From e77497f514f2a1585402c2adf86a75eab6c430e2 Mon Sep 17 00:00:00 2001 From: Miguel Gonzalez Date: Thu, 14 Jun 2018 07:22:52 +0200 Subject: [PATCH] 475d68ae56b16a62eb41c8d2c36703d59099ad0c --- dist/conf.example.json | 3 ++- dist/images | 2 +- dist/index.html | 16 ++++++------ dist/v-1527758585938/js/app.js | 23 ------------------ dist/v-1527758585938/js/maps/app.js.map | 1 - dist/v-1527758585938/js/templates.js | 16 ------------ .../locales/taiga/locale-de.json | 1 - .../locales/taiga/locale-en.json | 1 - .../locales/taiga/locale-fi.json | 1 - .../locales/taiga/locale-ja.json | 1 - .../styles/theme-high-contrast.css | 4 --- .../styles/theme-material-design.css | 4 --- dist/v-1527758585938/styles/theme-taiga.css | 4 --- .../emojis/0023-20e3.png | Bin .../emojis/002a-20e3.png | Bin .../emojis/0030-20e3.png | Bin .../emojis/0031-20e3.png | Bin .../emojis/0032-20e3.png | Bin .../emojis/0033-20e3.png | Bin .../emojis/0034-20e3.png | Bin .../emojis/0035-20e3.png | Bin .../emojis/0036-20e3.png | Bin .../emojis/0037-20e3.png | Bin .../emojis/0038-20e3.png | Bin .../emojis/0039-20e3.png | Bin .../emojis/1f004.png | Bin .../emojis/1f0cf.png | Bin .../emojis/1f170.png | Bin .../emojis/1f171.png | Bin .../emojis/1f17e.png | Bin .../emojis/1f17f.png | Bin .../emojis/1f18e.png | Bin .../emojis/1f191.png | Bin .../emojis/1f192.png | Bin .../emojis/1f193.png | Bin .../emojis/1f194.png | Bin .../emojis/1f195.png | Bin .../emojis/1f196.png | Bin .../emojis/1f197.png | Bin .../emojis/1f198.png | Bin .../emojis/1f199.png | Bin .../emojis/1f19a.png | Bin .../emojis/1f1e6-1f1e8.png | Bin .../emojis/1f1e6-1f1e9.png | Bin .../emojis/1f1e6-1f1ea.png | Bin .../emojis/1f1e6-1f1eb.png | Bin .../emojis/1f1e6-1f1ec.png | Bin .../emojis/1f1e6-1f1ee.png | Bin .../emojis/1f1e6-1f1f1.png | Bin .../emojis/1f1e6-1f1f2.png | Bin .../emojis/1f1e6-1f1f4.png | Bin .../emojis/1f1e6-1f1f6.png | Bin .../emojis/1f1e6-1f1f7.png | Bin .../emojis/1f1e6-1f1f8.png | Bin .../emojis/1f1e6-1f1f9.png | Bin .../emojis/1f1e6-1f1fa.png | Bin .../emojis/1f1e6-1f1fc.png | Bin .../emojis/1f1e6-1f1fd.png | Bin .../emojis/1f1e6-1f1ff.png | Bin .../emojis/1f1e7-1f1e6.png | Bin .../emojis/1f1e7-1f1e7.png | Bin .../emojis/1f1e7-1f1e9.png | Bin .../emojis/1f1e7-1f1ea.png | Bin .../emojis/1f1e7-1f1eb.png | Bin .../emojis/1f1e7-1f1ec.png | Bin .../emojis/1f1e7-1f1ed.png | Bin .../emojis/1f1e7-1f1ee.png | Bin .../emojis/1f1e7-1f1ef.png | Bin .../emojis/1f1e7-1f1f1.png | Bin .../emojis/1f1e7-1f1f2.png | Bin .../emojis/1f1e7-1f1f3.png | Bin .../emojis/1f1e7-1f1f4.png | Bin .../emojis/1f1e7-1f1f6.png | Bin .../emojis/1f1e7-1f1f7.png | Bin .../emojis/1f1e7-1f1f8.png | Bin .../emojis/1f1e7-1f1f9.png | Bin .../emojis/1f1e7-1f1fb.png | Bin .../emojis/1f1e7-1f1fc.png | Bin .../emojis/1f1e7-1f1fe.png | Bin .../emojis/1f1e7-1f1ff.png | Bin .../emojis/1f1e8-1f1e6.png | Bin .../emojis/1f1e8-1f1e8.png | Bin .../emojis/1f1e8-1f1e9.png | Bin .../emojis/1f1e8-1f1eb.png | Bin .../emojis/1f1e8-1f1ec.png | Bin .../emojis/1f1e8-1f1ed.png | Bin .../emojis/1f1e8-1f1ee.png | Bin .../emojis/1f1e8-1f1f0.png | Bin .../emojis/1f1e8-1f1f1.png | Bin .../emojis/1f1e8-1f1f2.png | Bin .../emojis/1f1e8-1f1f3.png | Bin .../emojis/1f1e8-1f1f4.png | Bin .../emojis/1f1e8-1f1f5.png | Bin .../emojis/1f1e8-1f1f7.png | Bin .../emojis/1f1e8-1f1fa.png | Bin .../emojis/1f1e8-1f1fb.png | Bin .../emojis/1f1e8-1f1fc.png | Bin .../emojis/1f1e8-1f1fd.png | Bin .../emojis/1f1e8-1f1fe.png | Bin .../emojis/1f1e8-1f1ff.png | Bin .../emojis/1f1e9-1f1ea.png | Bin .../emojis/1f1e9-1f1ec.png | Bin .../emojis/1f1e9-1f1ef.png | Bin .../emojis/1f1e9-1f1f0.png | Bin .../emojis/1f1e9-1f1f2.png | Bin .../emojis/1f1e9-1f1f4.png | Bin .../emojis/1f1e9-1f1ff.png | Bin .../emojis/1f1ea-1f1e6.png | Bin .../emojis/1f1ea-1f1e8.png | Bin .../emojis/1f1ea-1f1ea.png | Bin .../emojis/1f1ea-1f1ec.png | Bin .../emojis/1f1ea-1f1ed.png | Bin .../emojis/1f1ea-1f1f7.png | Bin .../emojis/1f1ea-1f1f8.png | Bin .../emojis/1f1ea-1f1f9.png | Bin .../emojis/1f1ea-1f1fa.png | Bin .../emojis/1f1eb-1f1ee.png | Bin .../emojis/1f1eb-1f1ef.png | Bin .../emojis/1f1eb-1f1f0.png | Bin .../emojis/1f1eb-1f1f2.png | Bin .../emojis/1f1eb-1f1f4.png | Bin .../emojis/1f1eb-1f1f7.png | Bin .../emojis/1f1ec-1f1e6.png | Bin .../emojis/1f1ec-1f1e7.png | Bin .../emojis/1f1ec-1f1e9.png | Bin .../emojis/1f1ec-1f1ea.png | Bin .../emojis/1f1ec-1f1eb.png | Bin .../emojis/1f1ec-1f1ec.png | Bin .../emojis/1f1ec-1f1ed.png | Bin .../emojis/1f1ec-1f1ee.png | Bin .../emojis/1f1ec-1f1f1.png | Bin .../emojis/1f1ec-1f1f2.png | Bin .../emojis/1f1ec-1f1f3.png | Bin .../emojis/1f1ec-1f1f5.png | Bin .../emojis/1f1ec-1f1f6.png | Bin .../emojis/1f1ec-1f1f7.png | Bin .../emojis/1f1ec-1f1f8.png | Bin .../emojis/1f1ec-1f1f9.png | Bin .../emojis/1f1ec-1f1fa.png | Bin .../emojis/1f1ec-1f1fc.png | Bin .../emojis/1f1ec-1f1fe.png | Bin .../emojis/1f1ed-1f1f0.png | Bin .../emojis/1f1ed-1f1f2.png | Bin .../emojis/1f1ed-1f1f3.png | Bin .../emojis/1f1ed-1f1f7.png | Bin .../emojis/1f1ed-1f1f9.png | Bin .../emojis/1f1ed-1f1fa.png | Bin .../emojis/1f1ee-1f1e8.png | Bin .../emojis/1f1ee-1f1e9.png | Bin .../emojis/1f1ee-1f1ea.png | Bin .../emojis/1f1ee-1f1f1.png | Bin .../emojis/1f1ee-1f1f2.png | Bin .../emojis/1f1ee-1f1f3.png | Bin .../emojis/1f1ee-1f1f4.png | Bin .../emojis/1f1ee-1f1f6.png | Bin .../emojis/1f1ee-1f1f7.png | Bin .../emojis/1f1ee-1f1f8.png | Bin .../emojis/1f1ee-1f1f9.png | Bin .../emojis/1f1ef-1f1ea.png | Bin .../emojis/1f1ef-1f1f2.png | Bin .../emojis/1f1ef-1f1f4.png | Bin .../emojis/1f1ef-1f1f5.png | Bin .../emojis/1f1f0-1f1ea.png | Bin .../emojis/1f1f0-1f1ec.png | Bin .../emojis/1f1f0-1f1ed.png | Bin .../emojis/1f1f0-1f1ee.png | Bin .../emojis/1f1f0-1f1f2.png | Bin .../emojis/1f1f0-1f1f3.png | Bin .../emojis/1f1f0-1f1f5.png | Bin .../emojis/1f1f0-1f1f7.png | Bin .../emojis/1f1f0-1f1fc.png | Bin .../emojis/1f1f0-1f1fe.png | Bin .../emojis/1f1f0-1f1ff.png | Bin .../emojis/1f1f1-1f1e6.png | Bin .../emojis/1f1f1-1f1e7.png | Bin .../emojis/1f1f1-1f1e8.png | Bin .../emojis/1f1f1-1f1ee.png | Bin .../emojis/1f1f1-1f1f0.png | Bin .../emojis/1f1f1-1f1f7.png | Bin .../emojis/1f1f1-1f1f8.png | Bin .../emojis/1f1f1-1f1f9.png | Bin .../emojis/1f1f1-1f1fa.png | Bin .../emojis/1f1f1-1f1fb.png | Bin .../emojis/1f1f1-1f1fe.png | Bin .../emojis/1f1f2-1f1e6.png | Bin .../emojis/1f1f2-1f1e8.png | Bin .../emojis/1f1f2-1f1e9.png | Bin .../emojis/1f1f2-1f1ea.png | Bin .../emojis/1f1f2-1f1eb.png | Bin .../emojis/1f1f2-1f1ec.png | Bin .../emojis/1f1f2-1f1ed.png | Bin .../emojis/1f1f2-1f1f0.png | Bin .../emojis/1f1f2-1f1f1.png | Bin .../emojis/1f1f2-1f1f2.png | Bin .../emojis/1f1f2-1f1f3.png | Bin .../emojis/1f1f2-1f1f4.png | Bin .../emojis/1f1f2-1f1f5.png | Bin .../emojis/1f1f2-1f1f6.png | Bin .../emojis/1f1f2-1f1f7.png | Bin .../emojis/1f1f2-1f1f8.png | Bin .../emojis/1f1f2-1f1f9.png | Bin .../emojis/1f1f2-1f1fa.png | Bin .../emojis/1f1f2-1f1fb.png | Bin .../emojis/1f1f2-1f1fc.png | Bin .../emojis/1f1f2-1f1fd.png | Bin .../emojis/1f1f2-1f1fe.png | Bin .../emojis/1f1f2-1f1ff.png | Bin .../emojis/1f1f3-1f1e6.png | Bin .../emojis/1f1f3-1f1e8.png | Bin .../emojis/1f1f3-1f1ea.png | Bin .../emojis/1f1f3-1f1eb.png | Bin .../emojis/1f1f3-1f1ec.png | Bin .../emojis/1f1f3-1f1ee.png | Bin .../emojis/1f1f3-1f1f1.png | Bin .../emojis/1f1f3-1f1f4.png | Bin .../emojis/1f1f3-1f1f5.png | Bin .../emojis/1f1f3-1f1f7.png | Bin .../emojis/1f1f3-1f1fa.png | Bin .../emojis/1f1f3-1f1ff.png | Bin .../emojis/1f1f4-1f1f2.png | Bin .../emojis/1f1f5-1f1e6.png | Bin .../emojis/1f1f5-1f1ea.png | Bin .../emojis/1f1f5-1f1eb.png | Bin .../emojis/1f1f5-1f1ec.png | Bin .../emojis/1f1f5-1f1ed.png | Bin .../emojis/1f1f5-1f1f0.png | Bin .../emojis/1f1f5-1f1f1.png | Bin .../emojis/1f1f5-1f1f2.png | Bin .../emojis/1f1f5-1f1f3.png | Bin .../emojis/1f1f5-1f1f7.png | Bin .../emojis/1f1f5-1f1f8.png | Bin .../emojis/1f1f5-1f1f9.png | Bin .../emojis/1f1f5-1f1fc.png | Bin .../emojis/1f1f5-1f1fe.png | Bin .../emojis/1f1f6-1f1e6.png | Bin .../emojis/1f1f7-1f1ea.png | Bin .../emojis/1f1f7-1f1f4.png | Bin .../emojis/1f1f7-1f1f8.png | Bin .../emojis/1f1f7-1f1fa.png | Bin .../emojis/1f1f7-1f1fc.png | Bin .../emojis/1f1f8-1f1e6.png | Bin .../emojis/1f1f8-1f1e7.png | Bin .../emojis/1f1f8-1f1e8.png | Bin .../emojis/1f1f8-1f1e9.png | Bin .../emojis/1f1f8-1f1ea.png | Bin .../emojis/1f1f8-1f1ec.png | Bin .../emojis/1f1f8-1f1ed.png | Bin .../emojis/1f1f8-1f1ee.png | Bin .../emojis/1f1f8-1f1ef.png | Bin .../emojis/1f1f8-1f1f0.png | Bin .../emojis/1f1f8-1f1f1.png | Bin .../emojis/1f1f8-1f1f2.png | Bin .../emojis/1f1f8-1f1f3.png | Bin .../emojis/1f1f8-1f1f4.png | Bin .../emojis/1f1f8-1f1f7.png | Bin .../emojis/1f1f8-1f1f8.png | Bin .../emojis/1f1f8-1f1f9.png | Bin .../emojis/1f1f8-1f1fb.png | Bin .../emojis/1f1f8-1f1fd.png | Bin .../emojis/1f1f8-1f1fe.png | Bin .../emojis/1f1f8-1f1ff.png | Bin .../emojis/1f1f9-1f1e6.png | Bin .../emojis/1f1f9-1f1e8.png | Bin .../emojis/1f1f9-1f1e9.png | Bin .../emojis/1f1f9-1f1eb.png | Bin .../emojis/1f1f9-1f1ec.png | Bin .../emojis/1f1f9-1f1ed.png | Bin .../emojis/1f1f9-1f1ef.png | Bin .../emojis/1f1f9-1f1f0.png | Bin .../emojis/1f1f9-1f1f1.png | Bin .../emojis/1f1f9-1f1f2.png | Bin .../emojis/1f1f9-1f1f3.png | Bin .../emojis/1f1f9-1f1f4.png | Bin .../emojis/1f1f9-1f1f7.png | Bin .../emojis/1f1f9-1f1f9.png | Bin .../emojis/1f1f9-1f1fb.png | Bin .../emojis/1f1f9-1f1fc.png | Bin .../emojis/1f1f9-1f1ff.png | Bin .../emojis/1f1fa-1f1e6.png | Bin .../emojis/1f1fa-1f1ec.png | Bin .../emojis/1f1fa-1f1f2.png | Bin .../emojis/1f1fa-1f1f3.png | Bin .../emojis/1f1fa-1f1f8.png | Bin .../emojis/1f1fa-1f1fe.png | Bin .../emojis/1f1fa-1f1ff.png | Bin .../emojis/1f1fb-1f1e6.png | Bin .../emojis/1f1fb-1f1e8.png | Bin .../emojis/1f1fb-1f1ea.png | Bin .../emojis/1f1fb-1f1ec.png | Bin .../emojis/1f1fb-1f1ee.png | Bin .../emojis/1f1fb-1f1f3.png | Bin .../emojis/1f1fb-1f1fa.png | Bin .../emojis/1f1fc-1f1eb.png | Bin .../emojis/1f1fc-1f1f8.png | Bin .../emojis/1f1fd-1f1f0.png | Bin .../emojis/1f1fe-1f1ea.png | Bin .../emojis/1f1fe-1f1f9.png | Bin .../emojis/1f1ff-1f1e6.png | Bin .../emojis/1f1ff-1f1f2.png | Bin .../emojis/1f1ff-1f1fc.png | Bin .../emojis/1f201.png | Bin .../emojis/1f202.png | Bin .../emojis/1f21a.png | Bin .../emojis/1f22f.png | Bin .../emojis/1f232.png | Bin .../emojis/1f233.png | Bin .../emojis/1f234.png | Bin .../emojis/1f235.png | Bin .../emojis/1f236.png | Bin .../emojis/1f237.png | Bin .../emojis/1f238.png | Bin .../emojis/1f239.png | Bin .../emojis/1f23a.png | Bin .../emojis/1f250.png | Bin .../emojis/1f251.png | Bin .../emojis/1f300.png | Bin .../emojis/1f301.png | Bin .../emojis/1f302.png | Bin .../emojis/1f303.png | Bin .../emojis/1f304.png | Bin .../emojis/1f305.png | Bin .../emojis/1f306.png | Bin .../emojis/1f307.png | Bin .../emojis/1f308.png | Bin .../emojis/1f309.png | Bin .../emojis/1f30a.png | Bin .../emojis/1f30b.png | Bin .../emojis/1f30c.png | Bin .../emojis/1f30d.png | Bin .../emojis/1f30e.png | Bin .../emojis/1f30f.png | Bin .../emojis/1f310.png | Bin .../emojis/1f311.png | Bin .../emojis/1f312.png | Bin .../emojis/1f313.png | Bin .../emojis/1f314.png | Bin .../emojis/1f315.png | Bin .../emojis/1f316.png | Bin .../emojis/1f317.png | Bin .../emojis/1f318.png | Bin .../emojis/1f319.png | Bin .../emojis/1f31a.png | Bin .../emojis/1f31b.png | Bin .../emojis/1f31c.png | Bin .../emojis/1f31d.png | Bin .../emojis/1f31e.png | Bin .../emojis/1f31f.png | Bin .../emojis/1f320.png | Bin .../emojis/1f321.png | Bin .../emojis/1f324.png | Bin .../emojis/1f325.png | Bin .../emojis/1f326.png | Bin .../emojis/1f327.png | Bin .../emojis/1f328.png | Bin .../emojis/1f329.png | Bin .../emojis/1f32a.png | Bin .../emojis/1f32b.png | Bin .../emojis/1f32c.png | Bin .../emojis/1f32d.png | Bin .../emojis/1f32e.png | Bin .../emojis/1f32f.png | Bin .../emojis/1f330.png | Bin .../emojis/1f331.png | Bin .../emojis/1f332.png | Bin .../emojis/1f333.png | Bin .../emojis/1f334.png | Bin .../emojis/1f335.png | Bin .../emojis/1f336.png | Bin .../emojis/1f337.png | Bin .../emojis/1f338.png | Bin .../emojis/1f339.png | Bin .../emojis/1f33a.png | Bin .../emojis/1f33b.png | Bin .../emojis/1f33c.png | Bin .../emojis/1f33d.png | Bin .../emojis/1f33e.png | Bin .../emojis/1f33f.png | Bin .../emojis/1f340.png | Bin .../emojis/1f341.png | Bin .../emojis/1f342.png | Bin .../emojis/1f343.png | Bin .../emojis/1f344.png | Bin .../emojis/1f345.png | Bin .../emojis/1f346.png | Bin .../emojis/1f347.png | Bin .../emojis/1f348.png | Bin .../emojis/1f349.png | Bin .../emojis/1f34a.png | Bin .../emojis/1f34b.png | Bin .../emojis/1f34c.png | Bin .../emojis/1f34d.png | Bin .../emojis/1f34e.png | Bin .../emojis/1f34f.png | Bin .../emojis/1f350.png | Bin .../emojis/1f351.png | Bin .../emojis/1f352.png | Bin .../emojis/1f353.png | Bin .../emojis/1f354.png | Bin .../emojis/1f355.png | Bin .../emojis/1f356.png | Bin .../emojis/1f357.png | Bin .../emojis/1f358.png | Bin .../emojis/1f359.png | Bin .../emojis/1f35a.png | Bin .../emojis/1f35b.png | Bin .../emojis/1f35c.png | Bin .../emojis/1f35d.png | Bin .../emojis/1f35e.png | Bin .../emojis/1f35f.png | Bin .../emojis/1f360.png | Bin .../emojis/1f361.png | Bin .../emojis/1f362.png | Bin .../emojis/1f363.png | Bin .../emojis/1f364.png | Bin .../emojis/1f365.png | Bin .../emojis/1f366.png | Bin .../emojis/1f367.png | Bin .../emojis/1f368.png | Bin .../emojis/1f369.png | Bin .../emojis/1f36a.png | Bin .../emojis/1f36b.png | Bin .../emojis/1f36c.png | Bin .../emojis/1f36d.png | Bin .../emojis/1f36e.png | Bin .../emojis/1f36f.png | Bin .../emojis/1f370.png | Bin .../emojis/1f371.png | Bin .../emojis/1f372.png | Bin .../emojis/1f373.png | Bin .../emojis/1f374.png | Bin .../emojis/1f375.png | Bin .../emojis/1f376.png | Bin .../emojis/1f377.png | Bin .../emojis/1f378.png | Bin .../emojis/1f379.png | Bin .../emojis/1f37a.png | Bin .../emojis/1f37b.png | Bin .../emojis/1f37c.png | Bin .../emojis/1f37d.png | Bin .../emojis/1f37e.png | Bin .../emojis/1f37f.png | Bin .../emojis/1f380.png | Bin .../emojis/1f381.png | Bin .../emojis/1f382.png | Bin .../emojis/1f383.png | Bin .../emojis/1f384.png | Bin .../emojis/1f385.png | Bin .../emojis/1f386.png | Bin .../emojis/1f387.png | Bin .../emojis/1f388.png | Bin .../emojis/1f389.png | Bin .../emojis/1f38a.png | Bin .../emojis/1f38b.png | Bin .../emojis/1f38c.png | Bin .../emojis/1f38d.png | Bin .../emojis/1f38e.png | Bin .../emojis/1f38f.png | Bin .../emojis/1f390.png | Bin .../emojis/1f391.png | Bin .../emojis/1f392.png | Bin .../emojis/1f393.png | Bin .../emojis/1f396.png | Bin .../emojis/1f397.png | Bin .../emojis/1f399.png | Bin .../emojis/1f39a.png | Bin .../emojis/1f39b.png | Bin .../emojis/1f39e.png | Bin .../emojis/1f39f.png | Bin .../emojis/1f3a0.png | Bin .../emojis/1f3a1.png | Bin .../emojis/1f3a2.png | Bin .../emojis/1f3a3.png | Bin .../emojis/1f3a4.png | Bin .../emojis/1f3a5.png | Bin .../emojis/1f3a6.png | Bin .../emojis/1f3a7.png | Bin .../emojis/1f3a8.png | Bin .../emojis/1f3a9.png | Bin .../emojis/1f3aa.png | Bin .../emojis/1f3ab.png | Bin .../emojis/1f3ac.png | Bin .../emojis/1f3ad.png | Bin .../emojis/1f3ae.png | Bin .../emojis/1f3af.png | Bin .../emojis/1f3b0.png | Bin .../emojis/1f3b1.png | Bin .../emojis/1f3b2.png | Bin .../emojis/1f3b3.png | Bin .../emojis/1f3b4.png | Bin .../emojis/1f3b5.png | Bin .../emojis/1f3b6.png | Bin .../emojis/1f3b7.png | Bin .../emojis/1f3b8.png | Bin .../emojis/1f3b9.png | Bin .../emojis/1f3ba.png | Bin .../emojis/1f3bb.png | Bin .../emojis/1f3bc.png | Bin .../emojis/1f3bd.png | Bin .../emojis/1f3be.png | Bin .../emojis/1f3bf.png | Bin .../emojis/1f3c0.png | Bin .../emojis/1f3c1.png | Bin .../emojis/1f3c2.png | Bin .../emojis/1f3c3-200d-2640-fe0f.png | Bin .../emojis/1f3c3-200d-2642-fe0f.png | Bin .../emojis/1f3c3.png | Bin .../emojis/1f3c4-200d-2640-fe0f.png | Bin .../emojis/1f3c4-200d-2642-fe0f.png | Bin .../emojis/1f3c4.png | Bin .../emojis/1f3c5.png | Bin .../emojis/1f3c6.png | Bin .../emojis/1f3c7.png | Bin .../emojis/1f3c8.png | Bin .../emojis/1f3c9.png | Bin .../emojis/1f3ca-200d-2640-fe0f.png | Bin .../emojis/1f3ca-200d-2642-fe0f.png | Bin .../emojis/1f3ca.png | Bin .../emojis/1f3cb-fe0f-200d-2640-fe0f.png | Bin .../emojis/1f3cb-fe0f-200d-2642-fe0f.png | Bin .../emojis/1f3cb.png | Bin .../emojis/1f3cc-fe0f-200d-2640-fe0f.png | Bin .../emojis/1f3cc-fe0f-200d-2642-fe0f.png | Bin .../emojis/1f3cc.png | Bin .../emojis/1f3cd.png | Bin .../emojis/1f3ce.png | Bin .../emojis/1f3cf.png | Bin .../emojis/1f3d0.png | Bin .../emojis/1f3d1.png | Bin .../emojis/1f3d2.png | Bin .../emojis/1f3d3.png | Bin .../emojis/1f3d4.png | Bin .../emojis/1f3d5.png | Bin .../emojis/1f3d6.png | Bin .../emojis/1f3d7.png | Bin .../emojis/1f3d8.png | Bin .../emojis/1f3d9.png | Bin .../emojis/1f3da.png | Bin .../emojis/1f3db.png | Bin .../emojis/1f3dc.png | Bin .../emojis/1f3dd.png | Bin .../emojis/1f3de.png | Bin .../emojis/1f3df.png | Bin .../emojis/1f3e0.png | Bin .../emojis/1f3e1.png | Bin .../emojis/1f3e2.png | Bin .../emojis/1f3e3.png | Bin .../emojis/1f3e4.png | Bin .../emojis/1f3e5.png | Bin .../emojis/1f3e6.png | Bin .../emojis/1f3e7.png | Bin .../emojis/1f3e8.png | Bin .../emojis/1f3e9.png | Bin .../emojis/1f3ea.png | Bin .../emojis/1f3eb.png | Bin .../emojis/1f3ec.png | Bin .../emojis/1f3ed.png | Bin .../emojis/1f3ee.png | Bin .../emojis/1f3ef.png | Bin .../emojis/1f3f0.png | Bin .../emojis/1f3f3-fe0f-200d-1f308.png | Bin .../emojis/1f3f3.png | Bin .../emojis/1f3f4.png | Bin .../emojis/1f3f5.png | Bin .../emojis/1f3f7.png | Bin .../emojis/1f3f8.png | Bin .../emojis/1f3f9.png | Bin .../emojis/1f3fa.png | Bin .../emojis/1f3fb.png | Bin .../emojis/1f3fc.png | Bin .../emojis/1f3fd.png | Bin .../emojis/1f3fe.png | Bin .../emojis/1f3ff.png | Bin .../emojis/1f400.png | Bin .../emojis/1f401.png | Bin .../emojis/1f402.png | Bin .../emojis/1f403.png | Bin .../emojis/1f404.png | Bin .../emojis/1f405.png | Bin .../emojis/1f406.png | Bin .../emojis/1f407.png | Bin .../emojis/1f408.png | Bin .../emojis/1f409.png | Bin .../emojis/1f40a.png | Bin .../emojis/1f40b.png | Bin .../emojis/1f40c.png | Bin .../emojis/1f40d.png | Bin .../emojis/1f40e.png | Bin .../emojis/1f40f.png | Bin .../emojis/1f410.png | Bin .../emojis/1f411.png | Bin .../emojis/1f412.png | Bin .../emojis/1f413.png | Bin .../emojis/1f414.png | Bin .../emojis/1f415.png | Bin .../emojis/1f416.png | Bin .../emojis/1f417.png | Bin .../emojis/1f418.png | Bin .../emojis/1f419.png | Bin .../emojis/1f41a.png | Bin .../emojis/1f41b.png | Bin .../emojis/1f41c.png | Bin .../emojis/1f41d.png | Bin .../emojis/1f41e.png | Bin .../emojis/1f41f.png | Bin .../emojis/1f420.png | Bin .../emojis/1f421.png | Bin .../emojis/1f422.png | Bin .../emojis/1f423.png | Bin .../emojis/1f424.png | Bin .../emojis/1f425.png | Bin .../emojis/1f426.png | Bin .../emojis/1f427.png | Bin .../emojis/1f428.png | Bin .../emojis/1f429.png | Bin .../emojis/1f42a.png | Bin .../emojis/1f42b.png | Bin .../emojis/1f42c.png | Bin .../emojis/1f42d.png | Bin .../emojis/1f42e.png | Bin .../emojis/1f42f.png | Bin .../emojis/1f430.png | Bin .../emojis/1f431.png | Bin .../emojis/1f432.png | Bin .../emojis/1f433.png | Bin .../emojis/1f434.png | Bin .../emojis/1f435.png | Bin .../emojis/1f436.png | Bin .../emojis/1f437.png | Bin .../emojis/1f438.png | Bin .../emojis/1f439.png | Bin .../emojis/1f43a.png | Bin .../emojis/1f43b.png | Bin .../emojis/1f43c.png | Bin .../emojis/1f43d.png | Bin .../emojis/1f43e.png | Bin .../emojis/1f43f.png | Bin .../emojis/1f440.png | Bin .../emojis/1f441.png | Bin .../emojis/1f442.png | Bin .../emojis/1f443.png | Bin .../emojis/1f444.png | Bin .../emojis/1f445.png | Bin .../emojis/1f446.png | Bin .../emojis/1f447.png | Bin .../emojis/1f448.png | Bin .../emojis/1f449.png | Bin .../emojis/1f44a.png | Bin .../emojis/1f44b.png | Bin .../emojis/1f44c.png | Bin .../emojis/1f44d.png | Bin .../emojis/1f44e.png | Bin .../emojis/1f44f.png | Bin .../emojis/1f450.png | Bin .../emojis/1f451.png | Bin .../emojis/1f452.png | Bin .../emojis/1f453.png | Bin .../emojis/1f454.png | Bin .../emojis/1f455.png | Bin .../emojis/1f456.png | Bin .../emojis/1f457.png | Bin .../emojis/1f458.png | Bin .../emojis/1f459.png | Bin .../emojis/1f45a.png | Bin .../emojis/1f45b.png | Bin .../emojis/1f45c.png | Bin .../emojis/1f45d.png | Bin .../emojis/1f45e.png | Bin .../emojis/1f45f.png | Bin .../emojis/1f460.png | Bin .../emojis/1f461.png | Bin .../emojis/1f462.png | Bin .../emojis/1f463.png | Bin .../emojis/1f464.png | Bin .../emojis/1f465.png | Bin .../emojis/1f466.png | Bin .../emojis/1f467.png | Bin .../emojis/1f468-200d-1f33e.png | Bin .../emojis/1f468-200d-1f373.png | Bin .../emojis/1f468-200d-1f393.png | Bin .../emojis/1f468-200d-1f3a4.png | Bin .../emojis/1f468-200d-1f3a8.png | Bin .../emojis/1f468-200d-1f3eb.png | Bin .../emojis/1f468-200d-1f3ed.png | Bin .../emojis/1f468-200d-1f466-200d-1f466.png | Bin .../emojis/1f468-200d-1f466.png | Bin .../emojis/1f468-200d-1f467-200d-1f466.png | Bin .../emojis/1f468-200d-1f467-200d-1f467.png | Bin .../emojis/1f468-200d-1f467.png | Bin ...1f468-200d-1f468-200d-1f466-200d-1f466.png | Bin .../emojis/1f468-200d-1f468-200d-1f466.png | Bin ...1f468-200d-1f468-200d-1f467-200d-1f466.png | Bin ...1f468-200d-1f468-200d-1f467-200d-1f467.png | Bin .../emojis/1f468-200d-1f468-200d-1f467.png | Bin ...1f468-200d-1f469-200d-1f466-200d-1f466.png | Bin .../emojis/1f468-200d-1f469-200d-1f466.png | Bin ...1f468-200d-1f469-200d-1f467-200d-1f466.png | Bin ...1f468-200d-1f469-200d-1f467-200d-1f467.png | Bin .../emojis/1f468-200d-1f469-200d-1f467.png | Bin .../emojis/1f468-200d-1f4bb.png | Bin .../emojis/1f468-200d-1f4bc.png | Bin .../emojis/1f468-200d-1f527.png | Bin .../emojis/1f468-200d-1f52c.png | Bin .../emojis/1f468-200d-1f680.png | Bin .../emojis/1f468-200d-1f692.png | Bin .../emojis/1f468-200d-2695-fe0f.png | Bin .../emojis/1f468-200d-2696-fe0f.png | Bin .../emojis/1f468-200d-2708-fe0f.png | Bin .../1f468-200d-2764-fe0f-200d-1f468.png | Bin ...8-200d-2764-fe0f-200d-1f48b-200d-1f468.png | Bin .../emojis/1f468.png | Bin .../emojis/1f469-200d-1f33e.png | Bin .../emojis/1f469-200d-1f373.png | Bin .../emojis/1f469-200d-1f393.png | Bin .../emojis/1f469-200d-1f3a4.png | Bin .../emojis/1f469-200d-1f3a8.png | Bin .../emojis/1f469-200d-1f3eb.png | Bin .../emojis/1f469-200d-1f3ed.png | Bin .../emojis/1f469-200d-1f466-200d-1f466.png | Bin .../emojis/1f469-200d-1f466.png | Bin .../emojis/1f469-200d-1f467-200d-1f466.png | Bin .../emojis/1f469-200d-1f467-200d-1f467.png | Bin .../emojis/1f469-200d-1f467.png | Bin ...1f469-200d-1f469-200d-1f466-200d-1f466.png | Bin .../emojis/1f469-200d-1f469-200d-1f466.png | Bin ...1f469-200d-1f469-200d-1f467-200d-1f466.png | Bin ...1f469-200d-1f469-200d-1f467-200d-1f467.png | Bin .../emojis/1f469-200d-1f469-200d-1f467.png | Bin .../emojis/1f469-200d-1f4bb.png | Bin .../emojis/1f469-200d-1f4bc.png | Bin .../emojis/1f469-200d-1f527.png | Bin .../emojis/1f469-200d-1f52c.png | Bin .../emojis/1f469-200d-1f680.png | Bin .../emojis/1f469-200d-1f692.png | Bin .../emojis/1f469-200d-2695-fe0f.png | Bin .../emojis/1f469-200d-2696-fe0f.png | Bin .../emojis/1f469-200d-2708-fe0f.png | Bin .../1f469-200d-2764-fe0f-200d-1f468.png | Bin .../1f469-200d-2764-fe0f-200d-1f469.png | Bin ...9-200d-2764-fe0f-200d-1f48b-200d-1f468.png | Bin ...9-200d-2764-fe0f-200d-1f48b-200d-1f469.png | Bin .../emojis/1f469.png | Bin .../emojis/1f46a.png | Bin .../emojis/1f46b.png | Bin .../emojis/1f46c.png | Bin .../emojis/1f46d.png | Bin .../emojis/1f46e-200d-2640-fe0f.png | Bin .../emojis/1f46e-200d-2642-fe0f.png | Bin .../emojis/1f46e.png | Bin .../emojis/1f46f-200d-2640-fe0f.png | Bin .../emojis/1f46f-200d-2642-fe0f.png | Bin .../emojis/1f46f.png | Bin .../emojis/1f470.png | Bin .../emojis/1f471-200d-2640-fe0f.png | Bin .../emojis/1f471-200d-2642-fe0f.png | Bin .../emojis/1f471.png | Bin .../emojis/1f472.png | Bin .../emojis/1f473-200d-2640-fe0f.png | Bin .../emojis/1f473-200d-2642-fe0f.png | Bin .../emojis/1f473.png | Bin .../emojis/1f474.png | Bin .../emojis/1f475.png | Bin .../emojis/1f476.png | Bin .../emojis/1f477-200d-2640-fe0f.png | Bin .../emojis/1f477-200d-2642-fe0f.png | Bin .../emojis/1f477.png | Bin .../emojis/1f478.png | Bin .../emojis/1f479.png | Bin .../emojis/1f47a.png | Bin .../emojis/1f47b.png | Bin .../emojis/1f47c.png | Bin .../emojis/1f47d.png | Bin .../emojis/1f47e.png | Bin .../emojis/1f47f.png | Bin .../emojis/1f480.png | Bin .../emojis/1f481-200d-2640-fe0f.png | Bin .../emojis/1f481-200d-2642-fe0f.png | Bin .../emojis/1f481.png | Bin .../emojis/1f482-200d-2640-fe0f.png | Bin .../emojis/1f482-200d-2642-fe0f.png | Bin .../emojis/1f482.png | Bin .../emojis/1f483.png | Bin .../emojis/1f484.png | Bin .../emojis/1f485.png | Bin .../emojis/1f486-200d-2640-fe0f.png | Bin .../emojis/1f486-200d-2642-fe0f.png | Bin .../emojis/1f486.png | Bin .../emojis/1f487-200d-2640-fe0f.png | Bin .../emojis/1f487-200d-2642-fe0f.png | Bin .../emojis/1f487.png | Bin .../emojis/1f488.png | Bin .../emojis/1f489.png | Bin .../emojis/1f48a.png | Bin .../emojis/1f48b.png | Bin .../emojis/1f48c.png | Bin .../emojis/1f48d.png | Bin .../emojis/1f48e.png | Bin .../emojis/1f48f.png | Bin .../emojis/1f490.png | Bin .../emojis/1f491.png | Bin .../emojis/1f492.png | Bin .../emojis/1f493.png | Bin .../emojis/1f494.png | Bin .../emojis/1f495.png | Bin .../emojis/1f496.png | Bin .../emojis/1f497.png | Bin .../emojis/1f498.png | Bin .../emojis/1f499.png | Bin .../emojis/1f49a.png | Bin .../emojis/1f49b.png | Bin .../emojis/1f49c.png | Bin .../emojis/1f49d.png | Bin .../emojis/1f49e.png | Bin .../emojis/1f49f.png | Bin .../emojis/1f4a0.png | Bin .../emojis/1f4a1.png | Bin .../emojis/1f4a2.png | Bin .../emojis/1f4a3.png | Bin .../emojis/1f4a4.png | Bin .../emojis/1f4a5.png | Bin .../emojis/1f4a6.png | Bin .../emojis/1f4a7.png | Bin .../emojis/1f4a8.png | Bin .../emojis/1f4a9.png | Bin .../emojis/1f4aa.png | Bin .../emojis/1f4ab.png | Bin .../emojis/1f4ac.png | Bin .../emojis/1f4ad.png | Bin .../emojis/1f4ae.png | Bin .../emojis/1f4af.png | Bin .../emojis/1f4b0.png | Bin .../emojis/1f4b1.png | Bin .../emojis/1f4b2.png | Bin .../emojis/1f4b3.png | Bin .../emojis/1f4b4.png | Bin .../emojis/1f4b5.png | Bin .../emojis/1f4b6.png | Bin .../emojis/1f4b7.png | Bin .../emojis/1f4b8.png | Bin .../emojis/1f4b9.png | Bin .../emojis/1f4ba.png | Bin .../emojis/1f4bb.png | Bin .../emojis/1f4bc.png | Bin .../emojis/1f4bd.png | Bin .../emojis/1f4be.png | Bin .../emojis/1f4bf.png | Bin .../emojis/1f4c0.png | Bin .../emojis/1f4c1.png | Bin .../emojis/1f4c2.png | Bin .../emojis/1f4c3.png | Bin .../emojis/1f4c4.png | Bin .../emojis/1f4c5.png | Bin .../emojis/1f4c6.png | Bin .../emojis/1f4c7.png | Bin .../emojis/1f4c8.png | Bin .../emojis/1f4c9.png | Bin .../emojis/1f4ca.png | Bin .../emojis/1f4cb.png | Bin .../emojis/1f4cc.png | Bin .../emojis/1f4cd.png | Bin .../emojis/1f4ce.png | Bin .../emojis/1f4cf.png | Bin .../emojis/1f4d0.png | Bin .../emojis/1f4d1.png | Bin .../emojis/1f4d2.png | Bin .../emojis/1f4d3.png | Bin .../emojis/1f4d4.png | Bin .../emojis/1f4d5.png | Bin .../emojis/1f4d6.png | Bin .../emojis/1f4d7.png | Bin .../emojis/1f4d8.png | Bin .../emojis/1f4d9.png | Bin .../emojis/1f4da.png | Bin .../emojis/1f4db.png | Bin .../emojis/1f4dc.png | Bin .../emojis/1f4dd.png | Bin .../emojis/1f4de.png | Bin .../emojis/1f4df.png | Bin .../emojis/1f4e0.png | Bin .../emojis/1f4e1.png | Bin .../emojis/1f4e2.png | Bin .../emojis/1f4e3.png | Bin .../emojis/1f4e4.png | Bin .../emojis/1f4e5.png | Bin .../emojis/1f4e6.png | Bin .../emojis/1f4e7.png | Bin .../emojis/1f4e8.png | Bin .../emojis/1f4e9.png | Bin .../emojis/1f4ea.png | Bin .../emojis/1f4eb.png | Bin .../emojis/1f4ec.png | Bin .../emojis/1f4ed.png | Bin .../emojis/1f4ee.png | Bin .../emojis/1f4ef.png | Bin .../emojis/1f4f0.png | Bin .../emojis/1f4f1.png | Bin .../emojis/1f4f2.png | Bin .../emojis/1f4f3.png | Bin .../emojis/1f4f4.png | Bin .../emojis/1f4f5.png | Bin .../emojis/1f4f6.png | Bin .../emojis/1f4f7.png | Bin .../emojis/1f4f8.png | Bin .../emojis/1f4f9.png | Bin .../emojis/1f4fa.png | Bin .../emojis/1f4fb.png | Bin .../emojis/1f4fc.png | Bin .../emojis/1f4fd.png | Bin .../emojis/1f4ff.png | Bin .../emojis/1f500.png | Bin .../emojis/1f501.png | Bin .../emojis/1f502.png | Bin .../emojis/1f503.png | Bin .../emojis/1f504.png | Bin .../emojis/1f505.png | Bin .../emojis/1f506.png | Bin .../emojis/1f507.png | Bin .../emojis/1f508.png | Bin .../emojis/1f509.png | Bin .../emojis/1f50a.png | Bin .../emojis/1f50b.png | Bin .../emojis/1f50c.png | Bin .../emojis/1f50d.png | Bin .../emojis/1f50e.png | Bin .../emojis/1f50f.png | Bin .../emojis/1f510.png | Bin .../emojis/1f511.png | Bin .../emojis/1f512.png | Bin .../emojis/1f513.png | Bin .../emojis/1f514.png | Bin .../emojis/1f515.png | Bin .../emojis/1f516.png | Bin .../emojis/1f517.png | Bin .../emojis/1f518.png | Bin .../emojis/1f519.png | Bin .../emojis/1f51a.png | Bin .../emojis/1f51b.png | Bin .../emojis/1f51c.png | Bin .../emojis/1f51d.png | Bin .../emojis/1f51e.png | Bin .../emojis/1f51f.png | Bin .../emojis/1f520.png | Bin .../emojis/1f521.png | Bin .../emojis/1f522.png | Bin .../emojis/1f523.png | Bin .../emojis/1f524.png | Bin .../emojis/1f525.png | Bin .../emojis/1f526.png | Bin .../emojis/1f527.png | Bin .../emojis/1f528.png | Bin .../emojis/1f529.png | Bin .../emojis/1f52a.png | Bin .../emojis/1f52b.png | Bin .../emojis/1f52c.png | Bin .../emojis/1f52d.png | Bin .../emojis/1f52e.png | Bin .../emojis/1f52f.png | Bin .../emojis/1f530.png | Bin .../emojis/1f531.png | Bin .../emojis/1f532.png | Bin .../emojis/1f533.png | Bin .../emojis/1f534.png | Bin .../emojis/1f535.png | Bin .../emojis/1f536.png | Bin .../emojis/1f537.png | Bin .../emojis/1f538.png | Bin .../emojis/1f539.png | Bin .../emojis/1f53a.png | Bin .../emojis/1f53b.png | Bin .../emojis/1f53c.png | Bin .../emojis/1f53d.png | Bin .../emojis/1f549.png | Bin .../emojis/1f54a.png | Bin .../emojis/1f54b.png | Bin .../emojis/1f54c.png | Bin .../emojis/1f54d.png | Bin .../emojis/1f54e.png | Bin .../emojis/1f550.png | Bin .../emojis/1f551.png | Bin .../emojis/1f552.png | Bin .../emojis/1f553.png | Bin .../emojis/1f554.png | Bin .../emojis/1f555.png | Bin .../emojis/1f556.png | Bin .../emojis/1f557.png | Bin .../emojis/1f558.png | Bin .../emojis/1f559.png | Bin .../emojis/1f55a.png | Bin .../emojis/1f55b.png | Bin .../emojis/1f55c.png | Bin .../emojis/1f55d.png | Bin .../emojis/1f55e.png | Bin .../emojis/1f55f.png | Bin .../emojis/1f560.png | Bin .../emojis/1f561.png | Bin .../emojis/1f562.png | Bin .../emojis/1f563.png | Bin .../emojis/1f564.png | Bin .../emojis/1f565.png | Bin .../emojis/1f566.png | Bin .../emojis/1f567.png | Bin .../emojis/1f56f.png | Bin .../emojis/1f570.png | Bin .../emojis/1f573.png | Bin .../emojis/1f574.png | Bin .../emojis/1f575-fe0f-200d-2640-fe0f.png | Bin .../emojis/1f575-fe0f-200d-2642-fe0f.png | Bin .../emojis/1f575.png | Bin .../emojis/1f576.png | Bin .../emojis/1f577.png | Bin .../emojis/1f578.png | Bin .../emojis/1f579.png | Bin .../emojis/1f57a.png | Bin .../emojis/1f587.png | Bin .../emojis/1f58a.png | Bin .../emojis/1f58b.png | Bin .../emojis/1f58c.png | Bin .../emojis/1f58d.png | Bin .../emojis/1f590.png | Bin .../emojis/1f595.png | Bin .../emojis/1f596.png | Bin .../emojis/1f5a4.png | Bin .../emojis/1f5a5.png | Bin .../emojis/1f5a8.png | Bin .../emojis/1f5b1.png | Bin .../emojis/1f5b2.png | Bin .../emojis/1f5bc.png | Bin .../emojis/1f5c2.png | Bin .../emojis/1f5c3.png | Bin .../emojis/1f5c4.png | Bin .../emojis/1f5d1.png | Bin .../emojis/1f5d2.png | Bin .../emojis/1f5d3.png | Bin .../emojis/1f5dc.png | Bin .../emojis/1f5dd.png | Bin .../emojis/1f5de.png | Bin .../emojis/1f5e1.png | Bin .../emojis/1f5e3.png | Bin .../emojis/1f5e8.png | Bin .../emojis/1f5ef.png | Bin .../emojis/1f5f3.png | Bin .../emojis/1f5fa.png | Bin .../emojis/1f5fb.png | Bin .../emojis/1f5fc.png | Bin .../emojis/1f5fd.png | Bin .../emojis/1f5fe.png | Bin .../emojis/1f5ff.png | Bin .../emojis/1f600.png | Bin .../emojis/1f601.png | Bin .../emojis/1f602.png | Bin .../emojis/1f603.png | Bin .../emojis/1f604.png | Bin .../emojis/1f605.png | Bin .../emojis/1f606.png | Bin .../emojis/1f607.png | Bin .../emojis/1f608.png | Bin .../emojis/1f609.png | Bin .../emojis/1f60a.png | Bin .../emojis/1f60b.png | Bin .../emojis/1f60c.png | Bin .../emojis/1f60d.png | Bin .../emojis/1f60e.png | Bin .../emojis/1f60f.png | Bin .../emojis/1f610.png | Bin .../emojis/1f611.png | Bin .../emojis/1f612.png | Bin .../emojis/1f613.png | Bin .../emojis/1f614.png | Bin .../emojis/1f615.png | Bin .../emojis/1f616.png | Bin .../emojis/1f617.png | Bin .../emojis/1f618.png | Bin .../emojis/1f619.png | Bin .../emojis/1f61a.png | Bin .../emojis/1f61b.png | Bin .../emojis/1f61c.png | Bin .../emojis/1f61d.png | Bin .../emojis/1f61e.png | Bin .../emojis/1f61f.png | Bin .../emojis/1f620.png | Bin .../emojis/1f621.png | Bin .../emojis/1f622.png | Bin .../emojis/1f623.png | Bin .../emojis/1f624.png | Bin .../emojis/1f625.png | Bin .../emojis/1f626.png | Bin .../emojis/1f627.png | Bin .../emojis/1f628.png | Bin .../emojis/1f629.png | Bin .../emojis/1f62a.png | Bin .../emojis/1f62b.png | Bin .../emojis/1f62c.png | Bin .../emojis/1f62d.png | Bin .../emojis/1f62e.png | Bin .../emojis/1f62f.png | Bin .../emojis/1f630.png | Bin .../emojis/1f631.png | Bin .../emojis/1f632.png | Bin .../emojis/1f633.png | Bin .../emojis/1f634.png | Bin .../emojis/1f635.png | Bin .../emojis/1f636.png | Bin .../emojis/1f637.png | Bin .../emojis/1f638.png | Bin .../emojis/1f639.png | Bin .../emojis/1f63a.png | Bin .../emojis/1f63b.png | Bin .../emojis/1f63c.png | Bin .../emojis/1f63d.png | Bin .../emojis/1f63e.png | Bin .../emojis/1f63f.png | Bin .../emojis/1f640.png | Bin .../emojis/1f641.png | Bin .../emojis/1f642.png | Bin .../emojis/1f643.png | Bin .../emojis/1f644.png | Bin .../emojis/1f645-200d-2640-fe0f.png | Bin .../emojis/1f645-200d-2642-fe0f.png | Bin .../emojis/1f645.png | Bin .../emojis/1f646-200d-2640-fe0f.png | Bin .../emojis/1f646-200d-2642-fe0f.png | Bin .../emojis/1f646.png | Bin .../emojis/1f647-200d-2640-fe0f.png | Bin .../emojis/1f647-200d-2642-fe0f.png | Bin .../emojis/1f647.png | Bin .../emojis/1f648.png | Bin .../emojis/1f649.png | Bin .../emojis/1f64a.png | Bin .../emojis/1f64b-200d-2640-fe0f.png | Bin .../emojis/1f64b-200d-2642-fe0f.png | Bin .../emojis/1f64b.png | Bin .../emojis/1f64c.png | Bin .../emojis/1f64d-200d-2640-fe0f.png | Bin .../emojis/1f64d-200d-2642-fe0f.png | Bin .../emojis/1f64d.png | Bin .../emojis/1f64e-200d-2640-fe0f.png | Bin .../emojis/1f64e-200d-2642-fe0f.png | Bin .../emojis/1f64e.png | Bin .../emojis/1f64f.png | Bin .../emojis/1f680.png | Bin .../emojis/1f681.png | Bin .../emojis/1f682.png | Bin .../emojis/1f683.png | Bin .../emojis/1f684.png | Bin .../emojis/1f685.png | Bin .../emojis/1f686.png | Bin .../emojis/1f687.png | Bin .../emojis/1f688.png | Bin .../emojis/1f689.png | Bin .../emojis/1f68a.png | Bin .../emojis/1f68b.png | Bin .../emojis/1f68c.png | Bin .../emojis/1f68d.png | Bin .../emojis/1f68e.png | Bin .../emojis/1f68f.png | Bin .../emojis/1f690.png | Bin .../emojis/1f691.png | Bin .../emojis/1f692.png | Bin .../emojis/1f693.png | Bin .../emojis/1f694.png | Bin .../emojis/1f695.png | Bin .../emojis/1f696.png | Bin .../emojis/1f697.png | Bin .../emojis/1f698.png | Bin .../emojis/1f699.png | Bin .../emojis/1f69a.png | Bin .../emojis/1f69b.png | Bin .../emojis/1f69c.png | Bin .../emojis/1f69d.png | Bin .../emojis/1f69e.png | Bin .../emojis/1f69f.png | Bin .../emojis/1f6a0.png | Bin .../emojis/1f6a1.png | Bin .../emojis/1f6a2.png | Bin .../emojis/1f6a3-200d-2640-fe0f.png | Bin .../emojis/1f6a3-200d-2642-fe0f.png | Bin .../emojis/1f6a3.png | Bin .../emojis/1f6a4.png | Bin .../emojis/1f6a5.png | Bin .../emojis/1f6a6.png | Bin .../emojis/1f6a7.png | Bin .../emojis/1f6a8.png | Bin .../emojis/1f6a9.png | Bin .../emojis/1f6aa.png | Bin .../emojis/1f6ab.png | Bin .../emojis/1f6ac.png | Bin .../emojis/1f6ad.png | Bin .../emojis/1f6ae.png | Bin .../emojis/1f6af.png | Bin .../emojis/1f6b0.png | Bin .../emojis/1f6b1.png | Bin .../emojis/1f6b2.png | Bin .../emojis/1f6b3.png | Bin .../emojis/1f6b4-200d-2640-fe0f.png | Bin .../emojis/1f6b4-200d-2642-fe0f.png | Bin .../emojis/1f6b4.png | Bin .../emojis/1f6b5-200d-2640-fe0f.png | Bin .../emojis/1f6b5-200d-2642-fe0f.png | Bin .../emojis/1f6b5.png | Bin .../emojis/1f6b6-200d-2640-fe0f.png | Bin .../emojis/1f6b6-200d-2642-fe0f.png | Bin .../emojis/1f6b6.png | Bin .../emojis/1f6b7.png | Bin .../emojis/1f6b8.png | Bin .../emojis/1f6b9.png | Bin .../emojis/1f6ba.png | Bin .../emojis/1f6bb.png | Bin .../emojis/1f6bc.png | Bin .../emojis/1f6bd.png | Bin .../emojis/1f6be.png | Bin .../emojis/1f6bf.png | Bin .../emojis/1f6c0.png | Bin .../emojis/1f6c1.png | Bin .../emojis/1f6c2.png | Bin .../emojis/1f6c3.png | Bin .../emojis/1f6c4.png | Bin .../emojis/1f6c5.png | Bin .../emojis/1f6cb.png | Bin .../emojis/1f6cc.png | Bin .../emojis/1f6cd.png | Bin .../emojis/1f6ce.png | Bin .../emojis/1f6cf.png | Bin .../emojis/1f6d0.png | Bin .../emojis/1f6d1.png | Bin .../emojis/1f6d2.png | Bin .../emojis/1f6e0.png | Bin .../emojis/1f6e1.png | Bin .../emojis/1f6e2.png | Bin .../emojis/1f6e3.png | Bin .../emojis/1f6e4.png | Bin .../emojis/1f6e5.png | Bin .../emojis/1f6e9.png | Bin .../emojis/1f6eb.png | Bin .../emojis/1f6ec.png | Bin .../emojis/1f6f0.png | Bin .../emojis/1f6f3.png | Bin .../emojis/1f6f4.png | Bin .../emojis/1f6f5.png | Bin .../emojis/1f6f6.png | Bin .../emojis/1f910.png | Bin .../emojis/1f911.png | Bin .../emojis/1f912.png | Bin .../emojis/1f913.png | Bin .../emojis/1f914.png | Bin .../emojis/1f915.png | Bin .../emojis/1f916.png | Bin .../emojis/1f917.png | Bin .../emojis/1f918.png | Bin .../emojis/1f919.png | Bin .../emojis/1f91a.png | Bin .../emojis/1f91b.png | Bin .../emojis/1f91c.png | Bin .../emojis/1f91d.png | Bin .../emojis/1f91e.png | Bin .../emojis/1f920.png | Bin .../emojis/1f921.png | Bin .../emojis/1f922.png | Bin .../emojis/1f923.png | Bin .../emojis/1f924.png | Bin .../emojis/1f925.png | Bin .../emojis/1f926-200d-2640-fe0f.png | Bin .../emojis/1f926-200d-2642-fe0f.png | Bin .../emojis/1f926.png | Bin .../emojis/1f927.png | Bin .../emojis/1f930.png | Bin .../emojis/1f933.png | Bin .../emojis/1f934.png | Bin .../emojis/1f935.png | Bin .../emojis/1f936.png | Bin .../emojis/1f937-200d-2640-fe0f.png | Bin .../emojis/1f937-200d-2642-fe0f.png | Bin .../emojis/1f937.png | Bin .../emojis/1f938-200d-2640-fe0f.png | Bin .../emojis/1f938-200d-2642-fe0f.png | Bin .../emojis/1f938.png | Bin .../emojis/1f939-200d-2640-fe0f.png | Bin .../emojis/1f939-200d-2642-fe0f.png | Bin .../emojis/1f939.png | Bin .../emojis/1f93a.png | Bin .../emojis/1f93c-200d-2640-fe0f.png | Bin .../emojis/1f93c-200d-2642-fe0f.png | Bin .../emojis/1f93c.png | Bin .../emojis/1f93d-200d-2640-fe0f.png | Bin .../emojis/1f93d-200d-2642-fe0f.png | Bin .../emojis/1f93d.png | Bin .../emojis/1f93e-200d-2640-fe0f.png | Bin .../emojis/1f93e-200d-2642-fe0f.png | Bin .../emojis/1f93e.png | Bin .../emojis/1f940.png | Bin .../emojis/1f941.png | Bin .../emojis/1f942.png | Bin .../emojis/1f943.png | Bin .../emojis/1f944.png | Bin .../emojis/1f945.png | Bin .../emojis/1f947.png | Bin .../emojis/1f948.png | Bin .../emojis/1f949.png | Bin .../emojis/1f94a.png | Bin .../emojis/1f94b.png | Bin .../emojis/1f950.png | Bin .../emojis/1f951.png | Bin .../emojis/1f952.png | Bin .../emojis/1f953.png | Bin .../emojis/1f954.png | Bin .../emojis/1f955.png | Bin .../emojis/1f956.png | Bin .../emojis/1f957.png | Bin .../emojis/1f958.png | Bin .../emojis/1f959.png | Bin .../emojis/1f95a.png | Bin .../emojis/1f95b.png | Bin .../emojis/1f95c.png | Bin .../emojis/1f95d.png | Bin .../emojis/1f95e.png | Bin .../emojis/1f980.png | Bin .../emojis/1f981.png | Bin .../emojis/1f982.png | Bin .../emojis/1f983.png | Bin .../emojis/1f984.png | Bin .../emojis/1f985.png | Bin .../emojis/1f986.png | Bin .../emojis/1f987.png | Bin .../emojis/1f988.png | Bin .../emojis/1f989.png | Bin .../emojis/1f98a.png | Bin .../emojis/1f98b.png | Bin .../emojis/1f98c.png | Bin .../emojis/1f98d.png | Bin .../emojis/1f98e.png | Bin .../emojis/1f98f.png | Bin .../emojis/1f990.png | Bin .../emojis/1f991.png | Bin .../emojis/1f9c0.png | Bin .../emojis/203c.png | Bin .../emojis/2049.png | Bin .../emojis/2122.png | Bin .../emojis/2139.png | Bin .../emojis/2194.png | Bin .../emojis/2195.png | Bin .../emojis/2196.png | Bin .../emojis/2197.png | Bin .../emojis/2198.png | Bin .../emojis/2199.png | Bin .../emojis/21a9.png | Bin .../emojis/21aa.png | Bin .../emojis/231a.png | Bin .../emojis/231b.png | Bin .../emojis/2328.png | Bin .../emojis/23cf.png | Bin .../emojis/23e9.png | Bin .../emojis/23ea.png | Bin .../emojis/23eb.png | Bin .../emojis/23ec.png | Bin .../emojis/23ed.png | Bin .../emojis/23ee.png | Bin .../emojis/23ef.png | Bin .../emojis/23f0.png | Bin .../emojis/23f1.png | Bin .../emojis/23f2.png | Bin .../emojis/23f3.png | Bin .../emojis/23f8.png | Bin .../emojis/23f9.png | Bin .../emojis/23fa.png | Bin .../emojis/24c2.png | Bin .../emojis/25aa.png | Bin .../emojis/25ab.png | Bin .../emojis/25b6.png | Bin .../emojis/25c0.png | Bin .../emojis/25fb.png | Bin .../emojis/25fc.png | Bin .../emojis/25fd.png | Bin .../emojis/25fe.png | Bin .../emojis/2600.png | Bin .../emojis/2601.png | Bin .../emojis/2602.png | Bin .../emojis/2603.png | Bin .../emojis/2604.png | Bin .../emojis/260e.png | Bin .../emojis/2611.png | Bin .../emojis/2614.png | Bin .../emojis/2615.png | Bin .../emojis/2618.png | Bin .../emojis/261d.png | Bin .../emojis/2620.png | Bin .../emojis/2622.png | Bin .../emojis/2623.png | Bin .../emojis/2626.png | Bin .../emojis/262a.png | Bin .../emojis/262e.png | Bin .../emojis/262f.png | Bin .../emojis/2638.png | Bin .../emojis/2639.png | Bin .../emojis/263a.png | Bin .../emojis/2640.png | Bin .../emojis/2642.png | Bin .../emojis/2648.png | Bin .../emojis/2649.png | Bin .../emojis/264a.png | Bin .../emojis/264b.png | Bin .../emojis/264c.png | Bin .../emojis/264d.png | Bin .../emojis/264e.png | Bin .../emojis/264f.png | Bin .../emojis/2650.png | Bin .../emojis/2651.png | Bin .../emojis/2652.png | Bin .../emojis/2653.png | Bin .../emojis/2660.png | Bin .../emojis/2663.png | Bin .../emojis/2665.png | Bin .../emojis/2666.png | Bin .../emojis/2668.png | Bin .../emojis/267b.png | Bin .../emojis/267f.png | Bin .../emojis/2692.png | Bin .../emojis/2693.png | Bin .../emojis/2694.png | Bin .../emojis/2695.png | Bin .../emojis/2696.png | Bin .../emojis/2697.png | Bin .../emojis/2699.png | Bin .../emojis/269b.png | Bin .../emojis/269c.png | Bin .../emojis/26a0.png | Bin .../emojis/26a1.png | Bin .../emojis/26aa.png | Bin .../emojis/26ab.png | Bin .../emojis/26b0.png | Bin .../emojis/26b1.png | Bin .../emojis/26bd.png | Bin .../emojis/26be.png | Bin .../emojis/26c4.png | Bin .../emojis/26c5.png | Bin .../emojis/26c8.png | Bin .../emojis/26ce.png | Bin .../emojis/26cf.png | Bin .../emojis/26d1.png | Bin .../emojis/26d3.png | Bin .../emojis/26d4.png | Bin .../emojis/26e9.png | Bin .../emojis/26ea.png | Bin .../emojis/26f0.png | Bin .../emojis/26f1.png | Bin .../emojis/26f2.png | Bin .../emojis/26f3.png | Bin .../emojis/26f4.png | Bin .../emojis/26f5.png | Bin .../emojis/26f7.png | Bin .../emojis/26f8.png | Bin .../emojis/26f9-fe0f-200d-2640-fe0f.png | Bin .../emojis/26f9-fe0f-200d-2642-fe0f.png | Bin .../emojis/26f9.png | Bin .../emojis/26fa.png | Bin .../emojis/26fd.png | Bin .../emojis/2702.png | Bin .../emojis/2705.png | Bin .../emojis/2708.png | Bin .../emojis/2709.png | Bin .../emojis/270a.png | Bin .../emojis/270b.png | Bin .../emojis/270c.png | Bin .../emojis/270d.png | Bin .../emojis/270f.png | Bin .../emojis/2712.png | Bin .../emojis/2714.png | Bin .../emojis/2716.png | Bin .../emojis/271d.png | Bin .../emojis/2721.png | Bin .../emojis/2728.png | Bin .../emojis/2733.png | Bin .../emojis/2734.png | Bin .../emojis/2744.png | Bin .../emojis/2747.png | Bin .../emojis/274c.png | Bin .../emojis/274e.png | Bin .../emojis/2753.png | Bin .../emojis/2754.png | Bin .../emojis/2755.png | Bin .../emojis/2757.png | Bin .../emojis/2763.png | Bin .../emojis/2764.png | Bin .../emojis/2795.png | Bin .../emojis/2796.png | Bin .../emojis/2797.png | Bin .../emojis/27a1.png | Bin .../emojis/27b0.png | Bin .../emojis/27bf.png | Bin .../emojis/2934.png | Bin .../emojis/2935.png | Bin .../emojis/2b05.png | Bin .../emojis/2b06.png | Bin .../emojis/2b07.png | Bin .../emojis/2b1b.png | Bin .../emojis/2b1c.png | Bin .../emojis/2b50.png | Bin .../emojis/2b55.png | Bin .../emojis/3030.png | Bin .../emojis/303d.png | Bin .../emojis/3297.png | Bin .../emojis/3299.png | Bin .../emojis/emojis-data.json | 0 .../fonts/OpenSans-Bold.ttf | Bin .../fonts/OpenSans-CondLight.eot | Bin .../fonts/OpenSans-CondLight.svg | 0 .../fonts/OpenSans-CondLight.ttf | Bin .../fonts/OpenSans-CondLight.woff | Bin .../fonts/OpenSans-Light.ttf | Bin .../fonts/OpenSans-Regular.ttf | Bin .../fonts/OpenSans-Semibold.ttf | Bin .../fonts/taiga.eot | Bin .../fonts/taiga.svg | 0 .../fonts/taiga.ttf | Bin .../fonts/taiga.woff | Bin .../images/attachment-gallery.png | Bin .../images/bg.png | Bin .../images/discover.png | Bin .../images/empty/empty_contact.png | Bin .../images/empty/empty_des.png | Bin .../images/empty/empty_field.png | Bin .../images/empty/empty_like.png | Bin .../images/empty/empty_mex.png | Bin .../images/empty/empty_moon.png | Bin .../images/empty/empty_sprint.png | Bin .../images/empty/empty_tex.png | Bin .../images/empty/empty_upvote.png | Bin .../images/empty/empty_watch.png | Bin .../images/epics-empty.png | Bin .../images/favicon.png | Bin .../images/import-logos/asana.png | Bin .../images/import-logos/github.png | Bin .../images/import-logos/jira.png | Bin .../images/import-logos/trello.png | Bin .../images/invitation_bg.jpg | Bin .../images/logo-color.png | Bin .../images/logo.png | Bin .../images/looking-for-people.png | Bin .../images/markitup/bg-container.png | Bin .../images/markitup/bg-editor-bbcode.png | Bin .../images/markitup/bg-editor-dotclear.png | Bin .../images/markitup/bg-editor-html.png | Bin .../images/markitup/bg-editor-json.png | Bin .../images/markitup/bg-editor-markdown.png | Bin .../images/markitup/bg-editor-textile.png | Bin .../images/markitup/bg-editor-wiki.png | Bin .../images/markitup/bg-editor-xml.png | Bin .../images/markitup/bg-editor.png | Bin .../images/markitup/body.png | Bin .../images/markitup/bold.png | Bin .../images/markitup/clean.png | Bin .../images/markitup/code.png | Bin .../images/markitup/h1.png | Bin .../images/markitup/h2.png | Bin .../images/markitup/h3.png | Bin .../images/markitup/h4.png | Bin .../images/markitup/h5.png | Bin .../images/markitup/h6.png | Bin .../images/markitup/handle.png | Bin .../images/markitup/help.png | Bin .../images/markitup/image.png | Bin .../images/markitup/italic.png | Bin .../images/markitup/jaysalvat.png | Bin .../images/markitup/link.png | Bin .../images/markitup/list-bullet.png | Bin .../images/markitup/list-numeric.png | Bin .../images/markitup/markitup.png | Bin .../images/markitup/menu.png | Bin .../images/markitup/picture.png | Bin .../images/markitup/preview.png | Bin .../images/markitup/preview_ico.png | Bin .../images/markitup/quotes.png | Bin .../images/markitup/stroke.png | Bin .../images/markitup/submenu.png | Bin .../images/menu-vert.png | Bin .../images/menu.png | Bin .../images/monster-fight.png | Bin .../images/notification-decoration.png | Bin .../images/project-logos/project-logo-01.png | Bin .../images/project-logos/project-logo-02.png | Bin .../images/project-logos/project-logo-03.png | Bin .../images/project-logos/project-logo-04.png | Bin .../images/project-logos/project-logo-05.png | Bin .../images/quote.png | Bin .../images/tribe-logo.png | Bin .../images/unnamed.png | Bin .../images/user-avatars/user-avatar-01.png | Bin .../images/user-avatars/user-avatar-02.png | Bin .../images/user-avatars/user-avatar-03.png | Bin .../images/user-avatars/user-avatar-04.png | Bin .../images/user-avatars/user-avatar-05.png | Bin .../images/user-noimage.png | Bin .../js/app-loader.js | 2 +- dist/v-1528953702317/js/app.js | 23 ++++++++++++++++++ .../js/libs.js | 0 dist/v-1528953702317/js/maps/app.js.map | 1 + .../js/maps/libs.js.map | 0 dist/v-1528953702317/js/templates.js | 16 ++++++++++++ .../locales/moment-locales/af.js | 0 .../locales/moment-locales/ar-dz.js | 0 .../locales/moment-locales/ar-kw.js | 0 .../locales/moment-locales/ar-ly.js | 0 .../locales/moment-locales/ar-ma.js | 0 .../locales/moment-locales/ar-sa.js | 0 .../locales/moment-locales/ar-tn.js | 0 .../locales/moment-locales/ar.js | 0 .../locales/moment-locales/az.js | 0 .../locales/moment-locales/be.js | 0 .../locales/moment-locales/bg.js | 0 .../locales/moment-locales/bm.js | 0 .../locales/moment-locales/bn.js | 0 .../locales/moment-locales/bo.js | 0 .../locales/moment-locales/br.js | 0 .../locales/moment-locales/bs.js | 0 .../locales/moment-locales/ca.js | 0 .../locales/moment-locales/cs.js | 0 .../locales/moment-locales/cv.js | 0 .../locales/moment-locales/cy.js | 0 .../locales/moment-locales/da.js | 0 .../locales/moment-locales/de-at.js | 0 .../locales/moment-locales/de-ch.js | 0 .../locales/moment-locales/de.js | 0 .../locales/moment-locales/dv.js | 0 .../locales/moment-locales/el.js | 0 .../locales/moment-locales/en-au.js | 0 .../locales/moment-locales/en-ca.js | 0 .../locales/moment-locales/en-gb.js | 0 .../locales/moment-locales/en-ie.js | 0 .../locales/moment-locales/en-il.js | 0 .../locales/moment-locales/en-nz.js | 0 .../locales/moment-locales/eo.js | 0 .../locales/moment-locales/es-do.js | 0 .../locales/moment-locales/es-us.js | 0 .../locales/moment-locales/es.js | 0 .../locales/moment-locales/et.js | 0 .../locales/moment-locales/eu.js | 0 .../locales/moment-locales/fa.js | 0 .../locales/moment-locales/fi.js | 0 .../locales/moment-locales/fo.js | 0 .../locales/moment-locales/fr-ca.js | 0 .../locales/moment-locales/fr-ch.js | 0 .../locales/moment-locales/fr.js | 0 .../locales/moment-locales/fy.js | 0 .../locales/moment-locales/gd.js | 0 .../locales/moment-locales/gl.js | 0 .../locales/moment-locales/gom-latn.js | 0 .../locales/moment-locales/gu.js | 0 .../locales/moment-locales/he.js | 0 .../locales/moment-locales/hi.js | 0 .../locales/moment-locales/hr.js | 0 .../locales/moment-locales/hu.js | 0 .../locales/moment-locales/hy-am.js | 0 .../locales/moment-locales/id.js | 0 .../locales/moment-locales/is.js | 0 .../locales/moment-locales/it.js | 0 .../locales/moment-locales/ja.js | 0 .../locales/moment-locales/jv.js | 0 .../locales/moment-locales/ka.js | 0 .../locales/moment-locales/kk.js | 0 .../locales/moment-locales/km.js | 0 .../locales/moment-locales/kn.js | 0 .../locales/moment-locales/ko.js | 0 .../locales/moment-locales/ky.js | 0 .../locales/moment-locales/lb.js | 0 .../locales/moment-locales/lo.js | 0 .../locales/moment-locales/lt.js | 0 .../locales/moment-locales/lv.js | 0 .../locales/moment-locales/me.js | 0 .../locales/moment-locales/mi.js | 0 .../locales/moment-locales/mk.js | 0 .../locales/moment-locales/ml.js | 0 .../locales/moment-locales/mr.js | 0 .../locales/moment-locales/ms-my.js | 0 .../locales/moment-locales/ms.js | 0 .../locales/moment-locales/mt.js | 0 .../locales/moment-locales/my.js | 0 .../locales/moment-locales/nb.js | 0 .../locales/moment-locales/ne.js | 0 .../locales/moment-locales/nl-be.js | 0 .../locales/moment-locales/nl.js | 0 .../locales/moment-locales/nn.js | 0 .../locales/moment-locales/pa-in.js | 0 .../locales/moment-locales/pl.js | 0 .../locales/moment-locales/pt-br.js | 0 .../locales/moment-locales/pt.js | 0 .../locales/moment-locales/ro.js | 0 .../locales/moment-locales/ru.js | 0 .../locales/moment-locales/sd.js | 0 .../locales/moment-locales/se.js | 0 .../locales/moment-locales/si.js | 0 .../locales/moment-locales/sk.js | 0 .../locales/moment-locales/sl.js | 0 .../locales/moment-locales/sq.js | 0 .../locales/moment-locales/sr-cyrl.js | 0 .../locales/moment-locales/sr.js | 0 .../locales/moment-locales/ss.js | 0 .../locales/moment-locales/sv.js | 0 .../locales/moment-locales/sw.js | 0 .../locales/moment-locales/ta.js | 0 .../locales/moment-locales/te.js | 0 .../locales/moment-locales/tet.js | 0 .../locales/moment-locales/tg.js | 0 .../locales/moment-locales/th.js | 0 .../locales/moment-locales/tl-ph.js | 0 .../locales/moment-locales/tlh.js | 0 .../locales/moment-locales/tr.js | 0 .../locales/moment-locales/tzl.js | 0 .../locales/moment-locales/tzm-latn.js | 0 .../locales/moment-locales/tzm.js | 0 .../locales/moment-locales/ug-cn.js | 0 .../locales/moment-locales/uk.js | 0 .../locales/moment-locales/ur.js | 0 .../locales/moment-locales/uz-latn.js | 0 .../locales/moment-locales/uz.js | 0 .../locales/moment-locales/vi.js | 0 .../locales/moment-locales/x-pseudo.js | 0 .../locales/moment-locales/yo.js | 0 .../locales/moment-locales/zh-cn.js | 0 .../locales/moment-locales/zh-hk.js | 0 .../locales/moment-locales/zh-tw.js | 0 .../locales/taiga/locale-ca.json | 0 .../locales/taiga/locale-de.json | 1 + .../locales/taiga/locale-en.json | 1 + .../locales/taiga/locale-es.json | 0 .../locales/taiga/locale-fa.json | 0 .../locales/taiga/locale-fi.json | 1 + .../locales/taiga/locale-fr.json | 0 .../locales/taiga/locale-it.json | 0 .../locales/taiga/locale-ja.json | 1 + .../locales/taiga/locale-ko.json | 0 .../locales/taiga/locale-nb.json | 0 .../locales/taiga/locale-nl.json | 0 .../locales/taiga/locale-pl.json | 0 .../locales/taiga/locale-pt-br.json | 0 .../locales/taiga/locale-ru.json | 0 .../locales/taiga/locale-sv.json | 0 .../locales/taiga/locale-tr.json | 0 .../locales/taiga/locale-zh-hans.json | 0 .../locales/taiga/locale-zh-hant.json | 0 .../prism/prism-abap.min.js | 0 .../prism/prism-actionscript.min.js | 0 .../prism/prism-ada.min.js | 0 .../prism/prism-apacheconf.min.js | 0 .../prism/prism-apl.min.js | 0 .../prism/prism-applescript.min.js | 0 .../prism/prism-arduino.min.js | 0 .../prism/prism-asciidoc.min.js | 0 .../prism/prism-asm6502.min.js | 0 .../prism/prism-aspnet.min.js | 0 .../prism/prism-autohotkey.min.js | 0 .../prism/prism-autoit.min.js | 0 .../prism/prism-bash.min.js | 0 .../prism/prism-basic.min.js | 0 .../prism/prism-batch.min.js | 0 .../prism/prism-bison.min.js | 0 .../prism/prism-brainfuck.min.js | 0 .../prism/prism-bro.min.js | 0 .../prism/prism-c.min.js | 0 .../prism/prism-clike.min.js | 0 .../prism/prism-coffeescript.min.js | 0 .../prism/prism-core.min.js | 0 .../prism/prism-cpp.min.js | 0 .../prism/prism-crystal.min.js | 0 .../prism/prism-csharp.min.js | 0 .../prism/prism-csp.min.js | 0 .../prism/prism-css-extras.min.js | 0 .../prism/prism-css.min.js | 0 .../prism/prism-d.min.js | 0 .../prism/prism-dart.min.js | 0 .../prism/prism-diff.min.js | 0 .../prism/prism-django.min.js | 0 .../prism/prism-docker.min.js | 0 .../prism/prism-eiffel.min.js | 0 .../prism/prism-elixir.min.js | 0 .../prism/prism-elm.min.js | 0 .../prism/prism-erlang.min.js | 0 .../prism/prism-flow.min.js | 0 .../prism/prism-fortran.min.js | 0 .../prism/prism-fsharp.min.js | 0 .../prism/prism-gherkin.min.js | 0 .../prism/prism-git.min.js | 0 .../prism/prism-glsl.min.js | 0 .../prism/prism-go.min.js | 0 .../prism/prism-graphql.min.js | 0 .../prism/prism-groovy.min.js | 0 .../prism/prism-haml.min.js | 0 .../prism/prism-handlebars.min.js | 0 .../prism/prism-haskell.min.js | 0 .../prism/prism-haxe.min.js | 0 .../prism/prism-hpkp.min.js | 0 .../prism/prism-hsts.min.js | 0 .../prism/prism-http.min.js | 0 .../prism/prism-ichigojam.min.js | 0 .../prism/prism-icon.min.js | 0 .../prism/prism-inform7.min.js | 0 .../prism/prism-ini.min.js | 0 .../prism/prism-io.min.js | 0 .../prism/prism-j.min.js | 0 .../prism/prism-java.min.js | 0 .../prism/prism-javascript.min.js | 0 .../prism/prism-jolie.min.js | 0 .../prism/prism-json.min.js | 0 .../prism/prism-jsx.min.js | 0 .../prism/prism-julia.min.js | 0 .../prism/prism-keyman.min.js | 0 .../prism/prism-kotlin.min.js | 0 .../prism/prism-languages.json | 0 .../prism/prism-latex.min.js | 0 .../prism/prism-less.min.js | 0 .../prism/prism-livescript.min.js | 0 .../prism/prism-lolcode.min.js | 0 .../prism/prism-lua.min.js | 0 .../prism/prism-makefile.min.js | 0 .../prism/prism-markdown.min.js | 0 .../prism/prism-markup.min.js | 0 .../prism/prism-matlab.min.js | 0 .../prism/prism-mel.min.js | 0 .../prism/prism-mizar.min.js | 0 .../prism/prism-monkey.min.js | 0 .../prism/prism-n4js.min.js | 0 .../prism/prism-nasm.min.js | 0 .../prism/prism-nginx.min.js | 0 .../prism/prism-nim.min.js | 0 .../prism/prism-nix.min.js | 0 .../prism/prism-nsis.min.js | 0 .../prism/prism-objectivec.min.js | 0 .../prism/prism-ocaml.min.js | 0 .../prism/prism-opencl.min.js | 0 .../prism/prism-oz.min.js | 0 .../prism/prism-parigp.min.js | 0 .../prism/prism-parser.min.js | 0 .../prism/prism-pascal.min.js | 0 .../prism/prism-perl.min.js | 0 .../prism/prism-php-extras.min.js | 0 .../prism/prism-php.min.js | 0 .../prism/prism-powershell.min.js | 0 .../prism/prism-processing.min.js | 0 .../prism/prism-prolog.min.js | 0 .../prism/prism-properties.min.js | 0 .../prism/prism-protobuf.min.js | 0 .../prism/prism-pug.min.js | 0 .../prism/prism-puppet.min.js | 0 .../prism/prism-pure.min.js | 0 .../prism/prism-python.min.js | 0 .../prism/prism-q.min.js | 0 .../prism/prism-qore.min.js | 0 .../prism/prism-r.min.js | 0 .../prism/prism-reason.min.js | 0 .../prism/prism-renpy.min.js | 0 .../prism/prism-rest.min.js | 0 .../prism/prism-rip.min.js | 0 .../prism/prism-roboconf.min.js | 0 .../prism/prism-ruby.min.js | 0 .../prism/prism-rust.min.js | 0 .../prism/prism-sas.min.js | 0 .../prism/prism-sass.min.js | 0 .../prism/prism-scala.min.js | 0 .../prism/prism-scheme.min.js | 0 .../prism/prism-scss.min.js | 0 .../prism/prism-smalltalk.min.js | 0 .../prism/prism-smarty.min.js | 0 .../prism/prism-sql.min.js | 0 .../prism/prism-stylus.min.js | 0 .../prism/prism-swift.min.js | 0 .../prism/prism-tcl.min.js | 0 .../prism/prism-textile.min.js | 0 .../prism/prism-tsx.min.js | 0 .../prism/prism-twig.min.js | 0 .../prism/prism-typescript.min.js | 0 .../prism/prism-vbnet.min.js | 0 .../prism/prism-verilog.min.js | 0 .../prism/prism-vhdl.min.js | 0 .../prism/prism-vim.min.js | 0 .../prism/prism-wiki.min.js | 0 .../prism/prism-xeora.min.js | 0 .../prism/prism-xojo.min.js | 0 .../prism/prism-yaml.min.js | 0 .../styles/theme-high-contrast.css | 4 +++ .../styles/theme-material-design.css | 4 +++ dist/v-1528953702317/styles/theme-taiga.css | 4 +++ .../svg/editor.svg | 0 .../svg/icons/block-user.svg | 0 .../svg/icons/multi-block-project.svg | 0 .../svg/icons/project-limit.svg | 0 .../svg/icons/team-question.svg | 0 .../svg/logo-color.svg | 0 .../svg/logo-moustache.svg | 0 .../svg/logo-nav.svg | 0 .../svg/logo.svg | 0 .../svg/pattern.svg | 0 .../svg/spinner-circle.svg | 0 .../svg/spinner.svg | 0 .../svg/sprite.svg | 0 1890 files changed, 68 insertions(+), 67 deletions(-) delete mode 100644 dist/v-1527758585938/js/app.js delete mode 100644 dist/v-1527758585938/js/maps/app.js.map delete mode 100644 dist/v-1527758585938/js/templates.js delete mode 100644 dist/v-1527758585938/locales/taiga/locale-de.json delete mode 100644 dist/v-1527758585938/locales/taiga/locale-en.json delete mode 100644 dist/v-1527758585938/locales/taiga/locale-fi.json delete mode 100644 dist/v-1527758585938/locales/taiga/locale-ja.json delete mode 100644 dist/v-1527758585938/styles/theme-high-contrast.css delete mode 100644 dist/v-1527758585938/styles/theme-material-design.css delete mode 100644 dist/v-1527758585938/styles/theme-taiga.css rename dist/{v-1527758585938 => v-1528953702317}/emojis/0023-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/002a-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0030-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0031-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0032-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0033-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0034-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0035-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0036-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0037-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0038-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/0039-20e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f004.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f0cf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f170.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f171.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f17e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f17f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f18e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f191.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f192.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f193.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f194.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f195.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f196.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f197.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f198.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f199.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f19a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1f6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e6-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1e7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1f6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e7-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e8-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e9-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e9-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e9-1f1ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e9-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e9-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e9-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1e9-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ea-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1eb-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1eb-1f1ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1eb-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1eb-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1eb-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1eb-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1e7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1f6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ec-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ed-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ed-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ed-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ed-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ed-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ed-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1f6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ee-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ef-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ef-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ef-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ef-1f1f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f0-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1e7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f1-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f2-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f3-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f4-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f5-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f6-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f7-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f7-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f7-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f7-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f7-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1e7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f8-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1f9-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fa-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fa-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fa-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fa-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fa-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fa-1f1fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fa-1f1ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fb-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fb-1f1e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fb-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fb-1f1ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fb-1f1ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fb-1f1f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fb-1f1fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fc-1f1eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fc-1f1f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fd-1f1f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fe-1f1ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1fe-1f1f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ff-1f1e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ff-1f1f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f1ff-1f1fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f201.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f202.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f21a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f22f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f232.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f233.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f234.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f235.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f236.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f237.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f238.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f239.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f23a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f250.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f251.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f300.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f301.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f302.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f303.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f304.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f305.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f306.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f307.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f308.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f309.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f30a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f30b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f30c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f30d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f30e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f30f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f310.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f311.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f312.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f313.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f314.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f315.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f316.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f317.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f318.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f319.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f31a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f31b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f31c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f31d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f31e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f31f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f320.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f321.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f324.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f325.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f326.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f327.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f328.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f329.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f32a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f32b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f32c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f32d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f32e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f32f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f330.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f331.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f332.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f333.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f334.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f335.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f336.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f337.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f338.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f339.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f33a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f33b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f33c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f33d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f33e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f33f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f340.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f341.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f342.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f343.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f344.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f345.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f346.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f347.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f348.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f349.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f34a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f34b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f34c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f34d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f34e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f34f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f350.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f351.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f352.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f353.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f354.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f355.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f356.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f357.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f358.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f359.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f35a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f35b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f35c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f35d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f35e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f35f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f360.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f361.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f362.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f363.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f364.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f365.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f366.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f367.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f368.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f369.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f36a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f36b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f36c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f36d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f36e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f36f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f370.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f371.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f372.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f373.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f374.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f375.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f376.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f377.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f378.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f379.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f37a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f37b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f37c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f37d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f37e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f37f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f380.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f381.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f382.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f383.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f384.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f385.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f386.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f387.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f388.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f389.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f38a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f38b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f38c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f38d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f38e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f38f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f390.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f391.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f392.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f393.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f396.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f397.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f399.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f39a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f39b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f39e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f39f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3a9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3aa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ab.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ac.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ad.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ae.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3af.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3b9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ba.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3bb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3bc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3bd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3be.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3bf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c3-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c3-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c4-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c4-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3c9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ca-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ca-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ca.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3cb-fe0f-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3cb-fe0f-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3cb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3cc-fe0f-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3cc-fe0f-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3cc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3cd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ce.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3cf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3d9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3da.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3db.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3dc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3dd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3de.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3df.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3f3-fe0f-200d-1f308.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f3ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f400.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f401.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f402.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f403.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f404.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f405.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f406.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f407.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f408.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f409.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f40a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f40b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f40c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f40d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f40e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f40f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f410.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f411.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f412.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f413.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f414.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f415.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f416.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f417.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f418.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f419.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f41a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f41b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f41c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f41d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f41e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f41f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f420.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f421.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f422.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f423.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f424.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f425.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f426.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f427.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f428.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f429.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f42a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f42b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f42c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f42d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f42e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f42f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f430.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f431.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f432.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f433.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f434.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f435.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f436.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f437.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f438.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f439.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f43a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f43b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f43c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f43d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f43e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f43f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f440.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f441.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f442.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f443.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f444.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f445.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f446.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f447.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f448.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f449.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f44a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f44b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f44c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f44d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f44e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f44f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f450.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f451.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f452.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f453.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f454.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f455.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f456.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f457.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f458.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f459.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f45a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f45b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f45c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f45d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f45e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f45f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f460.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f461.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f462.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f463.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f464.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f465.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f33e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f373.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f393.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f3a4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f3a8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f3eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f3ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f466-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f467-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f467-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f468-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f468-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f469-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f469-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f4bb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f4bc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f527.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f52c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f680.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-1f692.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-2695-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-2696-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-2708-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-2764-fe0f-200d-1f468.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f468.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f33e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f373.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f393.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f3a4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f3a8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f3eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f3ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f466-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f467-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f467-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f469-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f469-200d-1f467.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f4bb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f4bc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f527.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f52c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f680.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-1f692.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-2695-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-2696-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-2708-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-2764-fe0f-200d-1f468.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-2764-fe0f-200d-1f469.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f469.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46e-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46e-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46f-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46f-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f46f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f470.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f471-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f471-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f471.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f472.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f473-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f473-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f473.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f474.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f475.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f476.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f477-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f477-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f477.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f478.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f479.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f47a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f47b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f47c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f47d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f47e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f47f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f480.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f481-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f481-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f481.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f482-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f482-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f482.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f483.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f484.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f485.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f486-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f486-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f486.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f487-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f487-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f487.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f488.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f489.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f48a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f48b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f48c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f48d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f48e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f48f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f490.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f491.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f492.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f493.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f494.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f495.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f496.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f497.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f498.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f499.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f49a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f49b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f49c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f49d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f49e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f49f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4a9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4aa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ab.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ac.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ad.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ae.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4af.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4b9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ba.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4bb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4bc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4bd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4be.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4bf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4c9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ca.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4cb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4cc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4cd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ce.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4cf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4d9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4da.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4db.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4dc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4dd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4de.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4df.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f4ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f500.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f501.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f502.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f503.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f504.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f505.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f506.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f507.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f508.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f509.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f50a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f50b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f50c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f50d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f50e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f50f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f510.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f511.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f512.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f513.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f514.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f515.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f516.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f517.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f518.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f519.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f51a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f51b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f51c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f51d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f51e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f51f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f520.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f521.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f522.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f523.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f524.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f525.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f526.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f527.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f528.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f529.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f52a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f52b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f52c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f52d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f52e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f52f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f530.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f531.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f532.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f533.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f534.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f535.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f536.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f537.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f538.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f539.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f53a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f53b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f53c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f53d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f549.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f54a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f54b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f54c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f54d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f54e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f550.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f551.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f552.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f553.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f554.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f555.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f556.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f557.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f558.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f559.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f55a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f55b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f55c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f55d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f55e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f55f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f560.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f561.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f562.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f563.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f564.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f565.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f566.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f567.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f56f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f570.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f573.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f574.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f575-fe0f-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f575-fe0f-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f575.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f576.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f577.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f578.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f579.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f57a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f587.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f58a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f58b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f58c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f58d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f590.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f595.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f596.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5a4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5a5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5a8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5b1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5b2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5bc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5c2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5c3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5c4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5d1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5d2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5d3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5dc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5dd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5de.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5e1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5e8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f5ff.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f600.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f601.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f602.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f603.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f604.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f605.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f606.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f607.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f608.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f609.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f60a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f60b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f60c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f60d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f60e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f60f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f610.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f611.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f612.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f613.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f614.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f615.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f616.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f617.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f618.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f619.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f61a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f61b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f61c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f61d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f61e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f61f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f620.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f621.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f622.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f623.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f624.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f625.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f626.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f627.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f628.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f629.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f62a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f62b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f62c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f62d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f62e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f62f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f630.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f631.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f632.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f633.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f634.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f635.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f636.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f637.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f638.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f639.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f63a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f63b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f63c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f63d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f63e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f63f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f640.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f641.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f642.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f643.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f644.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f645-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f645-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f645.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f646-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f646-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f646.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f647-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f647-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f647.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f648.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f649.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64b-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64b-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64d-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64d-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64e-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64e-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f64f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f680.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f681.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f682.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f683.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f684.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f685.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f686.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f687.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f688.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f689.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f68a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f68b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f68c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f68d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f68e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f68f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f690.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f691.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f692.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f693.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f694.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f695.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f696.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f697.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f698.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f699.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f69a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f69b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f69c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f69d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f69e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f69f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a3-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a3-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6a9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6aa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6ab.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6ac.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6ad.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6ae.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6af.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b4-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b4-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b5-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b5-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b6-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b6-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6b9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6ba.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6bb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6bc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6bd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6be.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6bf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6c0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6c1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6c2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6c3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6c4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6c5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6cb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6cc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6cd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6ce.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6cf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6d0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6d1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6d2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6e0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6e1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6e2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6e3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6e4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6e5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f6f6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f910.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f911.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f912.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f913.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f914.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f915.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f916.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f917.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f918.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f919.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f91a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f91b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f91c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f91d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f91e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f920.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f921.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f922.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f923.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f924.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f925.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f926-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f926-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f926.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f927.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f930.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f933.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f934.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f935.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f936.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f937-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f937-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f937.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f938-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f938-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f938.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f939-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f939-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f939.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93c-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93c-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93d-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93d-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93e-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93e-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f93e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f940.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f941.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f942.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f943.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f944.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f945.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f947.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f948.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f949.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f94a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f94b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f950.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f951.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f952.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f953.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f954.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f955.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f956.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f957.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f958.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f959.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f95a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f95b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f95c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f95d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f95e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f980.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f981.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f982.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f983.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f984.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f985.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f986.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f987.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f988.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f989.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f98a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f98b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f98c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f98d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f98e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f98f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f990.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f991.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/1f9c0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/203c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2049.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2122.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2139.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2194.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2195.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2196.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2197.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2198.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2199.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/21a9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/21aa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/231a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/231b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2328.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23cf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23eb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23ec.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23ed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23ee.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23ef.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/23fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/24c2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/25aa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/25ab.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/25b6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/25c0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/25fb.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/25fc.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/25fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/25fe.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2600.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2601.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2602.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2603.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2604.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/260e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2611.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2614.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2615.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2618.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/261d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2620.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2622.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2623.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2626.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/262a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/262e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/262f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2638.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2639.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/263a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2640.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2642.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2648.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2649.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/264a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/264b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/264c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/264d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/264e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/264f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2650.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2651.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2652.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2653.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2660.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2663.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2665.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2666.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2668.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/267b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/267f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2692.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2693.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2694.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2695.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2696.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2697.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2699.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/269b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/269c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26a0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26a1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26aa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26ab.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26b0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26b1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26bd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26be.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26c4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26c5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26c8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26ce.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26cf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26d1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26d3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26d4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26e9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26ea.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f7.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f8.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f9-fe0f-200d-2640-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f9-fe0f-200d-2642-fe0f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26f9.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26fa.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/26fd.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2702.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2705.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2708.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2709.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/270a.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/270b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/270c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/270d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/270f.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2712.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2714.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2716.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/271d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2721.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2728.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2733.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2734.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2744.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2747.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/274c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/274e.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2753.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2754.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2755.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2757.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2763.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2764.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2795.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2796.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2797.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/27a1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/27b0.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/27bf.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2934.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2935.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2b05.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2b06.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2b07.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2b1b.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2b1c.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2b50.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/2b55.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/3030.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/303d.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/3297.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/3299.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/emojis/emojis-data.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/OpenSans-Bold.ttf (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/OpenSans-CondLight.eot (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/OpenSans-CondLight.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/OpenSans-CondLight.ttf (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/OpenSans-CondLight.woff (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/OpenSans-Light.ttf (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/OpenSans-Regular.ttf (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/OpenSans-Semibold.ttf (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/taiga.eot (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/taiga.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/taiga.ttf (100%) rename dist/{v-1527758585938 => v-1528953702317}/fonts/taiga.woff (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/attachment-gallery.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/bg.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/discover.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_contact.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_des.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_field.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_like.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_mex.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_moon.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_sprint.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_tex.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_upvote.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/empty/empty_watch.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/epics-empty.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/favicon.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/import-logos/asana.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/import-logos/github.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/import-logos/jira.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/import-logos/trello.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/invitation_bg.jpg (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/logo-color.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/logo.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/looking-for-people.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-container.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor-bbcode.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor-dotclear.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor-html.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor-json.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor-markdown.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor-textile.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor-wiki.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor-xml.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bg-editor.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/body.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/bold.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/clean.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/code.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/h1.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/h2.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/h3.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/h4.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/h5.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/h6.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/handle.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/help.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/image.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/italic.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/jaysalvat.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/link.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/list-bullet.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/list-numeric.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/markitup.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/menu.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/picture.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/preview.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/preview_ico.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/quotes.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/stroke.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/markitup/submenu.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/menu-vert.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/menu.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/monster-fight.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/notification-decoration.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/project-logos/project-logo-01.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/project-logos/project-logo-02.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/project-logos/project-logo-03.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/project-logos/project-logo-04.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/project-logos/project-logo-05.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/quote.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/tribe-logo.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/unnamed.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/user-avatars/user-avatar-01.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/user-avatars/user-avatar-02.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/user-avatars/user-avatar-03.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/user-avatars/user-avatar-04.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/user-avatars/user-avatar-05.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/images/user-noimage.png (100%) rename dist/{v-1527758585938 => v-1528953702317}/js/app-loader.js (96%) create mode 100644 dist/v-1528953702317/js/app.js rename dist/{v-1527758585938 => v-1528953702317}/js/libs.js (100%) create mode 100644 dist/v-1528953702317/js/maps/app.js.map rename dist/{v-1527758585938 => v-1528953702317}/js/maps/libs.js.map (100%) create mode 100644 dist/v-1528953702317/js/templates.js rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/af.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ar-dz.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ar-kw.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ar-ly.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ar-ma.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ar-sa.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ar-tn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ar.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/az.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/be.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/bg.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/bm.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/bn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/bo.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/br.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/bs.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ca.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/cs.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/cv.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/cy.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/da.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/de-at.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/de-ch.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/de.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/dv.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/el.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/en-au.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/en-ca.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/en-gb.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/en-ie.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/en-il.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/en-nz.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/eo.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/es-do.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/es-us.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/es.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/et.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/eu.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/fa.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/fi.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/fo.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/fr-ca.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/fr-ch.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/fr.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/fy.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/gd.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/gl.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/gom-latn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/gu.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/he.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/hi.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/hr.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/hu.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/hy-am.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/id.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/is.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/it.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ja.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/jv.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ka.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/kk.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/km.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/kn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ko.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ky.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/lb.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/lo.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/lt.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/lv.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/me.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/mi.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/mk.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ml.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/mr.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ms-my.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ms.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/mt.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/my.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/nb.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ne.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/nl-be.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/nl.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/nn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/pa-in.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/pl.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/pt-br.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/pt.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ro.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ru.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/sd.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/se.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/si.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/sk.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/sl.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/sq.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/sr-cyrl.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/sr.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ss.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/sv.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/sw.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ta.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/te.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/tet.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/tg.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/th.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/tl-ph.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/tlh.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/tr.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/tzl.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/tzm-latn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/tzm.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ug-cn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/uk.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/ur.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/uz-latn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/uz.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/vi.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/x-pseudo.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/yo.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/zh-cn.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/zh-hk.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/moment-locales/zh-tw.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-ca.json (100%) create mode 100644 dist/v-1528953702317/locales/taiga/locale-de.json create mode 100644 dist/v-1528953702317/locales/taiga/locale-en.json rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-es.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-fa.json (100%) create mode 100644 dist/v-1528953702317/locales/taiga/locale-fi.json rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-fr.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-it.json (100%) create mode 100644 dist/v-1528953702317/locales/taiga/locale-ja.json rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-ko.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-nb.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-nl.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-pl.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-pt-br.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-ru.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-sv.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-tr.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-zh-hans.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/locales/taiga/locale-zh-hant.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-abap.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-actionscript.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-ada.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-apacheconf.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-apl.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-applescript.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-arduino.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-asciidoc.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-asm6502.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-aspnet.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-autohotkey.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-autoit.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-bash.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-basic.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-batch.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-bison.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-brainfuck.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-bro.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-c.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-clike.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-coffeescript.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-core.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-cpp.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-crystal.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-csharp.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-csp.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-css-extras.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-css.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-d.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-dart.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-diff.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-django.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-docker.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-eiffel.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-elixir.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-elm.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-erlang.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-flow.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-fortran.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-fsharp.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-gherkin.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-git.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-glsl.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-go.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-graphql.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-groovy.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-haml.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-handlebars.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-haskell.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-haxe.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-hpkp.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-hsts.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-http.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-ichigojam.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-icon.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-inform7.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-ini.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-io.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-j.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-java.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-javascript.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-jolie.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-json.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-jsx.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-julia.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-keyman.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-kotlin.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-languages.json (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-latex.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-less.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-livescript.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-lolcode.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-lua.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-makefile.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-markdown.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-markup.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-matlab.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-mel.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-mizar.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-monkey.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-n4js.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-nasm.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-nginx.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-nim.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-nix.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-nsis.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-objectivec.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-ocaml.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-opencl.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-oz.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-parigp.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-parser.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-pascal.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-perl.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-php-extras.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-php.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-powershell.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-processing.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-prolog.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-properties.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-protobuf.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-pug.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-puppet.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-pure.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-python.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-q.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-qore.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-r.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-reason.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-renpy.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-rest.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-rip.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-roboconf.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-ruby.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-rust.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-sas.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-sass.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-scala.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-scheme.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-scss.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-smalltalk.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-smarty.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-sql.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-stylus.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-swift.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-tcl.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-textile.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-tsx.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-twig.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-typescript.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-vbnet.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-verilog.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-vhdl.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-vim.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-wiki.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-xeora.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-xojo.min.js (100%) rename dist/{v-1527758585938 => v-1528953702317}/prism/prism-yaml.min.js (100%) create mode 100644 dist/v-1528953702317/styles/theme-high-contrast.css create mode 100644 dist/v-1528953702317/styles/theme-material-design.css create mode 100644 dist/v-1528953702317/styles/theme-taiga.css rename dist/{v-1527758585938 => v-1528953702317}/svg/editor.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/icons/block-user.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/icons/multi-block-project.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/icons/project-limit.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/icons/team-question.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/logo-color.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/logo-moustache.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/logo-nav.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/logo.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/pattern.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/spinner-circle.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/spinner.svg (100%) rename dist/{v-1527758585938 => v-1528953702317}/svg/sprite.svg (100%) diff --git a/dist/conf.example.json b/dist/conf.example.json index b2a8b8a..ee0cc0c 100644 --- a/dist/conf.example.json +++ b/dist/conf.example.json @@ -19,5 +19,6 @@ "contribPlugins": [], "tribeHost": null, "importers": [], - "gravatar": true + "gravatar": true, + "rtlLanguages": ["fa"] } diff --git a/dist/images b/dist/images index f863f83..e3a8551 120000 --- a/dist/images +++ b/dist/images @@ -1 +1 @@ -./v-1527758585938/images \ No newline at end of file +./v-1528953702317/images \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index c22e3e5..cc0fc49 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1,5 +1,5 @@ - + @@ -8,14 +8,14 @@ Taiga - - + + - +
@@ -61,7 +61,7 @@
\n"}},a.directive("tgWikiWysiwyg",["$tgQueueModelTransformation","$rootScope","$tgConfirm","tgAttachmentsFullService","$tgQqueue","$tgRepo","$tgAnalytics","tgWikiHistoryService",r])}.call(this),function(){var t,e,r,n,i,o;o=this.taiga,n=this.taiga.mixOf,r=this.taiga.groupBy,e=this.taiga.bindOnce,i=angular.module("taigaWiki"),t=function(t,r,n,i,o,s,a,c,u){var l,p,h;return h=a.get("wiki/wiki-nav.html",!0),p=function(n,a,l){var p,f,d,g;return p=a.controller(),null==l.ngModel?r.error("WikiNavDirective: no ng-model attr is defined"):(f=n.project.my_permissions.indexOf("add_wiki_link")>-1,d=null,g=function(e){var r,l,m,v,y;return f=n.project.my_permissions.indexOf("add_wiki_link")>-1,r=n.project.my_permissions.indexOf("delete_wiki_link")>-1,l=h({wikiLinks:e,projectSlug:n.projectSlug,addWikiLinkPermission:f,deleteWikiLinkPermission:r}),l=c(l)(n),a.off(),f&&d&&d.destroy(),a.html(l),f&&(m=null,y=a.find(".sortable"),d=dragula([y[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:y[0],moves:function(t){return $(t).is("li")}}),d.on("dragend",function(t){var e;return m=$(t),t=m.scope().link,e=m.index(),n.$emit("wiki:links:move",t,e)}),v=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&d.dragging}})),a.on("click",".add-button",function(t){return t.preventDefault(),a.find(".new").removeClass("hidden"),a.find(".new input").focus(),a.find(".add-button").hide()}),a.on("click",".js-delete-link",function(e){var r,o,s,a;return e.preventDefault(),e.stopPropagation(),s=angular.element(e.currentTarget),r=s.parents(".wiki-link").data("id"),a=u.instant("WIKI.DELETE_LINK_TITLE"),o=n.wikiLinks[r].title,i.askOnDelete(a,o).then(function(e){return function(e){var o;return o=t.remove(n.wikiLinks[r]),o.then(function(){return o=p.loadWikiLinks(),o.then(function(){return e.finish(),g(n.wikiLinks)}),o.then(null,function(){return e.finish()})}),o.then(null,function(){return e.finish(!1),i.notify("error")})}}(this))}),a.on("keyup",".new input",function(e){var r,c,u,l;return e.preventDefault(),13===e.keyCode?(l=angular.element(e.currentTarget),c=l.val(),r=s().target(a.find(".new")).start(),u=t.create("wiki-links",{project:n.projectId,title:c}),u.then(function(){var t;return o.trackEvent("wikilink","create","create wiki link",1),t=p.loadWikiLinks(),t.then(function(){return r.finish(),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show(),g(n.wikiLinks)}),t.then(null,function(){return r.finish(),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show(),i.notify("error","Error loading wiki links")})}),u.then(null,function(t){var e;return r.finish(),a.find(".new input").val(c),a.find(".new input").focus().select(),null!=(null!=t&&null!=(e=t.__all__)?e[0]:void 0)?i.notify("error","The link already exists"):i.notify("error")})):27===e.keyCode?(l=angular.element(e.currentTarget),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show()):void 0})},e(n,l.ngModel,g))},l=function(t,e,r){return p(t,e,r),t.$on("$destroy",function(){return e.off()})},{link:l}},i.directive("tgWikiNav",["$tgRepo","$log","$tgLocation","$tgConfirm","$tgAnalytics","$tgLoading","$tgTemplate","$compile","$translate",t])}.call(this),function(){var t,e,r,n,i=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;n=this.taiga,e=this.taiga.mixOf,r=angular.module("taigaWiki"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.model=n,this.confirm=i,this.rs=o,this.params=s,this.q=a,this.navUrls=c,this.errorHandlingService=u,this.projectService=l,this.scope.projectSlug=this.params.pslug,this.scope.wikiSlug=this.params.slug,this.scope.sectionName="Wiki",this.scope.linksVisible=!1,p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return i(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgModel","$tgConfirm","$tgResources","$routeParams","$q","$tgNavUrls","tgErrorHandlingService","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_wiki_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadWikiPages=function(){var t;return t=this.rs.wiki.list(this.scope.projectId).then(function(t){return function(e){return t.scope.wikipages=e}}(this))},e.prototype.loadWikiLinks=function(){return this.rs.wiki.listLinks(this.scope.projectId).then(function(t){return function(e){var r,n,i,o,s;for(t.scope.wikiLinks=e,o=t.scope.wikiLinks,r=0,n=o.length;rt.total_memberships,this.scope.$emit("project:loaded",t),t},e.prototype.loadMembers=function(){var t;return t=this.getUrlFilters(),this.rs.memberships.list(this.scope.projectId,t).then(function(t){return function(e){return t.scope.memberships=_.filter(e.models,function(t){return null===t.user||t.is_user_active}),t.scope.page=e.current,t.scope.count=e.count,t.scope.paginatedBy=e.paginatedBy,e}}(this))},e.prototype.loadInitialData=function(){return this.loadProject(),this.q.all([this.loadMembers(),this.auth.refresh()])},e.prototype.getUrlFilters=function(){var t;return t=_.pick(this.location.search(),"page"),t.page||(t.page=1),t},e.prototype.addNewMembers=function(){return this.lightboxFactory.create("tg-lb-add-members",{"class":"lightbox lightbox-add-member",project:"project"},{project:this.scope.project})},e.prototype.showLimitUsersWarningMessage=function(){var t,e,r;return r=this.translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING"),e=this.translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING_MESSAGE",{members:this.scope.project.max_memberships}),t="/"+window._version+"/svg/icons/team-question.svg",this.confirm.success(r,e,{name:t,type:"img"})},e}(c(l.Controller,l.PageMixin,l.FiltersMixin)),u.controller("MembershipsController",t),e=function(t,e){var r,n,i;return i=t.get("admin/admin-membership-paginator.html",!0),n=function(t,r,n,o){var s,a,c,u,l,p,h;return a=2,l=4,c=2,u=2,s=r.find(".memberships-paginator"),p=function(){var e;return e=t.count/t.paginatedBy,e=parseInt(e,10)1,d.showNext=!(t.page===f),r=t.page,o=h=1,m=f;1<=m?h<=m:h>=m;o=1<=m?++h:--h)o===r+a&&f>r+a+u?g.push({classes:"dots",type:"dots"}):o===r-l&&r>c+l?g.push({classes:"dots",type:"dots"}):o>r+a&&o<=f-u||oc||(o===r?g.push({classes:"active",num:o,type:"page-active"}):g.push({classes:"page",num:o,type:"page"}));return n=i(d),n=e(n)(t),s.html(n),s.show()},t.$watch("memberships",function(t){if(t)return h()}),r.on("click",".memberships-paginator a.next",function(e){return e.preventDefault(),t.$apply(function(){return o.selectFilter("page",t.page+1),o.loadMembers()})}),r.on("click",".memberships-paginator a.previous",function(e){return e.preventDefault(),t.$apply(function(){return o.selectFilter("page",t.page-1),o.loadMembers()})}),r.on("click",".memberships-paginator li.page > a",function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=n.data("pagenum"),t.$apply(function(){return o.selectFilter("page",r),o.loadMembers()})})},r=function(t,e,r){var i;return i=e.controller(),n(t,e,r,i),t.$on("$destroy",function(){return e.off()})},{link:r}},u.directive("tgMemberships",["$tgTemplate","$compile",e]),i=function(t,e,r,n,i){var o,s;return s=e.get("admin/memberships-row-avatar.html",!0),o=function(e,o,a){var c,u,l;return u=r.instant("ADMIN.MEMBERSHIP.STATUS_PENDING"),l=function(t){var r,a,c;return r=i.getAvatar(t),a={full_name:t.full_name?t.full_name:"",email:t.user_email?t.user_email:t.email,imgurl:r.url,bg:r.bg,pending:t.is_user_active?"":u,isOwner:t.is_owner},c=s(a),c=n(c)(e),o.html(c)},null==a.tgMembershipsRowAvatar?t.error("MembershipsRowAvatarDirective: the directive need a member"):(c=e.$eval(a.tgMembershipsRowAvatar),l(c),e.$on("$destroy",function(){return o.off()}))},{link:o}},u.directive("tgMembershipsRowAvatar",["$log","$tgTemplate","$translate","$compile","tgAvatarService",i]),n=function(t,e,r,n,i){var o,s;return s=n.get("admin/admin-memberships-row-checkbox.html",!0),o=function(n,o,a){var c,u,l;return n.$on("$destroy",function(){return o.off()}),null==a.tgMembershipsRowAdminCheckbox?t.error("MembershipsRowAdminCheckboxDirective: the directive need a member"):(u=n.$eval(a.tgMembershipsRowAdminCheckbox),u.is_owner?void o.find(".js-check").remove():(l=function(t){var e,r;return e={inputId:"is-admin-"+t.id},r=s(e),r=i(r)(n),o.html(r)},o.on("click",":checkbox",function(t){return function(t){var n,i,s;return i=function(){return r.notify("success")},n=function(t){return u.revert(),o.find(":checkbox").prop("checked",u.is_admin),r.notify("error",t.is_admin[0])},s=angular.element(t.currentTarget),u.is_admin=s.prop("checked"),e.save(u).then(i,n)}}(this)),c=l(u),u.is_admin?o.find(":checkbox").prop("checked",!0):void 0))},{link:o}},u.directive("tgMembershipsRowAdminCheckbox",["$log","$tgRepo","$tgConfirm","$tgTemplate","$compile",n]),o=function(t,e,r){var n,i;return i=_.template(''),n=function(n,o,s){var a,c,u,l;return l=function(t){var e,r;return e={roleList:n.project.roles,selectedRole:t.role},r=i(e),o.html(r)},null==s.tgMembershipsRowRoleSelector?t.error("MembershipsRowRoleSelectorDirective: the directive need a member"):(a=o.controller(),u=n.$eval(s.tgMembershipsRowRoleSelector),c=l(u),o.on("change","select",function(t){return function(t){var n,i,o,s;if(o=function(){return r.notify("success")},i=function(){return r.notify("error")},s=angular.element(t.currentTarget),n=parseInt(s.val(),10),u.role!==n)return u.role=n,e.save(u).then(o,i)}}(this)),n.$on("$destroy",function(){return o.off()}))},{link:n}},u.directive("tgMembershipsRowRoleSelector",["$log","$tgRepo","$tgConfirm",o]),r=function(t,e,r,n,i,o,s,a,c,u){var l,p,h;return l='
\n
\n\n \n',h='\n\n\n \n',p=function(p,f,d){var g,m,v,y;return y=function(t){var e;return e=t.user?i(l)(p):i(h)(p),f.html(e)},null==d.tgMembershipsRowActions?t.error("MembershipsRowActionsDirective: the directive need a member"):(g=f.controller(),v=p.$eval(d.tgMembershipsRowActions),y(v),f.on("click",".js-resend",function(t){var e,i;return t.preventDefault(),i=function(){var t;return t=o.instant("ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION",{email:p.member.email}),n.notify("success",t)},e=function(){var t;return t=o.instant("ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION"),n.notify("error",t)},r.memberships.resendInvitation(p.member.id).then(i,e)}),m=function(){var t,r,i;return i=o.instant("ADMIN.MEMBERSHIP.DELETE_MEMBER"),t=o.instant("ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE",{email:v.email}),r=v.user?v.full_name:t,n.askOnDelete(i,r).then(function(t){var i,c;return c=function(e){return function(){var e;return t.finish(),v.user!==p.user.id?(p.page>1&&p.count-1<=p.paginatedBy&&g.selectFilter("page",p.page-1),u.fetchProject().then(function(){return g.loadInitialData()})):s.path(a.resolve("home")),e=o.instant("ADMIN.MEMBERSHIP.SUCCESS_DELETE",{message:r}),n.notify("success",e,null,5e3)}}(this),i=function(e){return function(){var e;return t.finish(!1),e=o.instant("ADMIN.MEMBERSHIP.ERROR_DELETE",{message:r}),n.notify("error",e)}}(this),e.remove(v).then(c,i)})},f.on("click",".delete",function(t){var e;return t.preventDefault(),p.project.owner.id===v.user?(e=p.user.id===v.user,c.create("tg-lightbox-leave-project-warning",{"class":"lightbox lightbox-leave-project-warning"},{isCurrentUser:e,project:p.project})):m()}),p.$on("$destroy",function(){return f.off()}))},{link:p}},u.directive("tgMembershipsRowActions",["$log","$tgRepo","$tgResources","$tgConfirm","$compile","$translate","$tgLocation","$tgNavUrls","tgLightboxFactory","tgProjectService",r]),s=function(){return{templateUrl:"admin/no-more-memberships-explanation.html",scope:{project:"="}}},u.directive("tgNoMoreMembershipsExplanation",[s])}.call(this),function(){var t,e;t=function(){var t;return t=function(t,e,r){var n;return n=r.tgAdminNavigation,e.find(".active").removeClass("active"),e.find("#adminmenu-"+n+" a").addClass("active"),t.$on("$destroy",function(){return e.off()})},{link:t}},e=angular.module("taigaAdmin"),e.directive("tgAdminNavigation",t)}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,$,I,E,T,C,P,w=function(t,e){function r(){this.constructor=t}for(var n in e)A.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},A={}.hasOwnProperty,O=function(t,e){return function(){return t.apply(e,arguments)}};T=this.taiga,$=this.taiga.mixOf,E=this.taiga.scopeDefer,P=this.taiga.trim,C=this.taiga.toString,k=this.taiga.joinStr,j=this.taiga.groupBy,b=this.taiga.bindOnce,S=this.taiga.debounce,I=angular.module("taigaAdmin"),v=function(t){function e(t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g){var m;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.appMetaService=u,this.translate=l,this.tgAuth=p,this.currentUserService=h,this.errorHandlingService=f,this.projectService=d,this.model=g,this.scope.project={},this.scope.projectTags=[],m=this.loadInitialData(),m.then(function(t){return function(){var e,r,n;return r=t.translate.instant(t.scope.sectionName),n=t.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:r,projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(n,e),t.fillUsersAndRoles(t.scope.project.members,t.scope.project.roles)}}(this)),m.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:loaded",function(t){return function(){var e,r,n;return r=t.translate.instant(t.scope.sectionName),n=t.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:r,projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(n,e)}}(this))}return w(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","$tgAuth","tgCurrentUserService","tgErrorHandlingService","tgProjectService","$tgModel"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t=this.model.make_model("projects",t),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.epicStatusList=_.sortBy(t.epic_statuses,"order"),this.scope.usStatusList=_.sortBy(t.us_statuses,"order"),this.scope.pointsList=_.sortBy(t.points,"order"),this.scope.taskStatusList=_.sortBy(t.task_statuses,"order"),this.scope.issueTypesList=_.sortBy(t.issue_types,"order"),this.scope.issueStatusList=_.sortBy(t.issue_statuses,"order"),this.scope.prioritiesList=_.sortBy(t.priorities,"order"),this.scope.severitiesList=_.sortBy(t.severities,"order"),E(this.scope,function(e){return function(){return e.scope.$emit("project:loaded",t)}}(this)),this.scope.projectTags=_.map(this.scope.project.tags,function(t){return function(e){return[e,t.scope.project.tags_colors[e]]}}(this)),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.tgAuth.refresh()},e.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.project)},e.prototype.addTag=function(t,e){var r;return r=_.clone(this.scope.project.tags),r.push(t),this.scope.projectTags.push([t,null]),this.scope.project.tags=r},e.prototype.deleteTag=function(t){var e;return e=_.clone(this.scope.project.tags),_.pull(e,t[0]),_.remove(this.scope.projectTags,function(e){return function(e){return e[0]===t[0]}}(this)),this.scope.project.tags=e},e}($(T.Controller,T.PageMixin)),I.controller("ProjectProfileController",v),y=function(t,e,r,n,i,o,s,a){var c;return c=function(c,u,l){var p,h,f,d;return p=u.controller(),h=u.find("form").checksley({onlyOneErrorElement:!0}),f=S(2e3,function(u){return function(u){var l,f,g;if(u.preventDefault(),h.validate())return l=r().target(d).start(),f=c.project.isAttributeModified("is_private"),g=t.save(c.project),g.then(function(){var t;return l.finish(),f&&c.project.is_private?a.trackEvent("project-privacy-changed","from-public-to-private","Change project privacy from public to private",1):f&&!c.project.is_private&&a.trackEvent("project-privacy-changed","from-private-to-public","Change project privacy from private to public",1),e.notify("success"),t=n.resolve("project-admin-project-profile-details",{project:c.project.slug}),i.path(t),o.fetchProject().then(function(t){return function(){return p.loadInitialData()}}(this)),s.loadProjects()}),g.then(null,function(t){if(l.finish(),h.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),d=u.find(".submit-button"),u.on("submit","form",f)},{link:c}},I.directive("tgProjectProfile",["$tgRepo","$tgConfirm","$tgLoading","$tgNavUrls","$tgLocation","tgProjectService","tgCurrentUserService","$tgAnalytics",y]),h=function(t,e,r){var n;return n=function(n,i,o){var s,a,c;return s=i.find("form").checksley({onlyOneErrorElement:!0}),a=S(2e3,function(i){return function(i){var o,a;if(i.preventDefault(),s.validate())return o=r().target(c).start(),a=t.save(n.project),a.then(function(){return o.finish(),e.notify("success")}),a.then(null,function(t){if(o.finish(),s.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),c=i.find(".submit-button"),i.on("submit","form",a),n.$on("$destroy",function(){return i.off()})},{link:n}},I.directive("tgProjectDefaultValues",["$tgRepo","$tgConfirm","$tgLoading",h]),m=function(t,e,r,n){var i;return i=function(r,i,o){var s;return s=function(o){return function(){var o,s;if(o=i.find("form").checksley(),o.initializeFields(),o.reset(),o.validate())return s=t.save(r.project),s.then(function(){return r.$emit("project:loaded",r.project),e.notify("success"),n.fetchProject()}),s.then(null,function(t){if(o.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this),i.on("change",".module-activation.module-direct-active input",function(t){return t.preventDefault(),r.$applyAsync(s)}),i.on("submit","form",function(t){return t.preventDefault(),s()}),i.on("click",".save",function(t){return t.preventDefault(),s()}),i.on("keydown",".videoconference-attributes input",function(t){return 32!==t.which}),r.$watch("project.videoconferences",function(t,e){if(null!=t&&null!=e&&t!==e)return r.project.videoconferences_extra_data=""}),r.$watch("isVideoconferenceActivated",function(t,e){if(t===!1&&(r.project.videoconferences=null,r.project.videoconferences_extra_data="",e===!0))return s()}),r.$watch("project",function(t){return null!=t.videoconferences?r.isVideoconferenceActivated=!0:r.isVideoconferenceActivated=!1})},{link:i}},I.directive("tgProjectModules",["$tgRepo","$tgConfirm","$tgLoading","tgProjectService",m]),f=function(t,e,r,n,i){var o;return o=function(o,s,a){var c,u,l,p,h,f,d,g,m,v,y,_,b,j,k,$,I,E,T,C,P,w,A,O,R,M; -return u=s.find(".admin-project-export-buttons"),E=function(){return u.removeClass("hidden")},p=function(){return u.addClass("hidden")},m=s.find(".admin-project-export-result"),A=function(){return m.removeClass("hidden")},h=function(){return m.addClass("hidden")},R=s.find(".spin"),O=function(){return R.removeClass("hidden")},f=function(){return R.addClass("hidden")},y=s.find(".result-title"),g=n.instant("ADMIN.PROJECT_EXPORT.LOADING_TITLE"),d=n.instant("ADMIN.PROJECT_EXPORT.LOADING_MESSAGE"),l=function(){return y.html(n.instant("ADMIN.PROJECT_EXPORT.DUMP_READY"))},c=function(){return y.html(n.instant("ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE"))},M=function(t){return y.html(n.instant("ADMIN.PROJECT_EXPORT.SYNC_MESSAGE",{url:t}))},k=function(){return y.html(g)},b=function(){return y.html(d)},I=function(){return y.html(l)},v=s.find(".result-message "),j=function(){return v.html(d)},_=function(){return v.html(c)},$=function(t){return v.html(M(t))},w=function(){return O(),k(),j(),p(),A()},C=function(){return f(),b(),_()},P=function(t){return f(),I(),$(t)},T=function(){return f(),h(),E()},s.on("click","a.button-export",S(2e3,function(s){return function(s){var a,c;return s.preventDefault(),c=function(e){var r;return i.trackEvent("exporter","export-project","Exported project",1),202===e.status?C():(r=e.data.url,P(r),t.open(r,"_blank"))},a=function(t){var e,i;return T(),e=n.instant("ADMIN.PROJECT_EXPORT.ERROR"),429===t.status?e=n.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY"):(null!=(i=t.data)?i._error_message:void 0)&&(e=n.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY",{message:t.data._error_message})),r.notify("error",e)},w(),e.projects["export"](o.projectId).then(c,a)}}(this)))},{link:o}},I.directive("tgProjectExport",["$window","$tgResources","$tgConfirm","$translate","$tgAnalytics",f]),i=function(t){function e(t,e,r,n,i,o){this.scope=t,this.rootscope=e,this.urls=r,this.confirm=n,this.rs=i,this.translate=o,this._generateUuid=O(this._generateUuid,this),this.setCsvUuid=O(this.setCsvUuid,this),this.rootscope.$on("project:loaded",this.setCsvUuid),this.scope.$watch("csvUuid",function(t){return function(e){return e?t.scope.csvUrl=t.urls.resolveAbsolute(t.type+"-csv",e):t.scope.csvUrl=""}}(this))}return w(e,t),e.$inject=["$scope","$rootScope","$tgUrls","$tgConfirm","$tgResources","$translate"],e.prototype.setCsvUuid=function(){return this.scope.csvUuid=this.scope.project[this.type+"_csv_uuid"]},e.prototype._generateUuid=function(t){var e;return null==t&&(t=null),e=this.rs.projects["regenerate_"+this.type+"_csv_uuid"](this.scope.projectId),e.then(function(t){return function(e){var r;return t.scope.csvUuid=null!=(r=e.data)?r.uuid:void 0}}(this)),e.then(null,function(t){return function(){return t.confirm.notify("error")}}(this)),e["finally"](function(){if(t)return t.finish()}),e},e.prototype.regenerateUuid=function(){var t,e;return this.scope.csvUuid?(e=this.translate.instant("ADMIN.REPORTS.REGENERATE_TITLE"),t=this.translate.instant("ADMIN.REPORTS.REGENERATE_SUBTITLE"),this.confirm.ask(e,t).then(this._generateUuid)):this._generateUuid()},e}(T.Controller),o=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="epics",e}(i),c=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="userstories",e}(i),a=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="tasks",e}(i),s=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="issues",e}(i),I.controller("CsvExporterEpicsController",o),I.controller("CsvExporterUserstoriesController",c),I.controller("CsvExporterTasksController",a),I.controller("CsvExporterIssuesController",s),n=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_EPIC"},{controller:"CsvExporterEpicsController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvEpic",["$translate",n]),p=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_US"},{controller:"CsvExporterUserstoriesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvUs",["$translate",p]),l=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_TASK"},{controller:"CsvExporterTasksController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvTask",["$translate",l]),u=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_ISSUE"},{controller:"CsvExporterIssuesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvIssue",["$translate",u]),d=function(t,e,r,n){var i;return i=function(t,i,o){var s,a,c;return c=function(){return i.find(".size-info").addClass("active")},a=function(r){var o;return o=e.make_model("projects",r.data),t.project=o,i.find(".loading-overlay").removeClass("active"),n.notify("success")},s=function(t){return 413===t.status&&c(),i.find(".loading-overlay").removeClass("active"),n.notify("error",t.data._error_message)},i.on("click",".js-change-logo",function(){return i.find("#logo-field").click()}),i.on("change","#logo-field",function(e){if(t.logoAttachment)return i.find(".loading-overlay").addClass("active"),r.projects.changeLogo(t.project.id,t.logoAttachment).then(a,s)}),i.on("click","a.js-use-default-logo",function(e){return i.find(".loading-overlay").addClass("active"),r.projects.removeLogo(t.project.id).then(a,s)}),t.$on("$destroy",function(){return i.off()})},{link:i}},I.directive("tgProjectLogo",["$tgAuth","$tgModel","$tgResources","$tgConfirm",d]),g=function(t){var e;return e=function(e,r,n){var i,o;return i=t(n.tgProjectLogoModel),o=i.assign,r.bind("change",function(){return e.$apply(function(){return o(e,r[0].files[0])})})},{link:e}},I.directive("tgProjectLogoModel",["$parse",g]),r=function(){return{scope:{project:"="},templateUrl:"admin/admin-project-restrictions.html"}},I.directive("tgAdminProjectRestrictions",[r]),e=function(t){return{link:function(e){return e.requestOwnership=function(){return t.create("tg-lb-request-ownership",{"class":"lightbox lightbox-request-ownership"},{projectId:e.projectId})}},scope:{projectId:"=",owner:"="},templateUrl:"admin/admin-project-request-ownership.html"}},I.directive("tgAdminProjectRequestOwnership",["tgLightboxFactory",e]),t=function(t){return{link:function(e){return e.changeOwner=function(){return t.create("tg-lb-change-owner",{"class":"lightbox lightbox-select-user","project-id":"projectId","active-users":"activeUsers","current-owner-id":"currentOwnerId"},{projectId:e.projectId,activeUsers:e.activeUsers,currentOwnerId:e.owner.id,members:e.members})}},scope:{activeUsers:"=",projectId:"=",owner:"=",members:"="},templateUrl:"admin/admin-project-change-owner.html"}},I.directive("tgAdminProjectChangeOwner",["tgLightboxFactory",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,I,E=function(t,e){function r(){this.constructor=t}for(var n in e)T.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},T={}.hasOwnProperty,C=function(t,e){return function(){return t.apply(e,arguments)}};j=this.taiga,b=this.taiga.mixOf,I=this.taiga.trim,k=this.taiga.toString,y=this.taiga.joinStr,v=this.taiga.groupBy,d=this.taiga.bindOnce,g=this.taiga.debounce,m=this.taiga.getDefaulColorList,S=angular.module("taigaAdmin"),u=function(t){function e(t,e,r,n,i,o,s,a,c,u,l,p,h){var f,d,g;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.appMetaService=u,this.translate=l,this.errorHandlingService=p,this.projectService=h,this.scope.project={},this.loadInitialData(),d=this.translate.instant(this.scope.sectionName),g=this.translate.instant("ADMIN.PROJECT_VALUES.PAGE_TITLE",{sectionName:d,projectName:this.scope.project.name}),f=this.scope.project.description,this.appMetaService.setAll(g,f)}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgErrorHandlingService","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){var t;return t=this.loadProject()},e}(b(j.Controller,j.PageMixin)),S.controller("ProjectValuesSectionController",u),a=function(t){function e(t,e,r,n,i){var o;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.moveValue=C(this.moveValue,this),this.loadValues=C(this.loadValues,this),this.scope.$on("admin:project-values:move",this.moveValue),o=this.scope.$watch("resource",function(t){return function(e){if(e)return t.loadValues(),o()}}(this))}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources"],e.prototype.loadValues=function(){return this.rs[this.scope.resource].listValues(this.scope.projectId,this.scope.type).then(function(t){return function(e){return t.scope.values=e,t.scope.maxValueOrder=_.maxBy(e,"order").order,e}}(this))},e.prototype.moveValue=function(t,e,r){var n,i;return i=this.scope.values,n=i.indexOf(e),i.splice(n,1),i.splice(r,0,e),_.each(i,function(t,e){return t.order=e}),this.repo.saveAll(i)},e}(j.Controller),S.controller("ProjectValuesController",a),c=function(t,e,r,n,i,o,s,a){var c,u,l;return u=function(t,e,r){var n,i,o,s,a,c;return s=null,o=null,i=null,c=e.find(".sortable"),n=dragula([c[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:c[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),n.on("dragend",function(e){var r,n;return i=$(e),n=i.scope().value,r=i.index(),t.$broadcast("admin:project-values:move",n,r)}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&n.dragging}}),t.$on("$destroy",function(){return e.off(),n.destroy()})},l=function(t,n,i){var c,u,l,p,h,f,d,m,v;return c=n.controller(),v=i.type,f=i.objname,p=function(){return t.newValue={name:"",is_closed:!1,is_archived:!1}},h=function(){return t.addNewElementText=o.instant("ADMIN.PROJECT_VALUES_"+f.toUpperCase()+".ACTION_ADD")},p(),h(),s.$on("$translateChangeEnd",function(){return t.$evalAsync(h)}),l=function(t){return function(t){var e;if(null==t&&(t=!1),e=n.find(".table-main"),$(document.body).scrollTop(e.offset().top+e.height()),t)return n.find(".new-value input:visible").first().focus()}}(this),m=function(t){var r,n,i,o;if(n=t.parents("form"),r=n.checksley(),r.validate())return o=n.scope().value,i=e.save(o),i.then(function(e){return function(){var e;return e=t.parents(".row.table-main"),e.addClass("hidden"),e.siblings(".visualization").removeClass("hidden"),a.fetchProject()}}(this)),i.then(null,function(t){return r.setErrors(t)})},d=function(r){var n,i,o;if(i=r.parents("form"),n=i.checksley(),n.validate())return t.newValue.project=t.project.id,t.newValue.order=t.maxValueOrder?t.maxValueOrder+1:1,o=e.create(v,t.newValue),o.then(function(e){return function(e){return r.addClass("hidden"),t.values.push(e),t.maxValueOrder=e.order,p()}}(this)),o.then(null,function(t){return n.setErrors(t)})},u=function(e){var r,n,i;return n=e.parents(".row.table-main"),r=e.parents("form"),i=r.scope().value,t.$apply(function(){return n.addClass("hidden"),i.revert(),n.siblings(".visualization").removeClass("hidden")})},n.on("click",".show-add-new",function(t){return t.preventDefault(),n.find(".new-value").removeClass("hidden"),l(!0)}),n.on("click",".add-new",g(2e3,function(t){var e;return t.preventDefault(),e=n.find(".new-value"),d(e)})),n.on("click",".delete-new",function(t){return t.preventDefault(),n.find(".new-value").addClass("hidden"),p()}),n.on("click",".edit-value",function(t){var e,r,n;return t.preventDefault(),n=angular.element(t.currentTarget),r=n.parents(".row.table-main"),r.addClass("hidden"),e=r.siblings(".edition"),e.removeClass("hidden"),e.find("input:visible").first().focus().select()}),n.on("keyup",".new-value input",function(t){var e;return 13===t.keyCode?(e=n.find(".new-value"),d(e)):27===t.keyCode?(n.find(".new-value").addClass("hidden"),p()):void 0}),n.on("click",".save",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),m(e)}),n.on("click",".cancel",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),u(e)}),n.on("click",".delete-value",function(n){var i,s,a,u,l,p,h;return n.preventDefault(),u=angular.element(n.currentTarget),s=u.parents("form"),h=s.scope().value,i={},_.each(t.values,function(t){if(h.id!==t.id)return i[t.id]=t.name}),a=h.name,0===_.keys(i).length?r.error(o.instant("ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL")):(p=o.instant("ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE"),l=o.instant("ADMIN.PROJECT_VALUES.REPLACEMENT"),r.askChoice(p,a,i,l).then(function(t){var n,i;return i=function(){return c.loadValues()["finally"](function(){return t.finish()})},n=function(){return r.notify("error")},e.remove(h,{moveTo:t.selected}).then(i,n)}))})},c=function(t,e,r){return u(t,e,r),l(t,e,r),t.$on("$destroy",function(){return e.off()})},{link:c}},S.directive("tgProjectValues",["$log","$tgRepo","$tgConfirm","$tgLocation","animationFrame","$translate","$rootScope","tgProjectService",c]),t=function(){var t;return t=function(t,e,r,n){var i;return t.colorList=m(),t.allowEmpty=!1,r.tgAllowEmpty&&(t.allowEmpty=!0),i=e.controller(),t.$watch(r.ngModel,function(e){return t.color=e.color}),e.on("click",".current-color",function(t){var r,n;return t.preventDefault(),t.stopPropagation(),n=angular.element(t.currentTarget),$(".select-color").hide(),n.siblings(".select-color").show(),r=angular.element("body"),r.on("click",function(t){return function(t){if(0===angular.element(t.target).parent(".select-color").length)return e.find(".select-color").hide(),r.unbind("click")}}(this))}),e.on("click",".select-color .color",function(r){var i;return r.preventDefault(),i=angular.element(r.currentTarget),t.$apply(function(){return n.$modelValue.color=i.data("color")}),e.find(".select-color").hide()}),e.on("click",".select-color .selected-color",function(r){return r.preventDefault(),t.$apply(function(){return n.$modelValue.color=t.color}),e.find(".select-color").hide()}),e.on("keyup","input",function(r){return r.stopPropagation(),13===r.keyCode?(t.$apply(function(){return n.$modelValue.color=t.color}),e.find(".select-color").hide()):27===r.keyCode?e.find(".select-color").hide():void 0}),t.$on("$destroy",function(){return e.off()})},{link:t,require:"ngModel"}},S.directive("tgColorSelection",t),p="text",r="multiline",l="richtext",e="date",f="url",h=[{key:p,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT"},{key:r,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI"},{key:l,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT"},{key:e,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE"},{key:f,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL"}],n=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p,f,d;this.scope=t,this.rootscope=e,this.repo=r,this.rs=n,this.params=i,this.q=o,this.location=s,this.navUrls=a,this.appMetaService=c,this.translate=u,this.projectService=l,this.moveCustomAttributes=C(this.moveCustomAttributes,this),this.deleteCustomAttribute=C(this.deleteCustomAttribute,this),this.saveCustomAttribute=C(this.saveCustomAttribute,this),this.createCustomAttribute=C(this.createCustomAttribute,this),this.loadCustomAttributes=C(this.loadCustomAttributes,this),this.scope.TYPE_CHOICES=h,this.scope.project=this.projectService.project.toJS(),this.scope.projectId=this.scope.project.id,f=this.translate.instant(this.scope.sectionName),d=this.translate.instant("ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE",{sectionName:f,projectName:this.scope.project.name}),p=this.scope.project.description,this.appMetaService.setAll(d,p),this.scope.init=function(t){return function(e){return t.scope.type=e,t.loadCustomAttributes()}}(this)}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadCustomAttributes=function(){return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then(function(t){return function(e){var r;return t.scope.customAttributes=e,t.scope.maxOrder=null!=(r=_.maxBy(e,"order"))?r.order:void 0,e}}(this))},e.prototype.createCustomAttribute=function(t){return this.repo.create("custom-attributes/"+this.scope.type,t)},e.prototype.saveCustomAttribute=function(t){return this.repo.save(t)},e.prototype.deleteCustomAttribute=function(t){return this.repo.remove(t)},e.prototype.moveCustomAttributes=function(t,e){var r,n;return r=this.scope.customAttributes,n=r.indexOf(t),r.splice(n,1),r.splice(e,0,t),_.each(r,function(t,e){return t.order=e}),this.repo.saveAll(r)},e}(b(j.Controller,j.PageMixin)),S.controller("ProjectCustomAttributesController",n),i=function(t,e,r,n){var i;return i=function(t,r,i){var o,s,a,c,u,l,p,h,f,d,m,v,y,_,b,S,j,k;return o=r.controller(),t.$on("$destroy",function(){return r.off()}),j=r.find(".js-sortable"),l=dragula([j[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:j[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),l.on("dragend",function(t){var e,r,n;return r=$(t),e=r.scope().attr,n=r.index(),o.moveCustomAttributes(e,n)}),b=function(){return r.find(".js-new-custom-field").removeClass("hidden"),r.find(".js-new-custom-field input:visible").first().focus()},f=function(){return r.find(".js-new-custom-field").addClass("hidden")},y=function(){return r.find(".js-add-custom-field-button").removeClass("hidden")},p=function(){return r.find(".js-add-custom-field-button").addClass("hidden")},_=function(){return r.find(".js-cancel-new-custom-field-button").removeClass("hidden")},h=function(){return r.find(".js-cancel-new-custom-field-button").addClass("hidden")},m=function(){return t.newAttr={}},c=function(r){var n,i,s,a;if(i=r.checksley(),i.validate())return a=function(t){return function(){return o.loadCustomAttributes(),f(),m(),e.notify("success")}}(this),s=function(t){return function(t){return i.setErrors(t)}}(this),n=t.newAttr,n.project=t.projectId,n.order=t.maxOrder?t.maxOrder+1:1,o.createCustomAttribute(n).then(a,s)},s=function(){return f(),m()},t.$watch("customAttributes",function(t){if(t)return 0===t.length?(h(),p(),b()):(f(),y(),_())}),r.on("click",".js-add-custom-field-button",function(t){return t.preventDefault(),b()}),r.on("click",".js-create-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),c(e)})),r.on("click",".js-cancel-new-custom-field-button",function(t){return t.preventDefault(),s()}),r.on("keyup",".js-new-custom-field input",function(t){var e,r;return 13===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),c(e)):27===t.keyCode?s():void 0}),S=function(t){return t.find(".js-view-custom-field").addClass("hidden"),t.find(".js-edit-custom-field").removeClass("hidden"),t.find(".js-edit-custom-field input:visible").first().focus().select()},d=function(t){return t.find(".js-edit-custom-field").addClass("hidden"),t.find(".js-view-custom-field").removeClass("hidden")},v=function(e){return t.$apply(function(){return e.scope().attr.revert()})},k=function(t){var r,n,i,s;if(n=t.checksley(),n.validate())return s=function(r){return function(){return o.loadCustomAttributes(),d(t),e.notify("success")}}(this),i=function(t){return function(t){return n.setErrors(t)}}(this),r=t.scope().attr,o.saveCustomAttribute(r).then(s,i)},a=function(t){return d(t),v(t)},r.on("click",".js-edit-custom-field-button",function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),S(e)}),r.on("click",".js-update-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),k(e)})),r.on("click",".js-cancel-edit-custom-field-button",function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),a(e)}),r.on("keyup",".js-edit-custom-field input",function(t){var e,r;return 13===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),k(e)):27===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),a(e)):void 0}),u=function(t){var r,i,s,a;return r=t.scope().attr,i=r.name,a=n.instant("COMMON.CUSTOM_ATTRIBUTES.DELETE"),s=n.instant("COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE"),e.ask(a,s,i).then(function(t){var n,s;return s=function(){return o.loadCustomAttributes()["finally"](function(){return t.finish()})},n=function(){return e.notify("error",null,"We have not been able to delete '"+i+"'.")},o.deleteCustomAttribute(r).then(s,n)})},r.on("click",".js-delete-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),u(e)}))},{link:i}},S.directive("tgProjectCustomAttributes",["$log","$tgConfirm","animationFrame","$translate",i]),o=function(t){function e(t,e,r,n,i,o,s){this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.model=o,this.projectService=s,this.mixingClass=C(this.mixingClass,this),this.cancelMixingTags=C(this.cancelMixingTags,this),this.confirmMixingTags=C(this.confirmMixingTags,this),this.toggleMixingFromTags=C(this.toggleMixingFromTags,this),this.startMixingTags=C(this.startMixingTags,this),this.deleteTag=C(this.deleteTag,this),this.editTag=C(this.editTag,this),this.createTag=C(this.createTag,this),this.filterAndSortTags=C(this.filterAndSortTags,this),this.loadTags=C(this.loadTags,this),this.loading=!0,this.loadTags()}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$tgModel","tgProjectService"],e.prototype.loadTags=function(){var t;return t=this.projectService.project.toJS(),this.rs.projects.tagsColors(t.id).then(function(t){return function(e){return t.scope.projectTagsAll=_.map(e.getAttrs(),function(e,r){return t.model.make_model("tag",{name:r,color:e})}),t.filterAndSortTags(),t.loading=!1}}(this))},e.prototype.filterAndSortTags=function(){return this.scope.projectTags=_.sortBy(this.scope.projectTagsAll,function(t){return t.name.toLowerCase()}),this.scope.projectTags=_.filter(this.scope.projectTags,function(t){return function(e){return e.name.indexOf(t.scope.tagsFilter.name)!==-1}}(this))},e.prototype.createTag=function(t,e){return this.rs.projects.createTag(this.scope.projectId,t,e)},e.prototype.editTag=function(t,e,r){return t===e&&(e=null),this.rs.projects.editTag(this.scope.projectId,t,e,r)},e.prototype.deleteTag=function(t){return this.scope.loadingDelete=!0,this.rs.projects.deleteTag(this.scope.projectId,t)["finally"](function(t){return function(){return t.scope.loadingDelete=!1}}(this))},e.prototype.startMixingTags=function(t){return this.scope.mixingTags.toTag=t.name},e.prototype.toggleMixingFromTags=function(t){var e;if(t.name!==this.scope.mixingTags.toTag)return e=this.scope.mixingTags.fromTags.indexOf(t.name),e===-1?this.scope.mixingTags.fromTags.push(t.name):this.scope.mixingTags.fromTags.splice(e,1)},e.prototype.confirmMixingTags=function(){var t,e;return e=this.scope.mixingTags.toTag,t=this.scope.mixingTags.fromTags,this.scope.loadingMixing=!0,this.rs.projects.mixTags(this.scope.projectId,e,t).then(function(t){return function(){return t.cancelMixingTags(),t.loadTags()}}(this))["finally"](function(t){return function(){return t.scope.loadingMixing=!1}}(this))},e.prototype.cancelMixingTags=function(){return this.scope.mixingTags.toTag=null,this.scope.mixingTags.fromTags=[]},e.prototype.mixingClass=function(t){if(null!==this.scope.mixingTags.toTag){if(t.name===this.scope.mixingTags.toTag)return"mixing-tags-to";if(this.scope.mixingTags.fromTags.indexOf(t.name)!==-1)return"mixing-tags-from"}},e}(j.Controller),S.controller("ProjectTagsController",o),s=function(t,e,r,n,i,o,s){var a;return a=function(t,e,n){var i,a,c,u,l,p,h,f,d,m,v,y;return a=$(window),i=e.controller(),y=n.type,d=n.objname,p=function(){return t.newValue={tag:"",color:""}},h=function(){return t.tagsFilter={name:""}},l=function(){return t.mixingTags={toTag:null,fromTags:[]}},f=function(){return t.addNewElementText=o.instant("ADMIN.PROJECT_VALUES_TAGS.ACTION_ADD")},p(),h(),l(),f(),s.$on("$translateChangeEnd",function(){return t.$evalAsync(f)}),u=function(t){return function(t){var r;if(null==t&&(t=!1),r=e.find(".table-main"),$(document.body).scrollTop(r.offset().top+r.height()),t)return e.find(".new-value input:visible").first().focus()}}(this),v=function(e){return function(e){var r,n,o,s,a;if(n=e.parents("form"),r=n.checksley(),r.validate())return a=n.scope().tag,o=a.clone(),o.revert(),t.loadingEdit=!0,s=i.editTag(o.name,a.name,a.color),s.then(function(){return i.loadTags().then(function(){var r;return r=e.parents(".row.table-main"),r.addClass("hidden"),t.loadingEdit=!1,r.siblings(".visualization").removeClass("hidden")})}),s.then(null,function(e){return t.loadingEdit=!1,r.setErrors(e.data)})}}(this),m=function(e){return function(e){var r,n,o;if(n=e.parents("form"),n=e,r=n.checksley(),r.validate())return t.loadingCreate=!0,o=i.createTag(t.newValue.tag,t.newValue.color),o.then(function(r){return i.loadTags().then(function(){return t.loadingCreate=!1,e.addClass("hidden"),p()})}),o.then(null,function(e){return t.loadingCreate=!1,r.setErrors(e.data)})}}(this),c=function(e){var r,n,i;return n=e.parents(".row.table-main"),r=e.parents("form"),i=r.scope().tag,t.$apply(function(){return n.addClass("hidden"),i.revert(),n.siblings(".visualization").removeClass("hidden")})},t.$watch("tagsFilter.name",function(t){return i.filterAndSortTags()}),a.on("keyup",function(e){if(27===e.keyCode)return t.$apply(function(){return l()})}),e.on("click",".show-add-new",function(t){return t.preventDefault(),e.find(".new-value").removeClass("hidden")}),e.on("click",".add-new",g(2e3,function(t){var r;return t.preventDefault(),r=e.find(".new-value"),m(r)})),e.on("click",".delete-new",function(t){return t.preventDefault(),e.find(".new-value").addClass("hidden"),p()}),e.on("click",".mix-tags",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return i.startMixingTags(r.parents("form").scope().tag)})}),e.on("click",".mixing-row",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return i.toggleMixingFromTags(r.parents("form").scope().tag)})}),e.on("click",".mixing-confirm",function(e){return e.preventDefault(),e.stopPropagation(),t.$apply(function(){return i.confirmMixingTags()})}),e.on("click",".mixing-cancel",function(e){return e.preventDefault(),e.stopPropagation(),t.$apply(function(){return i.cancelMixingTags()})}),e.on("click",".edit-value",function(t){var e,r,n;return t.preventDefault(),n=angular.element(t.currentTarget),r=n.parents(".row.table-main"),r.addClass("hidden"),e=r.siblings(".edition"),e.removeClass("hidden"),e.find("input:visible").first().focus().select()}),e.on("keyup",".new-value input",function(t){var r;return 13===t.keyCode?(r=e.find(".new-value"),m(r)):27===t.keyCode?(e.find(".new-value").addClass("hidden"),p()):void 0}),e.on("keyup",".status-name input",function(t){var e;return e=angular.element(t.currentTarget),13===t.keyCode?v(e):27===t.keyCode?c(e):void 0}),e.on("click",".save",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),v(e)}),e.on("click",".cancel",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),c(e)}),e.on("click",".delete-tag",function(t){var e,n,s,a;return t.preventDefault(),s=angular.element(t.currentTarget),e=s.parents("form"),n=e.scope().tag,a=o.instant("ADMIN.COMMON.TITLE_ACTION_DELETE_TAG"),r.askOnDelete(a,n.name).then(function(t){var e,o;return o=function(){return i.loadTags()["finally"](function(){return t.finish()})},e=function(){return r.notify("error")},i.deleteTag(n.name).then(o,e)})}),t.$on("$destroy",function(){return e.off(),a.off()})},{link:a}},S.directive("tgProjectTags",["$log","$tgRepo","$tgConfirm","$tgLocation","animationFrame","$translate","$rootScope",s])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){return function(){return t.apply(e,arguments)}},h=function(t,e){function r(){this.constructor=t}for(var n in e)f.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},f={}.hasOwnProperty,d=[].indexOf||function(t){for(var e=0,r=this.length;e\n
\n
<%- category.activePermissions %>/<%- category.permissions.length %>
\n <% _.each(category.permissions, function(permission) { %>\n
\n <% }) %>\n
\n'),o=_.template('
\n
\n
\n
\n
\n <% _.each(category.permissions, function(permission) { %>\n
\n \n
\n disabled="disabled" <% } %>\n <% if(permission.active) { %> checked="checked" <% } %>/>\n
\n \n \n
\n
\n <% }) %>\n
\n
\n
'),i=_.template('
'),a=function(a,u,l){var p,h,f,g,m;return p=u.controller(),h=function(t){var e,r,n,i,o,s,c,u,l,p;return s=function(e){return _.map(e,function(e){var r;return _.extend({},e,{active:(r=e.key,d.call(t.permissions,r)>=0)})})},n=function(t,e,r){return!(e.external_user&&!r.is_private&&0===t.key.indexOf("view_"))},c=function(e){return _.map(e,function(e){return e.permissions=e.permissions.map(function(e){return e.editable=n(e,t,a.project),e}),_.extend({},e,{activePermissions:_.filter(e.permissions,"active").length})})},e=[],r=[{key:"view_epics",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.VIEW_EPICS"},{key:"add_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.ADD_EPICS"},{key:"modify_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.MODIFY_EPICS"},{key:"comment_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.COMMENT_EPICS"},{key:"delete_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.DELETE_EPICS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.EPICS.NAME",permissions:s(r)}),o=[{key:"view_milestones",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS"},{key:"add_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS"},{key:"modify_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS"},{key:"delete_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME",permissions:s(o)}),l=[{key:"view_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES"},{key:"add_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES"},{key:"modify_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES"},{key:"comment_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.COMMENT_USER_STORIES"},{key:"delete_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME",permissions:s(l)}),u=[{key:"view_tasks",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS"},{key:"add_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS"},{key:"modify_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS"},{key:"comment_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.COMMENT_TASKS"},{key:"delete_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME",permissions:s(u)}),i=[{key:"view_issues",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES"},{key:"add_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES"},{key:"modify_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES"},{key:"comment_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.COMMENT_ISSUES"},{key:"delete_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME",permissions:s(i)}),p=[{key:"view_wiki_pages",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES"},{key:"add_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES"},{key:"modify_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES"},{key:"delete_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES"},{key:"view_wiki_links",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS"},{key:"add_wiki_link",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS"},{key:"delete_wiki_link",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME",permissions:s(p)}),c(e)},m=function(t,e){return t.find(".resume").html(n(c({category:e}))(a))},f=function(t,e){var r;return r=o({category:t,index:e}),r=angular.element(r),m(r,t),n(r)(a)},g=function(){var n;return u.off(),n=i(),_.each(h(a.role),function(t,e){return n=angular.element(n).append(f(t,e))}),u.html(n),u.on("click",".resume",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),e.toggleClass("open-drawer"),e.next().toggleClass("open")}),u.on("change",".category-item input",function(n){var i,o,s,c;return i=function(){var t;return t=_.filter(u.find(".category-item input"),function(t){return angular.element(t).is(":checked")}),t=_.sortBy(_.map(t,function(t){var e;return e=angular.element(t).parents(".category-item").data("id")})),t.length&&t.push("view_project"),t},c=angular.element(n.currentTarget),a.role.permissions=i(),s=function(){var e,n;return e=h(a.role),n=c.parents(".category-config").data("id"),m(c.parents(".category-config"),e[n]),t.$broadcast("projects:reload"),r.notify("success"),p.forceLoadProject()},o=function(){return r.notify("error"),c.prop("checked",!c.prop("checked")),a.role.permissions=i()},a.role.external_user?(a.project.public_permissions=a.role.permissions,a.project.anon_permissions=a.role.permissions.filter(function(t){return 0===t.indexOf("view_")}),e.save(a.project).then(s,o)):e.save(a.role).then(s,o)})},a.$on("$destroy",function(){return u.off()}),a.$on("role:changed",function(){return g()}),s(a,l.ngModel,g)},{link:a}},u.directive("tgRolePermissions",["$rootScope","$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b=function(t,e){function r(){this.constructor=t}for(var n in e)S.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},S={}.hasOwnProperty;v=this.taiga,g=this.taiga.mixOf,f=this.taiga.bindMethods,d=this.taiga.debounce,y=this.taiga.timeout,m=angular.module("taigaAdmin"),h=function(t){function e(t,e,r,n,i,o,s,a,c,u){var l;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.location=i,this.navUrls=o,this.appMetaService=s,this.translate=a,this.errorHandlingService=c,this.projectService=u,f(this),this.scope.sectionName="ADMIN.WEBHOOKS.SECTION_NAME",this.scope.project={},l=this.loadInitialData(),l.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.WEBHOOKS.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),l.then(null,this.onInitialDataError.bind(this)),this.scope.$on("webhooks:reload",this.loadWebhooks)}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgErrorHandlingService","tgProjectService"],e.prototype.loadWebhooks=function(){return this.rs.webhooks.list(this.scope.projectId).then(function(t){return function(e){return t.scope.webhooks=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadWebhooks()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("WebhooksController",h),p=function(t,e,r,n,i){var o;return o=function(n,o,s){var a,c,u,l,p,h,f,g;return g=n.$eval(s.tgWebhook),h=function(){var e;return e=i.instant("ADMIN.WEBHOOKS.DATE"),t.webhooklogs.list(g.id).then(function(t){return function(t){var r,n,i,o;for(r=0,n=t.length;r=1)return a.addClass("hidden")})}),s.on("click",function(t){return a.removeClass("hidden"),a.find("input")[0].focus()})},{link:o}},m.directive("tgNewWebhook",["$tgResources","$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",c]),r=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GITHUB.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GITHUB.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"github").then(function(t){return function(e){return t.scope.github=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("GithubController",r),i=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GITLAB.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GITLAB.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(t){return function(){return t.loadModules()}}(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"gitlab").then(function(t){return function(e){return t.scope.gitlab=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("GitlabController",i),t=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.BITBUCKET.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.BITBUCKET.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(t){return function(){return t.loadModules()}}(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"bitbucket").then(function(t){return function(e){return t.scope.bitbucket=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("BitbucketController",t),u=function(){var t;return t=function(t,e,r){return e.on("click",".select-input-content",function(){return e.find("input").select(),e.find(".help-copy").addClass("visible")})},{link:t}},m.directive("tgSelectInputText",u),n=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.github,"github"),c.then(function(){return n.trackEvent("github-webhook","created-or-changed","Create or changed github webhook",1),s.finish(),e.notify("success")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgGithubWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",n]),o=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.gitlab,"gitlab"),c.then(function(){return n.trackEvent("gitlab-webhook","created-or-changed","Create or changed gitlab webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgGitlabWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",o]),e=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.bitbucket,"bitbucket"),c.then(function(){return n.trackEvent("bitbucket-webhook","created-or-changed","Create or changed bitbucket webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgBitbucketWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",e]),l=function(){var t;return t=function(t,e,r,n){return n.$parsers.push(function(t){return t=$.trim(t),""===t?[]:t.split(",")})},{link:t,restrict:"EA",require:"ngModel"}},m.directive("tgValidOriginIps",l),s=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GOGS.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GOGS.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"gogs").then(function(t){return function(e){return t.scope.gogs=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),a=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.gogs,"gogs"),c.then(function(){return n.trackEvent("gogs-webhook","create-or-change","Create or change gogs webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c),o.on("click",".submit-button",c)},{link:i}},m.controller("GogsController",s),m.directive("tgGogsWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",a])}.call(this),function(){var t,e,r,n,i,o;i=this.taiga,e=this.taiga.bindOnce,o=this.taiga.timeout,r=this.taiga.debounce,n=angular.module("taigaProject"),t=function(t,e,r,n,i,o,s,a,c,u){var l;return l=function(r,l,p){var h,f;return h=null,r.$on("deletelightbox:new",function(t,e){return s.open(l),h=e}),r.$on("$destroy",function(){return l.off()}),f=function(){var r;return a.start(),s.close(l),r=t.remove(h),r.then(function(t){return u.trackEvent("projects","delete","Delete project",1),a.pageLoaded(),e.$broadcast("projects:reload"),n.path(i.resolve("home")),o.notify("success"),c.loadProjects()}),r.then(null,function(){return o.notify("error"),s.close(l)})},l.on("click",".button-red",function(t){return t.preventDefault(),s.close(l)}),l.on("click",".button-green",function(t){return t.preventDefault(),f()})},{link:l}},n.directive("tgLbDeleteProject",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","$tgConfirm","lightboxService","tgLoader","tgCurrentUserService","$tgAnalytics",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l;u=this.taiga.bindOnce,r=function(){var t;return t=function(t,e,r){return u(t,r.tgBoBind,function(t){return e.text(t)})},{link:t}},i=function(){var t;return t=function(t,e,r){return u(t,r.tgBoHtml,function(t){return e.html(t)})},{link:t}},o=function(){var t;return t=function(t,e,r){return u(t,r.tgBoRef,function(t){return e.html("#"+t+" ")})},{link:t}},s=function(){var t;return t=function(t,e,r){return u(t,r.tgBoSrc,function(t){return e.attr("src",t)})},{link:t}},n=function(){var t;return t=function(t,e,r){return u(t,r.tgBoHref,function(t){return e.attr("href",t)})},{link:t}},e=function(){var t;return t=function(t,e,r){return u(t,r.tgBoAlt,function(t){return e.attr("alt",t)})},{link:t}},a=function(){var t;return t=function(t,e,r){return u(t,r.tgBoTitle,function(t){return e.attr("title",t)})},{link:t}},c=function(){var t;return t=function(t,e,r){return t.$watch(r.tgTitleHtml,function(t){if(null!=t)return e.attr("title",t)})},{link:t}},t=function(){var t;return t=function(t,e,r){return t.$watch(r.tgBindHtml,function(t){if(null!=t)return e.html(t)})},{link:t}},l=angular.module("taigaBase"),l.directive("tgBoBind",r),l.directive("tgBoHtml",i),l.directive("tgBoRef",o),l.directive("tgBoSrc",s),l.directive("tgBoHref",n),l.directive("tgBoAlt",e),l.directive("tgBoTitle",a),l.directive("tgBindTitle",c),l.directive("tgBindHtml",t)}.call(this),function(){var t,e;t=function(){function t(){this.config=window.taigaConfig}return t.prototype.get=function(t,e){return null==e&&(e=null),_.has(this.config,t)?this.config[t]:e},t}(),e=angular.module("taigaBase"),e.service("$tgConfig",t)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=angular.module("taigaBase"),t=function(t){function e(t,e,r,n,i,o,s){this.rootScope=t,this.scope=e,this.params=r,this.repo=n,this.rs=i,this.confirm=o,this.projectService=s,this.scope.currentPlugin=_.head(_.filter(this.rootScope.adminPlugins,{slug:this.params.plugin})),this.scope.projectSlug=this.params.pslug,this.loadInitialData()}return n(e,t),e.$inject=["$rootScope","$scope","$routeParams","$tgRepo","$tgResources","$tgConfirm","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.$broadcast("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject()},e}(taiga.Controller),r.controller("ContribController",t),e=function(t){function e(t,e,r){this.rootScope=t,this.scope=e,this.params=r,this.scope.currentPlugin=_.head(_.filter(this.rootScope.userSettingsPlugins,{slug:this.params.plugin}))}return n(e,t),e.$inject=["$rootScope","$scope","$routeParams"],e}(taiga.Controller),r.controller("ContribUserSettingsController",e)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga,t=function(t){function e(t,e){this.storage=t,this.params=e}return r(e,t),e.$inject=["$tgStorage","$routeParams"],e.prototype.generateHash=function(t){return null==t&&(t=[]),t=_.map(t,function(t){return JSON.stringify(t)}),hex_sha1(t.join(":"))},e}(e.Service)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,t=function(t){function e(t,r,n,i,o,s){this.http=t,this.q=r,this.storage=n,this.rootScope=i,this.cacheFactory=o,this.translate=s,e.__super__.constructor.call(this),this.cache=this.cacheFactory("httpget")}return n(e,t),e.$inject=["$http","$q","$tgStorage","$rootScope","$cacheFactory","$translate"],e.prototype.headers=function(){var t,e,r;return t={},r=this.storage.get("token"),r&&(t.Authorization="Bearer "+r),e=this.translate.preferredLanguage(),e&&(t["Accept-Language"]=e),t},e.prototype.request=function(t){return t.headers=_.assign({},t.headers||{},this.headers()),this.http(t)},e.prototype.get=function(t,e,r){return r=_.assign({method:"GET",url:t},r),e&&(r.params=e),r.cache=this.cache,this.request(r)["finally"](function(t){return function(e){return t.cache.removeAll()}}(this))},e.prototype.post=function(t,e,r,n){return n=_.assign({method:"POST",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype.put=function(t,e,r,n){return n=_.assign({method:"PUT",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype.patch=function(t,e,r,n){return n=_.assign({method:"PATCH",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype["delete"]=function(t,e,r,n){return n=_.assign({method:"DELETE",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e}(r.Service),e=angular.module("taigaBase"),e.service("$tgHttp",t)}.call(this),function(){var t,e;t=function(t,e,r){return t.noreload=function(r){var n,i;return n=e.current,i=r.$on("$locationChangeSuccess",function(){return e.current=n,i()}),t},t.isInCurrentRouteParams=function(e,r){var n;return n=t.search()||{},n[e]===r},t},e=angular.module("taigaBase"),e.factory("$tgLocation",["$location","$route","$rootScope",t])}.call(this),function(){var t,e,r,n,i,o=[].indexOf||function(t){for(var e=0,r=this.length;ef?(p=a.instant("PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED",{fileName:e.name,fileSize:r(e.size),maxFileSize:r(f)}),d={status:413,data:{_error_message:p}},l.reject(d),l.promise):(v=function(t){return function(t){var e,i;return i=Math.round(t.loaded/t.total*100),e=a.instant("PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE",{uploadedSize:r(t.loaded),totalSize:r(t.total)}),n("in-progress",null,e,i)}}(this),g=function(t){return function(t){return n("done",a.instant("PROJECT.IMPORT.TITLE"),a.instant("PROJECT.IMPORT.DESCRIPTION"))}}(this),m=function(t){return function(t){return n("error")}}(this),c=function(t){return function(t){var e;d={};try{d.data=JSON.parse(t.target.responseText)}catch(r){d.data={}}return d.status=t.target.status,t.target.getResponseHeader("Taiga-Info-Project-Is-Private")&&(d.headers={isPrivate:"True"===t.target.getResponseHeader("Taiga-Info-Project-Is-Private"),memberships:parseInt(t.target.getResponseHeader("Taiga-Info-Project-Memberships"))}),201!==(e=d.status)&&202!==e||l.resolve(d),l.reject(d)}}(this),h=function(t){return function(t){return l.reject("fail")}}(this),u=new FormData,u.append("dump",e),y=new XMLHttpRequest,y.upload.addEventListener("progress",v,!1),y.upload.addEventListener("load",g,!1),y.upload.addEventListener("error",m,!1),y.upload.addEventListener("abort",m,!1),y.addEventListener("load",c,!1),y.addEventListener("error",h,!1),y.open("POST",i.resolve("importer")),y.setRequestHeader("Authorization","Bearer "+o.getToken()),y.setRequestHeader("Accept","application/json"),y.send(u),l.promise)},c.changeLogo=function(e,o){var a,c,u,l,p,h;return u=t.get("maxUploadFileSize",null),u&&o.size>u?(p={status:413,data:{_error_message:"'"+o.name+"' ("+r(o.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(u)+")"}},c=s.defer(),c.reject(p),c.promise):(a=new FormData,a.append("logo",o),l={transformRequest:angular.identity,headers:{"Content-Type":void 0}},h=i.resolve("projects")+"/"+e+"/change_logo",n.post(h,a,{},l))},c.removeLogo=function(t){var e;return e=i.resolve("projects")+"/"+t+"/remove_logo",n.post(e)},function(t){return t.projects=c}},t=angular.module("taigaResources"),t.factory("$tgProjectsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$tgAuth","$q","$translate",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("roles",e)},n.list=function(e){return t.queryMany("roles",{project:e})},function(t){return t.roles=n}},t=angular.module("taigaResources"),t.factory("$tgRolesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r,n){var i;return i={},i["do"]=function(t,i){var o,s,a,c;return o=n.defer(),c=e.resolve("search"),s={url:c,method:"GET",timeout:o.promise,cancelable:!0,params:{project:t,text:i,get_all:!1}},a=r.request(s).then(function(t){return t.data}),a.abort=function(){return o.resolve()},a["finally"]=function(){return a.abort=angular.noop,o=a=null},a},function(t){return t.search=i}},t=angular.module("taigaResources"),t.factory("$tgSearchResourcesProvider",["$tgRepo","$tgUrls","$tgHttp","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(t,e,r){var n;return n={},n.get=function(r,n){return t.queryOne("milestones",n).then(function(t){var r;return r=t.user_stories,r=_.map(r,function(t){return e.make_model("userstories",t)}),t._attrs.user_stories=r,t})},n.stats=function(e,r){return t.queryOneRaw("milestones",r+"/stats")},n.list=function(r,n){var i;return i={project:r},i=_.extend({},i,n||{}),t.queryMany("milestones",i,{},!0).then(function(t){return function(t){var r,n,i,o,s,a;for(s=t[0],r=t[1],n=0,i=s.length;nc?(l={status:413,data:{_error_message:"'"+e.name+"' ("+r(e.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(c)+")"}},a=o.defer(),a.reject(l),a.promise):(s=new FormData,s.append("avatar",e),u={transformRequest:angular.identity,headers:{"Content-Type":void 0}},p=i.resolve("users")+"/change_avatar",n.post(p,s,{},u))},s.removeAvatar=function(){var t;return t=i.resolve("users")+"/remove_avatar",n.post(t)},s.changePassword=function(t,e){var r,o;return o=i.resolve("users")+"/change_password",r={current_password:t,password:e},n.post(o,r)},function(t){return t.userSettings=s}},t=angular.module("taigaResources"),t.factory("$tgUserSettingsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,e=function(t,e){var r;return r={},r.contacts=function(r,n){var i,o;return null==n&&(n={}),o=e.resolve("user-contacts",r),i={headers:{}},n.enablePagination||(i.headers["x-disable-pagination"]="1"),t.get(o,{},i).then(function(t){return t.data})},function(t){return t.users=r}},t=angular.module("taigaResources"),t.factory("$tgUsersResourcesProvider",["$tgHttp","$tgUrls","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(e,r,n,i,o){var s,a;return a={},s="userstories-queryparams",a.get=function(t,r,n){var i;return i=a.getQueryParams(t),i.project=t,i=_.extend({},i,n),e.queryOne("userstories",r,i)},a.getByRef=function(t,r,n){var i;return null==n&&(n={}),i=a.getQueryParams(t),i.project=t,i.ref=r,i=_.extend({},i,n),e.queryOne("userstories","by_ref",i)},a.listInAllProjects=function(t){return e.queryMany("userstories",t)},a.filtersData=function(t){return e.queryOneRaw("userstories-filters",null,t)},a.listUnassigned=function(t,r,n){var i;return i={project:t,milestone:"null"},i=_.extend({},i,r||{}),a.storeQueryParams(t,i),e.queryMany("userstories",_.extend(i,{page_size:n}),{enablePagination:!0},!0)},a.listAll=function(t,r){var n;return n={project:t},n=_.extend({},n,r||{}),a.storeQueryParams(t,n),e.queryMany("userstories",n)},a.bulkCreate=function(t,e,i){var o,s;return o={project_id:t,status_id:e,bulk_stories:i},s=n.resolve("bulk-create-us"),r.post(s,o)},a.upvote=function(t){var e;return e=n.resolve("userstory-upvote",t),r.post(e)},a.downvote=function(t){var e;return e=n.resolve("userstory-downvote",t),r.post(e)},a.watch=function(t){var e;return e=n.resolve("userstory-watch",t),r.post(e)},a.unwatch=function(t){var e;return e=n.resolve("userstory-unwatch",t),r.post(e)},a.bulkUpdateBacklogOrder=function(t,e){var i,o;return o=n.resolve("bulk-update-us-backlog-order"),i={project_id:t,bulk_stories:e},r.post(o,i)},a.bulkUpdateMilestone=function(t,e,i){var o,s;return s=n.resolve("bulk-update-us-milestone"),o={project_id:t,milestone_id:e,bulk_stories:i},r.post(s,o)},a.bulkUpdateKanbanOrder=function(t,e,i){var o,s;return s=n.resolve("bulk-update-us-kanban-order"),o={project_id:t,status_id:e,bulk_stories:i},r.post(s,o)},a.listValues=function(t,r){var n;return n={project:t},a.storeQueryParams(t,n),e.queryMany(r,n)},a.storeQueryParams=function(e,r){var n,o;return o=e+":"+s,n=t([e,o]),i.set(n,r)},a.getQueryParams=function(e){var r,n;return n=e+":"+s,r=t([e,n]),i.get(r)||{}},a.storeShowTags=function(e,r){var n;return n=t([e,"showTags"]),i.set(n,r)},a.getShowTags=function(e){var r;return r=t([e,"showTags"]),i.get(r)||null},function(t){return t.userstories=a}},e=angular.module("taigaResources"),e.factory("$tgUserstoriesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage","$q",r])}.call(this),function(){var t,e;e=function(t,e,r){var n;return n={},n.list=function(e){var r;return r={webhook:e},t.queryMany("webhooklogs",r)},n.resend=function(t){var n;return n=e.resolve("webhooklogs-resend",t),r.post(n)},function(t){return t.webhooklogs=n}},t=angular.module("taigaResources"),t.factory("$tgWebhookLogsResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e;e=function(t,e,r){var n;return n={},n.list=function(e){var r;return r={project:e},t.queryMany("webhooks",r)},n.test=function(t){var n;return n=e.resolve("webhooks-test",t),r.post(n)},function(t){return t.webhooks=n}},t=angular.module("taigaResources"),t.factory("$tgWebhooksResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("wiki",e)},n.getBySlug=function(e,r){return t.queryOne("wiki","by_slug?project="+e+"&slug="+r)},n.list=function(e){return t.queryMany("wiki",{project:e})},n.listLinks=function(e){return t.queryMany("wiki-links",{project:e})},function(t){return t.wiki=n}},t=angular.module("taigaResources"),t.factory("$tgWikiResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){function r(){this.constructor=t}for(var n in e)a.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},a={}.hasOwnProperty;o=this.taiga,n=this.taiga.mixOf,r=this.taiga.debounce,i=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.translate=l,this.scope.sectionName=this.translate.instant("CHANGE_PASSWORD.SECTION_NAME"),this.scope.user=this.auth.getUser()}return s(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate"],e}(n(o.Controller,o.PageMixin)), -i.controller("UserChangePasswordController",t),e=function(t,e,n,i){var o;return o=function(o,s,a,c){var u,l,p;return u=new checksley.Form(s.find("form")),l=r(2e3,function(r){return function(r){var s,a;if(r.preventDefault(),u.validate())return o.newPassword1!==o.newPassword2?void e.notify("error",i.instant("CHANGE_PASSWORD.ERROR_PASSWORD_MATCH")):(s=n().target(p).start(),a=t.userSettings.changePassword(o.currentPassword,o.newPassword1),a.then(function(){return s.finish(),e.notify("success")}),a.then(null,function(t){return s.finish(),e.notify("error",t.data._error_message)}))}}(this)),p=s.find(".submit-button"),s.on("submit","form",l),o.$on("$destroy",function(){return s.off()})},{link:o}},i.directive("tgUserChangePassword",["$tgResources","$tgConfirm","$tgLoading","$translate",e])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,r=this.taiga.debounce,n=angular.module("taigaUserSettings"),t=function(t,e,n,i,o,s,a){var c;return c=function(e,c,u){var l,p;return e.$on("deletelightbox:new",function(t,e){return s.open(c)}),e.$on("$destroy",function(){return c.off()}),l=function(){var r,u;return r=a().target(p).start(),u=t.remove(e.user),u.then(function(t){return r.finish(),s.close(c),n.logout(),i.path(o.resolve("login"))}),u.then(null,function(){return r.finish(),console.log("FAIL")})},c.on("click",".button-green",function(t){return t.preventDefault(),s.close(c)}),c.on("click",".button-red",r(2e3,function(t){return t.preventDefault(),l()})),p=c.find(".button-red")},{link:c,templateUrl:"user/lightbox/lightbox-delete-account.html"}},n.directive("tgLbDeleteUser",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","lightboxService","$tgLoading",t])}.call(this),function(){var t,e,r,n,i,o,s,a=function(t,e){function r(){this.constructor=t}for(var n in e)c.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},c={}.hasOwnProperty;s=this.taiga,i=this.taiga.mixOf,n=this.taiga.bindOnce,o=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.errorHandlingService=l,this.scope.sectionName="USER_SETTINGS.NOTIFICATIONS.LIVE_SECTION_NAME",this.scope.user=this.auth.getUser(),p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return a(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","tgErrorHandlingService"],e.prototype.loadInitialData=function(){return this.rs.notifyPolicies.list().then(function(t){return function(e){return t.scope.notifyPolicies=e,e}}(this))},e}(i(s.Controller,s.PageMixin)),o.controller("UserLiveNotificationsController",t),e=function(){var t;return t=function(t,e,r){return t.$on("$destroy",function(){return e.off()})},{link:t}},o.directive("tgUserLiveNotifications",e),r=function(t,e,r){var i,o;return o=_.template('<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\n
\n
<%- notifyPolicy.project_name %>
\n
\n
\n checked="checked"<% } %>/>\n \n
\n
\n
\n
\n checked="checked"<% } %> />\n \n
\n
\n
\n
\n checked="checked"<% } %> />\n \n
\n
\n
\n<% }) %>'),i=function(i,s,a){var c;return c=function(){var n,a;return s.off(),n={notifyPolicies:i.notifyPolicies},a=o(n),s.html(r(a)(i)),s.on("change","input[type=radio]",function(r){var n,o,s,a,c,u;return u=angular.element(r.currentTarget),a=u.parents(".policy-table-row").data("index"),s=i.notifyPolicies[a],c=s.live_notify_level,s.live_notify_level=parseInt(u.val(),10),o=function(){return e.notify("success")},n=function(){return e.notify("error"),u.parents(".policy-table-row").find("input[value="+c+"]").prop("checked",!0)},t.save(s).then(o,n)})},i.$on("$destroy",function(){return s.off()}),n(i,a.ngModel,c)},{link:i}},o.directive("tgUserLiveNotificationsList",["$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u=function(t,e){function r(){this.constructor=t}for(var n in e)l.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},l={}.hasOwnProperty;c=this.taiga,o=this.taiga.mixOf,a=this.taiga.sizeFormat,s=angular.module("taigaUserSettings"),i=this.taiga.debounce,n=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f,d){var g,m,v;this.scope=t,this.rootscope=e,this.config=r,this.repo=n,this.confirm=i,this.rs=o,this.params=s,this.q=c,this.location=u,this.navUrls=l,this.auth=p,this.translate=h,this.errorHandlingService=f,this.window=d,this.scope.sectionName="USER_SETTINGS.MENU.SECTION_TITLE",this.scope.project={},this.scope.user=this.auth.getUser(),this.scope.user||this.errorHandlingService.permissionDenied(),this.scope.lang=this.getLan(),this.scope.theme=this.getTheme(),g=this.config.get("maxUploadFileSize",null),g&&(v=this.translate.instant("USER_SETTINGS.AVATAR_MAX_SIZE",{maxFileSize:a(g)}),this.scope.maxFileSizeMsg=v),m=this.loadInitialData(),m.then(null,this.onInitialDataError.bind(this))}return u(e,t),e.$inject=["$scope","$rootScope","$tgConfig","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate","tgErrorHandlingService","$window"],e.prototype.loadInitialData=function(){return this.scope.availableThemes=this.config.get("themes",[]),this.rs.locales.list().then(function(t){return function(e){return t.scope.locales=e,e}}(this))},e.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.user)},e.prototype.getLan=function(){return this.scope.user.lang||this.translate.preferredLanguage()},e.prototype.getTheme=function(){return this.scope.user.theme||this.config.get("defaultTheme")||"taiga"},e.prototype.exportProfile=function(){var t,e;return e=function(t){var e;return e=t.data.url,this.window.open(e,"_blank")},t=function(t){return function(e){var r;if(null!=(r=e.data)?r._error_message:void 0)return t.confirm.notify("error",e.data._error_message)}}(this),this.auth.exportProfile().then(e,t)},e}(o(c.Controller,c.PageMixin)),s.controller("UserSettingsController",n),r=function(t,e,r,n){var o;return o=function(o,s,a){var c;return c=i(2e3,function(i){return function(i){var a,c,u,l;if(i.preventDefault(),c=s.find("form").checksley(),c.validate())return a=o.user.isAttributeModified("email"),o.user.lang=o.lang,o.user.theme=o.theme,l=function(r){var i;return e.setUser(r),a?(i=n.instant("USER_PROFILE.CHANGE_EMAIL_SUCCESS"),t.success(i)):t.notify("success")},u=function(e){return c.setErrors(e),t.notify("error",e._error_message)},r.save(o.user).then(l,u)}}(this)),s.on("submit","form",c),o.$on("$destroy",function(){return s.off()})},{link:o}},s.directive("tgUserProfile",["$tgConfirm","$tgAuth","$tgRepo","$translate",r]),e=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return u=function(){return o.find(".size-info").removeClass("hidden")},c=function(r){var s;return s=e.make_model("users",r.data),t.setUser(s),i.user=s,o.find(".loading-overlay").removeClass("active"),n.notify("success")},a=function(t){return 413===t.status&&u(),o.find(".loading-overlay").removeClass("active"),n.notify("error",t.data._error_message)},o.on("click",".js-change-avatar",function(){return o.find("#avatar-field").click()}),o.on("change","#avatar-field",function(t){if(i.avatarAttachment)return o.find(".loading-overlay").addClass("active"),r.userSettings.changeAvatar(i.avatarAttachment).then(c,a)}),o.on("click","a.js-use-gravatar",function(t){return o.find(".loading-overlay").addClass("active"),r.userSettings.removeAvatar().then(c,a)}),i.$on("$destroy",function(){return o.off()})},{link:i}},s.directive("tgUserAvatar",["$tgAuth","$tgModel","$tgResources","$tgConfirm",e]),t=function(t){var e;return e=function(e,r,n){var i,o;return i=t(n.tgAvatarModel),o=i.assign,r.bind("change",function(){return e.$apply(function(){return o(e,r[0].files[0])})})},{link:e}},s.directive("tgAvatarModel",["$parse",t])}.call(this),function(){var t,e;t=function(){var t;return t=function(t,e,r){var n;return n=r.tgUserSettingsNavigation,e.find(".active").removeClass("active"),e.find("#usersettingsmenu-"+n+" a").addClass("active"),t.$on("$destroy",function(){return e.off()})},{link:t}},e=angular.module("taigaUserSettings"),e.directive("tgUserSettingsNavigation",t)}.call(this),function(){var t,e,r,n,i,o,s,a=function(t,e){function r(){this.constructor=t}for(var n in e)c.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},c={}.hasOwnProperty;s=this.taiga,i=this.taiga.mixOf,n=this.taiga.bindOnce,o=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.errorHandlingService=l,this.scope.sectionName="USER_SETTINGS.NOTIFICATIONS.SECTION_NAME",this.scope.user=this.auth.getUser(),p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return a(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","tgErrorHandlingService"],e.prototype.loadInitialData=function(){return this.rs.notifyPolicies.list().then(function(t){return function(e){return t.scope.notifyPolicies=e,e}}(this))},e}(i(s.Controller,s.PageMixin)),o.controller("UserNotificationsController",t),e=function(){var t;return t=function(t,e,r){return t.$on("$destroy",function(){return e.off()})},{link:t}},o.directive("tgUserNotifications",e),r=function(t,e,r){var i,o;return o=_.template('<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\n
\n
<%- notifyPolicy.project_name %>
\n
\n
\n checked="checked"<% } %>/>\n \n
\n
\n
\n
\n checked="checked"<% } %> />\n \n
\n
\n
\n
\n checked="checked"<% } %> />\n \n
\n
\n
\n<% }) %>'),i=function(i,s,a){var c;return c=function(){var n,a;return s.off(),n={notifyPolicies:i.notifyPolicies},a=o(n),s.html(r(a)(i)),s.on("change","input[type=radio]",function(r){var n,o,s,a,c,u;return u=angular.element(r.currentTarget),a=u.parents(".policy-table-row").data("index"),s=i.notifyPolicies[a],c=s.notify_level,s.notify_level=parseInt(u.val(),10),o=function(){return e.notify("success")},n=function(){return e.notify("error"),u.parents(".policy-table-row").find("input[value="+c+"]").prop("checked",!0)},t.save(s).then(o,n)})},i.$on("$destroy",function(){return s.off()}),n(i,a.ngModel,c)},{link:i}},o.directive("tgUserNotificationsList",["$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){angular.module("taigaComponents",[])}.call(this),function(){var t;t=angular.module("taigaDiscover",[])}.call(this),function(){var t;t=angular.module("taigaExternalApps",[])}.call(this),function(){angular.module("taigaHistory",[])}.call(this),function(){var t;t=angular.module("taigaHome",[])}.call(this),function(){angular.module("taigaNavigationBar",[])}.call(this),function(){var t;t=angular.module("taigaProfile",[])}.call(this),function(){angular.module("taigaProjects",[])}.call(this),function(){angular.module("taigaResources2",[])}.call(this),function(){angular.module("taigaUserTimeline",[])}.call(this),function(){var t;t=angular.module("taigaUtils",[])}.call(this),function(){angular.module("taigaWikiHistory",[])}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{templateUrl:"components/assigned-to/assigned-item/assigned-item.html",scope:{member:"="},link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedItem",t)}.call(this),function(){var t;t=function(){function t(){this.assigned&&this._getAssignedMember(),this._filterAssignedMember()}return t.$inject=[],t.prototype._getAssignedMember=function(){return this.assignedMember=_.filter(this.project.members,function(t){return function(e){return e.id===t.assigned.get("id")}}(this))},t.prototype._filterAssignedMember=function(){return this.assigned?this.nonAssignedMembers=_.filter(this.project.members,function(t){return function(e){return e.id!==t.assigned.get("id")}}(this)):this.nonAssignedMembers=this.project.members},t}(),angular.module("taigaComponents").controller("AssignedToSelectorCtrl",t)}.call(this),function(){var t;t=function(){return{controller:"AssignedToSelectorCtrl",controllerAs:"vm",bindToController:!0,templateUrl:"components/assigned-to/assigned-to-selector/assigned-to-selector.html",scope:{assigned:"=",project:"=",onRemoveAssigned:"&",onAssignTo:"&"}}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedToSelector",t)}.call(this),function(){var t;t=function(){function t(t,e){this.lightboxFactory=t,this.lightboxService=e,this.has_permissions=_.includes(this.project.my_permissions,"modify_epic")}return t.$inject=["tgLightboxFactory","lightboxService"],t.prototype._closeAndRemoveAssigned=function(){return this.lightboxService.closeAll(),this.onRemoveAssigned()},t.prototype._closeAndAssign=function(t){return this.lightboxService.closeAll(),this.onAssignTo({member:t})},t.prototype.onSelectAssignedTo=function(t,e){return this.lightboxFactory.create("tg-assigned-to-selector",{"class":"lightbox lightbox-assigned-to-selector open",assigned:"assigned",project:"project","on-remove-assigned":"onRemoveAssigned()","on-assign-to":"assignTo(member)"},{assigned:this.assignedTo,project:this.project,onRemoveAssigned:this._closeAndRemoveAssigned.bind(this),assignTo:this._closeAndAssign.bind(this)})},t}(),angular.module("taigaComponents").controller("AssignedToCtrl",t)}.call(this),function(){var t;t=function(){return{controller:"AssignedToCtrl",controllerAs:"vm",bindToController:!0,templateUrl:"components/assigned-to/assigned-to.html",scope:{assignedTo:"=",project:"=",onRemoveAssigned:"&",onAssignTo:"&"}}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedToComponent",t)}.call(this),function(){var t;t=function(t,e,r){var n;return n=function(n,i,o){var s;return s=t(o.tgAttachmentLink)(n),i.on("click",function(t){return taiga.isImage(s.getIn(["file","name"]))?(t.preventDefault(),n.$apply(function(){return r.open($("tg-attachments-preview")),e.fileId=s.getIn(["file","id"])})):taiga.isPdf(s.getIn(["file","name"]))?(t.preventDefault(),window.open(s.getIn(["file","url"]))):void 0}),n.$on("$destroy",function(){return i.off()})},{link:n}},t.$inject=["$parse","tgAttachmentsPreviewService","lightboxService"],angular.module("taigaComponents").directive("tgAttachmentLink",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment-gallery.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentGallery",t)}.call(this),function(){var t;t=function(){function t(t,e){this.attachmentsService=t,this.translate=e,this.form={},this.form.description=this.attachment.getIn(["file","description"]),this.form.is_deprecated=this.attachment.get(["file","is_deprecated"]),this.title=this.translate.instant("ATTACHMENT.TITLE",{fileName:this.attachment.get("name"),date:moment(this.attachment.get("created_date")).format(this.translate.instant("ATTACHMENT.DATE"))})}return t.$inject=["tgAttachmentsService","$translate"],t.prototype.editMode=function(t){var e;return e=this.attachment.set("editable",t),this.onUpdate({attachment:e})},t.prototype["delete"]=function(){return this.onDelete({attachment:this.attachment})},t.prototype.save=function(){var t;return t=this.attachment.set("loading",!0),this.onUpdate({attachment:t}),t=this.attachment.merge({editable:!1,loading:!1}),t=t.mergeIn(["file"],{description:this.form.description,is_deprecated:!!this.form.is_deprecated}),this.onUpdate({attachment:t})},t}(),angular.module("taigaComponents").controller("Attachment",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachment",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i;return i=t(n.tgAttachmentsDrop),r.on("dragover",function(t){return t.preventDefault(),!1}),r.on("drop",function(t){var r;return t.stopPropagation(),t.preventDefault(),r=t.dataTransfer||t.originalEvent&&t.originalEvent.dataTransfer,e.$apply(function(){return i(e,{files:r.files})})}),e.$on("$destroy",function(){return r.off()})},{link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsDrop",t)}.call(this),function(){var t,e;e=this.taiga.sizeFormat,t=function(){function t(t,r,n,i,o,s,a){this.translate=t,this.confirm=r,this.config=n,this.storage=i,this.attachmentsFullService=o,this.projectService=s,this.attachmentsPreviewService=a,this.mode=this.storage.get("attachment-mode","list"),this.maxFileSize=this.config.get("maxUploadFileSize",null),this.maxFileSize&&(this.maxFileSize=e(this.maxFileSize)),this.maxFileSizeMsg=this.maxFileSize?this.translate.instant("ATTACHMENT.MAX_UPLOAD_SIZE",{maxFileSize:this.maxFileSize}):"",taiga.defineImmutableProperty(this,"attachments",function(t){return function(){return t.attachmentsFullService.attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(t){return function(){return t.attachmentsFullService.deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(t){return function(){return t.attachmentsFullService.attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(t){return function(){return t.attachmentsFullService.deprecatedsVisible}}(this))}return t.$inject=["$translate","$tgConfirm","$tgConfig","$tgStorage","tgAttachmentsFullService","tgProjectService","tgAttachmentsPreviewService"],t.prototype.uploadingAttachments=function(){return this.attachmentsFullService.uploadingAttachments},t.prototype.addAttachment=function(t){var e;return e="list"===this.mode,this.attachmentsFullService.addAttachment(this.projectId,this.objId,this.type,t,e)},t.prototype.setMode=function(t){return this.mode=t,this.storage.set("attachment-mode",t)},t.prototype.toggleDeprecatedsVisible=function(){return this.attachmentsFullService.toggleDeprecatedsVisible()},t.prototype.addAttachments=function(t){return _.forEach(t,function(t){return function(e){return t.addAttachment(e)}}(this))},t.prototype.loadAttachments=function(){return this.attachmentsFullService.loadAttachments(this.type,this.objId,this.projectId)},t.prototype.deleteAttachment=function(t){var e,r;return this.attachmentsPreviewService.fileId=null,r=this.translate.instant("ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT"),e=this.translate.instant("ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT",{fileName:t.getIn(["file","name"])}),this.confirm.askOnDelete(r,e).then(function(r){return function(n){var i,o;return i=function(){return e=r.translate.instant("ATTACHMENT.ERROR_DELETE_ATTACHMENT",{errorMessage:e}),r.confirm.notify("error",null,e),n.finish(!1)},o=function(){return n.finish()},r.attachmentsFullService.deleteAttachment(t,r.type).then(o,i)}}(this))},t.prototype.reorderAttachment=function(t,e){return this.attachmentsFullService.reorderAttachment(this.type,t,e)},t.prototype.updateAttachment=function(t){return this.attachmentsFullService.updateAttachment(t,this.type)},t.prototype._isEditable=function(){return!!this.projectService.project&&this.projectService.hasPermission(this.editPermission)},t.prototype.showAttachments=function(){return this._isEditable()||this.attachmentsFullService.attachments.size},t}(),angular.module("taigaComponents").controller("AttachmentsFull",t)}.call(this),function(){var t,e;e=this.taiga.bindOnce,t=function(){var t;return t=function(t,r,n,i){return e(t,"vm.objId",function(t){return i.loadAttachments()})},{scope:{},bindToController:{type:"@",objId:"=",projectId:"=",editPermission:"@"},controller:"AttachmentsFull",controllerAs:"vm",templateUrl:"components/attachments-full/attachments-full.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsFull",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.attachmentsService=t,this.rootScope=e,this._attachments=Immutable.List(),this._deprecatedsCount=0,this._attachmentsVisible=Immutable.List(),this._deprecatedsVisible=!1,this.uploadingAttachments=[],taiga.defineImmutableProperty(this,"attachments",function(t){return function(){return t._attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(t){return function(){return t._deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(t){return function(){return t._attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(t){return function(){return t._deprecatedsVisible}}(this))}return e(r,t),r.$inject=["tgAttachmentsService","$rootScope"],r.prototype.toggleDeprecatedsVisible=function(){return this._deprecatedsVisible=!this._deprecatedsVisible,this.regenerate()},r.prototype.regenerate=function(){return this._deprecatedsCount=this._attachments.count(function(t){return t.getIn(["file","is_deprecated"])}),this._deprecatedsVisible?this._attachmentsVisible=this._attachments:this._attachmentsVisible=this._attachments.filter(function(t){return!t.getIn(["file","is_deprecated"])})},r.prototype.addAttachment=function(t,e,r,n,i,o){return null==i&&(i=!0),null==o&&(o=!1),new Promise(function(s){return function(a,c){var u;return s.attachmentsService.validate(n)?(s.uploadingAttachments.push(n),u=s.attachmentsService.upload(n,e,t,r,o),u.then(function(t){var e;return s.uploadingAttachments=s.uploadingAttachments.filter(function(e){return e.name!==t.get("name")}),e=Immutable.Map(),e=e.merge({file:t,editable:i,loading:!1,from_comment:o}),s._attachments=s._attachments.push(e),s.regenerate(),s.rootScope.$broadcast("attachment:create"),a(e)})):c(new Error(n))}}(this))},r.prototype.loadAttachments=function(t,e,r){return this.attachmentsService.list(t,e,r).then(function(t){return function(e){return t._attachments=e.map(function(t){var e;return e=Immutable.Map(),e.merge({loading:!1,editable:!1,file:t})}),t.regenerate()}}(this))},r.prototype.deleteAttachment=function(t,e){var r;return r=function(e){return function(){return e._attachments=e._attachments.filter(function(e){return e!==t}),e.regenerate()}}(this),this.attachmentsService["delete"](e,t.getIn(["file","id"])).then(r)},r.prototype.reorderAttachment=function(t,e,r){var n,i,o;if(i=this.attachments.findIndex(function(t){return t===e}),i!==r)return n=this.attachments.remove(i),n=n.splice(r,0,e),n=n.map(function(t,e){return t.setIn(["file","order"],e+1)}),o=[],n.forEach(function(e){return function(r){var n;return n={order:r.getIn(["file","order"])},o.push(e.attachmentsService.patch(r.getIn(["file","id"]),t,n))}}(this)),Promise.all(o).then(function(t){return function(){return t._attachments=n,t.regenerate()}}(this))},r.prototype.updateAttachment=function(t,e){var r,n,i;return r=this._attachments.findIndex(function(e){return e.getIn(["file","id"])===t.getIn(["file","id"])}),n=this._attachments.get(r),i=taiga.patch(n.get("file"),t.get("file")),t.get("loading")?(this._attachments=this._attachments.set(r,t),this.regenerate()):this.attachmentsService.patch(t.getIn(["file","id"]),e,i).then(function(e){return function(){return e._attachments=e._attachments.set(r,t),e.regenerate()}}(this))},r}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsFullService",t)}.call(this),function(){var t;t=function(){function t(t){this.attachmentsPreviewService=t,taiga.defineImmutableProperty(this,"current",function(t){return function(){return t.attachmentsPreviewService.fileId?t.getCurrent():null}}(this))}return t.$inject=["tgAttachmentsPreviewService"],t.prototype.hasPagination=function(){var t;return t=this.attachments.filter(function(t){return function(t){return taiga.isImage(t.getIn(["file","name"]))}}(this)),t.size>1},t.prototype.getCurrent=function(){var t,e;return t=this.attachments.find(function(t){return function(e){return t.attachmentsPreviewService.fileId===e.getIn(["file","id"])}}(this)),e=t.get("file")},t.prototype.getIndex=function(){return this.attachments.findIndex(function(t){return function(e){return t.attachmentsPreviewService.fileId===e.getIn(["file","id"])}}(this))},t.prototype.next=function(){var t,e;return t=this.getIndex(),e=this.attachments.slice(t+1).find(function(t){return taiga.isImage(t.getIn(["file","name"]))}),e||(e=this.attachments.find(function(t){return taiga.isImage(t.getIn(["file","name"]))})),this.attachmentsPreviewService.fileId=e.getIn(["file","id"])},t.prototype.previous=function(){var t,e;return t=this.getIndex(),e=this.attachments.slice(0,t).findLast(function(t){return taiga.isImage(t.getIn(["file","name"]))}),e||(e=this.attachments.findLast(function(t){return taiga.isImage(t.getIn(["file","name"]))})),this.attachmentsPreviewService.fileId=e.getIn(["file","id"])},t}(),angular.module("taigaComponents").controller("AttachmentsPreview",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){return $(document.body).on("keydown.image-preview",function(r){return e.fileId&&(39===r.keyCode?i.next():37===r.keyCode&&i.previous()),t.$digest()}),t.$on("$destroy",function(){return $(document.body).off(".image-preview")})},{scope:{},controller:"AttachmentsPreview",templateUrl:"components/attachments-preview/attachments-preview.html",link:r,controllerAs:"vm",bindToController:{attachments:"="}}},angular.module("taigaComponents").directive("tgAttachmentsPreview",["lightboxService","tgAttachmentsPreviewService",t])}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){}return e(r,t),r.$inject=[],r}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsPreviewService",t)}.call(this),function(){var t;t=function(){function t(t){this.attachmentsService=t}return t.$inject=["tgAttachmentsService"],t.prototype.addAttachment=function(t){var e;if(e=Immutable.fromJS({file:t,name:t.name,size:t.size}),this.attachmentsService.validate(t)&&(this.attachments=this.attachments.push(e),this.onAdd))return this.onAdd({attachment:e})},t.prototype.addAttachments=function(t){return _.forEach(t,this.addAttachment.bind(this))},t.prototype.deleteAttachment=function(t){if(this.attachments=this.attachments.filter(function(e){return e!==t}),this.onDelete)return this.onDelete({attachment:t})},t}(),angular.module("taigaComponents").controller("AttachmentsSimple",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachments:"=",onAdd:"&",onDelete:"&"},controller:"AttachmentsSimple",controllerAs:"vm",templateUrl:"components/attachments-simple/attachments-simple.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsSimple",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o,s;return i=t(n.tgAttachmentsSortable),o=dragula([r[0]],{copySortSource:!1,copy:!1,mirrorContainer:r[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),o.on("dragend",function(t){var r,n;return t=$(t),r=t.scope().attachment,n=t.index(),e.$apply(function(){return i(e,{attachment:r,index:n})})}),s=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&o.dragging}}),e.$on("$destroy",function(){return r.off(),o.destroy()})},{link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsSortable",t)}.call(this),function(){var t;t=function(t){return{link:function(e,r){return t(function(){return r[0].select()})}}},t.$inject=["$timeout"],angular.module("taigaComponents").directive("tgAutoSelect",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i;return i=n.tgAvatarBig?"avatarBig":"avatar",e.$watch(i,function(e){var n;return n=t.getAvatar(e,i),r.attr("src",n.url),r.css("background",n.bg||"")})},{link:e,scope:{avatar:"=tgAvatar",avatarBig:"=tgAvatarBig"}}},t.$inject=["tgAvatarService"],angular.module("taigaComponents").directive("tgAvatar",t),angular.module("taigaComponents").directive("tgAvatarBig",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){var t,e;return t=function(t,e,r){return t.$watch("epics",function(e){if(e&&!e.isIterable)return t.immutable_epics=Immutable.fromJS(e)})},e=function(t,e){return e.format?"components/belong-to-epics/belong-to-epics-"+e.format+".html":"components/belong-to-epics/belong-to-epics-pill.html"},{link:t,scope:{epics:"="},templateUrl:e}},e.directive("tgBelongToEpics",t)}.call(this),function(){var t;t=function(t,e,r,n,i){return{restrict:"A",compile:function(o,s){var a,c;return a=e(s.tgBindCode),c=e(s.tgBindCode,function(t){return(t||"").toString()}),r.$$addBindingClass(o),function(e,o,s){return r.$$addBindingInfo(o,s.tgBindCode),e.$watch(c,function(){var r;return r=n.getHTML(a(e)),o.html(t.getTrustedHtml(r)||""),i.addHightlighter(o)})}}}},angular.module("taigaComponents").directive("tgBindCode",["$sce","$parse","$compile","tgWysiwygService","tgWysiwygCodeHightlighterService",t]); -}.call(this),function(){var t;t=function(){return{scope:{levels:"=",value:"="},templateUrl:"components/board-zoom/board-zoom.html"}},angular.module("taigaComponents").directive("tgBoardZoom",[t])}.call(this),function(){var t;t=function(){function t(){this.index=0}return t.$inject=[],t.prototype.next=function(){if(this.index++,this.index>=this.images.size)return this.index=0},t.prototype.previous=function(){if(this.index--,this.index<0)return this.index=this.images.size-1},t}(),angular.module("taigaComponents").controller("CardSlideshow",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){return{controller:"CardSlideshow",templateUrl:"components/card-slideshow/card-slideshow.html",bindToController:!0,controllerAs:"vm",scope:{images:"="}}},e.directive("tgCardSlideshow",t)}.call(this),function(){var t;t=function(){function t(){}return t.$inject=[],t.prototype.visible=function(t){return this.zoom.indexOf(t)!==-1},t.prototype.hasTasks=function(){var t;return t=this.item.getIn(["model","tasks"]),t&&t.size>0},t.prototype.hasMultipleAssignedUsers=function(){var t;return t=this.item.getIn(["model","assigned_users"]),t&&t.size>1},t.prototype.hasVisibleAttachments=function(){return this.item.get("images").size>0},t.prototype.toggleFold=function(){return this.onToggleFold({id:this.item.get("id")})},t.prototype.getClosedTasks=function(){return this.item.getIn(["model","tasks"]).filter(function(t){return t.get("is_closed")})},t.prototype.closedTasksPercent=function(){return 100*this.getClosedTasks().size/this.item.getIn(["model","tasks"]).size},t.prototype.getModifyPermisionKey=function(){return"task"===this.type?"modify_task":"modify_us"},t.prototype.getDeletePermisionKey=function(){return"task"===this.type?"delete_task":"delete_us"},t.prototype._setVisibility=function(){var t;return t={related:this.visible("related_tasks"),slides:this.visible("attachments")},_.isUndefined(this.item.get("foldStatusChanged"))||(this.visible("related_tasks")&&this.visible("attachments")?(t.related=!this.item.get("foldStatusChanged"),t.slides=!this.item.get("foldStatusChanged")):this.visible("attachments")?(t.related=this.item.get("foldStatusChanged"),t.slides=this.item.get("foldStatusChanged")):this.visible("related_tasks")||this.visible("attachments")||(t.related=this.item.get("foldStatusChanged"),t.slides=this.item.get("foldStatusChanged"))),this.item.getIn(["model","tasks"])&&this.item.getIn(["model","tasks"]).size||(t.related=!1),this.item.get("images")&&this.item.get("images").size||(t.slides=!1),t},t.prototype.isRelatedTasksVisible=function(){var t;return t=this._setVisibility(),t.related},t.prototype.isSlideshowVisible=function(){var t;return t=this._setVisibility(),t.slides},t.prototype.getNavKey=function(){return"task"===this.type?"project-tasks-detail":"project-userstories-detail"},t}(),angular.module("taigaComponents").controller("Card",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){return{link:function(t){},controller:"Card",controllerAs:"vm",bindToController:!0,templateUrl:"components/card/card.html",scope:{onToggleFold:"&",onClickAssignedTo:"&",onClickEdit:"&",onClickDelete:"&",project:"=",item:"=",zoom:"=",zoomLevel:"=",archived:"=",type:"@"}}},e.directive("tgCard",t)}.call(this),function(){var t;t=function(){return{link:function(t,e){return e.on("click",function(t){var r;if(!$(t.target).is("input"))return t.preventDefault(),r=e.find('input[type="file"]'),r.val(""),r.trigger("click")}),t.$on("$destroy",function(){return e.off()})}}},angular.module("taigaComponents").directive("tgClickInputFile",[t])}.call(this),function(){var t,e,r;r=this.taiga,e=r.getDefaulColorList,t=function(){function t(t){this.projectService=t,this.colorList=e(),this.checkIsColorRequired(),this.displayColorList=!1}return t.$inject=["tgProjectService"],t.prototype.userCanChangeColor=function(){return!this.requiredPerm||this.projectService.hasPermission(this.requiredPerm)},t.prototype.checkIsColorRequired=function(){if(!this.isColorRequired)return this.colorList=_.dropRight(this.colorList)},t.prototype.setColor=function(t){return this.color=t,this.customColor=t},t.prototype.resetColor=function(){if(this.isColorRequired&&!this.color)return this.color=this.initColor},t.prototype.toggleColorList=function(){return this.displayColorList=!this.displayColorList,this.customColor=this.color,this.resetColor()},t.prototype.onSelectDropdownColor=function(t){return this.color=t,this.onSelectColor({color:t}),this.toggleColorList()},t.prototype.onKeyDown=function(t){if(13===t.which)return!this.customColor&&this.isColorRequired||this.onSelectDropdownColor(this.customColor),t.preventDefault()},t}(),angular.module("taigaComponents").controller("ColorSelectorCtrl",t)}.call(this),function(){var t,e;e=this.taiga.bindOnce,t=function(t){var e;return e=function(e,r,n,i){var o,s,a;return o=null,s=function(){return t.cancel(o),o=null},a=function(){if(!o)return o=t(function(){return i.displayColorList=!1,i.resetColor()},400)},r.find(".color-selector").mouseenter(s).mouseleave(a),r.find(".color-selector-dropdown").mouseenter(s).mouseleave(a),e.$watch("vm.initColor",function(t){return i.setColor(t)})},{link:e,templateUrl:"components/color-selector/color-selector.html",controller:"ColorSelectorCtrl",controllerAs:"vm",bindToController:{isColorRequired:"=",onSelectColor:"&",initColor:"=",requiredPerm:"@"},scope:{}}},t.$inject=["$timeout"],angular.module("taigaComponents").directive("tgColorSelector",t)}.call(this),function(){var t,e;e=angular.module("taigaUserStories"),t=function(){function t(t,e,r,n,i){this.rootScope=t,this.confirm=e,this.modelTransform=r,this.navUrls=n,this.window=i,this.editMode=!1,this.loadingSubject=!1,this.originalSubject=this.item.subject}return t.$inject=["$rootScope","$tgConfirm","$tgQueueModelTransformation","$tgNavUrls","$window"],t.prototype._checkNav=function(){var t,e,r;if(null!=(null!=(e=this.item.neighbors.previous)?e.ref:void 0)&&(t={project:this.project.slug,ref:this.item.neighbors.previous.ref},this.previousUrl=this.navUrls.resolve("project-"+this.item._name+"-detail",t)),null!=(null!=(r=this.item.neighbors.next)?r.ref:void 0))return t={project:this.project.slug,ref:this.item.neighbors.next.ref},this.nextUrl=this.navUrls.resolve("project-"+this.item._name+"-detail",t)},t.prototype._checkPermissions=function(){return this.permissions={canEdit:_.includes(this.project.my_permissions,this.requiredPerm)}},t.prototype.editSubject=function(t){var e;if(e=this.window.getSelection(),"Range"!==e.type&&(t&&(this.editMode=!0),!t))return this.editMode=!1},t.prototype.onKeyDown=function(t){if(13===t.which&&this.saveSubject(),27===t.which)return this.item.subject=this.originalSubject,this.editSubject(!1)},t.prototype.saveSubject=function(){var t,e,r,n;return r=function(t){return function(){return t.loadingSubject=!1,t.rootScope.$broadcast("object:updated"),t.confirm.notify("success"),t.originalSubject=t.item.subject}}(this),e=function(t){return function(){return t.loadingSubject=!1,t.confirm.notify("error")}}(this),this.editMode=!1,this.loadingSubject=!0,t=this.item,n=this.modelTransform.save(function(t){return t}),n.then(r,e)},t}(),e.controller("StoryHeaderCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaUserStories"),t=function(){var t;return this.$inject=[],t=function(t,e,r,n){return n._checkPermissions(),n._checkNav()},{link:t,controller:"StoryHeaderCtrl",bindToController:!0,scope:{item:"=",project:"=",requiredPerm:"@"},controllerAs:"vm",templateUrl:"components/detail/header/detail-header.html"}},e.directive("tgDetailHeader",t)}.call(this),function(){var t;t=function(){function t(t,e){this.translate=t,this.tgLightboxFactory=e}return t.$inject=["$translate","tgLightboxFactory"],t.prototype.visible=function(){return"button"===this.format||null!=this.dueDate},t.prototype.disabled=function(){return this.isClosed},t.prototype.color=function(){var t;return t={no_longer_applicable:"closed",due_soon:"due-soon",past_due:"past-due",set:"due-set"},t[this.dueDateStatus]||""},t.prototype.title=function(){return"button"===this.format?this.dueDate?this._formatTitle():"Edit due date":this._formatTitle()},t.prototype._formatTitle=function(){var t,e,r,n;return t="closed",n={no_longer_applicable:"COMMON.DUE_DATE.NO_LONGER_APPLICABLE",due_soon:"COMMON.DUE_DATE.DUE_SOON",past_due:"COMMON.DUE_DATE.PAST_DUE"},r=this.translate.instant("COMMON.PICKERDATE.FORMAT"),e=moment(this.dueDate).format(r),n[this.dueDateStatus]?e+" ("+this.translate.instant(n[this.dueDateStatus])+")":e},t.prototype.setDueDate=function(){if(!this.disabled())return this.tgLightboxFactory.create("tg-lb-set-due-date",{"class":"lightbox lightbox-set-due-date"},{object:this.item})},t}(),angular.module("taigaComponents").controller("DueDate",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){var t;return t=function(t,e){return e.format?"components/due-date/due-date-"+e.format+".html":"components/due-date/due-date-icon.html"},{link:function(t){},controller:"DueDate",controllerAs:"vm",bindToController:!0,templateUrl:t,scope:{dueDate:"=",dueDateStatus:"=",isClosed:"=",item:"=",format:"@"}}},e.directive("tgDueDate",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){var o;return o=t(n.tgFileChange),r.on("change",function(t){return e.$apply(function(){return o(e,{files:t.currentTarget.files})})}),e.$on("$destroy",function(){return r.off()})},{restrict:"A",link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgFileChange",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=taiga.generateHash,t=function(t){function n(t,e,r){this.q=t,this.urls=e,this.http=r}return r(n,t),n.$inject=["$q","$tgUrls","$tgHttp"],n.prototype.storeFilters=function(t,r,n){var i,o,s,a,c;return i=this.q.defer(),c=this.urls.resolve("user-storage"),s=t+":"+n,o=e([t,s]),_.isEmpty(r)?(a=this.http["delete"](c+"/"+o,{key:o,value:r}),a.then(function(){return i.resolve()}),a.then(null,function(){return i.reject()})):(a=this.http.put(c+"/"+o,{key:o,value:r}),a.then(function(t){return i.resolve()}),a.then(null,function(t){return function(e){var n;return n=t.http.post(""+c,{key:o,value:r}),n.then(function(){return i.resolve()}),n.then(null,function(){return i.reject()})}}(this))),i.promise},n.prototype.getFilters=function(t,r){var n,i,o,s,a;return n=this.q.defer(),a=this.urls.resolve("user-storage"),o=t+":"+r,i=e([t,o]),s=this.http.get(a+"/"+i),s.then(function(t){return n.resolve(t.data.value)}),s.then(null,function(t){return n.resolve({})}),n.promise},n}(taiga.Service),angular.module("taigaComponents").service("tgFilterRemoteStorageService",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=$("tg-filter"),t.$watch(r.ngIf,function(t){var r,n;if(t)return i.find(".filter-list").hide(),n=i.height(),r=0,i.children().each(function(){return r+=$(this).outerHeight(!0)}),$(e.context.nextSibling).css({"max-height":n-r,display:"block"})})},{priority:900,link:t}},angular.module("taigaComponents").directive("tgFilterSlideDown",[t])}.call(this),function(){var t;t=function(){function t(){this.opened=null,this.customFilterForm=!1,this.customFilterName=""}return t.$inject=[],t.prototype.toggleFilterCategory=function(t){return this.opened===t?this.opened=null:this.opened=t},t.prototype.isOpen=function(t){return this.opened===t},t.prototype.saveCustomFilter=function(){return this.onSaveCustomFilter({name:this.customFilterName}),this.customFilterForm=!1,this.opened="custom-filter",this.customFilterName=""},t.prototype.changeQ=function(){return this.onChangeQ({q:this.q})},t.prototype.unselectFilter=function(t){return this.onRemoveFilter({filter:t})},t.prototype.unselectFilter=function(t){return this.onRemoveFilter({filter:t})},t.prototype.selectFilter=function(t,e){return e={category:t,filter:e},this.onAddFilter({filter:e})},t.prototype.removeCustomFilter=function(t){return this.onRemoveCustomFilter({filter:t})},t.prototype.selectCustomFilter=function(t){return this.onSelectCustomFilter({filter:t})},t.prototype.isFilterSelected=function(t,e){return!!_.find(this.selectedFilters,function(r){return e.id===r.id&&t.dataType===r.dataType})},t}(),angular.module("taigaComponents").controller("Filter",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=t.$watch("vm.defaultQ",function(e){return e&&!t.vm.filtersForm.$dirty?(t.vm.q=e,i()):t.vm.filtersForm.$dirty?i():void 0}),r.$observe("open",function(r){return r=t.$eval(r),r?e.addClass("open"):e.removeClass("open")})},{scope:{onChangeQ:"&",onAddFilter:"&",onSelectCustomFilter:"&",onRemoveFilter:"&",onRemoveCustomFilter:"&",onSaveCustomFilter:"&",customFilters:"<",defaultQ:"=q",filters:"<",customFilters:"<",selectedFilters:"<"},bindToController:!0,controller:"Filter",controllerAs:"vm",templateUrl:"components/filter/filter.html",link:t}},angular.module("taigaComponents").directive("tgFilter",[t])}.call(this),function(){var t,e;e=this.taiga,t=function(t,e,r,n,i){var o;return o=function(n,o,s,a){var c,u,l;return l=null,u=introJs(),u.oncomplete(function(){return $("html,body").scrollTop(0)}),u.onexit(function(){return e.disableJoyRide()}),c=function(t,e){if(e[t.joyride])return u.setOptions({exitOnEsc:!1,exitOnOverlayClick:!1,showStepNumbers:!1,nextLabel:i.instant("JOYRIDE.NAV.NEXT")+" →",prevLabel:"← "+i.instant("JOYRIDE.NAV.BACK"),skipLabel:i.instant("JOYRIDE.NAV.SKIP"),doneLabel:i.instant("JOYRIDE.NAV.DONE"),disableInteraction:!0}),u.setOption("steps",r.get(t.joyride)),u.start()},t.$on("$routeChangeSuccess",function(r,n){return n.joyride&&e.isAuthenticated()?(u.oncomplete(function(){return e.disableJoyRide(n.joyride)}),n.loader?l=t.$on("loader:end",function(){return e.loadJoyRideConfig().then(function(t){return c(n,t)}),l()}):e.loadJoyRideConfig().then(function(t){return c(n,t)})):(u.exit(),void(l&&l()))})},{scope:{},link:o}},t.$inject=["$rootScope","tgCurrentUserService","tgJoyRideService","$location","$translate"],angular.module("taigaComponents").directive("tgJoyRide",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.translate=t,this.checkPermissionsService=e}return e(r,t),r.$inject=["$translate","tgCheckPermissionsService"],r.prototype.getConfig=function(){return{dashboard:function(t){return function(){var e;return e=[{element:".project-list > section:not(.ng-hide)",position:"left",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP1.TITLE"),text:t.translate.instant("JOYRIDE.DASHBOARD.STEP1.TEXT")}},{element:".working-on-container",position:"right",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.DASHBOARD.STEP2.TEXT")}},{element:".watching-container",position:"right",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TITLE"),text:[t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT1"),t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT2")]}}],$(".project-list .create-project-button").is(":hidden")||e.push({element:".project-list .create-project-button",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TITLE"),text:[t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT1"),t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT2")]}}),e}}(this),backlog:function(t){return function(){var e;return e=[{element:".summary",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP1.TITLE"),text:[t.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT1"),t.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT2")]}},{element:".backlog-table-empty",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP2.TEXT")}},{element:".sprints",position:"left",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP3.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP3.TEXT")}}],t.checkPermissionsService.check("add_us")&&e.push({element:".new-us",position:"rigth",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP4.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP4.TEXT")}}),e}}(this),kanban:function(t){return function(){var e;return e=[{element:".kanban-table-inner",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP1.TITLE"),text:t.translate.instant("JOYRIDE.KANBAN.STEP1.TEXT")}},{element:".card-placeholder",position:"right",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.KANBAN.STEP2.TEXT")}}],t.checkPermissionsService.check("add_us")&&e.push({element:".add-action",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP3.TITLE"),text:[t.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT1"),t.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT2")]}}),e}}(this)}},r.prototype.get=function(t){var e,r;return r=this.getConfig(),e=r[t].call(this),_.map(e,function(t){var e;return e="",t.joyride.title&&(e+="

"+t.joyride.title+"

"),_.isArray(t.joyride.text)?_.forEach(t.joyride.text,function(t){return e+="

"+t+"

"}):e+="

"+t.joyride.text+"

",t.intro=e,t})},r}(taiga.Service),angular.module("taigaComponents").service("tgJoyRideService",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i,o){var s,a,c;return r.zoomIndex=t.get("kanban_zoom")||2,r.levels=5,c=[["ref"],["subject"],["owner","tags","extra_info","unfold"],["attachments"],["related_tasks","empty_extra_info"]],s=function(e){return null==e&&(e=0),t.get("kanban_zoom")!==e&&t.set("kanban_zoom",e),_.reduce(c,function(t,r,n){return n<=e&&(t=t.concat(r)),t})},r.$watch("zoomIndex",function(t){var e;return e=s(t),r.onZoomChange({zoomLevel:t,zoom:e})}),a=r.$watch(function(){return e.project},function(t){if(t)return t.get("my_permissions").indexOf("view_tasks")===-1&&(r.levels=4),a()})},{scope:{onZoomChange:"&"},template:'',link:r}},angular.module("taigaComponents").directive("tgKanbanBoardZoom",["$tgStorage","tgProjectService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(t,e,r){},{restrict:"AE",scope:{},controllerAs:"vm",controller:function(){return this.close=function(){return t.open=!1},Object.defineProperties(this,{open:{get:function(){return t.open}},title:{get:function(){return t.title}},desc:{get:function(){return t.desc}}})},link:e,templateUrl:"components/live-announcement/live-announcement.html"}},t.$inject=["tgLiveAnnouncementService"],angular.module("taigaComponents").directive("tgLiveAnnouncement",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){this.open=!1,this.title="",this.desc=""}return e(r,t),r.prototype.show=function(t,e){return this.open=!0,this.title=t,this.desc=e},r}(taiga.Service),angular.module("taigaComponents").service("tgLiveAnnouncementService",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.$watch("project",function(e){var n,i;if(e=Immutable.fromJS(e))return i=e.get("logo_big_url"),i?(r.attr("src",i),r.css("background","")):(n=t.getDefaultProjectLogo(e.get("slug"),e.get("id")),r.attr("src",n.src),r.css("background",n.color))})},{link:e,scope:{project:"=tgProjectLogoBigSrc"}}},t.$inject=["tgProjectLogoService"],angular.module("taigaComponents").directive("tgProjectLogoBigSrc",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.$watch("project",function(e){var n,i;if(e=Immutable.fromJS(e))return i=e.get("logo_small_url"),i?(r.attr("src",i),r.css("background","")):(n=t.getDefaultProjectLogo(e.get("slug"),e.get("id")),r.attr("src",n.src),r.css("background",n.color))})},{link:e,scope:{project:"=tgProjectLogoSmallSrc"}}},t.$inject=["tgProjectLogoService"],angular.module("taigaComponents").directive("tgProjectLogoSmallSrc",t)}.call(this),function(){var t;t=function(){function t(t,e){this.projectService=t,this.lightboxFactory=e,this.project=null,this.menu=Immutable.Map()}return t.$inject=["tgProjectService","tgLightboxFactory"],t.prototype.show=function(){return this.project=this.projectService.project,this.active=this._getActiveSection(),this._setVideoConference(),this._setMenuPermissions()},t.prototype.hide=function(){return this.project=null,this.menu={}},t.prototype.search=function(){return this.lightboxFactory.create("tg-search-box",{"class":"lightbox lightbox-search"})},t.prototype._setVideoConference=function(){var t;if(t=this._videoConferenceUrl())return this.project=this.project.set("videoconferenceUrl",t)},t.prototype._setMenuPermissions=function(){if(this.menu=Immutable.Map({epics:!1,backlog:!1,kanban:!1,issues:!1,wiki:!1}),this.project.get("is_epics_activated")&&this.project.get("my_permissions").indexOf("view_epics")!==-1&&(this.menu=this.menu.set("epics",!0)),this.project.get("is_backlog_activated")&&this.project.get("my_permissions").indexOf("view_us")!==-1&&(this.menu=this.menu.set("backlog",!0)),this.project.get("is_kanban_activated")&&this.project.get("my_permissions").indexOf("view_us")!==-1&&(this.menu=this.menu.set("kanban",!0)),this.project.get("is_issues_activated")&&this.project.get("my_permissions").indexOf("view_issues")!==-1&&(this.menu=this.menu.set("issues",!0)),this.project.get("is_wiki_activated")&&this.project.get("my_permissions").indexOf("view_wiki_pages")!==-1)return this.menu=this.menu.set("wiki",!0)},t.prototype._getActiveSection=function(){var t,e,r,n,i;return n=this.projectService.section,i=this.projectService.sectionsBreadcrumb,t=i.lastIndexOf("backlog"),e=i.lastIndexOf("kanban"),t===-1&&e===-1||(r=e===-1||t>e?"backlog":"kanban"),"backlog-kanban"===n&&("backlog"===r||"kanban"===r?n=r:this.project.get("is_backlog_activated")&&!this.project.get("is_kanban_activated")?n="backlog":!this.project.get("is_backlog_activated")&&this.project.get("is_kanban_activated")&&(n="kanban")),n},t.prototype._videoConferenceUrl=function(){var t,e;if("appear-in"===this.project.get("videoconferences"))t="https://appear.in/";else if("talky"===this.project.get("videoconferences"))t="https://talky.io/";else{if("jitsi"!==this.project.get("videoconferences"))return"custom"===this.project.get("videoconferences")?this.project.get("videoconferences_extra_data"):"";t="https://meet.jit.si/"}return e=this.project.get("videoconferences_extra_data")?this.project.get("slug")+"-"+taiga.slugify(this.project.get("videoconferences_extra_data")):this.project.get("slug"),"jitsi"===this.project.get("videoconferences")&&(e=e.replace(/-/g,"")),t+e},t}(),angular.module("taigaComponents").controller("ProjectMenu",t)}.call(this),function(){var t,e;e=this.taiga,t=function(t,e){var r;return r=function(e,r,n,i){var o;return o=function(){return t.project?i.show():i.hide()},e.$watch(function(){return t.project},o),e.vm.fixed=!1,$(window).on("scroll",function(){var t;return t=$(window).scrollTop(),t>100&&e.vm.fixed===!1?(e.vm.fixed=!0,e.$digest()):t<100&&e.vm.fixed===!0?(e.vm.fixed=!1,e.$digest()):void 0})},{scope:{},controller:"ProjectMenu",controllerAs:"vm",templateUrl:"components/project-menu/project-menu.html",link:r}},t.$inject=["tgProjectService","tgLightboxFactory"],angular.module("taigaComponents").directive("tgProjectMenu",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){var t,e,r,n;return r=function(t){var e,r,n;return t.addClass("selected"),n=t.position().top+t.outerHeight(),e=t.parent().outerHeight(),n>e?(r=n-e,t.parent().scrollTop(t.parent().scrollTop()+r)):t.position().top<0?t.parent().scrollTop(t.parent().scrollTop()+t.position().top):void 0},t=function(t,e,n){var i,o,s;if(i=t.find(".selected"),40===e){if(!i.length)return r(t.find("li:first"));if(o=i.next("li"),o.length)return i.removeClass("selected"),r(o)}else if(38===e){if(!i.length)return r(t.find("li:last"));if(s=i.prev("li"),s.length)return i.removeClass("selected"),r(s)}},n=function(){return $(document).off(".tags-keyboard-navigation")},e=function(e,r){return n(),$(r).parent().on("keydown.tags-keyboard-navigation",function(n){return function(n){var i;if(i=n.keyCode?n.keyCode:n.which,40===i||38===i)return n.preventDefault(),t(r,i,e)}}(this)),e.$on("$destroy",n)},{link:e,templateUrl:"components/tags/tag-dropdown/tag-dropdown.html",scope:{onSelectTag:"&",colorArray:"=",tag:"="}}},e.directive("tgTagsDropdown",t)}.call(this),function(){var t,e,r;r=this.taiga.trim,e=angular.module("taigaCommon"),t=function(){function t(t){this.tagLineService=t,this.disableColorSelection=!1,this.newTag={name:"",color:null},this.colorArray=[],this.addTag=!1}return t.$inject=["tgTagLineService"],t.prototype.checkPermissions=function(){return this.tagLineService.checkPermissions(this.project.my_permissions,this.permissions)},t.prototype._createColorsArray=function(t){return this.colorArray=this.tagLineService.createColorsArray(t)},t.prototype.displayTagInput=function(){return this.addTag=!0},t.prototype.addNewTag=function(t,e){if(this.newTag.name="",this.newTag.color=null,t.length)return this.disableColorSelection?t.length?this.onAddTag({name:t,color:e}):void 0:(this.project.tags_colors[t]&&(e=this.project.tags_colors[t]),this.onAddTag({name:t,color:e}))},t.prototype.selectColor=function(t){return this.newTag.color=t},t}(),e.controller("TagLineCommonCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){var t;return t=function(t,e,r,n){var i;return _.isUndefined(r.disableColorSelection)||(n.disableColorSelection=!0),i=t.$watch("vm.project",function(t){if(t&&Object.keys(t).length)return i(),n.disableColorSelection?void 0:n.colorArray=n._createColorsArray(n.project.tags_colors)}),e.on("keydown",".tag-input",function(r){var i;return 27===r.keyCode?(n.addTag=!1,n.newTag.name="",n.newTag.color="",r.stopPropagation()):13===r.keyCode&&(r.preventDefault(),e.find(".tags-dropdown .selected").length?(i=$(".tags-dropdown .selected .tags-dropdown-name").text(),n.addNewTag(i,null)):n.addNewTag(n.newTag.name,n.newTag.color)),t.$apply()})},{link:t,scope:{permissions:"@",loadingAddTag:"=",loadingRemoveTag:"=",tags:"=",project:"=",onAddTag:"&",onDeleteTag:"&"},templateUrl:"components/tags/tag-line-common/tag-line-common.html",controller:"TagLineCommonCtrl",controllerAs:"vm",bindToController:!0}},e.directive("tgTagLineCommon",t)}.call(this),function(){var t,e,r;r=this.taiga.trim,e=angular.module("taigaCommon"),t=function(){function t(t,e,r){this.rootScope=t,this.confirm=e,this.modelTransform=r,this.loadingAddTag=!1}return t.$inject=["$rootScope","$tgConfirm","$tgQueueModelTransformation"],t.prototype.onDeleteTag=function(t){var e,n,i,o;return this.loadingRemoveTag=t[0],n=function(t){return function(e){return t.rootScope.$broadcast("object:updated"),t.loadingRemoveTag=!1,e}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.loadingRemoveTag=!1}}(this),i=r(t[0].toLowerCase()),o=this.modelTransform.save(function(t){var e;return e=_.clone(t.tags),_.remove(e,function(t){return t[0]===i}),t.tags=e,t}),o.then(n,e)},t.prototype.onAddTag=function(t,e){var n,i,o;return this.loadingAddTag=!0,i=function(t){return function(e){return t.rootScope.$broadcast("object:updated"),t.addTag=!1,t.loadingAddTag=!1,e}}(this),n=function(t){return function(){return t.loadingAddTag=!1,t.confirm.notify("error")}}(this),o=this.modelTransform.save(function(n){return function(n){var i,o;return o=r(t.toLowerCase()),i=_.clone(n.tags),i.push([t,e]),n.tags=i,n}}(this)),o.then(i,n)},t}(),e.controller("TagLineCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){return{scope:{item:"=",permissions:"@",project:"="},templateUrl:"components/tags/tag-line-detail/tag-line-detail.html",controller:"TagLineCtrl",controllerAs:"vm",bindToController:!0}},e.directive("tgTagLine",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=angular.module("taigaCommon"),t=function(t){function e(){}return r(e,t),e.$inject=[],e.prototype.checkPermissions=function(t,e){return _.includes(t,e)},e.prototype.createColorsArray=function(t){return _.map(t,function(t,e){return[e,t]})},e}(taiga.Service),e.service("tgTagLineService",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){return{templateUrl:"components/tags/tag/tag.html",scope:{tag:"<",loadingRemoveTag:"<",onDeleteTag:"&",hasPermissions:"@"}}},e.directive("tgTag",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){var o,s;return e.zoomIndex=t.get("taskboard_zoom")||2,e.levels=4,s=[["ref"],["subject"],["owner","tags","extra_info","unfold"],["attachments","empty_extra_info"],["related_tasks"]],o=function(e){return null==e&&(e=0),t.get("taskboard_zoom")!==e&&t.set("taskboard_zoom",e),_.reduce(s,function(t,r,n){return n<=e&&(t=t.concat(r)),t})},e.$watch("zoomIndex",function(t){var r;return r=o(t),e.onZoomChange({zoomLevel:t,zoom:r})})},{scope:{onZoomChange:"&"},template:'',link:e}},angular.module("taigaComponents").directive("tgTaskboardZoom",["$tgStorage",t])}.call(this),function(){var t;t=function(t,e,r,n,i){var o;return o=function(t,e,r){return t.privacyPolicyUrl=n.get("privacyPolicyUrl"),t.termsOfServiceUrl=n.get("termsOfServiceUrl"),t.GDPRUrl=n.get("GDPRUrl")},{restrict:"AE",scope:{},controllerAs:"vm",controller:function(){return this.close=function(){var n,o,s;return t.open=!1,o=r.getUser(),void 0===o.read_new_terms&&(s=o.getAttrs(),s.read_new_terms=!1,o=i.make_model("users",s)),o.read_new_terms=!0,n=function(t){return r.setUser(t)},e.save(o).then(n)},Object.defineProperties(this,{open:{get:function(){return t.open}}})},link:o,templateUrl:"components/terms-announcement/terms-announcement.html"}},t.$inject=["tgTermsAnnouncementService","$tgRepo","$tgAuth","$tgConfig","$tgModel"],angular.module("taigaComponents").directive("tgTermsAnnouncement",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){this.open=!1}return e(r,t),r.prototype.show=function(){return this.open=!0},r}(taiga.Service),angular.module("taigaComponents").service("tgTermsAnnouncementService",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.privacyPolicyUrl=t.get("privacyPolicyUrl"),e.termsOfServiceUrl=t.get("termsOfServiceUrl"),e.target=!1,e.privacyPolicyUrl&&e.termsOfServiceUrl||(e.target=!0),r.on("change","input[name='accepted_terms']",function(t){var r;return r=angular.element(t.currentTarget),e.target=r.is(":checked"),e.$apply()})},{restrict:"AE",link:e,scope:{target:"="},templateUrl:"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html"}},angular.module("taigaComponents").directive("tgTermsOfServiceAndPrivacyPolicyNotice",["$tgConfig",t])}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i){return r.vm={},r.vm.tribeHost=t.config.tribeHost,r.vm.url=e.protocol()+"://"+e.host(),"http"===e.protocol()&&80!==e.port()?r.vm.url=r.vm.url+":"+e.port():"https"===e.protocol()&&443!==e.port()?r.vm.url=r.vm.url+":"+e.port():void 0},{scope:{usId:"=",projectSlug:"="},controllerAs:"vm",templateUrl:"components/tribe-button/tribe-button.html",link:r}},t.$inject=["$tgConfig","$tgLocation"],angular.module("taigaComponents").directive("tgTribeButton",t); -}.call(this),function(){var t;t=function(t){var e,r;return r=function(e,r,n){return e.vm={},e.vm.tribeHost=t.config.tribeHost,e.vm.show=function(){return e.vm.open=!0},e.vm.hide=function(t){return e.vm.open=!1}},e={templateUrl:"components/tribe-button/tribe-linked.html",scope:{gigTitle:"=",gigId:"="},link:r}},t.$inject=["$tgConfig"],angular.module("taigaComponents").directive("tgTribeLinked",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return t.$inject=["tgCurrentUserService"],t.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},t.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},t.prototype.toggleVote=function(){var t;return this.loading=!0,t=this.item.is_voter?this._downvote():this._upvote(),t["finally"](function(t){return function(){return t.loading=!1}}(this)),t},t.prototype._upvote=function(){return this.onUpvote().then(function(t){return function(){return t.showTextWhenMouseIsLeave()}}(this))},t.prototype._downvote=function(){return this.onDownvote()},t}(),angular.module("taigaComponents").controller("VoteButton",t)}.call(this),function(){var t;t=function(){return{scope:{},controller:"VoteButton",bindToController:{item:"=",onUpvote:"=",onDownvote:"="},controllerAs:"vm",templateUrl:"components/vote-button/vote-button.html"}},angular.module("taigaComponents").directive("tgVoteButton",t)}.call(this),function(){var t;t=function(){function t(t,e){this.currentUserService=t,this.rootScope=e,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return t.$inject=["tgCurrentUserService","$rootScope"],t.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},t.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},t.prototype.openWatchers=function(){return this.rootScope.$broadcast("watcher:add",this.item)},t.prototype.getPerms=function(){var t,e;return this.item?(t=this.item._name,e={userstories:"modify_us",issues:"modify_issue",tasks:"modify_task",epics:"modify_epic"},e[t]):""},t.prototype.toggleWatch=function(){var t;return this.loading=!0,t=this.item.is_watcher?this._unwatch():this._watch(),t["finally"](function(t){return function(){return t.loading=!1}}(this)),t},t.prototype._watch=function(){return this.onWatch().then(function(t){return function(){return t.showTextWhenMouseIsLeave()}}(this))},t.prototype._unwatch=function(){return this.onUnwatch()},t}(),angular.module("taigaComponents").controller("WatchButton",t)}.call(this),function(){var t;t=function(){return{scope:{},controller:"WatchButton",bindToController:{item:"=",onWatch:"=",onUnwatch:"="},controllerAs:"vm",templateUrl:function(t,e){return"components/watch-button/watch-button-"+e.environment+".html"}}},angular.module("taigaComponents").directive("tgWatchButton",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return i={epics:"epic",userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.comment.comment.id,i[e.vm.comment.comment._name],r,!0,!0).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCommentEditWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return e.editableDescription=!1,e.saveComment=function(t,r){return e.content="",e.vm.type.comment=t,e.vm.onAddComment({callback:r})},i={epics:"epic",userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.type.id,i[e.vm.type._name],r,!0,!0).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.onChange=function(t){return e.vm.type.comment=t},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCommentWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return i={userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.comment.comment.id,i[e.vm.comment.comment._name],r).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCustomFieldEditWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t,e,r,n,i){var o;return o=function(i,o,s){var a;return i.editableDescription=!1,i.saveDescription=function(n,i){var o;return o=t.save(function(t){return t.description=n,t}),o.then(function(){return r.notify("success"),e.$broadcast("object:updated")}),o.then(null,function(){return r.notify("error")}),o["finally"](i)},a=function(t,e){return n.addAttachment(i.project.id,i.item.id,s.type,t).then(function(t){return e(t.getIn(["file","name"]),t.getIn(["file","url"]))})},i.uploadFiles=function(t,e){var r,n,i,o;for(o=[],n=0,i=t.length;n\n \n \n\n \n\n \n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\n \n"}},angular.module("taigaComponents").directive("tgItemWysiwyg",["$tgQueueModelTransformation","$rootScope","$tgConfirm","tgAttachmentsFullService","$translate",t])}.call(this),function(){var t;t=function(){function t(){Prism.plugins.customClass.prefix("prism-"),Prism.plugins.customClass.map({})}return t.prototype.getLanguages=function(){return new Promise(function(t){return function(e,r){return t.languages?e(t.languages):t.loadPromise?t.loadPromise.then(function(){return e(t.languages)}):t.loadPromise=$.getJSON("/"+window._version+"/prism/prism-languages.json").then(function(r){return t.loadPromise=null,t.languages=_.map(r,function(t){return t.url="/"+window._version+"/prism/"+t.file,t}),e(t.languages)})}}(this))},t.prototype.getLanguageInClassList=function(t){var e;return e=_.find(this.languages,function(e){return!!_.find(t,function(t){return"language-"+e.name===t})}),e?e.name:null},t.prototype.loadLanguage=function(t){return new Promise(function(e){return Prism.languages[t]?e():ljs.load("/"+window._version+"/prism/prism-"+t+".min.js",e)})},t.prototype.replaceCodeBrToNl=function(t){return $(t).find("br").replaceWith("\n")},t.prototype.hightlightCode=function(t){var e;if(this.replaceCodeBrToNl(t),e=this.getLanguageInClassList(t.classList))return this.loadLanguage(e).then(function(){return Prism.highlightElement(t)})},t.prototype.addHightlighter=function(t){var e;return e=$(t).find("code"),e.each(function(t){return function(e,r){return t.hightlightCode(r)}}(this))},t}(),angular.module("taigaComponents").service("tgWysiwygCodeHightlighterService",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){return e.$watch("visible",function(n){return n&&!r.hasClass("open")?(e.open=!0,t.open(r,null,e.onClose),e.$applyAsync(function(){var t;if(t=r[0].querySelector("textarea"))return t.select()})):!n&&r.hasClass("open")?(e.open=!1,t.close(r)):void 0})},{scope:{languages:"<",codeLanguage:"<",code:"<",visible:"<",onClose:"&",onSave:"&"},link:e,templateUrl:"components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html"}},angular.module("taigaComponents").directive("tgWysiwygCodeLightbox",["lightboxService",t])}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.projectService=t,this.wysiwygService=e,this.navurls=r,this.rs=n,this.cancelablePromise=null}return t.$inject=["tgProjectService","tgWysiwygService","$tgNavUrls","$tgResources"],t.prototype.searchEmoji=function(t,e){var r;return r=this.wysiwygService.searchEmojiByName(t),r=r.slice(0,10),e(r)},t.prototype.searchUser=function(t,e){var r,n;return r=["username","full_name","full_name_display"],n=this.projectService.project.toJS().members.filter(function(e){return function(e){var n,i,o;for(n=0,i=r.length;n=0)return!0;if(e[o].indexOf(t)>=0)return!0}return!1}}(this)),n=n.slice(0,10).map(function(t){return function(e){return e.url=t.navurls.resolve("user-profile",{project:t.projectService.project.get("slug"),username:e.username}),e}}(this)),e(n)},t.prototype.searchItem=function(t){return new Promise(function(e){return function(r,n){var i,o,s,a;return t=taiga.slugify(t),s=["issues","tasks","userstories"],a={issues:"project-issues-detail",tasks:"project-tasks-detail",userstories:"project-userstories-detail"},o=["ref","subject"],i=function(e){var r,n,i;for(r=0,n=o.length;r=0)return!0;return!1},e.cancelablePromise&&e.cancelablePromise.abort(),e.cancelablePromise=e.rs.search["do"](e.projectService.project.get("id"),t),e.cancelablePromise.then(function(t){var n,o,c,u,l;if(t.count<1||t.count===t.wikipages.length)return r([]);for(u=[],n=0,c=s.length;n0&&(o=t[l].filter(i),o=o.map(function(t){return t.url=e.navurls.resolve(a[l],{project:e.projectService.project.get("slug"),ref:t.ref}),t}),u=u.concat(o));return u=_.sortBy(u,["ref"]),r(u.slice(0,10))})}}(this))},t.prototype.search=function(t){return new Promise(function(e){return function(r){return"#".indexOf(t[0])!==-1?e.searchItem(t.replace("#","")).then(r):"@".indexOf(t[0])!==-1?e.searchUser(t.replace("@",""),r):":".indexOf(t[0])!==-1?e.searchEmoji(t.replace(":",""),r):void 0}}(this))},t}(),angular.module("taigaComponents").service("tgWysiwygMentionService",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.bindOnce,t=function(t,e,n,i,o,s,a,c,u,l){var p,h,f,d,g,m,v,y,b,S,j,k;return k=function(){if(window.getSelection){if(window.getSelection().empty)return window.getSelection().empty()}else{if(window.getSelection().removeAllRanges)return window.getSelection().removeAllRanges();if(document.selection)return document.selection.empty()}},m=function(t){return $(t.endContainer).parentsUntil(".editor","code")},v=function(t){return!!m(t).length},j=function(t,e){var r,n,i;return r=$(t).is("code")?t:$(t).closest("code")[0],i=r.parentNode,n=document.createElement("p"),n.innerText=r.innerText,i.parentNode.replaceChild(n,i),e.checkContentChanged(e.elements[0])},d=function(t,e){var r,n,i,o;return i=document.createElement("pre"),r=document.createElement("code"),t.startContainer.parentNode.nextSibling||$("
").insertAfter(t.startContainer.parentNode),o=t.endContainer.parentNode.nextSibling,n=t.extractContents(),r.appendChild(n),i.appendChild(r),o.parentNode.insertBefore(i,o),S(e),e.checkContentChanged(e.elements[0])},S=function(e){var r,n,i,o,s,a,c,u,l,p;if(e){for(l=e.elements[0].children,r=0,i=l.length;rRTL",this.button.title="RTL",this.on(this.button,"click",this.handleClick.bind(this))},getButton:function(){return this.button},handleClick:function(t){var e;return e=MediumEditor.selection.getSelectionRange(document),"right"===e.commonAncestorContainer.parentNode.style.textAlign?document.execCommand("justifyLeft",!1):document.execCommand("justifyRight",!1)}}),g=function(t){return'\n \n'},h=MediumEditor.extensions.button.extend({name:"code",init:function(){var t;return t=_.find(this.base.options.toolbar.buttons,function(t){return"code"===t.name}),this.button=this.document.createElement("button"),this.button.classList.add("medium-editor-action"),this.button.innerHTML=t.contentDefault||"Code",this.button.title="Code",this.on(this.button,"click",this.handleClick.bind(this))},getButton:function(){return this.button},tagNames:["code"],handleClick:function(t){var e,r;if(e=MediumEditor.selection.getSelectionRange(self.document),v(e,this.base)?j(e.endContainer,this.base):(d(e,this.base),k()),r=this.base.getExtensionByName("toolbar"))return r.hideToolbar()}}),f=MediumEditor.extensions.paste.extend({doPaste:function(t,e,r){var n;return n=MediumEditor.util.htmlEntities(e),MediumEditor.util.insertHTMLCommand(this.document,n)}}),b=MediumEditor.util.isBlockContainer,MediumEditor.util.isBlockContainer=function(t){var e;return t?(e=t.tagName?t.tagName:t.parentNode.tagName,"code"===e.toLowerCase()||b(t)):b(t)},y=function(o,d,m){var v,y,b,k,I,E,T,C,P,w,A,O,R,M,U,N,D,L,x,F,B,H,q;return M=null,C=d.find(".medium"),T=d.find(".markdown"),k=null,A=!!m.$attr.editonly,U=!!m.$attr.notPersist,o.required=!!m.$attr.required,o.editMode=A||!1,o.mode=n.get("editor-mode","html"),o.markdown="",o.codeEditorVisible=!1,o.codeLans=[],a.getLanguages().then(function(t){return o.codeLans=t}),L=function(t){return o.editMode=t},x=function(t){var e;if(e=i.getHTML(t),C.html(e),a.addHightlighter(M.elements[0]),o.editMode)return S(M)},o.saveSnippet=function(t,e){var r;return o.codeEditorVisible=!1,k.innerText=e,r=k.parentNode,"remove-formating"===t?(k.className="",r.className="",j(k,M)):_.trim(e).length?(t?(k.className="language-"+t,r.className="language-"+t):(k.className="",r.className=""),a.hightlightCode(k),M.checkContentChanged(M.elements[0])):(k.parentNode.parentNode.removeChild(k.parentNode),M.checkContentChanged(M.elements[0])),F(),null},o.setMode=function(t){return n.set("editor-mode",t),"markdown"===t?H():x(o.markdown),o.mode=t,M.trigger("editableBlur",{},C[0])},o.save=function(t){t&&t.preventDefault(),"html"===o.mode&&H(),x(o.markdown),o.required&&!o.markdown.length||(o.saving=!0,o.outdated=!1,o.onSave({text:o.markdown,cb:D}))},o.cancel=function(t){t&&t.preventDefault(),A||L(!1),U?b():"html"===o.mode&&x(o.content||null),o.markdown=o.content,E(),M.trigger("blur",{},C[0]),o.outdated=!1,S(M),o.onCancel()},b=function(){return o.markdown="",C.html("")},D=function(){return o.saving=!1,A||L(!1),U&&b(),E(),M.trigger("blur",{},C[0]),u.trackEvent("develop","save wysiwyg",o.mode,1)},q=function(t,e){return r.isImage(t)?M.pasteHTML("
"):(t=$("
").text(t).html(),M.pasteHTML(""+t+"
"))},O=function(){var t;return t=n.get(o.storageKey),!(!t||!t.version||t.version===o.version)},w=function(){var t;return t=n.get(o.storageKey),!!t},P=function(){var t;return t=n.get(o.storageKey),t?t.text:o.content},E=function(){return n.remove(o.storageKey)},v=function(){var r,n;return o.content===o.markdown?(o.cancel(),document.activeElement.blur(),document.body.click(),null):(n=t.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE"),r=t.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE"),e.ask(n,null,r).then(function(t){return o.cancel(),t.finish()}))},N=function(){var t;return t=$("
").html(C.html()),t.find("code br").replaceWith("\n"),t.html()},H=function(){var t;return t=N(),o.markdown=i.getMarkdown(t)},R=function(t){var e;if(o.storageKey)return e={},e.version=o.version||0,e.text=t,n.set(o.storageKey,e)},y=function(){return"html"===o.mode&&H(),R(o.markdown),o.onChange({markdown:o.markdown})},F=_.throttle(y,200),I=function(t,e){var r;return null==e&&(e=!1),t.length&&(r=i.getHTML(t),C.html(r)),M=new MediumEditor(C[0],{imageDragging:!1,placeholder:{text:o.placeholder},toolbar:{buttons:[{name:"bold",contentDefault:g("editor-bold")},{name:"italic",contentDefault:g("editor-italic")},{name:"strikethrough",contentDefault:g("editor-cross-out")},{name:"anchor",contentDefault:g("editor-link")},{name:"image",contentDefault:g("editor-image")},{name:"orderedlist",contentDefault:g("editor-list-n")},{name:"unorderedlist",contentDefault:g("editor-list-o")},{name:"h1",contentDefault:g("editor-h1")},{name:"h2",contentDefault:g("editor-h2")},{name:"h3",contentDefault:g("editor-h3")},{name:"quote",contentDefault:g("editor-quote")},{name:"removeFormat",contentDefault:g("editor-no-format")},{name:"rtl",contentDefault:g("editor-rtl")},{name:"code",contentDefault:g("editor-code")}]},extensions:{paste:new f,code:new h,autolist:new AutoList,alignright:new p,mediumMention:new MentionExtension({getItems:function(t,e){return c.search(t).then(e)}})}}),o.changeMarkdown=F,M.subscribe("editableInput",function(t){return o.$applyAsync(F)}),M.subscribe("editableClick",function(t){var e;if(e=new RegExp("^(?:[a-z]+:)?//","i"),t.target.href)return e.test(t.target.getAttribute("href"))||"_blank"===t.target.getAttribute("target")?(t.stopPropagation(),window.open(t.target.href)):l.url(t.target.href)}),M.subscribe("editableDrop",function(t){return o.onUploadFile({files:t.dataTransfer.files,cb:q})}),M.subscribe("editableKeydown",function(t){var e,r;return e=t.keyCode?t.keyCode:t.which,r=$(".medium-mention"),40!==e&&38!==e||!r.length?o.editMode&&27===e?(t.stopPropagation(),o.$applyAsync(v)):27===e?C.blur():void 0:(t.stopPropagation(),void t.preventDefault())}),L(e),o.$applyAsync(function(){return a.addHightlighter(M.elements[0]),S(M)})},$(C[0]).on("mousedown",function(t){return t.target.href?(t.preventDefault(),t.stopPropagation()):o.$applyAsync(function(){if(!o.editMode)return L(!0),S(M)})}),$(C[0]).on("dblclick","pre",function(t){return o.$applyAsync(function(){return o.codeEditorVisible=!0,k=t.currentTarget.querySelector("code"),o.currentCodeLanguage=a.getLanguageInClassList(k.classList),o.code=k.innerText})}),B=o.$watch("content",function(t){var e;if(!_.isUndefined(t)){if(o.outdated=O(),!M&&w()&&L(!0),(o.markdown.length||t.length)&&o.markdown===t)return;return t=P(),o.markdown=t,M&&M.destroy(),s.open()?e=s.onEnd(function(){return I(t,o.editMode),e()}):I(t,o.editMode),B()}}),o.$on("$destroy",function(){if(M)return C.length&&$(C[0]).off(),M.destroy()})},{templateUrl:"common/components/wysiwyg-toolbar.html",scope:{placeholder:"@",version:"<",storageKey:"<",content:"<",onCancel:"&",onSave:"&",onUploadFile:"&",onChange:"&"},link:y}},angular.module("taigaComponents").directive("tgWysiwyg",["$translate","$tgConfirm","$tgStorage","tgWysiwygService","animationFrame","tgLoader","tgWysiwygCodeHightlighterService","tgWysiwygMentionService","$tgAnalytics","$location",t])}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.wysiwygCodeHightlighterService=t,this.projectService=e,this.navurls=r,this.emojis=n}return t.$inject=["tgWysiwygCodeHightlighterService","tgProjectService","$tgNavUrls","$tgEmojis"],t.prototype.searchEmojiByName=function(t){return this.emojis.searchByName(t)},t.prototype.pipeLinks=function(t){return t.replace(/\[\[(.*?)\]\]/g,function(t,e,r,n){var i,o,s;return o=e.split("|"),i=o[0],s=o[1]||o[0],"["+s+"]("+i+")"})},t.prototype.replaceUrls=function(t){var e,r,n,i,o;for(e=document.createElement("html"),e.innerHTML=t,o=e.querySelectorAll("a"),r=0,n=o.length;r(.*?)
<\/li>/g,"
  • $1
  • ")},t.prototype.getMarkdown=function(t){var e,r,n;return e={filter:["html","body","span","div"],replacement:function(t){return t}},r={filter:function(t){return function(t){return"PRE"===t.nodeName&&t.firstChild&&"CODE"===t.firstChild.nodeName}}(this),replacement:function(t){return function(e,r){var n;return n=t.wysiwygCodeHightlighterService.getLanguageInClassList(r.firstChild.classList),n||(n=""),"\n\n```"+n+"\n"+_.trim(r.firstChild.textContent)+"\n```\n\n"}}(this)},t=t.replace(/ (<\/.*>)/g,"$1"),t=this.emojis.replaceImgsByEmojiName(t),t=this.replaceUrls(t),t=this.removeTrailingListBr(t),n=toMarkdown(t,{gfm:!0,converters:[e,r]})},t.prototype.parseMentionMatches=function(t){var e,r,n,i,o,s,a;for(s="twitter",a=this.tagBuilder,r=[],o=/@[^\s]{1,50}[^.\s]/g,e=o.exec(t);null!==e;)n=e.index,i=t.charAt(n-1),e.index===o.lastIndex&&o.lastIndex++,e.forEach(function(t,e){return r.push(new Autolinker.match.Mention({tagBuilder:a,matchedText:t,offset:n,serviceName:s,mention:t.slice(1)}))}),e=o.exec(t);return r},t.prototype.autoLinkHTML=function(t){var e,r;return r=String(Autolinker.matcher.Mention.prototype.matcherRegexes.twitter),r.indexOf(".")===-1&&(r="@[^s]{1,50}[^.s]"),e=new Autolinker({mention:"twitter",hashtag:"twitter",replaceFn:function(t){return function(e){var r,n;return"mention"===e.getType()?(r=t.navurls.resolve("user-profile",{project:t.projectService.project.get("slug"),username:e.getMention()}),'@'+e.getMention()+""):"hashtag"===e.getType()?(n=t.navurls.resolve("project-detail-ref",{project:t.projectService.project.get("slug"),ref:e.getHashtag()}),'#'+e.getHashtag()+""):void 0}}(this)}),Autolinker.matcher.Mention.prototype.parseMatches=this.parseMentionMatches.bind(e),e.link(t)},t.prototype.getHTML=function(t){var e,r,n;return t&&t.length?(r={breaks:!0},t=this.emojis.replaceEmojiNameByImgs(t),t=this.pipeLinks(t),e=window.markdownit({breaks:!0}),e.use(window.markdownitLazyHeaders),n=e.render(t),n=this.searchWikiLinks(n),n=this.autoLinkHTML(n)):""},t}(),angular.module("taigaComponents").service("tgWysiwygService",t)}.call(this),function(){var t;t=function(){function t(t){this.translate=t,this.is_open=!1,this.texts={week:this.translate.instant("DISCOVER.FILTERS.WEEK"),month:this.translate.instant("DISCOVER.FILTERS.MONTH"),year:this.translate.instant("DISCOVER.FILTERS.YEAR"),all:this.translate.instant("DISCOVER.FILTERS.ALL_TIME")}}return t.$inject=["$translate"],t.prototype.currentText=function(){return this.texts[this.currentOrderBy]},t.prototype.open=function(){return this.is_open=!0},t.prototype.close=function(){return this.is_open=!1},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.is_open=!1,this.onChange({orderBy:this.currentOrderBy})},t}(),angular.module("taigaDiscover").controller("DiscoverHomeOrderBy",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"DiscoverHomeOrderBy",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-home-order-by/discover-home-order-by.html",scope:{currentOrderBy:"=orderBy",onChange:"&"},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverHomeOrderBy",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.discoverProjectsService.projectsCount}}(this)),this.discoverProjectsService.fetchStats()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.selectFilter=function(t){return this.onChange({filter:t,q:this.q})},t.prototype.submitFilter=function(){return this.onChange({filter:this.filter,q:this.q})},t}(),angular.module("taigaDiscover").controller("DiscoverSearchBar",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{controller:"DiscoverSearchBar",controllerAs:"vm",templateUrl:"discover/components/discover-search-bar/discover-search-bar.html",bindToController:!0,scope:{q:"=",filter:"=",onChange:"&"},compile:function(t,e){if(!e.q)return e.q=""},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchBar",t)}.call(this),function(){var t;t=function(){function t(){this.like_is_open=0===this.orderBy.indexOf("-total_fans"),this.activity_is_open=0===this.orderBy.indexOf("-total_activity")}return t.$inject=[],t.prototype.openLike=function(){return this.like_is_open=!0,this.activity_is_open=!1,this.setOrderBy("-total_fans_last_week")},t.prototype.openActivity=function(){return this.activity_is_open=!0,this.like_is_open=!1,this.setOrderBy("-total_activity_last_week")},t.prototype.setOrderBy=function(t){return null==t&&(t=""),t||(this.like_is_open=!1,this.activity_is_open=!1),this.onChange({orderBy:t})},t}(),angular.module("taigaDiscover").controller("DiscoverSearchListHeader",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"DiscoverSearchListHeader",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-search-list-header/discover-search-list-header.html",scope:{onChange:"&",orderBy:"="},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchListHeader",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"featured",function(t){return function(){return t.discoverProjectsService.featured}}(this)),this.discoverProjectsService.fetchFeatured()}return t.$inject=["tgDiscoverProjectsService"],t}(),angular.module("taigaDiscover").controller("FeaturedProjects",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"FeaturedProjects",controllerAs:"vm",templateUrl:"discover/components/featured-projects/featured-projects.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgFeaturedProjects",t)}.call(this),function(){var t;t=function(){return{templateUrl:"discover/components/highlighted/highlighted.html",scope:{loading:"=",highlighted:"=",orderBy:"="}}},t.$inject=[],angular.module("taigaDiscover").directive("tgHighlighted",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"highlighted",function(t){return function(){return t.discoverProjectsService.mostActive}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostActive({order_by:this.order_by}).then(function(t){return function(){return t.loading=!1}}(this))},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.fetch()},t.prototype.getOrderBy=function(t){return"all"===this.currentOrderBy?"-total_activity":"-total_activity_last_"+this.currentOrderBy},t}(),angular.module("taigaDiscover").controller("MostActive",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"MostActive",controllerAs:"vm",templateUrl:"discover/components/most-active/most-active.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgMostActive",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"highlighted",function(t){return function(){return t.discoverProjectsService.mostLiked}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostLiked({order_by:this.order_by}).then(function(t){return function(){return t.loading=!1}}(this))},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.fetch()},t.prototype.getOrderBy=function(){return"all"===this.currentOrderBy?"-total_fans":"-total_fans_last_"+this.currentOrderBy},t}(),angular.module("taigaDiscover").controller("MostLiked",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"MostLiked",controllerAs:"vm",templateUrl:"discover/components/most-liked/most-liked.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgMostLiked",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n){var i,o;this.location=t,this.navUrls=e,this.appMetaService=r,this.translate=n,o=this.translate.instant("DISCOVER.PAGE_TITLE"),i=this.translate.instant("DISCOVER.PAGE_DESCRIPTION"),this.appMetaService.setAll(o,i)}return t.$inject=["$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],t.prototype.onSubmit=function(t){var e;return e=this.navUrls.resolve("discover-search"),this.location.search("text",t).path(e)},t}(),angular.module("taigaDiscover").controller("DiscoverHome",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n,i,o,s){var a,c;this.routeParams=t,this.discoverProjectsService=e,this.route=r,this.location=n,this.analytics=i,this.appMetaService=o,this.translate=s,this.page=1,taiga.defineImmutableProperty(this,"searchResult",function(t){return function(){return t.discoverProjectsService.searchResult}}(this)),taiga.defineImmutableProperty(this,"nextSearchPage",function(t){return function(){return t.discoverProjectsService.nextSearchPage}}(this)),this.q=this.routeParams.text,this.filter=this.routeParams.filter||"all",this.orderBy=this.routeParams.order_by||"",this.loadingGlobal=!1,this.loadingList=!1,this.loadingPagination=!1,c=this.translate.instant("DISCOVER.SEARCH.PAGE_TITLE"), -a=this.translate.instant("DISCOVER.SEARCH.PAGE_DESCRIPTION"),this.appMetaService.setAll(c,a),this.analytics.trackPage(this.location.url(),"Discover Search")}return t.$inject=["$routeParams","tgDiscoverProjectsService","$route","$tgLocation","$tgAnalytics","tgAppMetaService","$translate"],t.prototype.fetch=function(){return this.page=1,this.discoverProjectsService.resetSearchList(),this.search()},t.prototype.fetchByGlobalSearch=function(){if(!this.loadingGlobal)return this.loadingGlobal=!0,this.fetch().then(function(t){return function(){return t.loadingGlobal=!1}}(this))},t.prototype.fetchByOrderBy=function(){if(!this.loadingList)return this.loadingList=!0,this.fetch().then(function(t){return function(){return t.loadingList=!1}}(this))},t.prototype.showMore=function(){if(!this.loadingPagination)return this.loadingPagination=!0,this.page++,this.search().then(function(t){return function(){return t.loadingPagination=!1}}(this))},t.prototype.search=function(){var t,e;return t=this.getFilter(),e={page:this.page,q:this.q,order_by:this.orderBy},_.assign(e,t),this.discoverProjectsService.fetchSearch(e)},t.prototype.getFilter=function(){return"people"===this.filter?{is_looking_for_people:!0}:"scrum"===this.filter?{is_backlog_activated:!0}:"kanban"===this.filter?{is_kanban_activated:!0}:{}},t.prototype.onChangeFilter=function(t,e){return this.filter=t,this.q=e,this.route.updateParams({filter:this.filter,text:this.q}),this.analytics.trackPage(this.location.url(),"Discover Search"),this.fetchByGlobalSearch()},t.prototype.onChangeOrder=function(t){return this.orderBy=t,this.route.updateParams({order_by:t}),this.analytics.trackPage(this.location.url(),"Discover Search"),this.fetchByOrderBy()},t}(),angular.module("taigaDiscover").controller("DiscoverSearch",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"DiscoverSearch",controllerAs:"vm",link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearch",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga,t=function(t){function n(t,r){this.rs=t,this.projectsService=r,this._mostLiked=Immutable.List(),this._mostActive=Immutable.List(),this._featured=Immutable.List(),this._searchResult=Immutable.List(),this._projectsCount=0,this.decorate=this.projectsService._decorate.bind(this.projectsService),e.defineImmutableProperty(this,"mostLiked",function(t){return function(){return t._mostLiked}}(this)),e.defineImmutableProperty(this,"mostActive",function(t){return function(){return t._mostActive}}(this)),e.defineImmutableProperty(this,"featured",function(t){return function(){return t._featured}}(this)),e.defineImmutableProperty(this,"searchResult",function(t){return function(){return t._searchResult}}(this)),e.defineImmutableProperty(this,"nextSearchPage",function(t){return function(){return t._nextSearchPage}}(this)),e.defineImmutableProperty(this,"projectsCount",function(t){return function(){return t._projectsCount}}(this))}var i;return r(n,t),n.$inject=["tgResources","tgProjectsService"],i={discover_mode:!0},n.prototype.fetchMostLiked=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,5),n=Immutable.fromJS(r),n=n.map(t.decorate),t._mostLiked=n}}(this))},n.prototype.fetchMostActive=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,5),n=Immutable.fromJS(r),n=n.map(t.decorate),t._mostActive=n}}(this))},n.prototype.fetchFeatured=function(){var t;return t=_.extend({},i),t.is_featured=!0,this.rs.projects.getProjects(t,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,4),n=Immutable.fromJS(r),n=n.map(t.decorate),t._featured=n}}(this))},n.prototype.resetSearchList=function(){return this._searchResult=Immutable.List()},n.prototype.fetchStats=function(){return this.rs.stats.discover().then(function(t){return function(e){return t._projectsCount=e.getIn(["projects","total"])}}(this))},n.prototype.fetchSearch=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e).then(function(t){return function(e){var r;return t._nextSearchPage=!!e.headers("X-Pagination-Next"),r=Immutable.fromJS(e.data),r=r.map(t.decorate),t._searchResult=t._searchResult.concat(r)}}(this))},n}(e.Service),angular.module("taigaDiscover").service("tgDiscoverProjectsService",t)}.call(this),function(){var t,e,r,n;r=this.taiga,n=r.trim,e=r.getRandomDefaultColor,t=function(){function t(t,r,n,i){this.confirm=t,this.projectService=r,this.epicsService=n,this.analytics=i,this.project=this.projectService.project.toJS(),this.newEpic={color:e(),status:this.project.default_epic_status,tags:[]},this.attachments=Immutable.List(),this.loading=!1}return t.$inject=["$tgConfirm","tgProjectService","tgEpicsService","$tgAnalytics"],t.prototype.createEpic=function(){if(this.validateForm())return this.loading=!0,this.epicsService.createEpic(this.newEpic,this.attachments).then(function(t){return function(e){return t.analytics.trackEvent("epic","create","create epic",1),t.onCreateEpic(),t.loading=!1}}(this))["catch"](function(t){return function(e){if(t.loading=!1,t.setFormErrors(e.data),e.data._error_message)return t.confirm.notify("error",e.data._error_message)}}(this))},t.prototype.selectColor=function(t){return this.newEpic.color=t},t.prototype.addTag=function(t,e){if(t=n(t.toLowerCase()),!_.find(this.newEpic.tags,function(e){return e[0]===t}))return this.newEpic.tags.push([t,e])},t.prototype.deleteTag=function(t){return _.remove(this.newEpic.tags,function(e){return e[0]===t[0]})},t.prototype.addAttachment=function(t){return this.attachments.push(t)},t}(),angular.module("taigaEpics").controller("CreateEpicCtrl",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=e.find("form").checksley(),n.validateForm=function(t){return function(){return i.validate()}}(this),n.setFormErrors=function(t){return function(t){return i.setErrors(t)}}(this)},{link:t,templateUrl:"epics/create-epic/create-epic.html",controller:"CreateEpicCtrl",controllerAs:"vm",bindToController:{onCreateEpic:"&"},scope:{}}},angular.module("taigaEpics").directive("tgCreateEpic",t)}.call(this),function(){var t;t=function(){function t(t,e,r){this.confirm=t,this.projectService=e,this.epicsService=r,this.displayUserStories=!1,this.displayAssignedTo=!1,this.displayStatusList=!1,this.loadingStatus=!1,this.project=this.projectService.project.toJS(),this._calculateProgressBar()}return t.$inject=["$tgConfirm","tgProjectService","tgEpicsService"],t.prototype._calculateProgressBar=function(){var t,e;return this.epic.getIn(["status_extra_info","is_closed"])===!0?this.percentage="100%":(t=this.epic.getIn(["user_stories_counts","progress"]),e=this.epic.getIn(["user_stories_counts","total"]),0===e?this.percentage="0%":this.percentage=100*t/e+"%")},t.prototype.canEditEpics=function(){return this.projectService.hasPermission("modify_epic")},t.prototype.toggleUserStoryList=function(){return this.displayUserStories?this.displayUserStories=!1:this.epicsService.listRelatedUserStories(this.epic).then(function(t){return function(e){return t.epicStories=e,t.displayUserStories=!0}}(this))["catch"](function(t){return function(){return t.confirm.notify("error")}}(this))},t.prototype.updateStatus=function(t){return this.displayStatusList=!1,this.loadingStatus=!0,this.epicsService.updateEpicStatus(this.epic,t)["catch"](function(t){return function(){return t.confirm.notify("error")}}(this))["finally"](function(t){return function(){return t.loadingStatus=!1}}(this))},t.prototype.updateAssignedTo=function(t){return this.assignLoader=!0,this.epicsService.updateEpicAssignedTo(this.epic,(null!=t?t.id:void 0)||null)["catch"](function(t){return function(){return t.confirm.notify("error")}}(this)).then(function(t){return function(){return t.assignLoader=!1}}(this))},t}(),angular.module("taigaEpics").controller("EpicRowCtrl",t)}.call(this),function(){var t;t=function(){return{templateUrl:"epics/dashboard/epic-row/epic-row.html",controller:"EpicRowCtrl",controllerAs:"vm",bindToController:!0,scope:{epic:"=",column:"="}}},angular.module("taigaEpics").directive("tgEpicRow",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,r,n,i,o,s,a,c,u){this.params=t,this.errorHandlingService=r,this.lightboxFactory=n,this.lightboxService=i,this.confirm=o,this.projectService=s,this.epicsService=a,this.appMetaService=c,this.translate=u,this.sectionName="EPICS.SECTION_NAME",e.defineImmutableProperty(this,"project",function(t){return function(){return t.projectService.project}}(this)),e.defineImmutableProperty(this,"epics",function(t){return function(){return t.epicsService.epics}}(this)),this.appMetaService.setfn(this._setMeta.bind(this))}return t.$inject=["$routeParams","tgErrorHandlingService","tgLightboxFactory","lightboxService","$tgConfirm","tgProjectService","tgEpicsService","tgAppMetaService","$translate"],t.prototype._setMeta=function(){var t;return this.project?(t={projectName:this.project.get("name"),projectDescription:this.project.get("description")},{title:this.translate.instant("EPICS.PAGE_TITLE",t),description:this.translate.instant("EPICS.PAGE_DESCRIPTION",t)}):null},t.prototype.loadInitialData=function(){return this.epicsService.clear(),this.projectService.setProjectBySlug(this.params.pslug).then(function(t){return function(){return t.projectService.isEpicsDashboardEnabled()?t.projectService.hasPermission("view_epics")?t.epicsService.fetchEpics():t.errorHandlingService.permissionDenied():t.errorHandlingService.notFound()}}(this))},t.prototype.canCreateEpics=function(){return this.projectService.hasPermission("add_epic")},t.prototype.onCreateEpic=function(){var t;return t=function(t){return function(){t.lightboxService.closeAll(),t.confirm.notify("success")}}(this),this.lightboxFactory.create("tg-create-epic",{"class":"lightbox lightbox-create-epic open","on-create-epic":"onCreateEpic()"},{onCreateEpic:t.bind(this)})},t}(),angular.module("taigaEpics").controller("EpicsDashboardCtrl",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i){var o,s,a;if(e.hasPermission("modify_epic"))return o=t(i.tgEpicsSortable),s=dragula([n[0]],{copySortSource:!1,copy:!1,mirrorContainer:n[0],moves:function(t){return $(t).is("div.epics-table-body-row")}}),s.on("dragend",function(t){var e,n,i;return n=$(t),e=n.scope().epic,i=n.index(),r.$apply(function(){return o(r,{epic:e,newIndex:i})})}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&s.dragging}}),r.$on("$destroy",function(){return n.off(),s.destroy()})},{link:r}},t.$inject=["$parse","tgProjectService"],angular.module("taigaComponents").directive("tgEpicsSortable",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.generateHash,t=function(){function t(t,n,i,o,s){this.confirm=t,this.epicsService=n,this.timeout=i,this.storage=o,this.projectService=s,this.hash=e([this.projectService.project.get("id"),"epics"]),this.displayOptions=!1,this.displayVotes=!0,this.column=this.storage.get(this.hash,{votes:!0,name:!0,project:!0,sprint:!0,assigned:!0,status:!0,progress:!0}),r.defineImmutableProperty(this,"epics",function(t){return function(){return t.epicsService.epics}}(this)),r.defineImmutableProperty(this,"disabledEpicsPagination",function(t){return function(){return t.epicsService._disablePagination}}(this)),r.defineImmutableProperty(this,"loadingEpics",function(t){return function(){return t.epicsService._loadingEpics}}(this))}return t.$inject=["$tgConfirm","tgEpicsService","$timeout","$tgStorage","tgProjectService"],t.prototype.toggleEpicTableOptions=function(){return this.displayOptions=!this.displayOptions},t.prototype.reorderEpic=function(t,e){return t.get("epics_order")===e?null:this.epicsService.reorderEpic(t,e).then(null,function(t){return function(){return t.confirm.notify("error")}}(this))},t.prototype.nextPage=function(){return this.epicsService.nextPage()},t.prototype.hoverEpicTableOption=function(){if(this.timer)return this.timeout.cancel(this.timer)},t.prototype.hideEpicTableOption=function(){return this.timer=this.timeout(function(t){return function(){return t.displayOptions=!1}}(this),400)},t.prototype.updateViewOptions=function(){return this.storage.set(this.hash,this.column)},t}(),angular.module("taigaEpics").controller("EpicsTableCtrl",t)}.call(this),function(){var t;t=function(){return{templateUrl:"epics/dashboard/epics-table/epics-table.html",controller:"EpicsTableCtrl",controllerAs:"vm",scope:{}}},angular.module("taigaEpics").directive("tgEpicsTable",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(){this._calculateProgressBar()}return t.$inject=[],t.prototype._calculateProgressBar=function(){var t,e;return this.story.get("is_closed")===!0?this.percentage="100%":(t=this.story.get("tasks").size,e=this.story.get("tasks").filter(function(t){return t.get("is_closed")}).size,0===t?this.percentage="0%":this.percentage=100*e/t+"%")},t}(),e.controller("StoryRowCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){return{templateUrl:"epics/dashboard/story-row/story-row.html",controller:"StoryRowCtrl",controllerAs:"vm",bindToController:!0,scope:{story:"=",column:"="}}},e.directive("tgStoryRow",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,r,n,i){this.projectService=t,this.attachmentsService=r,this.resources=n,this.xhrError=i,this.clear(),e.defineImmutableProperty(this,"epics",function(t){return function(){return t._epics}}(this))}return t.$inject=["tgProjectService","tgAttachmentsService","tgResources","tgXhrErrorService"],t.prototype.clear=function(){return this._loadingEpics=!1,this._disablePagination=!1,this._page=1,this._epics=Immutable.List()},t.prototype.fetchEpics=function(t){return null==t&&(t=!1),this._loadingEpics=!0,this._disablePagination=!0,this.resources.epics.list(this.projectService.project.get("id"),this._page).then(function(e){return function(r){return t?(e.clear(),e._epics=r.list):e._epics=e._epics.concat(r.list),e._loadingEpics=!1,e._disablePagination=!r.headers("x-pagination-next")}}(this))["catch"](function(t){return function(e){return t.xhrError.response(e)}}(this))},t.prototype.nextPage=function(){return this._page++,this.fetchEpics()},t.prototype.listRelatedUserStories=function(t){return this.resources.userstories.listInEpic(t.get("id"))},t.prototype.createEpic=function(t,e){return t.project=this.projectService.project.get("id"),this.resources.epics.post(t).then(function(t){return function(r){var n;return n=_.map(e.toJS(),function(e){return t.attachmentsService.upload(e.file,r.get("id"),r.get("project"),"epic")}),Promise.all(n).then(t.fetchEpics.bind(t,!0))}}(this))},t.prototype.reorderEpic=function(t,e){var r,n,i,o,s,a,c,u,l;return s={},this._epics.forEach(function(t){return s[t.get("id")]=t.get("epics_order")}),l=this.epics.filter(function(e){return function(e){return e.get("id")!==t.get("id")}}(this)),n=l.slice(0,e),r=l.slice(e),a=n.last(),o=a?a.get("epics_order")+1:0,s[t.get("id")]=o,c=n.filter(function(t){return function(t){return t.get("epics_order")===a.get("epics_order")}}(this)),u=_.fromPairs(c.map(function(t){return function(t){return[t.get("id"),t.get("epics_order")]}}(this)).toJS()),r.forEach(function(t){return s[t.get("id")]=t.get("epics_order")+1}),this._epics=this._epics.map(function(t){return t.set("epics_order",s[t.get("id")])}),this._epics=this._epics.sortBy(function(t){return t.get("epics_order")}),i={epics_order:o,version:t.get("version")},this.resources.epics.reorder(t.get("id"),i,u).then(function(t){return function(e){return t._epics=t._epics.map(function(t){return t.get("id")===e.get("id")?e:t})}}(this))},t.prototype.reorderRelatedUserstory=function(t,e,r,n){var i,o,s,a,c,u,l,p,h;return h=e.filter(function(t){return function(t){return t.get("id")!==r.get("id")}}(this)),i=h.slice(0,n),c=i.last(),a=c?c.get("epic_order")+1:0,u=i.filter(function(t){return function(t){return t.get("epic_order")===c.get("epic_order")}}(this)),l=_.fromPairs(u.map(function(t){return function(t){return[t.get("id"),t.get("epic_order")]}}(this)).toJS()),o={order:a},s=t.get("id"),p=r.get("id"),this.resources.epics.reorderRelatedUserstory(s,p,o,l).then(function(e){return function(){return e.listRelatedUserStories(t)}}(this))},t.prototype.replaceEpic=function(t){return this._epics=this._epics.map(function(e){return e.get("id")===t.get("id")?t:e})},t.prototype.updateEpicStatus=function(t,e){var r;return r={status:e,version:t.get("version")},this.resources.epics.patch(t.get("id"),r).then(this.replaceEpic.bind(this))},t.prototype.updateEpicAssignedTo=function(t,e){var r;return r={assigned_to:e,version:t.get("version")},this.resources.epics.patch(t.get("id"),r).then(this.replaceEpic.bind(this))},t}(),angular.module("taigaEpics").service("tgEpicsService",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e){this.projectService=t,this.epicsService=e,this.sectionName="Epics",this.showCreateRelatedUserstoriesLightbox=!1}return t.$inject=["tgProjectService","tgEpicsService"],t.prototype.showRelatedUserStoriesSection=function(){var t;return this.projectService.hasPermission("view_epics")||(null!=(t=this.userstories)?t.length:void 0)>0},t.prototype.userCanSort=function(){return this.projectService.hasPermission("modify_epic")},t.prototype.loadRelatedUserstories=function(){return this.epicsService.listRelatedUserStories(this.epic).then(function(t){return function(e){return t.userstories=e}}(this))},t.prototype.reorderRelatedUserstory=function(t,e){return this.epicsService.reorderRelatedUserstory(this.epic,this.userstories,t,e).then(function(t){return function(e){return t.userstories=e}}(this))},t}(),e.controller("RelatedUserStoriesCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e,r,n){this.currentUserService=t,this.rs=e,this.confirm=r,this.analytics=n,this.projects=null,this.projectUserstories=Immutable.List(),this.loading=!1}return t.$inject=["tgCurrentUserService","tgResources","$tgConfirm","$tgAnalytics"],t.prototype.loadProjects=function(){if(null===this.projects)return this.projects=this.currentUserService.projects.get("all")},t.prototype.filterUss=function(t,e){var r;return r=this.rs.userstories.listInAllProjects({project:t,q:e},!0).then(function(t){return function(e){var r,n;return r=t.epicUserstories.map(function(t){return t.get("id")}),n=e.filter(function(t){return r.indexOf(t.get("id"))===-1}),t.projectUserstories=n}}(this))},t.prototype.saveRelatedUserStory=function(t,e){var r,n,i;if(this.validateExistingUserstoryForm())return this.loading=!0,n=function(t){return function(e){return t.loading=!1,t.confirm.notify("error"),t.setExistingUserstoryFormErrors(e)}}(this),i=function(t){return function(){return t.analytics.trackEvent("epic related user story","create","create related user story on epic",1),t.loading=!1,e&&e(),t.loadRelatedUserstories()}}(this),r=this.epic.get("id"),this.rs.epics.addRelatedUserstory(r,t).then(i,n)},t.prototype.bulkCreateRelatedUserStories=function(t,e,r){var n,i,o;if(this.validateNewUserstoryForm())return this.loading=!0,i=function(t){return function(e){return t.loading=!1,t.confirm.notify("error"),t.setNewUserstoryFormErrors(e)}}(this),o=function(t){return function(){return t.analytics.trackEvent("epic related user story","create","create related user story on epic",1),t.loading=!1,r&&r(),t.loadRelatedUserstories()}}(this),n=this.epic.get("id"),this.rs.epics.bulkCreateRelatedUserStories(n,t,e).then(o,i)},t}(),e.controller("RelatedUserstoriesCreateCtrl",t)}.call(this),function(){var t,e,r;r=angular.module("taigaEpics"),e=this.taiga.debounceLeading,t=function(t){var r;return this.lightboxService=t,r=function(t,r,n,i){var o,s;return s=r.find(".new-user-story-form").checksley(),o=r.find(".existing-user-story-form").checksley(),i.validateNewUserstoryForm=function(t){return function(){return s.validate()}}(this),i.setNewUserstoryFormErrors=function(t){return function(t){return s.setErrors(t)}}(this),i.validateExistingUserstoryForm=function(t){return function(){return o.validate()}}(this),i.setExistingUserstoryFormErrors=function(t){return function(t){return o.setErrors(t)}}(this),t.showLightbox=function(e){return i.loadProjects(),t.selectProject(e).then(function(t){return function(){return lightboxService.open(r.find(".lightbox-create-related-user-stories"))}}(this))},t.closeLightbox=function(){return t.selectedUserstory=null,t.searchUserstory="",t.relatedUserstoriesText="",lightboxService.close(r.find(".lightbox-create-related-user-stories"))},t.$watch("vm.project",function(e){if(null!=e)return t.selectedProject=e.get("id")}),t.selectProject=function(e){return t.selectedUserstory=null,t.searchUserstory="",i.filterUss(e,t.searchUserstory)},t.onUpdateSearchUserstory=e(300,function(){return t.selectedUserstory=null,i.filterUss(t.selectedProject,t.searchUserstory)})},{link:r,templateUrl:"epics/related-userstories/related-userstories-create/related-userstories-create.html",controller:"RelatedUserstoriesCreateCtrl",controllerAs:"vm",bindToController:!0,scope:{showCreateRelatedUserstoriesLightbox:"=",project:"=",epic:"=",epicUserstories:"=",loadRelatedUserstories:"&"}}},t.$inject=["lightboxService"],r.directive("tgRelatedUserstoriesCreate",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(t,e){var r;return r=function(r,n,i){var o,s,a;if(e.hasPermission("modify_epic"))return o=t(i.tgRelatedUserstoriesSortable),s=dragula([n[0]],{copySortSource:!1,copy:!1,mirrorContainer:n[0],moves:function(t){return $(t).is("tg-related-userstory-row")}}),s.on("dragend",function(t){var e,n,i;return e=$(t),i=e.scope().us,n=e.index(),r.$apply(function(){return o(r,{us:i,newIndex:n})})}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&s.dragging}}),r.$on("$destroy",function(){return n.off(),s.destroy()})},{link:r}},t.$inject=["$parse","tgProjectService"],e.directive("tgRelatedUserstoriesSortable",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){return{templateUrl:"epics/related-userstories/related-userstories.html",controller:"RelatedUserStoriesCtrl",controllerAs:"vm",bindToController:!0,scope:{userstories:"=",project:"=",epic:"="}}},t.$inject=[],e.directive("tgRelatedUserstories",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e,r,n){this.avatarService=t,this.translate=e,this.confirm=r,this.rs=n}return t.$inject=["tgAvatarService","$translate","$tgConfirm","tgResources"],t.prototype.setAvatarData=function(){var t;return t=this.userstory.get("assigned_to_extra_info"),this.avatar=this.avatarService.getAvatar(t)},t.prototype.getAssignedToFullNameDisplay=function(){return this.userstory.get("assigned_to")?this.userstory.getIn(["assigned_to_extra_info","full_name_display"]):this.translate.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED")},t.prototype.onDeleteRelatedUserstory=function(){var t,e;return e=this.translate.instant("EPIC.TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY"),t=this.translate.instant("EPIC.MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY",{subject:this.userstory.get("subject")}),this.confirm.askOnDelete(e,t).then(function(e){return function(r){var n,i,o,s;return i=function(){return t=e.translate.instant("EPIC.ERROR_UNLINK_RELATED_USERSTORY",{errorMessage:t}),e.confirm.notify("error",null,t),r.finish(!1)},o=function(){return e.loadRelatedUserstories(),r.finish()},n=e.epic.get("id"),s=e.userstory.get("id"),e.rs.epics.deleteRelatedUserstory(n,s).then(o,i)}}(this))},t}(),e.controller("RelatedUserstoryRowCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){var t;return t=function(t,e,r,n){return n.setAvatarData()},{link:t,templateUrl:"epics/related-userstories/related-userstory-row/related-userstory-row.html",controller:"RelatedUserstoryRowCtrl",controllerAs:"vm",bindToController:!0,scope:{userstory:"=",epic:"=",project:"=",loadRelatedUserstories:"&"}}},t.$inject=[],e.directive("tgRelatedUserstoryRow",t)}.call(this),function(){var t,e,r=function(t,e){return function(){return t.apply(e,arguments)}},n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;e=this.taiga,t=function(t){function i(t,n,i,o,s,a,c,u){var l,p;this.routeParams=t,this.externalAppsService=n,this.window=i,this.currentUserService=o,this.location=s,this.navUrls=a,this.xhrError=c,this.loader=u,this.createApplicationToken=r(this.createApplicationToken,this),this._getApplicationToken=r(this._getApplicationToken,this),this._redirect=r(this._redirect,this),this.loader.start(!1),this._applicationId=this.routeParams.application,this._state=this.routeParams.state,this._getApplicationToken(),this._user=this.currentUserService.getUser(),this._application=null,p=encodeURIComponent(this.location.url()),l=this.navUrls.resolve("login"),this.loginWithAnotherUserUrl=l+"?next="+p,e.defineImmutableProperty(this,"user",function(t){return function(){return t._user}}(this)),e.defineImmutableProperty(this,"application",function(t){return function(){return t._application}}(this))}return n(i,t),i.$inject=["$routeParams","tgExternalAppsService","$window","tgCurrentUserService","$location","$tgNavUrls","tgXhrErrorService","tgLoader"],i.prototype._redirect=function(t){var e;return e=t.get("next_url"),this.window.open(e,"_self")},i.prototype._getApplicationToken=function(){return this.externalAppsService.getApplicationToken(this._applicationId,this._state).then(function(t){return function(e){return t._application=e.get("application"),e.get("auth_code")?t._redirect(e):t.loader.pageLoaded()}}(this))["catch"](function(t){return function(e){return t.loader.pageLoaded(),t.xhrError.response(e)}}(this))},i.prototype.cancel=function(){return this.window.history.back()},i.prototype.createApplicationToken=function(){return this.externalAppsService.authorizeApplicationToken(this._applicationId,this._state).then(function(t){return function(e){return t._redirect(e)}}(this))["catch"](function(t){return function(e){return t.xhrError.response(e)}}(this))},i}(e.Controller),angular.module("taigaExternalApps").controller("ExternalApp",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t){this.rs=t}return e(r,t),r.$inject=["tgResources"],r.prototype.getApplicationToken=function(t,e){return this.rs.externalapps.getApplicationToken(t,e)},r.prototype.authorizeApplicationToken=function(t,e){return this.rs.externalapps.authorizeApplicationToken(t,e)},r}(taiga.Service),angular.module("taigaExternalApps").service("tgExternalAppsService",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t){this.lightboxFactory=t}return e(r,t),r.$inject=["tgLightboxFactory"],r.prototype.sendFeedback=function(){return this.lightboxFactory.create("tg-lb-feedback",{"class":"lightbox lightbox-feedback lightbox-generic-form"})},r}(taiga.Service),angular.module("taigaFeedback").service("tgFeedbackService",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t,e,r){this.currentUserService=t,this.permissionService=e,this.lightboxFactory=r,this.hiddenDeletedComment=!0}return t.$inject=["tgCurrentUserService","tgCheckPermissionsService","tgLightboxFactory"],t.prototype.showDeletedComment=function(){return this.hiddenDeletedComment=!1},t.prototype.hideDeletedComment=function(){return this.hiddenDeletedComment=!0},t.prototype.checkCancelComment=function(t){if(27===t.keyCode)return this.onEditMode({commentId:this.comment.id})},t.prototype.canEditDeleteComment=function(){if(this.currentUserService.getUser())return this.user=this.currentUserService.getUser(),this.user.get("id")===this.comment.user.pk||this.permissionService.check("modify_project")},t.prototype.saveComment=function(t,e){return this.onEditComment({commentId:this.comment.id,commentData:t,callback:e})},t.prototype.displayCommentHistory=function(){return this.lightboxFactory.create("tg-lb-display-historic",{"class":"lightbox lightbox-display-historic",comment:"comment",name:"name",object:"object"},{comment:this.comment,name:this.name,object:this.object})},t}(),e.controller("CommentCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){return{scope:{name:"@",object:"@",comment:"<",type:"<",loading:"<",editing:"<",deleting:"<",objectId:"<",editMode:"<",onEditMode:"&",onDeleteComment:"&",onRestoreDeletedComment:"&",onEditComment:"&"},templateUrl:"history/comments/comment.html",bindToController:!0,controller:"CommentCtrl",controllerAs:"vm"}},e.directive("tgComment",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(){}return t.$inject=[],t.prototype.initializePermissions=function(){return this.canAddCommentPermission="comment_"+this.name},t}(),e.controller("CommentsCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return n.initializePermissions()},{scope:{type:"<",name:"@",object:"@",comments:"<",onEditMode:"&",onDeleteComment:"&",onRestoreDeletedComment:"&",onAddComment:"&",onEditComment:"&",editMode:"<",loading:"<",deleting:"<",editing:"<",projectId:"="},templateUrl:"history/comments/comments.html",bindToController:!0,controller:"CommentsCtrl",controllerAs:"vm",link:t}},e.directive("tgComments",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t){this.rs=t}return t.$inject=["$tgResources"],t.prototype._loadHistoric=function(){var t,e,r;return r=this.name,e=this.object,t=this.comment.id,this.rs.history.getCommentHistory(r,e,t).then(function(t){return function(e){return t.commentHistoryEntries=e}}(this))},t}(),e.controller("LightboxDisplayHistoricCtrl",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){return i._loadHistoric(),t.open(r)},{scope:{},bindToController:{name:"=",object:"=",comment:"="},templateUrl:"history/history-lightbox/comment-history-lightbox.html",controller:"LightboxDisplayHistoricCtrl",controllerAs:"vm",link:e}},t.$inject=["lightboxService"],angular.module("taigaHistory").directive("tgLbDisplayHistoric",t)}.call(this),function(){var t;t=function(){return{scope:{entry:"<"},templateUrl:"history/history-lightbox/history-entry.html"}},angular.module("taigaHistory").directive("tgHistoryEntry",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){return{templateUrl:"history/history-tabs/history-tabs.html",scope:{showCommentTab:"&",showActivityTab:"&",onActiveComments:"&",onActiveActivities:"&",onOrderComments:"&",activeTab:"<",commentsNum:"<",activitiesNum:"<",onReverse:"<"}}},e.directive("tgHistoryTabs",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t,e,r,n){this.rs=t,this.repo=e,this.storage=r,this.projectService=n,this.editing=null,this.deleting=null,this.editMode={},this.viewComments=!0,this.reverse=this.storage.get("orderComments"),this._loadHistory()}return t.$inject=["$tgResources","$tgRepo","$tgStorage","tgProjectService"],t.prototype._loadHistory=function(){return this.rs.history.get(this.name,this.id).then(function(t){return function(e){return t._getComments(e),t._getActivities(e)}}(this))},t.prototype._getComments=function(t){ -return this.comments=_.filter(t,function(t){return""!==t.comment}),this.reverse&&this.comments-_.reverse(this.comments),this.commentsNum=this.comments.length},t.prototype._getActivities=function(t){return this.activities=_.filter(t,function(t){return Object.keys(t.values_diff).length>0}),this.activitiesNum=this.activities.length},t.prototype.showHistorySection=function(){return this.showCommentTab()||this.showActivityTab()},t.prototype.showCommentTab=function(){return this.commentsNum>0||this.projectService.hasPermission("comment_"+this.name)},t.prototype.showActivityTab=function(){return this.activitiesNum>0},t.prototype.toggleEditMode=function(t){return this.editMode[t]=!this.editMode[t]},t.prototype.onActiveHistoryTab=function(t){return this.viewComments=t},t.prototype.deleteComment=function(t){var e,r,n;return n=this.name,r=this.id,e=t,this.deleting=t,this.rs.history.deleteComment(n,r,e).then(function(t){return function(){return t._loadHistory(),t.deleting=null}}(this))},t.prototype.editComment=function(t,e){var r,n,i;return i=this.name,n=this.id,r=t,this.editing=t,this.rs.history.editComment(i,n,r,e).then(function(e){return function(){return e._loadHistory(),e.toggleEditMode(t),e.editing=null}}(this))},t.prototype.restoreDeletedComment=function(t){var e,r,n;return n=this.name,r=this.id,e=t,this.editing=t,this.rs.history.undeleteComment(n,r,e).then(function(t){return function(){return t._loadHistory(),t.editing=null}}(this))},t.prototype.addComment=function(t){return this.repo.save(this.type).then(function(e){return function(){return e._loadHistory(),t()}}(this))},t.prototype.onOrderComments=function(){return this.reverse=!this.reverse,this.storage.set("orderComments",this.reverse),this._loadHistory()},t}(),e.controller("HistorySection",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return t.$on("object:updated",function(){return n._loadHistory(t.type,t.id)})},{link:t,templateUrl:"history/history.html",controller:"HistorySection",controllerAs:"vm",bindToController:!0,scope:{type:"=",name:"@",id:"=",projectId:"="}}},t.$inject=[],e.directive("tgHistorySection",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(){}return t.$inject=[],t.prototype.diffTags=function(){if("tags"===this.type)return this.diffRemoveTags=_.difference(this.diff[0],this.diff[1]).toString(),this.diffAddTags=_.difference(this.diff[1],this.diff[0]).toString()},t}(),e.controller("ActivitiesDiffCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return n.diffTags()},{scope:{type:"<",diff:"<"},templateUrl:"history/history/history-diff.html",controller:"ActivitiesDiffCtrl",controllerAs:"vm",bindToController:!0,link:t}},e.directive("tgHistoryDiff",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r){},{scope:{activities:"<"},templateUrl:"history/history/history.html",link:t}},e.directive("tgHistory",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){return t.vm={},t.vm.duty=t.duty,t.vm.type=t.type,t.vm.getDutyType=function(){if(t.vm.duty){if("epics"===t.vm.duty.get("_name"))return e.instant("COMMON.EPIC");if("userstories"===t.vm.duty.get("_name"))return e.instant("COMMON.USER_STORY");if("tasks"===t.vm.duty.get("_name"))return e.instant("COMMON.TASK");if("issues"===t.vm.duty.get("_name"))return e.instant("COMMON.ISSUE")}}},{templateUrl:"home/duties/duty.html",scope:{duty:"=tgDuty",type:"@"},link:r}},t.$inject=["$tgNavUrls","$translate"],angular.module("taigaHome").directive("tgDuty",t)}.call(this),function(){var t;t=function(){function t(t,e,r){this.currentUserService=t,this.location=e,this.navUrls=r,this.currentUserService.getUser()||this.location.path(this.navUrls.resolve("discover"))}return t.$inject=["tgCurrentUserService","$location","$tgNavUrls"],t}(),angular.module("taigaHome").controller("Home",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga.groupBy,t=function(t){function n(t,e,r){this.navurls=t,this.rs=e,this.projectsService=r}return r(n,t),n.$inject=["$tgNavUrls","tgResources","tgProjectsService"],n.prototype._attachProjectInfoToWorkInProgress=function(t,e){var r,n,i,o,s;return r=function(t){return function(r,n){var i,o,s;return o=e.get(String(r.get("project"))),i={project:o.get("slug"),ref:r.get("ref")},s=t.navurls.resolve("project-"+n+"-detail",i),r=r.set("url",s),r=r.set("project",o),r=r.set("_name",n)}}(this),i=function(t,n){return t=t.filter(function(t){return e.get(String(t.get("project")))}),t=t.map(function(t){return r(t,n)})},o=t.get("assignedTo"),o.get("epics")&&(n=i(o.get("epics"),"epics"),o=o.set("epics",n)),o.get("userStories")&&(n=i(o.get("userStories"),"userstories"),o=o.set("userStories",n)),o.get("tasks")&&(n=i(o.get("tasks"),"tasks"),o=o.set("tasks",n)),o.get("issues")&&(n=i(o.get("issues"),"issues"),o=o.set("issues",n)),s=t.get("watching"),s.get("epics")&&(n=i(s.get("epics"),"epics"),s=s.set("epics",n)),s.get("userStories")&&(n=i(s.get("userStories"),"userstories"),s=s.set("userStories",n)),s.get("tasks")&&(n=i(s.get("tasks"),"tasks"),s=s.set("tasks",n)),s.get("issues")&&(n=i(s.get("issues"),"issues"),s=s.set("issues",n)),t=t.set("assignedTo",o),t=t.set("watching",s)},n.prototype.getWorkInProgress=function(t){var r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y;return p=Immutable.Map(),h=this.projectsService.getProjectsByUserId(t).then(function(t){return p=Immutable.fromJS(e(t.toJS(),function(t){return t.id}))}),o=Immutable.Map(),a={status__is_closed:!1,assigned_to:t},l={is_closed:!1,assigned_users:t},u={status__is_closed:!1,assigned_to:t},c={status__is_closed:!1,assigned_to:t},r=this.rs.epics.listInAllProjects(a).then(function(t){return o=o.set("epics",t)}),s=this.rs.userstories.listInAllProjects(l).then(function(t){return o=o.set("userStories",t)}),i=this.rs.tasks.listInAllProjects(u).then(function(t){return o=o.set("tasks",t)}),n=this.rs.issues.listInAllProjects(c).then(function(t){return o=o.set("issues",t)}),a={status__is_closed:!1,watchers:t},l={is_closed:!1,watchers:t},u={status__is_closed:!1,watchers:t},c={status__is_closed:!1,watchers:t},f=Immutable.Map(),d=this.rs.epics.listInAllProjects(a).then(function(t){return f=f.set("epics",t)}),v=this.rs.userstories.listInAllProjects(l).then(function(t){return f=f.set("userStories",t)}),m=this.rs.tasks.listInAllProjects(u).then(function(t){return f=f.set("tasks",t)}),g=this.rs.issues.listInAllProjects(c).then(function(t){return f=f.set("issues",t)}),y=Immutable.Map(),Promise.all([h,r,d,s,v,i,m,n,g]).then(function(t){return function(){return y=y.set("assignedTo",o),y=y.set("watching",f),y=t._attachProjectInfoToWorkInProgress(y,p)}}(this))},n}(taiga.Service),angular.module("taigaHome").service("tgHomeService",t)}.call(this),function(){var t;t=function(t){var e,r;return r=function(e,r,n,i){return e.vm={},taiga.defineImmutableProperty(e.vm,"projects",function(){return t.projects.get("recents")})},e={templateUrl:"home/projects/home-project-list.html",scope:{},link:r}},t.$inject=["tgCurrentUserService"],angular.module("taigaHome").directive("tgHomeProjectList",t)}.call(this),function(){var t;t=function(){function t(t){this.homeService=t,this.assignedTo=Immutable.Map(),this.watching=Immutable.Map()}return t.$inject=["tgHomeService"],t.prototype._setAssignedTo=function(t){var e,r,n,i;if(e=t.get("assignedTo").get("epics"),i=t.get("assignedTo").get("userStories"),n=t.get("assignedTo").get("tasks"),r=t.get("assignedTo").get("issues"),this.assignedTo=i.concat(n).concat(r).concat(e),this.assignedTo.size>0)return this.assignedTo=this.assignedTo.sortBy(function(t){return t.get("modified_date")}).reverse()},t.prototype._setWatching=function(t){var e,r,n,i;if(e=t.get("watching").get("epics"),i=t.get("watching").get("userStories"),n=t.get("watching").get("tasks"),r=t.get("watching").get("issues"),this.watching=i.concat(n).concat(r).concat(e),this.watching.size>0)return this.watching=this.watching.sortBy(function(t){return t.get("modified_date")}).reverse()},t.prototype.getWorkInProgress=function(t){return this.homeService.getWorkInProgress(t).then(function(t){return function(e){return t._setAssignedTo(e),t._setWatching(e)}}(this))},t}(),angular.module("taigaHome").controller("WorkingOn",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){var o,s;if(o=e.getUser())return s=o.get("id"),i.getWorkInProgress(s)},{controller:"WorkingOn",controllerAs:"vm",templateUrl:"home/working-on/working-on.html",scope:{},link:r}},t.$inject=["tgHomeService","tgCurrentUserService"],angular.module("taigaHome").directive("tgWorkingOn",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,e,r,n,i){this.projectService=t,this.rs=e,this.lightboxService=r,this.confirm=n,this.rootScope=i,this.project=this.projectService.project,this.roles=this.projectService.project.get("roles"),this.rolesValues={},this.loading=!1,this.defaultMaxInvites=4}return t.$inject=["tgProjectService","$tgResources","lightboxService","$tgConfirm","$rootScope"],t.prototype._areRolesValidated=function(){return Object.defineProperty(this,"areRolesValidated",{get:function(t){return function(){var e;return e=_.filter(Object.values(t.rolesValues),function(t){return t}),e.length===t.contactsToInvite.size+t.emailsToInvite.size}}(this)})},t.prototype._checkLimitMemberships=function(){var t;return null===this.project.get("max_memberships")?this.membersLimit=this.defaultMaxInvites:(t=Math.max(this.project.get("max_memberships")-this.project.get("total_memberships"),0),this.membersLimit=Math.min(t,this.defaultMaxInvites)),this.showWarningMessage=this.membersLimit=s.get("max_memberships_private_projects"),i&&n?(e="private-space-members",r=s.get("max_memberships_private_projects")):i?e="private-space":n&&(e="private-members",r=s.get("max_memberships_private_projects"))):(o=!this.currentUserService.canCreatePublicProjects().valid,n=null!==s.get("max_memberships_public_projects")&&t.headers.memberships>=s.get("max_memberships_public_projects"),o&&n?(e="public-space-members",r=s.get("max_memberships_public_projects")):o?e="public-space":n&&(e="public-members",r=s.get("max_memberships_public_projects"))),!!e&&{key:e,values:{max_memberships:r,members:t.headers.memberships}})},r}(taiga.Service),angular.module("taigaProjects").service("tgImportProjectService",t)}.call(this),function(){var t;t=function(){function t(){}return t.$inject=[],t.prototype.isDisabled=function(t){return this.invitedMembers.indexOf(t)===-1},t}(),angular.module("taigaProjects").controller("InviteMembersCtrl",t)}.call(this),function(){var t;t=function(){ -var t;return t=function(t,e,r,n){},{link:t,templateUrl:"projects/create/invite-members/invite-members.html",controller:"InviteMembersCtrl",controllerAs:"vm",bindToController:!0,scope:{invitedMembers:"<",members:"<",onToggleInvitedMember:"&"}}},t.$inject=[],angular.module("taigaProjects").directive("tgInviteMembers",t)}.call(this),function(){var t;t=function(){return{templateUrl:"projects/create/invite-members/single-member/single-member.html",scope:{disabled:"<",avatar:"="}}},t.$inject=[],angular.module("taigaProjects").directive("tgSingleMember",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,this.canCreatePublicProjects=this.currentUserService.canCreatePublicProjects(),this.canCreatePrivateProjects=this.currentUserService.canCreatePrivateProjects(),this.projectForm=this.project.toJS(),this.projectForm.is_private=!1,this.projectForm.keepExternalReference=!1,"agile"===this.projectForm.importer_type?this.projectForm.project_type=null:this.projectForm.project_type="scrum",this.projectForm.create_subissues=!0,!this.canCreatePublicProjects.valid&&this.canCreatePrivateProjects.valid&&(this.projectForm.is_private=!0)}return t.$inject=["tgCurrentUserService"],t.prototype.checkUsersLimit=function(){return this.limitMembersPrivateProject=this.currentUserService.canAddMembersPrivateProject(this.members.size),this.limitMembersPublicProject=this.currentUserService.canAddMembersPublicProject(this.members.size)},t.prototype.saveForm=function(){return this.onSaveProjectDetails({project:Immutable.fromJS(this.projectForm)})},t.prototype.canCreateProject=function(){return this.projectForm.is_private?this.canCreatePrivateProjects.valid:this.canCreatePublicProjects.valid},t.prototype.isDisabled=function(){return!this.canCreateProject()},t}(),angular.module("taigaProjects").controller("JiraImportProjectFormCtrl",t)}.call(this),function(){var t;t=function(){return{link:function(t,e,r,n){return t.$watch("vm.members",n.checkUsersLimit.bind(n))},templateUrl:"projects/create/jira-import/jira-import-project-form/jira-import-project-form.html",controller:"JiraImportProjectFormCtrl",controllerAs:"vm",bindToController:!0,scope:{members:"<",project:"<",onSaveProjectDetails:"&",onCancelForm:"&",fetchingUsers:"<"}}},t.$inject=[],angular.module("taigaProjects").directive("tgJiraImportProjectForm",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.jiraImportService=t,this.confirm=e,this.translate=r,this.importProjectService=n,this.step="autorization-jira",this.project=null,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.jiraImportService.projects}}(this)),taiga.defineImmutableProperty(this,"members",function(t){return function(){return t.jiraImportService.projectUsers}}(this))}return t.$inject=["tgJiraImportService","$tgConfirm","$translate","tgImportProjectService"],t.prototype.startProjectSelector=function(){return this.step="project-select-jira",this.jiraImportService.fetchProjects()},t.prototype.onSelectProject=function(t){return this.step="project-form-jira",this.project=t,this.fetchingUsers=!0,this.jiraImportService.fetchUsers(this.project.get("id")).then(function(t){return function(){return t.fetchingUsers=!1}}(this))},t.prototype.onSaveProjectDetails=function(t){return this.project=t,this.step="project-members-jira"},t.prototype.onCancelMemberSelection=function(){return this.step="project-form-jira"},t.prototype.startImport=function(t){var e,r,n;return e=this.confirm.loader(this.translate.instant("PROJECT.IMPORT.IN_PROGRESS.TITLE"),this.translate.instant("PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION"),!0),e.start(),r=this.project.get("project_type"),"issues"===r&&this.project.get("create_subissues")&&(r="issues-with-subissues"),n=this.jiraImportService.importProject(this.project.get("name"),this.project.get("description"),this.project.get("id"),t,this.project.get("keepExternalReference"),this.project.get("is_private"),r,this.project.get("importer_type")),this.importProjectService.importPromise(n).then(function(t){return function(){return e.stop()}}(this))},t.prototype.submitUserSelection=function(t){return this.startImport(t),null},t}(),angular.module("taigaProjects").controller("JiraImportCtrl",t)}.call(this),function(){var t;t=function(){return{link:function(t,e,r,n){return n.startProjectSelector()},templateUrl:"projects/create/jira-import/jira-import.html",controller:"JiraImportCtrl",controllerAs:"vm",bindToController:!0,scope:{onCancel:"&"}}},t.$inject=[],angular.module("taigaProjects").directive("tgJiraImport",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.resources=t,this.location=e,this.projects=Immutable.List(),this.projectUsers=Immutable.List()}return e(r,t),r.$inject=["tgResources","$location"],r.prototype.setToken=function(t,e){return this.token=t,this.url=e},r.prototype.fetchProjects=function(){return this.resources.jiraImporter.listProjects(this.url,this.token).then(function(t){return function(e){return t.projects=e}}(this))},r.prototype.fetchUsers=function(t){return this.resources.jiraImporter.listUsers(this.url,this.token,t).then(function(t){return function(e){return t.projectUsers=e}}(this))},r.prototype.importProject=function(t,e,r,n,i,o,s,a){return this.resources.jiraImporter.importProject(this.url,this.token,t,e,r,n,i,o,s,a)},r.prototype.getAuthUrl=function(t){return new Promise(function(e){return function(r,n){return e.resources.jiraImporter.getAuthUrl(t).then(function(t){return e.authUrl=t.data.url,r(e.authUrl)},function(t){return n(t.data._error_message)})}}(this))},r.prototype.authorize=function(t){return new Promise(function(e){return function(r,n){return e.resources.jiraImporter.authorize(t).then(function(t){return e.token=t.data.token,e.url=t.data.url,r(t.data)},function(t){return n(new Error(t.status))})}}(this))},r}(taiga.Service),angular.module("taigaProjects").service("tgJiraImportService",t)}.call(this),function(){var t;t=function(){function t(){}return t.$inject=[],t.prototype.start=function(){return this.mode="search",this.invalid=!1},t.prototype.assignUser=function(){return this.onSelectUser({user:this.user,taigaUser:this.userEmail})},t.prototype.selectUser=function(t){return this.onSelectUser({user:this.user,taigaUser:Immutable.fromJS(t)})},t}(),angular.module("taigaProjects").controller("SelectImportUserLightboxCtrl",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i,o){return r.$watch("vm.visible",function(i){return i&&!n.hasClass("open")?(o.start(),t.open(n,null,r.vm.onClose).then(function(){return n.find("input").focus(),e.init(n)})):!i&&n.hasClass("open")?t.close(n).then(function(){return o.userEmail="",o.usersSearch=""}):void 0})},{controller:"SelectImportUserLightboxCtrl",controllerAs:"vm",bindToController:!0,scope:{user:"<",visible:"<",onClose:"&",onSelectUser:"&",selectableUsers:"<",isPrivate:"<",limitMembersPrivateProject:"<",limitMembersPublicProject:"<",displayEmailSelector:"<"},templateUrl:"projects/create/select-import-user-lightbox/select-import-user-lightbox.html",link:r}},t.$inject=["lightboxService","lightboxKeyboardNavigationService"],angular.module("taigaProjects").directive("tgSelectImportUserLightbox",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,this.canCreatePublicProjects=this.currentUserService.canCreatePublicProjects(),this.canCreatePrivateProjects=this.currentUserService.canCreatePrivateProjects(),this.projectForm=this.project.toJS(),this.platformName="Trello",this.projectForm.is_private=!1,this.projectForm.keepExternalReference=!1,!this.canCreatePublicProjects.valid&&this.canCreatePrivateProjects.valid&&(this.projectForm.is_private=!0)}return t.$inject=["tgCurrentUserService"],t.prototype.checkUsersLimit=function(){return this.limitMembersPrivateProject=this.currentUserService.canAddMembersPrivateProject(this.members.size),this.limitMembersPublicProject=this.currentUserService.canAddMembersPublicProject(this.members.size)},t.prototype.saveForm=function(){return this.onSaveProjectDetails({project:Immutable.fromJS(this.projectForm)})},t.prototype.canCreateProject=function(){return this.projectForm.is_private?this.canCreatePrivateProjects.valid:this.canCreatePublicProjects.valid},t.prototype.isDisabled=function(){return!this.canCreateProject()},t}(),angular.module("taigaProjects").controller("TrelloImportProjectFormCtrl",t)}.call(this),function(){var t;t=function(){return{link:function(t,e,r,n){return t.$watch("vm.members",n.checkUsersLimit.bind(n))},templateUrl:"projects/create/trello-import/trello-import-project-form/trello-import-project-form.html",controller:"TrelloImportProjectFormCtrl",controllerAs:"vm",bindToController:!0,scope:{members:"<",project:"<",onSaveProjectDetails:"&",onCancelForm:"&",fetchingUsers:"<"}}},t.$inject=[],angular.module("taigaProjects").directive("tgTrelloImportProjectForm",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.trelloImportService=t,this.confirm=e,this.translate=r,this.importProjectService=n,this.project=null,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.trelloImportService.projects}}(this)),taiga.defineImmutableProperty(this,"members",function(t){return function(){return t.trelloImportService.projectUsers}}(this))}return t.$inject=["tgTrelloImportService","$tgConfirm","$translate","tgImportProjectService"],t.prototype.startProjectSelector=function(){return this.trelloImportService.fetchProjects().then(function(t){return function(){return t.step="project-select-trello"}}(this))},t.prototype.onSelectProject=function(t){return this.step="project-form-trello",this.project=t,this.fetchingUsers=!0,this.trelloImportService.fetchUsers(this.project.get("id")).then(function(t){return function(){return t.fetchingUsers=!1}}(this))},t.prototype.onSaveProjectDetails=function(t){return this.project=t,this.step="project-members-trello"},t.prototype.onCancelMemberSelection=function(){return this.step="project-form-trello"},t.prototype.startImport=function(t){var e,r;return e=this.confirm.loader(this.translate.instant("PROJECT.IMPORT.IN_PROGRESS.TITLE"),this.translate.instant("PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION"),!0),e.start(),r=this.trelloImportService.importProject(this.project.get("name"),this.project.get("description"),this.project.get("id"),t,this.project.get("keepExternalReference"),this.project.get("is_private")),this.importProjectService.importPromise(r).then(function(t){return function(){return e.stop()}}(this))},t.prototype.submitUserSelection=function(t){return this.startImport(t),null},t}(),angular.module("taigaProjects").controller("TrelloImportCtrl",t)}.call(this),function(){var t;t=function(){return{link:function(t,e,r,n){return n.startProjectSelector()},templateUrl:"projects/create/trello-import/trello-import.html",controller:"TrelloImportCtrl",controllerAs:"vm",bindToController:!0,scope:{onCancel:"&"}}},t.$inject=[],angular.module("taigaProjects").directive("tgTrelloImport",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t){this.resources=t,this.projects=Immutable.List(),this.projectUsers=Immutable.List(),this.token=null}return e(r,t),r.$inject=["tgResources"],r.prototype.setToken=function(t){return this.token=t},r.prototype.fetchProjects=function(){return this.resources.trelloImporter.listProjects(this.token).then(function(t){return function(e){return t.projects=e}}(this))},r.prototype.fetchUsers=function(t){return this.resources.trelloImporter.listUsers(this.token,t).then(function(t){return function(e){return t.projectUsers=e}}(this))},r.prototype.importProject=function(t,e,r,n,i,o){return this.resources.trelloImporter.importProject(this.token,t,e,r,n,i,o)},r.prototype.getAuthUrl=function(){return new Promise(function(t){return function(e){return t.resources.trelloImporter.getAuthUrl().then(function(r){return t.authUrl=r.data.url,e(t.authUrl)})}}(this))},r.prototype.authorize=function(t){return new Promise(function(e){return function(r,n){return e.resources.trelloImporter.authorize(t).then(function(t){return e.token=t.data.token,r(e.token)},function(t){return n(new Error(t.status))})}}(this))},r}(taiga.Service),angular.module("taigaProjects").service("tgTrelloImportService",t)}.call(this),function(){var t;t=function(t,e){return{link:function(r,n,i){return r.$watch("visible",function(i){return i&&!n.hasClass("open")?t.open(n,r.onClose).then(function(){return n.find("input").focus(),e.init(n)}):!i&&n.hasClass("open")?t.close(n):void 0})},templateUrl:"projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html",scope:{visible:"<",onClose:"&",onConfirm:"&"}}},t.$inject=["lightboxService","lightboxKeyboardNavigationService"],angular.module("taigaProjects").directive("tgWarningUserImportLightbox",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.currentUserService.projects.get("all")}}(this))}return t.$inject=["tgCurrentUserService"],t}(),angular.module("taigaProjects").controller("ProjectsListing",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n,i){this.routeParams=t,this.appMetaService=e,this.auth=r,this.translate=n,this.projectService=i,this.user=this.auth.userData,taiga.defineImmutableProperty(this,"project",function(t){return function(){return t.projectService.project}}(this)),taiga.defineImmutableProperty(this,"members",function(t){return function(){return t.projectService.activeMembers}}(this)),this.appMetaService.setfn(this._setMeta.bind(this))}return t.$inject=["$routeParams","tgAppMetaService","$tgAuth","$translate","tgProjectService"],t.prototype._setMeta=function(){var t;return this.project?(t={projectName:this.project.get("name")},{title:this.translate.instant("PROJECT.PAGE_TITLE",t),description:this.project.get("description")}):null},t}(),angular.module("taigaProjects").controller("Project",t)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,e=this.taiga.groupBy,t=function(t){function e(t,e){this.rs=t,this.projectUrl=e}return n(e,t),e.$inject=["tgResources","$projectUrl"],e.prototype.create=function(t){return this.rs.projects.create(t)},e.prototype.duplicate=function(t,e){return this.rs.projects.duplicate(t,e)},e.prototype.getProjectBySlug=function(t){return this.rs.projects.getProjectBySlug(t).then(function(t){return function(e){return t._decorate(e)}}(this))},e.prototype.getProjectStats=function(t){return this.rs.projects.getProjectStats(t)},e.prototype.getProjectsByUserId=function(t,e){return this.rs.projects.getProjectsByUserId(t,e).then(function(t){return function(e){return e.map(t._decorate.bind(t))}}(this))},e.prototype._decorate=function(t){var e;return e=this.projectUrl.get(t.toJS()),t=t.set("url",e)},e.prototype.bulkUpdateProjectsOrder=function(t){return this.rs.projects.bulkUpdateOrder(t)},e.prototype.transferValidateToken=function(t,e){return this.rs.projects.transferValidateToken(t,e)},e.prototype.transferAccept=function(t,e,r){return this.rs.projects.transferAccept(t,e,r)},e.prototype.transferReject=function(t,e,r){return this.rs.projects.transferReject(t,e,r)},e}(r.Service),angular.module("taigaProjects").service("tgProjectsService",t)}.call(this),function(){var t;t=function(){return{templateUrl:"projects/transfer/cant-own-project-explanation.html"}},angular.module("taigaProjects").directive("tgCantOwnProjectExplanation",t)}.call(this),function(){var t,e;e=angular.module("taigaProjects"),t=function(){function t(t,e,r,n,i,o,s,a,c){this.routeParams=t,this.projectService=e,this.location=r,this.authService=n,this.currentUserService=i,this.navUrls=o,this.translate=s,this.confirmService=a,this.errorHandlingService=c}return t.$inject=["$routeParams","tgProjectsService","$location","$tgAuth","tgCurrentUserService","$tgNavUrls","$translate","$tgConfirm","tgErrorHandlingService"],t.prototype.initialize=function(){return this.projectId=this.project.get("id"),this.token=this.routeParams.token,this.showAddComment=!1,this._refreshUserData()},t.prototype._validateToken=function(){return this.projectService.transferValidateToken(this.projectId,this.token).then(null,function(t){return function(e,r){return t.errorHandlingService.notfound()}}(this))},t.prototype._refreshUserData=function(){return this.authService.refresh().then(function(t){return function(){return t._validateToken(),t._setProjectData(),t._checkOwnerData()}}(this))},t.prototype._setProjectData=function(){return this.canBeOwnedByUser=this.currentUserService.canOwnProject(this.project)},t.prototype._checkOwnerData=function(){var t,e;return t=this.currentUserService.getUser(),this.project.get("is_private")?(this.ownerMessage="ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PRIVATE",this.maxProjects=t.get("max_private_projects"),null===this.maxProjects&&(this.maxProjects=this.translate.instant("ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS")),this.currentProjects=t.get("total_private_projects"),e=t.get("max_memberships_private_projects")):(this.ownerMessage="ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PUBLIC",this.maxProjects=t.get("max_public_projects"),null===this.maxProjects&&(this.maxProjects=this.translate.instant("ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS")),this.currentProjects=t.get("total_public_projects"),e=t.get("max_memberships_public_projects")),this.validNumberOfMemberships=null===e||this.project.get("total_memberships")<=e},t.prototype.transferAccept=function(t,e){return this.loadingAccept=!0,this.projectService.transferAccept(this.project.get("id"),t,e).then(function(t){return function(){var e;e=t.navUrls.resolve("project-admin-project-profile-details",{project:t.project.get("slug")}),t.loadingAccept=!1,t.location.path(e),t.confirmService.notify("success",t.translate.instant("ADMIN.PROJECT_TRANSFER.ACCEPTED_PROJECT_OWNERNSHIP"),"",5e3)}}(this))},t.prototype.transferReject=function(t,e){return this.loadingReject=!0,this.projectService.transferReject(this.project.get("id"),t,e).then(function(t){return function(){var e;e=t.navUrls.resolve("home",{project:t.project.get("slug")}),t.loadingReject=!1,t.location.path(e),t.confirmService.notify("success",t.translate.instant("ADMIN.PROJECT_TRANSFER.REJECTED_PROJECT_OWNERNSHIP"),"",5e3)}}(this))},t.prototype.addComment=function(){return this.showAddComment=!0},t.prototype.hideComment=function(){return this.showAddComment=!1,this.reason=""},t}(),e.controller("TransferProjectController",t)}.call(this),function(){var t,e;e=angular.module("taigaProjects"),t=function(){var t;return t=function(t,e,r,n){return n.initialize()},{link:t,scope:{},bindToController:{project:"="},templateUrl:"projects/transfer/transfer-project.html",controller:"TransferProjectController",controllerAs:"vm"}},e.directive("tgTransferProject",t)}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,t=function(t,e,n,i,o,s){var a;return a={},a.list=function(r,n,i){var o,s,a,c;return c="attachments/"+r,s={object_id:n,project:i},o={headers:{"x-disable-pagination":"1"}},a=t.resolve(c),e.get(a,s,o).then(function(t){return Immutable.fromJS(t.data)})},a["delete"]=function(r,n){var i,o;return o="attachments/"+r,i=t.resolve(o)+("/"+n),e["delete"](i)},a.patch=function(r,n,i){var o,s;return s="attachments/"+r,o=t.resolve(s)+("/"+n),e.patch(o,i)},a.create=function(e,a,c,u,l){var p,h,f,d,g,m,v,y,_,b,S;return b="attachments/"+e,_=t.resolve(b),h=o.defer(),void 0===u?(h.reject(null),h.promise):(f=n.get("maxUploadFileSize",null),f&&u.size>f?(d={status:413,data:{_error_message:"'"+u.name+"' ("+r(u.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(f)+")"}},h.reject(d),h.promise):(y=function(t){return function(t){return i.$apply(function(){return u.status="in-progress",u.size=r(t.total),u.progressMessage="upload "+r(t.loaded)+" of "+r(t.total),u.progressPercent=Math.round(t.loaded/t.total*100)+"%"})}}(this),m=function(t){return function(t){return i.$apply(function(){var e,r,n;u.status="done",n=t.target.status;try{e=JSON.parse(t.target.responseText)}catch(i){e={}}return n>=200&&n<400?(e=Immutable.fromJS(e),h.resolve(e)):(d={status:n,data:{_error_message:null!=(r=p.attached_file)?r[0]:void 0}},h.reject(d))})}}(this),v=function(t){return function(t){return i.$apply(function(){return u.status="error",h.reject("fail")})}}(this),p=new FormData,p.append("project",a),p.append("object_id",c),p.append("attached_file",u),p.append("from_comment",l),S=new XMLHttpRequest,S.upload.addEventListener("progress",y,!1),S.addEventListener("load",m,!1),S.addEventListener("error",v,!1),g=s.get("token"),S.open("POST",_),S.setRequestHeader("Authorization","Bearer "+g),S.setRequestHeader("Accept","application/json"),S.send(p),h.promise))},function(){return{attachments:a}}},t.$inject=["$tgUrls","$tgHttp","$tgConfig","$rootScope","$q","$tgStorage"],e=angular.module("taigaResources2"),e.factory("tgAttachmentsResource",t)}.call(this),function(){var t,e;t=function(t,e){var r;return r={},r.listInAllProjects=function(r){var n,i;return i=t.resolve("epics"),n={headers:{"x-disable-pagination":"1"}},e.get(i,r,n).then(function(t){return Immutable.fromJS(t.data)})},r.list=function(r,n){var i,o;return null==n&&(n=0),o=t.resolve("epics"),i={project:r,page:n},e.get(o,i).then(function(t){return{list:Immutable.fromJS(t.data),headers:t.headers}})},r.patch=function(r,n){var i;return i=t.resolve("epics")+("/"+r),e.patch(i,n).then(function(t){return Immutable.fromJS(t.data)})},r.post=function(r){var n;return n=t.resolve("epics"),e.post(n,r).then(function(t){return Immutable.fromJS(t.data)})},r.reorder=function(r,n,i){var o,s;return s=t.resolve("epics")+("/"+r),o={headers:{"set-orders":JSON.stringify(i)}},e.patch(s,n,null,o).then(function(t){return Immutable.fromJS(t.data)})},r.addRelatedUserstory=function(r,n){var i,o;return o=t.resolve("epic-related-userstories",r),i={user_story:n,epic:r},e.post(o,i)},r.reorderRelatedUserstory=function(r,n,i,o){var s,a;return a=t.resolve("epic-related-userstories",r)+("/"+n),s={headers:{"set-orders":JSON.stringify(o)}},e.patch(a,i,null,s)},r.bulkCreateRelatedUserStories=function(r,n,i){var o,s;return s=t.resolve("epic-related-userstories-bulk-create",r),o={bulk_userstories:i,project_id:n},e.post(s,o)},r.deleteRelatedUserstory=function(r,n){var i;return i=t.resolve("epic-related-userstories",r)+("/"+n),e["delete"](i)},function(){return{epics:r}}},t.$inject=["$tgUrls","$tgHttp"],e=angular.module("taigaResources2"),e.factory("tgEpicsResource",t)}.call(this),function(){var t,e;t=function(t,e){var r;return r={},r.getApplicationToken=function(r,n){var i;return i=t.resolve("applications"),i=i+"/"+r+"/token?state="+n,e.get(i).then(function(t){return Immutable.fromJS(t.data)})},r.authorizeApplicationToken=function(r,n){var i,o;return o=t.resolve("application-tokens"),o+="/authorize",i={state:n,application:r},e.post(o,i).then(function(t){return Immutable.fromJS(t.data)})},function(){return{externalapps:r}}},t.$inject=["$tgUrls","$tgHttp"],e=angular.module("taigaResources2"),e.factory("tgExternalAppsResource",t)}.call(this),function(){var t,e,r,n,i,o;o=this.taiga,n=function(t,e){var r;return r={},r.getAuthUrl=function(r){return r=t.resolve("importers-trello-auth-url"),e.get(r)},r.authorize=function(r){var n;return n=t.resolve("importers-trello-authorize"),e.post(n,{code:r})},r.listProjects=function(r){var n;return n=t.resolve("importers-trello-list-projects"),e.post(n,{token:r}).then(function(t){return Immutable.fromJS(t.data)})},r.listUsers=function(r,n){var i;return i=t.resolve("importers-trello-list-users"),e.post(i,{token:r,project:n}).then(function(t){return Immutable.fromJS(t.data)})},r.importProject=function(r,n,i,o,s,a,c){var u,l;return l=t.resolve("importers-trello-import-project"),u={token:r,name:n,description:i,project:o,users_bindings:s.toJS(),keep_external_reference:a,is_private:c,template:"kanban"},e.post(l,u)},function(){return{trelloImporter:r}}},n.$inject=["$tgUrls","$tgHttp"],r=function(t,e){var r;return r={},r.getAuthUrl=function(r){var n;return n=t.resolve("importers-jira-auth-url")+"?url="+r,e.get(n)},r.authorize=function(r){var n;return n=t.resolve("importers-jira-authorize"),e.post(n,{oauth_verifier:r})},r.listProjects=function(r,n){var i;return i=t.resolve("importers-jira-list-projects"),e.post(i,{url:r,token:n}).then(function(t){return Immutable.fromJS(t.data)})},r.listUsers=function(r,n,i){var o;return o=t.resolve("importers-jira-list-users"),e.post(o,{url:r,token:n,project:i}).then(function(t){return Immutable.fromJS(t.data)})},r.importProject=function(r,n,i,o,s,a,c,u,l,p){var h,f,d;return d=t.resolve("importers-jira-import-project"),f="kanban","kanban"!==l&&(f="scrum"),h={url:r,token:n,name:i,description:o,project:s,users_bindings:a.toJS(),keep_external_reference:c,is_private:u,project_type:l,importer_type:p,template:f},e.post(d,h)},function(){return{jiraImporter:r}}},r.$inject=["$tgUrls","$tgHttp"],e=function(t,e){var r;return r={},r.getAuthUrl=function(r){var n;return n=t.resolve("importers-github-auth-url")+"?uri="+r,e.get(n)},r.authorize=function(r){var n;return n=t.resolve("importers-github-authorize"),e.post(n,{code:r})},r.listProjects=function(r){var n;return n=t.resolve("importers-github-list-projects"),e.post(n,{token:r}).then(function(t){return Immutable.fromJS(t.data)})},r.listUsers=function(r,n){var i;return i=t.resolve("importers-github-list-users"),e.post(i,{token:r,project:n}).then(function(t){return Immutable.fromJS(t.data)})},r.importProject=function(r,n,i,o,s,a,c,u){var l,p;return p=t.resolve("importers-github-import-project"),l={token:r,name:n,description:i,project:o,users_bindings:s.toJS(),keep_external_reference:a,is_private:c,template:u},e.post(p,l)},function(){return{githubImporter:r}}},e.$inject=["$tgUrls","$tgHttp"],t=function(t,e){var r;return r={},r.getAuthUrl=function(){var r;return r=t.resolve("importers-asana-auth-url"),e.get(r)},r.authorize=function(r){var n;return n=t.resolve("importers-asana-authorize"),e.post(n,{code:r})},r.listProjects=function(r){var n;return n=t.resolve("importers-asana-list-projects"),e.post(n,{token:r}).then(function(t){return Immutable.fromJS(t.data)})},r.listUsers=function(r,n){var i;return i=t.resolve("importers-asana-list-users"),e.post(i,{token:r,project:n}).then(function(t){return Immutable.fromJS(t.data)})},r.importProject=function(r,n,i,o,s,a,c,u){var l,p;return p=t.resolve("importers-asana-import-project"),l={token:r,name:n,description:i,project:o,users_bindings:s.toJS(),keep_external_reference:a,is_private:c,template:u},e.post(p,l)},function(){return{asanaImporter:r}}},t.$inject=["$tgUrls","$tgHttp"],i=angular.module("taigaResources2"),i.factory("tgTrelloImportResource",n),i.factory("tgJiraImportResource",r),i.factory("tgGithubImportResource",e),i.factory("tgAsanaImportResource",t)}.call(this),function(){var t,e;t=function(t,e){var r;return r={},r.listInAllProjects=function(r){var n,i;return i=t.resolve("issues"),n={headers:{"x-disable-pagination":"1"}},e.get(i,r,n).then(function(t){return Immutable.fromJS(t.data)})},function(){return{issues:r}}},t.$inject=["$tgUrls","$tgHttp"],e=angular.module("taigaResources2"),e.factory("tgIssuesResource",t)}.call(this),function(){var t,e,r;r=function(){},t=function(t,e,r){var n;return n={},n.create=function(r){var n;return n=t.resolve("projects"),e.post(n,JSON.stringify(r)).then(function(t){return function(t){return Immutable.fromJS(t.data)}}(this))},n.duplicate=function(r,n){var i,o,s;return s=t.resolve("projects"),s=s+"/"+r+"/duplicate",i=n.users.map(function(t){return function(t){return{id:t}}}(this)),o={name:n.name,description:n.description,is_private:n.is_private,users:i},e.post(s,o)},n.getProjects=function(r,n){var i,o;return null==r&&(r={}),null==n&&(n=!0),o=t.resolve("projects"),i={},n||(i={headers:{"x-lazy-pagination":!0}}),e.get(o,r,i)},n.getProjectBySlug=function(r){var n;return n=t.resolve("projects"),n=n+"/by_slug?slug="+r,e.get(n).then(function(t){return Immutable.fromJS(t.data)})},n.getProjectsByUserId=function(r,n){var i,o,s;return null==n&&(n=!1),s=t.resolve("projects"),i={},n||(i.headers={"x-disable-pagination":"1"}),o={member:r,order_by:"user_order"},e.get(s,o,i).then(function(t){return Immutable.fromJS(t.data)})},n.getProjectStats=function(r){var n;return n=t.resolve("projects"),n=n+"/"+r,e.get(n).then(function(t){return Immutable.fromJS(t.data)})},n.bulkUpdateOrder=function(r){var n;return n=t.resolve("bulk-update-projects-order"),e.post(n,r)},n.getTimeline=function(n,i){var o,s;return o={page:i,only_relevant:!0},s=t.resolve("timeline-project"),s=s+"/"+n,e.get(s,o,{headers:{"x-lazy-pagination":!0}}).then(function(t){return t=Immutable.fromJS(t),r(t)})},n.likeProject=function(r){var n;return n=t.resolve("project-like",r),e.post(n)},n.unlikeProject=function(r){var n;return n=t.resolve("project-unlike",r),e.post(n)},n.watchProject=function(r,n){var i,o;return i={notify_level:n,live_notify_level:n},o=t.resolve("project-watch",r),e.post(o,i)},n.unwatchProject=function(r){var n;return n=t.resolve("project-unwatch",r),e.post(n)},n.contactProject=function(r,n){var i,o;return i={project:r,comment:n},o=t.resolve("project-contact"),e.post(o,i)},n.transferValidateToken=function(r,n){var i,o;return i={token:n},o=t.resolve("project-transfer-validate-token",r),e.post(o,i)},n.transferAccept=function(r,n,i){var o,s;return o={token:n,reason:i},s=t.resolve("project-transfer-accept",r),e.post(s,o)},n.transferReject=function(r,n,i){var o,s;return o={token:n,reason:i},s=t.resolve("project-transfer-reject",r),e.post(s,o)},n.transferRequest=function(r){var n;return n=t.resolve("project-transfer-request",r),e.post(n)},n.transferStart=function(r,n,i){var o,s;return o={user:n,reason:i},s=t.resolve("project-transfer-start",r),e.post(s,o)},function(){return{projects:n}}},t.$inject=["$tgUrls","$tgHttp","tgPaginateResponseService"],e=angular.module("taigaResources2"),e.factory("tgProjectsResources",t)}.call(this),function(){var t,e;e=["tgProjectsResources","tgUserResources","tgUsersResources","tgUserstoriesResource","tgTasksResource","tgIssuesResource","tgExternalAppsResource","tgAttachmentsResource","tgStatsResource","tgWikiHistory","tgEpicsResource","tgTrelloImportResource","tgJiraImportResource","tgGithubImportResource","tgAsanaImportResource"],t=function(t){var r,n,i,o,s,a,c,u,l;for(r=0,i=e.length;r"),$("head").append(r)),r.text(e||"")):0===t.indexOf("og:")?(r=$("head meta[property='"+t+"']"),0===r.length&&(r=$(""),$("head").append(r)),r.attr("content",e||"")):(r=$("head meta[name='"+t+"']"),0===r.length&&(r=$(""),$("head").append(r)),r.attr("content",e||""))},t.prototype.setTitle=function(t){return this._set("title",t)},t.prototype.setDescription=function(t){return this._set("description",r(t,250))},t.prototype.setTwitterMetas=function(t,e){return this._set("twitter:card","summary"),this._set("twitter:site","@taigaio"),this._set("twitter:title",t),this._set("twitter:description",r(e,300)),this._set("twitter:image",window.location.origin+"/"+window._version+"/images/logo-color.png")},t.prototype.setOpenGraphMetas=function(t,e){return this._set("og:type","object"),this._set("og:site_name","Taiga - Love your projects"),this._set("og:title",t),this._set("og:description",r(e,300)),this._set("og:image",window.location.origin+"/"+window._version+"/images/logo-color.png"),this._set("og:url",window.location.href)},t.prototype.setAll=function(t,e){return this.setTitle(t),this.setDescription(e),this.setTwitterMetas(t,e),this.setOpenGraphMetas(t,e)},t.prototype.addMobileViewport=function(){return $("head").append('')},t.prototype.removeMobileViewport=function(){return $('head meta[name="viewport"]').remove()},t.prototype.setfn=function(t){return this.listener&&this._listener(),this._listener=this.rootScope.$watchCollection(t,function(t){return function(e){if(e)return t.setAll(e.title,e.description),t._listener()}}(this))},t}(),angular.module("taigaCommon").service("tgAppMetaService",t)}.call(this),function(){var t,e;e=this.taiga.sizeFormat,t=function(){function t(t,r,n,i){this.confirm=t,this.config=r,this.translate=n,this.rs=i,this.maxFileSize=this.getMaxFileSize(),this.maxFileSize&&(this.maxFileSizeFormated=e(this.maxFileSize))}return t.$inject=["$tgConfirm","$tgConfig","$translate","tgResources"],t.prototype.sizeError=function(t){var r;return r=this.translate.instant("ATTACHMENT.ERROR_MAX_SIZE_EXCEEDED",{fileName:t.name,fileSize:e(t.size),maxFileSize:this.maxFileSizeFormated}),this.confirm.notify("error",r)},t.prototype.validate=function(t){return!(this.maxFileSize&&t.size>this.maxFileSize)||(this.sizeError(t),!1)},t.prototype.getMaxFileSize=function(){return this.config.get("maxUploadFileSize",null)},t.prototype.list=function(t,e,r){return this.rs.attachments.list(t,e,r).then(function(t){return function(t){return t.sortBy(function(t){return t.get("order")})}}(this))},t.prototype["delete"]=function(t,e){return this.rs.attachments["delete"](t,e)},t.prototype.saveError=function(t,e){var r;return r="",t&&(r=this.translate.instant("ATTACHMENT.ERROR_UPLOAD_ATTACHMENT",{fileName:t.name,errorMessage:e.data._error_message})),this.confirm.notify("error",r)},t.prototype.upload=function(t,e,r,n,i){var o;return null==i&&(i=!1),o=this.rs.attachments.create(n,r,e,t,i),o.then(null,this.saveError.bind(this,t)),o},t.prototype.patch=function(t,e,r){var n;return n=this.rs.attachments.patch(e,t,r),n.then(null,this.saveError.bind(this,null)),n},t}(),angular.module("taigaCommon").service("tgAttachmentsService",t)}.call(this),function(){var t,e=function(t,e){return(+t%(e=+e)+e)%e};t=function(){function t(t){var e,r;this.config=t,r=["/"+window._version+"/images/user-avatars/user-avatar-01.png","/"+window._version+"/images/user-avatars/user-avatar-02.png","/"+window._version+"/images/user-avatars/user-avatar-03.png","/"+window._version+"/images/user-avatars/user-avatar-04.png","/"+window._version+"/images/user-avatars/user-avatar-05.png"],e=["rgba( 178, 176, 204, 1 )","rgba( 183, 203, 131, 1 )","rgba( 210, 198, 139, 1 )","rgba( 214, 161, 212, 1 )","rgba( 247, 154, 154, 1 )"],this.logos=_.cartesianProduct(r,e)}return t.prototype.getDefault=function(t){var r,n;return r=e(murmurhash3_32_gc(t,42),this.logos.length),n=this.logos[r],{src:n[0],color:n[1]}},t.prototype.getUnnamed=function(){return{url:"/"+window._version+"/images/unnamed.png"}},t.prototype.getAvatar=function(t,e){var r,n,i,o,s,a;return t?(r="photo","avatarBig"===e&&(r="big_photo"),s=null,t instanceof Immutable.Map?(n=t.get("gravatar_id"),s=t.get(r)):(n=t.gravatar_id,s=t[r]),n?s?{url:s}:location.host.indexOf("localhost")===-1&&this.config.get("gravatar",!0)?(a=location.protocol+"//"+location.host,i=this.getDefault(n),o=encodeURIComponent(a+i.src),{url:"https://www.gravatar.com/avatar/"+n+"?s=200&d="+o,bg:i.color}):(a=location.protocol+"//"+location.host,i=this.getDefault(n),{url:a+i.src,bg:i.color}):this.getUnnamed()):this.getUnnamed()},t}(),angular.module("taigaCommon").service("tgAvatarService",["$tgConfig",t])}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t){this.projectService=t}return t.$inject=["tgProjectService"],t.prototype.check=function(t){return!!this.projectService.project&&this.projectService.project.get("my_permissions").indexOf(t)!==-1},t}(),angular.module("taigaCommon").service("tgCheckPermissionsService",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.groupBy,t=function(){function t(t,e,n){this.projectsService=t,this.storageService=e,this.rs=n,this._user=null,this._projects=Immutable.Map(),this._projectsById=Immutable.Map(),this._joyride=null,r.defineImmutableProperty(this,"projects",function(t){return function(){return t._projects}}(this)),r.defineImmutableProperty(this,"projectsById",function(t){return function(){return t._projectsById}}(this))}return t.$inject=["tgProjectsService","$tgStorage","tgResources"],t.prototype.isAuthenticated=function(){return null!==this.getUser()},t.prototype.getUser=function(){var t;return this._user||(t=this.storageService.get("userInfo"),t&&(t=Immutable.fromJS(t),this.setUser(t))),this._user},t.prototype.removeUser=function(){return this._user=null,this._projects=Immutable.Map(),this._projectsById=Immutable.Map(),this._joyride=null},t.prototype.setUser=function(t){return this._user=t,this._loadUserInfo()},t.prototype.bulkUpdateProjectsOrder=function(t){return this.projectsService.bulkUpdateProjectsOrder(t).then(function(t){return function(){return t.loadProjects()}}(this))},t.prototype.loadProjects=function(){return this.projectsService.getProjectsByUserId(this._user.get("id")).then(function(t){return function(e){return t.setProjects(e)}}(this))},t.prototype.disableJoyRide=function(t){if(this.isAuthenticated())return t?this._joyride[t]=!1:this._joyride={backlog:!1,kanban:!1,dashboard:!1},this.rs.user.setUserStorage("joyride",this._joyride)},t.prototype.loadJoyRideConfig=function(){return new Promise(function(t){return function(e){return null!==t._joyride?void e(t._joyride):t.rs.user.getUserStorage("joyride").then(function(r){return t._joyride=r,e(t._joyride)})["catch"](function(){return t._joyride={backlog:!0,kanban:!0,dashboard:!0},t.rs.user.createUserStorage("joyride",t._joyride),e(t._joyride)})}}(this))},t.prototype._loadUserInfo=function(){return Promise.all([this.loadProjects()])},t.prototype.setProjects=function(t){return this._projects=this._projects.set("all",t),this._projects=this._projects.set("recents",t.slice(0,10)),this._projectsById=Immutable.fromJS(e(t.toJS(),function(t){return t.id})),this.projects},t.prototype.canCreatePrivateProjects=function(){var t;return t=this.getUser(),null!==t.get("max_private_projects")&&t.get("total_private_projects")>=t.get("max_private_projects")?{valid:!1,reason:"max_private_projects",type:"private_project",current:t.get("total_private_projects"),max:t.get("max_private_projects")}:{valid:!0}},t.prototype.canCreatePublicProjects=function(){var t;return t=this.getUser(),null!==t.get("max_public_projects")&&t.get("total_public_projects")>=t.get("max_public_projects")?{valid:!1,reason:"max_public_projects",type:"public_project",current:t.get("total_public_projects"),max:t.get("max_public_projects")}:{valid:!0}},t.prototype.canAddMembersPublicProject=function(t){var e;return e=this.getUser(),null!==e.get("max_memberships_public_projects")&&t>e.get("max_memberships_public_projects")?{valid:!1,reason:"max_members_public_projects",type:"public_project",current:t,max:e.get("max_memberships_public_projects")}:{valid:!0}},t.prototype.canAddMembersPrivateProject=function(t){var e;return e=this.getUser(),null!==e.get("max_memberships_private_projects")&&t>e.get("max_memberships_private_projects")?{valid:!1,reason:"max_members_private_projects",type:"private_project",current:t,max:e.get("max_memberships_private_projects")}:{valid:!0}},t.prototype.canOwnProject=function(t){var e,r,n;if(n=this.getUser(),t.get("is_private")){if(r=this.canCreatePrivateProjects(),!r.valid)return r;if(e=this.canAddMembersPrivateProject(t.get("total_memberships")),!e.valid)return e}else{if(r=this.canCreatePublicProjects(),!r.valid)return r;if(e=this.canAddMembersPublicProject(t.get("total_memberships")),!e.valid)return e}return{valid:!0}},t}(),angular.module("taigaCommon").service("tgCurrentUserService",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t){this.rootScope=t}return t.$inject=["$rootScope"],t.prototype.init=function(){return this.rootScope.errorHandling={}},t.prototype.notfound=function(){return this.rootScope.errorHandling.showingError=!0,this.rootScope.errorHandling.notfound=!0},t.prototype.error=function(){return this.rootScope.errorHandling.showingError=!0,this.rootScope.errorHandling.error=!0},t.prototype.permissionDenied=function(){return this.rootScope.errorHandling.showingError=!0,this.rootScope.errorHandling.permissionDenied=!0},t.prototype.block=function(){return this.rootScope.errorHandling.showingError=!0,this.rootScope.errorHandling.blocked=!0},t}(),angular.module("taigaCommon").service("tgErrorHandlingService",t)}.call(this),function(){var t;t=function(){function t(t,e){this.rootScope=t,this.compile=e}return t.$inject=["$rootScope","$compile"],t.prototype.create=function(t,e,r){var n,i,o;o=this.rootScope.$new(),o=_.merge(o,r),n=$("
    ").attr(t,!0).attr("tg-bind-scope",!0),e&&n.attr(e),n.addClass("remove-on-close"),i=this.compile(n)(o),$(document.body).append(i)},t}(),angular.module("taigaCommon").service("tgLightboxFactory",t)}.call(this),function(){var t;t=function(){return function(t){var e;return e=Immutable.Map({data:t.get("data"),next:!!t.get("headers")("x-pagination-next"),prev:!!t.get("headers")("x-pagination-prev"),current:t.get("headers")("x-pagination-current"),count:t.get("headers")("x-pagination-count")})}},angular.module("taigaCommon").factory("tgPaginateResponseService",t)}.call(this),function(){var t,e=function(t,e){return(+t%(e=+e)+e)%e};t=function(){function t(){var t,e;e=["/"+window._version+"/images/project-logos/project-logo-01.png","/"+window._version+"/images/project-logos/project-logo-02.png","/"+window._version+"/images/project-logos/project-logo-03.png","/"+window._version+"/images/project-logos/project-logo-04.png","/"+window._version+"/images/project-logos/project-logo-05.png"],t=["rgba( 153, 214, 220, 1 )","rgba( 213, 156, 156, 1 )","rgba( 214, 161, 212, 1 )","rgba( 164, 162, 219, 1 )","rgba( 152, 224, 168, 1 )"],this.logos=_.cartesianProduct(e,t)}return t.prototype.getDefaultProjectLogo=function(t,r){var n,i,o;return i=t+"-"+r,n=e(murmurhash3_32_gc(i,42),this.logos.length),o=this.logos[n],{src:o[0],color:o[1]}},t}(),angular.module("taigaCommon").service("tgProjectLogoService",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,r,n,i){this.projectsService=t,this.xhrError=r,this.userActivityService=n,this.interval=i,this._project=null,this._section=null,this._sectionsBreadcrumb=Immutable.List(),this._activeMembers=Immutable.List(),e.defineImmutableProperty(this,"project",function(t){return function(){return t._project}}(this)),e.defineImmutableProperty(this,"section",function(t){return function(){return t._section}}(this)),e.defineImmutableProperty(this,"sectionsBreadcrumb",function(t){return function(){return t._sectionsBreadcrumb}}(this)),e.defineImmutableProperty(this,"activeMembers",function(t){return function(){return t._activeMembers}}(this)),window.localStorage.e2e||this.autoRefresh()}return t.$inject=["tgProjectsService","tgXhrErrorService","tgUserActivityService","$interval"],t.prototype.cleanProject=function(){return this._project=null,this._activeMembers=Immutable.List(),this._section=null,this._sectionsBreadcrumb=Immutable.List()},t.prototype.autoRefresh=function(){var t;return t=this.interval(function(t){return function(){return t.fetchProject()}}(this),6e5),this.userActivityService.onInactive(function(e){return function(){return e.interval.cancel(t)}}(this)),this.userActivityService.onActive(function(t){return function(){return t.fetchProject(),t.autoRefresh()}}(this))},t.prototype.setSection=function(t){return this._section=t,t?this._sectionsBreadcrumb=this._sectionsBreadcrumb.push(this._section):this._sectionsBreadcrumb=Immutable.List()},t.prototype.setProject=function(t){return this._project=t,this._activeMembers=this._project.get("members").filter(function(t){return t.get("is_active")})},t.prototype.setProjectBySlug=function(t){return new Promise(function(e){return function(r,n){return e.project&&e.project.get("slug")===t?r():e.projectsService.getProjectBySlug(t).then(function(t){return e.setProject(t),r()})["catch"](function(t){return e.xhrError.response(t)})}}(this))},t.prototype.fetchProject=function(){var t;if(this.project)return t=this.project.get("slug"),this.projectsService.getProjectBySlug(t).then(function(t){return function(e){return t.setProject(e)}}(this))},t.prototype.hasPermission=function(t){return this._project.get("my_permissions").indexOf(t)!==-1},t.prototype.isEpicsDashboardEnabled=function(){return this._project.get("is_epics_activated")},t}(),angular.module("taigaCommon").service("tgProjectService",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga,t=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return r(e,t),e}(e.Service=function(){return{use:function(t){var e;return e=$("link[rel='stylesheet']:first"),0===e.length&&(e=$(""),$("head").append(e)),e.attr("href","/"+window._version+"/styles/theme-"+t+".css")}}}),angular.module("taigaCommon").service("tgThemeService",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.groupBy,t=function(){function t(t){return this.timeout=t,window.localStorage.e2e?null:(window.addEventListener("mousemove",this.resetTimer.bind(this),!1),window.addEventListener("mousedown",this.resetTimer.bind(this),!1),window.addEventListener("keypress",this.resetTimer.bind(this),!1),window.addEventListener("mousewheel",this.resetTimer.bind(this),!1),window.addEventListener("touchmove",this.resetTimer.bind(this),!1),this.subscriptionsActive=[],this.subscriptionsInactive=[],this.isActive=!0,void this.startTimer())}return t.$inject=["$timeout"],t.prototype.idleTimeout=3e5,t.prototype.startTimer=function(){return this.timerId=this.timeout(this._fireInactive.bind(this),this.idleTimeout)},t.prototype.resetTimer=function(){return this.isActive||this._fireActive(),this.timeout.cancel(this.timerId),this.startTimer(),this.isActive=!0},t.prototype.onActive=function(t){return this.subscriptionsActive.push(t),this._unSubscriptionsActive.bind(this,t)},t.prototype.onInactive=function(t){return this.subscriptionsInactive.push(t),this._unSubscriptionsInactive.bind(this,t)},t.prototype._fireActive=function(){return this.subscriptionsActive.forEach(function(t){return t()})},t.prototype._fireInactive=function(){return this.isActive=!1,this.subscriptionsInactive.forEach(function(t){return t()})},t.prototype._unSubscriptionsActive=function(t){return this.subscriptionsActive=this.subscriptionsActive.filter(function(e){return e!==t})},t.prototype._unSubscriptionsInactive=function(t){return this.subscriptionsInactive=this.subscriptionsInactive.filter(function(e){return e!==t})},t}(),angular.module("taigaCommon").service("tgUserActivityService",t)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,e=r.bindMethods,t=function(t){function r(t){this.rs=t,e(this)}return n(r,t),r.$inject=["tgResources"],r.prototype.getUserByUserName=function(t){return this.rs.users.getUserByUsername(t)},r.prototype.getContacts=function(t,e){return this.rs.users.getContacts(t,e)},r.prototype.getLiked=function(t,e,r,n){return this.rs.users.getLiked(t,e,r,n)},r.prototype.getVoted=function(t,e,r,n){return this.rs.users.getVoted(t,e,r,n)},r.prototype.getWatched=function(t,e,r,n){return this.rs.users.getWatched(t,e,r,n)},r.prototype.getStats=function(t){return this.rs.users.getStats(t)},r.prototype.attachUserContactsToProjects=function(t,e){return this.getContacts(t).then(function(t){return e=e.map(function(e){var r;return r=t.filter(function(t){var r;return r=t.get("id"),e.get("members").indexOf(r)!==-1}),e=e.set("contacts",r)})})},r}(r.Service),angular.module("taigaCommon").service("tgUserService",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.q=t,this.errorHandlingService=e}return e(r,t),r.$inject=["$q","tgErrorHandlingService"],r.prototype.notFound=function(){return this.errorHandlingService.notfound()},r.prototype.permissionDenied=function(){return this.errorHandlingService.permissionDenied()},r.prototype.response=function(t){return t&&(404===t.status?this.notFound():403===t.status&&this.permissionDenied()),this.q.reject(t)},r}(taiga.Service),angular.module("taigaCommon").service("tgXhrErrorService",t)}.call(this),function(){var t;t=function(t,e){var r,n,i;return i=[".jpg",".jpeg",".bmp",".gif",".png"],r=function(t){return t=t.toLowerCase(),_.some(i,function(e){return t.indexOf(e,t-e.length)!==-1})},n=function(n,i){var o,s;return o=r(n.attachment.get("url")),s=o?t.get("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html"):t.get("user-timeline/user-timeline-attachment/user-timeline-attachment.html"),i.html(s),e(i.contents())(n),i.find("img").error(function(){return this.remove()})},{link:n,scope:{attachment:"=tgUserTimelineAttachment"}}},t.$inject=["$tgTemplate","$compile"],angular.module("taigaUserTimeline").directive("tgUserTimelineAttachment",t)}.call(this),function(){var t,e;e=this.taiga.unslugify,t=function(){function t(t,e){this.translate=t,this.sce=e}return t.$inject=["$translate","$sce"],t.prototype._fieldTranslationKey={status:"COMMON.FIELDS.STATUS",subject:"COMMON.FIELDS.SUBJECT",description_diff:"COMMON.FIELDS.DESCRIPTION",points:"COMMON.FIELDS.POINTS",assigned_to:"COMMON.FIELDS.ASSIGNED_TO",assigned_users:"COMMON.FIELDS.ASSIGNED_USERS",severity:"ISSUES.FIELDS.SEVERITY",priority:"ISSUES.FIELDS.PRIORITY",type:"ISSUES.FIELDS.TYPE",is_iocaine:"TASK.FIELDS.IS_IOCAINE",is_blocked:"COMMON.FIELDS.IS_BLOCKED",color:"COMMON.FIELDS.COLOR",due_date:"COMMON.FIELDS.DUE_DATE",due_date_reason:"COMMON.FIELDS.DUE_DATE_REASON"},t.prototype._params={username:function(t,e){var r,n,i;return i=t.getIn(["data","user"]),i.get("is_profile_visible")?(r=this.translate.instant("COMMON.SEE_USER_PROFILE",{username:i.get("username")}),n="user-profile:username=timeline.getIn(['data', 'user', 'username'])",this._getLink(n,i.get("name"),r)):this._getUsernameSpan(i.get("name"))},field_name:function(t,e){var r;return r=t.getIn(["data","value_diff","key"]),this.translate.instant(this._fieldTranslationKey[r])},project_name:function(t,e){var r;return r="project:project=timeline.getIn(['data', 'project', 'slug'])",this._getLink(r,t.getIn(["data","project","name"]))},new_value:function(t,e){var r,n,i;return _.isArray(t.getIn(["data","value_diff","value"]).toJS())?(i=t.getIn(["data","value_diff","value"]).get(1),null===i&&"assigned_to"===t.getIn(["data","value_diff","key"])&&(i=this.translate.instant("ACTIVITY.VALUES.UNASSIGNED")),null===i&&"assigned_users"===t.getIn(["data","value_diff","key"])?i=this.translate.instant("ACTIVITY.VALUES.UNASSIGNED"):"due_date"===t.getIn(["data","value_diff","key"])&&(i?(n=this.translate.instant("COMMON.PICKERDATE.FORMAT"),i=moment(i,"YYYY-MM-DD").format(n)):i=this.translate.instant("ACTIVITY.VALUES.NOT_SET")),r=i):r=t.getIn(["data","value_diff","value"]).first().get(1),_.escape(r)},sprint_name:function(t,e){var r;return r="project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])",this._getLink(r,t.getIn(["data","milestone","name"]))},us_name:function(t,e){var r,n,i,o;return n=this._getTimelineObj(t,e).get("userstory"),r={obj:"parent_userstory"},o=this._getDetailObjUrl(r),i="#"+n.get("ref")+" "+n.get("subject"),this._getLink(o,i)},related_us_name:function(t,e){var r,n,i;return r=t.getIn(["data","userstory"]),i="project-userstories-detail:project=timeline.getIn(['data', 'userstory', 'project', 'slug']),ref=timeline.getIn(['data', 'userstory', 'ref'])",n="#"+r.get("ref")+" "+r.get("subject"),this._getLink(i,n)},epic_name:function(t,e){var r,n,i;return r=t.getIn(["data","epic"]),i="project-epics-detail:project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['data', 'epic', 'ref'])",n="#"+r.get("ref")+" "+r.get("subject"),this._getLink(i,n)},obj_name:function(t,r){var n,i,o;return n=this._getTimelineObj(t,r),o=this._getDetailObjUrl(r),i="wikipage"===r.obj?e(n.get("slug")):"milestone"===r.obj?n.get("name"):"#"+n.get("ref")+" "+n.get("subject"),this._getLink(o,i)},role_name:function(t,e){return _.escape(t.getIn(["data","value_diff","value"]).keySeq().first())}},t.prototype._translateTitleParams=function(t,e,r){return this._params[t].call(this,e,r)},t.prototype._getTimelineObj=function(t,e){return t.getIn(["data",e.obj])},t.prototype._getDetailObjUrl=function(t){var e;return e={issue:["project-issues-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],wikipage:["project-wiki-page",":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])"],task:["project-tasks-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],userstory:["project-userstories-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],parent_userstory:["project-userstories-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])"],milestone:["project-taskboard",":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])"],epic:["project-epics-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"]},e[t.obj][0]+e[t.obj][1]},t.prototype._getLink=function(t,e,r){var n;return r=r||e,n=$("").attr("ng-non-bindable",!0).text(e),$("").attr("tg-nav",t).attr("title",r).append(n).prop("outerHTML")},t.prototype._getUsernameSpan=function(t){var e;return e=e||t,$("").addClass("username").text(t).prop("outerHTML")},t.prototype._getParams=function(t,e,r){var n;return n={},r.translate_params.forEach(function(r){return function(i){return n[i]=r._translateTitleParams(i,t,e)}}(this)),n},t.prototype.getTitle=function(t,e,r){var n,i,o;return n=this._getParams(t,e,r),i={},Object.keys(n).forEach(function(t){return i[t]="{{"+t+"}}"}),o=this.translate.instant(r.key,i),Object.keys(n).forEach(function(t){var e;return e="{{"+t+"}}",o=o.replace(new RegExp(e,"g"),n[t])}),o},t}(),angular.module("taigaUserTimeline").service("tgUserTimelineItemTitle",t)}.call(this),function(){var t,e;e=function(t,e){var r;return r=[{check:function(t,e){return"membership"===e.obj},key:"TIMELINE.NEW_MEMBER",translate_params:["project_name"],member:function(t){return Immutable.Map({user:t.getIn(["data","user"]),role:t.getIn(["data","role"])})}},{check:function(t,e){return"project"===e.obj&&"create"===e.type},key:"TIMELINE.NEW_PROJECT",translate_params:["username","project_name"],description:function(t){return t.getIn(["data","project","description"])}},{check:function(t,e){return"change"===e.type&&t.hasIn(["data","value_diff"])&&"attachments"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.UPLOAD_ATTACHMENT",translate_params:["username","obj_name"]},{check:function(t,e){return"userstory"===e.obj&&"create"===e.type},key:"TIMELINE.US_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"issue"===e.obj&&"create"===e.type},key:"TIMELINE.ISSUE_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"wikipage"===e.obj&&"create"===e.type},key:"TIMELINE.WIKI_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"task"===e.obj&&"create"===e.type&&!t.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"task"===e.obj&&"create"===e.type&&t.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_CREATED_WITH_US",translate_params:["username","project_name","obj_name","us_name"]},{check:function(t,e){return"milestone"===e.obj&&"create"===e.type},key:"TIMELINE.MILESTONE_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"epic"===e.obj&&"create"===e.type},key:"TIMELINE.EPIC_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"relateduserstory"===e.obj&&"create"===e.type},key:"TIMELINE.EPIC_RELATED_USERSTORY_CREATED",translate_params:["username","project_name","related_us_name","epic_name"]},{check:function(t,e){return t.getIn(["data","comment"])&&"userstory"===e.obj},key:"TIMELINE.NEW_COMMENT_US",translate_params:["username","obj_name"],description:function(t){var e;return e=t.getIn(["data","comment_html"]),$($.parseHTML(e)).text()}},{check:function(t,e){return t.getIn(["data","comment"])&&"issue"===e.obj},key:"TIMELINE.NEW_COMMENT_ISSUE",translate_params:["username","obj_name"],description:function(t){var e;return e=t.getIn(["data","comment_html"]),$($.parseHTML(e)).text()}},{check:function(t,e){return t.getIn(["data","comment"])&&"task"===e.obj},key:"TIMELINE.NEW_COMMENT_TASK",translate_params:["username","obj_name"],description:function(t){var e;return e=t.getIn(["data","comment_html"]),$($.parseHTML(e)).text()}},{check:function(t,e){return t.getIn(["data","comment"])&&"epic"===e.obj},key:"TIMELINE.NEW_COMMENT_EPIC",translate_params:["username","obj_name"],description:function(t){var e;return e=t.getIn(["data","comment_html"]),$($.parseHTML(e)).text()}},{check:function(t,e){return t.hasIn(["data","value_diff"])&&"moveInBacklog"===t.getIn(["data","value_diff","key"])&&t.hasIn(["data","value_diff","value","backlog_order"])&&"change"===e.type},key:"TIMELINE.US_MOVED",translate_params:["username","obj_name"]},{check:function(t,e){return!(!t.hasIn(["data","value_diff"])||"moveInBacklog"!==t.getIn(["data","value_diff","key"])||"change"!==e.type||"userstory"!==e.obj)&&null===t.getIn(["data","value_diff","value","milestone"]).get(1)},key:"TIMELINE.US_REMOVED_FROM_MILESTONE",translate_params:["username","obj_name"]},{check:function(t,e){return t.hasIn(["data","value_diff"])&&"moveInBacklog"===t.getIn(["data","value_diff","key"])&&"change"===e.type&&"userstory"===e.obj},key:"TIMELINE.US_ADDED_MILESTONE",translate_params:["username","obj_name","sprint_name"]},{check:function(t,e){return!(!t.hasIn(["data","value_diff"])||"blocked"!==t.getIn(["data","value_diff","key"])||"change"!==e.type)&&t.getIn(["data","value_diff","value","is_blocked"]).get(1)===!0},key:"TIMELINE.BLOCKED",translate_params:["username","obj_name"],description:function(t){var e;return!!t.hasIn(["data","value_diff","value","blocked_note_html"])&&(e=t.getIn(["data","value_diff","value","blocked_note_html"]).get(1),$($.parseHTML(e)).text())}},{check:function(t,e){return!(!t.hasIn(["data","value_diff"])||"blocked"!==t.getIn(["data","value_diff","key"])||"change"!==e.type)&&t.getIn(["data","value_diff","value","is_blocked"]).get(1)===!1; -},key:"TIMELINE.UNBLOCKED",translate_params:["username","obj_name"]},{check:function(t,e){return"milestone"===e.obj&&"change"===e.type},key:"TIMELINE.MILESTONE_UPDATED",translate_params:["username","obj_name"]},{check:function(t,e){return"wikipage"===e.obj&&"change"===e.type},key:"TIMELINE.WIKI_UPDATED",translate_params:["username","obj_name"]},{check:function(t,e){return"userstory"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"points"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.US_UPDATED_POINTS",translate_params:["username","field_name","obj_name","new_value","role_name"]},{check:function(t,e){return"userstory"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.US_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(t,e){return"userstory"===e.obj&&"change"===e.type},key:"TIMELINE.US_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"issue"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.ISSUE_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(t,e){return"issue"===e.obj&&"change"===e.type},key:"TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"task"===e.obj&&"change"===e.type&&!t.getIn(["data","task","userstory"])&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.TASK_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(t,e){return"task"===e.obj&&"change"===e.type&&t.getIn(["data","task","userstory"])&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.TASK_UPDATED_WITH_US",translate_params:["username","field_name","obj_name","us_name"]},{check:function(t,e){return"task"===e.obj&&"change"===e.type&&!t.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"task"===e.obj&&"change"===e.type&&t.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE",translate_params:["username","field_name","obj_name","us_name","new_value"]},{check:function(t,e){return"epic"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.EPIC_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(t,e){return"epic"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"color"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.EPIC_UPDATED_WITH_NEW_COLOR",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"epic"===e.obj&&"change"===e.type},key:"TIMELINE.EPIC_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"user"===e.obj&&"create"===e.type},key:"TIMELINE.NEW_USER",translate_params:["username"]}],_.find(r,function(r){return r.check(t,e)})},t=function(){function t(){}return t.prototype.getType=function(t,r){return e(t,r)},t}(),angular.module("taigaUserTimeline").service("tgUserTimelineItemType",t)}.call(this),function(){var t;t=function(){return{templateUrl:"user-timeline/user-timeline-item/user-timeline-item.html",scope:{timeline:"=tgUserTimelineItem"}}},angular.module("taigaUserTimeline").directive("tgUserTimelineItem",t)}.call(this),function(){var t;t=function(){var t;return t={},t.generate=function(t){var e,r,n,i;return i=1,r=Immutable.List(),t.minItems=t.minItems||20,n=function(){return r=Immutable.List(),e()},e=function(){return t.fetch(i).then(function(n){var o;return i++,o=n.get("data"),t.filter&&(o=t.filter(o)),t.map&&(o=o.map(t.map)),r=r.concat(o),r.size\n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: app.coffee\n */\n\n(function() {\n var configure, i18nInit, init, module, modules, pluginsModules, pluginsWithModule, taiga;\n\n this.taiga = taiga = {};\n\n taiga.emojis = window.emojis;\n\n this.taigaContribPlugins = this.taigaContribPlugins || window.taigaContribPlugins || [];\n\n taiga.generateHash = function(components) {\n if (components == null) {\n components = [];\n }\n components = _.map(components, function(x) {\n return JSON.stringify(x);\n });\n return hex_sha1(components.join(\":\"));\n };\n\n taiga.generateUniqueSessionIdentifier = function() {\n var date, randomNumber;\n date = (new Date()).getTime();\n randomNumber = Math.floor(Math.random() * 0x9000000);\n return taiga.generateHash([date, randomNumber]);\n };\n\n taiga.sessionId = taiga.generateUniqueSessionIdentifier();\n\n configure = function($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider, $compileProvider, $translateProvider, $translatePartialLoaderProvider, $animateProvider) {\n var authHttpIntercept, blockingIntercept, decorators, defaultHeaders, loaderIntercept, originalWhen, preferedLangCode, userInfo, versionCheckHttpIntercept;\n $animateProvider.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/);\n originalWhen = $routeProvider.when;\n $routeProvider.when = function(path, route) {\n route.resolve || (route.resolve = {});\n angular.extend(route.resolve, {\n languageLoad: [\n \"$q\", \"$translate\", function($q, $translate) {\n var deferred;\n deferred = $q.defer();\n $translate().then(function() {\n return deferred.resolve();\n });\n return deferred.promise;\n }\n ],\n projectLoaded: [\n \"$q\", \"tgProjectService\", \"$route\", function($q, projectService, $route) {\n var deferred, ref;\n deferred = $q.defer();\n projectService.setSection((ref = $route.current.$$route) != null ? ref.section : void 0);\n if ($route.current.params.pslug) {\n projectService.setProjectBySlug($route.current.params.pslug).then(deferred.resolve);\n } else {\n projectService.cleanProject();\n deferred.resolve();\n }\n return deferred.promise;\n }\n ]\n });\n return originalWhen.call($routeProvider, path, route);\n };\n $routeProvider.when(\"/\", {\n templateUrl: \"home/home.html\",\n controller: \"Home\",\n controllerAs: \"vm\",\n loader: true,\n title: \"HOME.PAGE_TITLE\",\n loader: true,\n description: \"HOME.PAGE_DESCRIPTION\",\n joyride: \"dashboard\"\n });\n $routeProvider.when(\"/discover\", {\n templateUrl: \"discover/discover-home/discover-home.html\",\n controller: \"DiscoverHome\",\n controllerAs: \"vm\",\n title: \"PROJECT.NAVIGATION.DISCOVER\",\n loader: true\n });\n $routeProvider.when(\"/discover/search\", {\n templateUrl: \"discover/discover-search/discover-search.html\",\n title: \"PROJECT.NAVIGATION.DISCOVER\",\n loader: true,\n controller: \"DiscoverSearch\",\n controllerAs: \"vm\",\n reloadOnSearch: false\n });\n $routeProvider.when(\"/projects/\", {\n templateUrl: \"projects/listing/projects-listing.html\",\n access: {\n requiresLogin: true\n },\n title: \"PROJECTS.PAGE_TITLE\",\n description: \"PROJECTS.PAGE_DESCRIPTION\",\n loader: true,\n controller: \"ProjectsListing\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/new\", {\n title: \"PROJECT.CREATE.TITLE\",\n templateUrl: \"projects/create/create-project.html\",\n loader: true,\n controller: \"CreateProjectCtrl\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/new/scrum\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/kanban\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/duplicate\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/import/:platform?\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/:pslug/\", {\n templateUrl: \"projects/project/project.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\",\n section: \"project-timeline\"\n });\n $routeProvider.when(\"/project/:pslug/t/:ref\", {\n loader: true,\n controller: \"DetailController\",\n template: \"\"\n });\n $routeProvider.when(\"/project/:pslug/search\", {\n templateUrl: \"search/search.html\",\n reloadOnSearch: false,\n section: \"search\",\n loader: true\n });\n $routeProvider.when(\"/project/:pslug/epics\", {\n section: \"epics\",\n templateUrl: \"epics/dashboard/epics-dashboard.html\",\n loader: true,\n controller: \"EpicsDashboardCtrl\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/:pslug/epic/:epicref\", {\n templateUrl: \"epic/epic-detail.html\",\n loader: true,\n section: \"epics\"\n });\n $routeProvider.when(\"/project/:pslug/backlog\", {\n templateUrl: \"backlog/backlog.html\",\n loader: true,\n section: \"backlog\",\n joyride: \"backlog\"\n });\n $routeProvider.when(\"/project/:pslug/kanban\", {\n templateUrl: \"kanban/kanban.html\",\n loader: true,\n section: \"kanban\",\n joyride: \"kanban\"\n });\n $routeProvider.when(\"/project/:pslug/taskboard/:sslug\", {\n templateUrl: \"taskboard/taskboard.html\",\n loader: true,\n section: \"backlog\"\n });\n $routeProvider.when(\"/project/:pslug/us/:usref\", {\n templateUrl: \"us/us-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n });\n $routeProvider.when(\"/project/:pslug/task/:taskref\", {\n templateUrl: \"task/task-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n });\n $routeProvider.when(\"/project/:pslug/wiki\", {\n redirectTo: function(params) {\n return \"/project/\" + params.pslug + \"/wiki/home\";\n }\n });\n $routeProvider.when(\"/project/:pslug/wiki-list\", {\n templateUrl: \"wiki/wiki-list.html\",\n loader: true,\n section: \"wiki\"\n });\n $routeProvider.when(\"/project/:pslug/wiki/:slug\", {\n templateUrl: \"wiki/wiki.html\",\n loader: true,\n section: \"wiki\"\n });\n $routeProvider.when(\"/project/:pslug/team\", {\n templateUrl: \"team/team.html\",\n loader: true,\n section: \"team\"\n });\n $routeProvider.when(\"/project/:pslug/issues\", {\n templateUrl: \"issue/issues.html\",\n loader: true,\n section: \"issues\"\n });\n $routeProvider.when(\"/project/:pslug/issue/:issueref\", {\n templateUrl: \"issue/issues-detail.html\",\n loader: true,\n section: \"issues\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/details\", {\n templateUrl: \"admin/admin-project-profile.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/default-values\", {\n templateUrl: \"admin/admin-project-default-values.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/modules\", {\n templateUrl: \"admin/admin-project-modules.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/export\", {\n templateUrl: \"admin/admin-project-export.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/reports\", {\n templateUrl: \"admin/admin-project-reports.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/status\", {\n templateUrl: \"admin/admin-project-values-status.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/points\", {\n templateUrl: \"admin/admin-project-values-points.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/priorities\", {\n templateUrl: \"admin/admin-project-values-priorities.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/severities\", {\n templateUrl: \"admin/admin-project-values-severities.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/types\", {\n templateUrl: \"admin/admin-project-values-types.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/custom-fields\", {\n templateUrl: \"admin/admin-project-values-custom-fields.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/tags\", {\n templateUrl: \"admin/admin-project-values-tags.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/memberships\", {\n templateUrl: \"admin/admin-memberships.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/roles\", {\n templateUrl: \"admin/admin-roles.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/webhooks\", {\n templateUrl: \"admin/admin-third-parties-webhooks.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/github\", {\n templateUrl: \"admin/admin-third-parties-github.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/gitlab\", {\n templateUrl: \"admin/admin-third-parties-gitlab.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/bitbucket\", {\n templateUrl: \"admin/admin-third-parties-bitbucket.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/gogs\", {\n templateUrl: \"admin/admin-third-parties-gogs.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/contrib/:plugin\", {\n templateUrl: \"contrib/main.html\"\n });\n $routeProvider.when(\"/project/:pslug/transfer/:token\", {\n templateUrl: \"projects/transfer/transfer-page.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/user-settings/user-profile\", {\n templateUrl: \"user/user-profile.html\"\n });\n $routeProvider.when(\"/user-settings/user-change-password\", {\n templateUrl: \"user/user-change-password.html\"\n });\n $routeProvider.when(\"/user-settings/mail-notifications\", {\n templateUrl: \"user/mail-notifications.html\"\n });\n $routeProvider.when(\"/user-settings/live-notifications\", {\n templateUrl: \"user/live-notifications.html\"\n });\n $routeProvider.when(\"/change-email/:email_token\", {\n templateUrl: \"user/change-email.html\"\n });\n $routeProvider.when(\"/cancel-account/:cancel_token\", {\n templateUrl: \"user/cancel-account.html\"\n });\n $routeProvider.when(\"/user-settings/contrib/:plugin\", {\n templateUrl: \"contrib/user-settings.html\"\n });\n $routeProvider.when(\"/profile\", {\n templateUrl: \"profile/profile.html\",\n loader: true,\n access: {\n requiresLogin: true\n },\n controller: \"Profile\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/profile/:slug\", {\n templateUrl: \"profile/profile.html\",\n loader: true,\n controller: \"Profile\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/login\", {\n templateUrl: \"auth/login.html\",\n title: \"LOGIN.PAGE_TITLE\",\n description: \"LOGIN.PAGE_DESCRIPTION\",\n disableHeader: true,\n controller: \"LoginPage\"\n });\n $routeProvider.when(\"/register\", {\n templateUrl: \"auth/register.html\",\n title: \"REGISTER.PAGE_TITLE\",\n description: \"REGISTER.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/forgot-password\", {\n templateUrl: \"auth/forgot-password.html\",\n title: \"FORGOT_PASSWORD.PAGE_TITLE\",\n description: \"FORGOT_PASSWORD.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/change-password/:token\", {\n templateUrl: \"auth/change-password-from-recovery.html\",\n title: \"CHANGE_PASSWORD.PAGE_TITLE\",\n description: \"CHANGE_PASSWORD.PAGE_TITLE\",\n disableHeader: true\n });\n $routeProvider.when(\"/invitation/:token\", {\n templateUrl: \"auth/invitation.html\",\n title: \"INVITATION.PAGE_TITLE\",\n description: \"INVITATION.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/external-apps\", {\n templateUrl: \"external-apps/external-app.html\",\n title: \"EXTERNAL_APP.PAGE_TITLE\",\n description: \"EXTERNAL_APP.PAGE_DESCRIPTION\",\n controller: \"ExternalApp\",\n controllerAs: \"vm\",\n disableHeader: true,\n mobileViewport: true\n });\n $routeProvider.when(\"/blocked-project/:pslug/\", {\n templateUrl: \"projects/project/blocked-project.html\",\n loader: true\n });\n $routeProvider.when(\"/error\", {\n templateUrl: \"error/error.html\"\n });\n $routeProvider.when(\"/not-found\", {\n templateUrl: \"error/not-found.html\"\n });\n $routeProvider.when(\"/permission-denied\", {\n templateUrl: \"error/permission-denied.html\"\n });\n $routeProvider.otherwise({\n templateUrl: \"error/not-found.html\"\n });\n $locationProvider.html5Mode({\n enabled: true,\n requireBase: false\n });\n defaultHeaders = {\n \"Content-Type\": \"application/json\",\n \"Accept-Language\": window.taigaConfig.defaultLanguage || \"en\",\n \"X-Session-Id\": taiga.sessionId\n };\n $httpProvider.defaults.headers[\"delete\"] = defaultHeaders;\n $httpProvider.defaults.headers.patch = defaultHeaders;\n $httpProvider.defaults.headers.post = defaultHeaders;\n $httpProvider.defaults.headers.put = defaultHeaders;\n $httpProvider.defaults.headers.get = {\n \"X-Session-Id\": taiga.sessionId\n };\n $httpProvider.useApplyAsync(true);\n $tgEventsProvider.setSessionId(taiga.sessionId);\n authHttpIntercept = function($q, $location, $navUrls, $lightboxService, errorHandlingService) {\n var httpResponseError;\n httpResponseError = function(response) {\n var nextUrl, search;\n if (response.status === 0 || (response.status === -1 && !response.config.cancelable)) {\n $lightboxService.closeAll();\n errorHandlingService.error();\n } else if (response.status === 401 && $location.url().indexOf('/login') === -1) {\n nextUrl = $location.url();\n search = $location.search();\n if (search.force_next) {\n $location.url($navUrls.resolve(\"login\")).search(\"force_next\", search.force_next);\n } else {\n $location.url($navUrls.resolve(\"login\")).search({\n \"unauthorized\": true,\n \"next\": nextUrl\n });\n }\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"authHttpIntercept\", [\"$q\", \"$location\", \"$tgNavUrls\", \"lightboxService\", \"tgErrorHandlingService\", authHttpIntercept]);\n $httpProvider.interceptors.push(\"authHttpIntercept\");\n loaderIntercept = function($q, loaderService) {\n return {\n request: function(config) {\n loaderService.logRequest();\n return config;\n },\n requestError: function(rejection) {\n loaderService.logResponse();\n return $q.reject(rejection);\n },\n responseError: function(rejection) {\n loaderService.logResponse();\n return $q.reject(rejection);\n },\n response: function(response) {\n loaderService.logResponse();\n return response;\n }\n };\n };\n $provide.factory(\"loaderIntercept\", [\"$q\", \"tgLoader\", loaderIntercept]);\n $httpProvider.interceptors.push(\"loaderIntercept\");\n versionCheckHttpIntercept = function($q) {\n var httpResponseError;\n httpResponseError = function(response) {\n var $injector;\n if (response.status === 400 && response.data.version) {\n $injector = angular.element(\"body\").injector();\n $injector.invoke([\n \"$tgConfirm\", \"$translate\", (function(_this) {\n return function($confirm, $translate) {\n var versionErrorMsg;\n versionErrorMsg = $translate.instant(\"ERROR.VERSION_ERROR\");\n return $confirm.notify(\"error\", versionErrorMsg, null, 10000);\n };\n })(this)\n ]);\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"versionCheckHttpIntercept\", [\"$q\", versionCheckHttpIntercept]);\n $httpProvider.interceptors.push(\"versionCheckHttpIntercept\");\n blockingIntercept = function($q, errorHandlingService) {\n var redirectToBlockedPage, responseError, responseOk;\n redirectToBlockedPage = function() {\n return errorHandlingService.block();\n };\n responseOk = function(response) {\n if (response.data.blocked_code) {\n redirectToBlockedPage();\n }\n return response;\n };\n responseError = function(response) {\n if (response.status === 451) {\n redirectToBlockedPage();\n }\n return $q.reject(response);\n };\n return {\n response: responseOk,\n responseError: responseError\n };\n };\n $provide.factory(\"blockingIntercept\", [\"$q\", \"tgErrorHandlingService\", blockingIntercept]);\n $httpProvider.interceptors.push(\"blockingIntercept\");\n $compileProvider.debugInfoEnabled(window.taigaConfig.debugInfo || false);\n if (localStorage.userInfo) {\n userInfo = JSON.parse(localStorage.userInfo);\n }\n preferedLangCode = (userInfo != null ? userInfo.lang : void 0) || window.taigaConfig.defaultLanguage || \"en\";\n $translatePartialLoaderProvider.addPart('taiga');\n $translateProvider.useLoader('$translatePartialLoader', {\n urlTemplate: '/' + window._version + '/locales/{part}/locale-{lang}.json'\n }).useSanitizeValueStrategy('escapeParameters').addInterpolation('$translateMessageFormatInterpolation').preferredLanguage(preferedLangCode);\n $translateProvider.fallbackLanguage(preferedLangCode);\n decorators = window.getDecorators();\n return _.each(decorators, function(decorator) {\n return $provide.decorator(decorator.provider, decorator.decorator);\n });\n };\n\n i18nInit = function(lang, $translate) {\n var messages;\n moment.locale(lang);\n if (lang !== 'en') {\n ljs.load((\"/\" + window._version + \"/locales/moment-locales/\") + lang + \".js\");\n }\n messages = {\n defaultMessage: $translate.instant(\"COMMON.FORM_ERRORS.DEFAULT_MESSAGE\"),\n type: {\n email: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_EMAIL\"),\n url: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URL\"),\n urlstrict: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URLSTRICT\"),\n number: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_NUMBER\"),\n digits: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DIGITS\"),\n dateIso: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DATEISO\"),\n alphanum: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_ALPHANUM\"),\n phone: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_PHONE\")\n },\n notnull: $translate.instant(\"COMMON.FORM_ERRORS.NOTNULL\"),\n notblank: $translate.instant(\"COMMON.FORM_ERRORS.NOT_BLANK\"),\n required: $translate.instant(\"COMMON.FORM_ERRORS.REQUIRED\"),\n regexp: $translate.instant(\"COMMON.FORM_ERRORS.REGEXP\"),\n min: $translate.instant(\"COMMON.FORM_ERRORS.MIN\"),\n max: $translate.instant(\"COMMON.FORM_ERRORS.MAX\"),\n range: $translate.instant(\"COMMON.FORM_ERRORS.RANGE\"),\n minlength: $translate.instant(\"COMMON.FORM_ERRORS.MIN_LENGTH\"),\n maxlength: $translate.instant(\"COMMON.FORM_ERRORS.MAX_LENGTH\"),\n rangelength: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_LENGTH\"),\n mincheck: $translate.instant(\"COMMON.FORM_ERRORS.MIN_CHECK\"),\n maxcheck: $translate.instant(\"COMMON.FORM_ERRORS.MAX_CHECK\"),\n rangecheck: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_CHECK\"),\n equalto: $translate.instant(\"COMMON.FORM_ERRORS.EQUAL_TO\"),\n linewidth: $translate.instant(\"COMMON.FORM_ERRORS.LINEWIDTH\"),\n pikaday: $translate.instant(\"COMMON.FORM_ERRORS.PIKADAY\")\n };\n return checksley.updateMessages('default', messages);\n };\n\n init = function($log, $rootscope, $auth, $events, $analytics, $translate, $location, $navUrls, appMetaService, loaderService, navigationBarService, errorHandlingService, lightboxService) {\n var un, user, validators;\n $log.debug(\"Initialize application\");\n $rootscope.$on('$translatePartialLoaderStructureChanged', function() {\n return $translate.refresh();\n });\n validators = {\n linewidth: function(val, width) {\n var lines, valid;\n lines = taiga.nl2br(val).split(\"
    \");\n valid = _.every(lines, function(line) {\n return line.length < width;\n });\n return valid;\n },\n pikaday: function(val) {\n var prettyDate;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n return moment(val, prettyDate).isValid();\n }\n };\n checksley.updateValidators(validators);\n $rootscope.contribPlugins = this.taigaContribPlugins;\n $rootscope.adminPlugins = _.filter(this.taigaContribPlugins, {\n \"type\": \"admin\"\n });\n $rootscope.userSettingsPlugins = _.filter(this.taigaContribPlugins, {\n \"type\": \"userSettings\"\n });\n $rootscope.$on(\"$translateChangeEnd\", function(e, ctx) {\n var lang;\n lang = ctx.language;\n return i18nInit(lang, $translate);\n });\n Promise.setScheduler(function(cb) {\n return $rootscope.$evalAsync(cb);\n });\n $events.setupConnection();\n if ($auth.isAuthenticated()) {\n user = $auth.getUser();\n $auth.showTerms();\n }\n $analytics.initialize();\n $rootscope.$on('$locationChangeStart', function(event) {\n errorHandlingService.init();\n if (lightboxService.getLightboxOpen().length) {\n event.preventDefault();\n return lightboxService.closeAll();\n }\n });\n un = $rootscope.$on('$routeChangeStart', function(event, next) {\n if (next.loader) {\n loaderService.start(true);\n }\n return un();\n });\n return $rootscope.$on('$routeChangeSuccess', function(event, next) {\n var description, title;\n if (next.loader) {\n loaderService.start(true);\n }\n if (next.access && next.access.requiresLogin) {\n if (!$auth.isAuthenticated()) {\n $location.path($navUrls.resolve(\"login\"));\n }\n }\n if (next.title || next.description) {\n title = $translate.instant(next.title || \"\");\n description = $translate.instant(next.description || \"\");\n appMetaService.setAll(title, description);\n }\n if (next.mobileViewport) {\n appMetaService.addMobileViewport();\n } else {\n appMetaService.removeMobileViewport();\n }\n if (next.disableHeader) {\n return navigationBarService.disableHeader();\n } else {\n return navigationBarService.enableHeader();\n }\n });\n };\n\n angular.module('infinite-scroll').value('THROTTLE_MILLISECONDS', 500);\n\n pluginsWithModule = _.filter(this.taigaContribPlugins, function(plugin) {\n return plugin.module;\n });\n\n pluginsModules = _.map(pluginsWithModule, function(plugin) {\n return plugin.module;\n });\n\n modules = [\"taigaBase\", \"taigaCommon\", \"taigaResources\", \"taigaResources2\", \"taigaAuth\", \"taigaEvents\", \"taigaHome\", \"taigaNavigationBar\", \"taigaProjects\", \"taigaRelatedTasks\", \"taigaBacklog\", \"taigaTaskboard\", \"taigaKanban\", \"taigaIssues\", \"taigaUserStories\", \"taigaTasks\", \"taigaTeam\", \"taigaWiki\", \"taigaSearch\", \"taigaAdmin\", \"taigaProject\", \"taigaUserSettings\", \"taigaFeedback\", \"taigaPlugins\", \"taigaIntegrations\", \"taigaComponents\", \"taigaProfile\", \"taigaHome\", \"taigaUserTimeline\", \"taigaExternalApps\", \"taigaDiscover\", \"taigaHistory\", \"taigaWikiHistory\", \"taigaEpics\", \"taigaUtils\", \"templates\", \"ngSanitize\", \"ngRoute\", \"ngAnimate\", \"ngAria\", \"pascalprecht.translate\", \"infinite-scroll\", \"tgRepeat\"].concat(pluginsModules);\n\n module = angular.module(\"taiga\", modules);\n\n module.config([\"$routeProvider\", \"$locationProvider\", \"$httpProvider\", \"$provide\", \"$tgEventsProvider\", \"$compileProvider\", \"$translateProvider\", \"$translatePartialLoaderProvider\", \"$animateProvider\", configure]);\n\n module.run([\"$log\", \"$rootScope\", \"$tgAuth\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"tgLoader\", \"tgNavigationBarService\", \"tgErrorHandlingService\", \"lightboxService\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: classes.coffee\n */\n\n(function() {\n var TaigaBase, TaigaController, TaigaService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n TaigaBase = (function() {\n function TaigaBase() {}\n\n return TaigaBase;\n\n })();\n\n TaigaService = (function(superClass) {\n extend(TaigaService, superClass);\n\n function TaigaService() {\n return TaigaService.__super__.constructor.apply(this, arguments);\n }\n\n return TaigaService;\n\n })(TaigaBase);\n\n TaigaController = (function(superClass) {\n extend(TaigaController, superClass);\n\n function TaigaController() {\n this.onInitialDataError = bind(this.onInitialDataError, this);\n return TaigaController.__super__.constructor.apply(this, arguments);\n }\n\n TaigaController.prototype.onInitialDataError = function(xhr) {\n if (xhr) {\n if (xhr.status === 404) {\n this.errorHandlingService.notfound();\n } else if (xhr.status === 403) {\n this.errorHandlingService.permissionDenied();\n }\n }\n return this.q.reject(xhr);\n };\n\n return TaigaController;\n\n })(TaigaBase);\n\n this.taiga.Base = TaigaBase;\n\n this.taiga.Service = TaigaService;\n\n this.taiga.Controller = TaigaController;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: utils.coffee\n */\n\n(function() {\n var DEFAULT_COLOR_LIST, addClass, bindMethods, bindOnce, cancelTimeout, debounce, debounceLeading, defineImmutableProperty, getDefaulColorList, getMatches, getRandomDefaultColor, groupBy, isEmail, isImage, isPdf, joinStr, mixOf, nl2br, patch, replaceTags, scopeDefer, sizeFormat, slugify, startswith, stripTags, taiga, timeout, toString, toggleText, trim, truncate, unslugify,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n slice = [].slice,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n addClass = function(el, className) {\n if (el.classList) {\n return el.classList.add(className);\n } else {\n return el.className += ' ' + className;\n }\n };\n\n nl2br = (function(_this) {\n return function(str) {\n var breakTag;\n breakTag = '
    ';\n return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + breakTag + '$2');\n };\n })(this);\n\n bindMethods = (function(_this) {\n return function(object) {\n var dependencies, methods;\n dependencies = _.keys(object);\n methods = [];\n _.forIn(object, function(value, key) {\n if (indexOf.call(dependencies, key) < 0 && _.isFunction(value)) {\n return methods.push(key);\n }\n });\n return _.bindAll(object, methods);\n };\n })(this);\n\n bindOnce = (function(_this) {\n return function(scope, attr, continuation) {\n var delBind, val;\n val = scope.$eval(attr);\n if (val !== void 0) {\n return continuation(val);\n }\n delBind = null;\n return delBind = scope.$watch(attr, function(val) {\n if (val === void 0) {\n return;\n }\n continuation(val);\n if (delBind) {\n return delBind();\n }\n });\n };\n })(this);\n\n mixOf = function() {\n var Mixed, base, i, method, mixin, mixins, name, ref;\n base = arguments[0], mixins = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n Mixed = (function(superClass) {\n extend(Mixed, superClass);\n\n function Mixed() {\n return Mixed.__super__.constructor.apply(this, arguments);\n }\n\n return Mixed;\n\n })(base);\n for (i = mixins.length - 1; i >= 0; i += -1) {\n mixin = mixins[i];\n ref = mixin.prototype;\n for (name in ref) {\n method = ref[name];\n Mixed.prototype[name] = method;\n }\n }\n return Mixed;\n };\n\n trim = function(data, char) {\n return _.trim(data, char);\n };\n\n slugify = function(data) {\n return data.toString().toLowerCase().trim().replace(/\\s+/g, '-').replace(/&/g, '-and-').replace(/[^\\w\\-]+/g, '').replace(/\\-\\-+/g, '-');\n };\n\n unslugify = function(data) {\n if (data) {\n return _.capitalize(data.replace(/-/g, ' '));\n }\n return data;\n };\n\n toggleText = function(element, texts) {\n var nextTextPosition, text;\n nextTextPosition = element.data('nextTextPosition');\n if ((nextTextPosition == null) || nextTextPosition >= texts.length) {\n nextTextPosition = 0;\n }\n text = texts[nextTextPosition];\n element.data('nextTextPosition', nextTextPosition + 1);\n return element.text(text);\n };\n\n groupBy = function(coll, pred) {\n var i, item, len, result;\n result = {};\n for (i = 0, len = coll.length; i < len; i++) {\n item = coll[i];\n result[pred(item)] = item;\n }\n return result;\n };\n\n timeout = function(wait, continuation) {\n return window.setTimeout(continuation, wait);\n };\n\n cancelTimeout = function(timeoutVar) {\n return window.clearTimeout(timeoutVar);\n };\n\n scopeDefer = function(scope, func) {\n return _.defer((function(_this) {\n return function() {\n return scope.$apply(func);\n };\n })(this));\n };\n\n toString = function(value) {\n if (_.isNumber(value)) {\n return value + \"\";\n } else if (_.isString(value)) {\n return value;\n } else if (_.isPlainObject(value)) {\n return JSON.stringify(value);\n } else if (_.isUndefined(value)) {\n return \"\";\n }\n return value.toString();\n };\n\n joinStr = function(str, coll) {\n return coll.join(str);\n };\n\n debounce = function(wait, func) {\n return _.debounce(func, wait, {\n leading: true,\n trailing: false\n });\n };\n\n debounceLeading = function(wait, func) {\n return _.debounce(func, wait, {\n leading: false,\n trailing: true\n });\n };\n\n startswith = function(str1, str2) {\n return _.startsWith(str1, str2);\n };\n\n truncate = function(str, maxLength, suffix) {\n var out;\n if (suffix == null) {\n suffix = \"...\";\n }\n if ((typeof str !== \"string\") && !(str instanceof String)) {\n return str;\n }\n out = str.slice(0);\n if (out.length > maxLength) {\n out = out.substring(0, maxLength + 1);\n out = out.substring(0, Math.min(out.length, out.lastIndexOf(\" \")));\n out = out + suffix;\n }\n return out;\n };\n\n sizeFormat = function(input, precision) {\n var number, size, units;\n if (precision == null) {\n precision = 1;\n }\n if (isNaN(parseFloat(input)) || !isFinite(input)) {\n return \"-\";\n }\n if (input === 0) {\n return \"0 bytes\";\n }\n units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n number = Math.floor(Math.log(input) / Math.log(1024));\n if (number > 5) {\n number = 5;\n }\n size = (input / Math.pow(1024, number)).toFixed(precision);\n return size + \" \" + units[number];\n };\n\n stripTags = function(str, exception) {\n var pattern;\n if (exception) {\n pattern = new RegExp('<(?!' + exception + '\\s*\\/?)[^>]+>', 'gi');\n return String(str).replace(pattern, '');\n } else {\n return String(str).replace(/<\\/?[^>]+>/g, '');\n }\n };\n\n replaceTags = function(str, tags, replace) {\n var pattern;\n pattern = new RegExp('<(' + tags + ')>', 'gi');\n str = str.replace(pattern, '<' + replace + '>');\n pattern = new RegExp('<\\/(' + tags + ')>', 'gi');\n str = str.replace(pattern, '');\n return str;\n };\n\n defineImmutableProperty = (function(_this) {\n return function(obj, name, fn) {\n return Object.defineProperty(obj, name, {\n get: function() {\n var fn_result;\n if (!_.isFunction(fn)) {\n throw \"defineImmutableProperty third param must be a function\";\n }\n fn_result = fn();\n if (fn_result && _.isObject(fn_result)) {\n if (fn_result.size === void 0) {\n throw \"defineImmutableProperty must return immutable data\";\n }\n }\n return fn_result;\n }\n });\n };\n })(this);\n\n _.mixin({\n removeKeys: function(obj, keys) {\n return _.chain([keys]).flatten().reduce(function(obj, key) {\n delete obj[key];\n return obj;\n }, obj).value();\n },\n cartesianProduct: function() {\n return _.reduceRight(arguments, function(a, b) {\n return _.flatten(_.map(a, function(x) {\n return _.map(b, function(y) {\n return [y].concat(x);\n });\n }), true);\n }, [[]]);\n }\n });\n\n isImage = function(name) {\n return name.match(/\\.(jpe?g|png|gif|gifv|webm|svg|psd)/i) !== null;\n };\n\n isEmail = function(name) {\n return (name != null) && name.match(/^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/) !== null;\n };\n\n isPdf = function(name) {\n return name.match(/\\.(pdf)/i) !== null;\n };\n\n patch = function(oldImmutable, newImmutable) {\n var pathObj;\n pathObj = {};\n newImmutable.forEach(function(newValue, key) {\n if (newValue !== oldImmutable.get(key)) {\n if (newValue.toJS) {\n return pathObj[key] = newValue.toJS();\n } else {\n return pathObj[key] = newValue;\n }\n }\n });\n return pathObj;\n };\n\n DEFAULT_COLOR_LIST = ['#fce94f', '#edd400', '#c4a000', '#8ae234', '#73d216', '#4e9a06', '#d3d7cf', '#fcaf3e', '#f57900', '#ce5c00', '#729fcf', '#3465a4', '#204a87', '#888a85', '#ad7fa8', '#75507b', '#5c3566', '#ef2929', '#cc0000', '#a40000', '#222222'];\n\n getRandomDefaultColor = function() {\n return _.sample(DEFAULT_COLOR_LIST);\n };\n\n getDefaulColorList = function() {\n return _.clone(DEFAULT_COLOR_LIST);\n };\n\n getMatches = function(string, regex, index) {\n var match, matches;\n index || (index = 1);\n matches = [];\n match = null;\n while (match = regex.exec(string)) {\n if (index === -1) {\n matches.push(match);\n } else {\n matches.push(match[index]);\n }\n }\n return matches;\n };\n\n taiga = this.taiga;\n\n taiga.addClass = addClass;\n\n taiga.nl2br = nl2br;\n\n taiga.bindMethods = bindMethods;\n\n taiga.bindOnce = bindOnce;\n\n taiga.mixOf = mixOf;\n\n taiga.trim = trim;\n\n taiga.slugify = slugify;\n\n taiga.unslugify = unslugify;\n\n taiga.toggleText = toggleText;\n\n taiga.groupBy = groupBy;\n\n taiga.timeout = timeout;\n\n taiga.cancelTimeout = cancelTimeout;\n\n taiga.scopeDefer = scopeDefer;\n\n taiga.toString = toString;\n\n taiga.joinStr = joinStr;\n\n taiga.truncate = truncate;\n\n taiga.debounce = debounce;\n\n taiga.debounceLeading = debounceLeading;\n\n taiga.startswith = startswith;\n\n taiga.sizeFormat = sizeFormat;\n\n taiga.stripTags = stripTags;\n\n taiga.replaceTags = replaceTags;\n\n taiga.defineImmutableProperty = defineImmutableProperty;\n\n taiga.isImage = isImage;\n\n taiga.isEmail = isEmail;\n\n taiga.isPdf = isPdf;\n\n taiga.patch = patch;\n\n taiga.getRandomDefaultColor = getRandomDefaultColor;\n\n taiga.getDefaulColorList = getDefaulColorList;\n\n taiga.getMatches = getMatches;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/controllerMixins.coffee\n */\n\n(function() {\n var FiltersMixin, PageMixin, UsFiltersMixin, groupBy, joinStr, taiga, toString, trim;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n joinStr = this.taiga.joinStr;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n PageMixin = (function() {\n function PageMixin() {}\n\n PageMixin.prototype.fillUsersAndRoles = function(users, roles) {\n var activeUsers, computableRoles;\n activeUsers = _.filter(users, (function(_this) {\n return function(user) {\n return user.is_active;\n };\n })(this));\n this.scope.activeUsers = _.sortBy(activeUsers, \"full_name_display\");\n this.scope.activeUsersById = groupBy(this.scope.activeUsers, function(e) {\n return e.id;\n });\n this.scope.users = _.sortBy(users, \"full_name_display\");\n this.scope.usersById = groupBy(this.scope.users, function(e) {\n return e.id;\n });\n this.scope.roles = _.sortBy(roles, \"order\");\n computableRoles = _(this.scope.project.members).map(\"role\").uniq().value();\n return this.scope.computableRoles = _(roles).filter(\"computable\").filter(function(x) {\n return _.includes(computableRoles, x.id);\n }).value();\n };\n\n PageMixin.prototype.loadUsersAndRoles = function() {\n var promise;\n promise = this.q.all([this.rs.projects.usersList(this.scope.projectId), this.rs.projects.rolesList(this.scope.projectId)]);\n return promise.then((function(_this) {\n return function(results) {\n var roles, users;\n users = results[0], roles = results[1];\n _this.fillUsersAndRoles(users, roles);\n return results;\n };\n })(this));\n };\n\n return PageMixin;\n\n })();\n\n taiga.PageMixin = PageMixin;\n\n FiltersMixin = (function() {\n function FiltersMixin() {}\n\n FiltersMixin.prototype.selectFilter = function(name, value, load) {\n var existing, location, params;\n if (load == null) {\n load = false;\n }\n params = this.location.search();\n if (params[name] !== void 0 && name !== \"page\") {\n existing = _.map(taiga.toString(params[name]).split(\",\"), function(x) {\n return trim(x);\n });\n existing.push(taiga.toString(value));\n existing = _.compact(existing);\n value = joinStr(\",\", _.uniq(existing));\n }\n if (!this.location.isInCurrentRouteParams(name, value)) {\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n }\n };\n\n FiltersMixin.prototype.replaceFilter = function(name, value, load) {\n var location;\n if (load == null) {\n load = false;\n }\n if (!this.location.isInCurrentRouteParams(name, value)) {\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n }\n };\n\n FiltersMixin.prototype.replaceAllFilters = function(filters, load) {\n var location;\n if (load == null) {\n load = false;\n }\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(filters);\n };\n\n FiltersMixin.prototype.unselectFilter = function(name, value, load) {\n var location, newValues, params, parsedValues;\n if (load == null) {\n load = false;\n }\n params = this.location.search();\n if (params[name] === void 0) {\n return;\n }\n if (value === void 0 || value === null) {\n delete params[name];\n }\n parsedValues = _.map(taiga.toString(params[name]).split(\",\"), function(x) {\n return trim(x);\n });\n newValues = _.reject(parsedValues, function(x) {\n return x === taiga.toString(value);\n });\n newValues = _.compact(newValues);\n if (_.isEmpty(newValues)) {\n value = null;\n } else {\n value = joinStr(\",\", _.uniq(newValues));\n }\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n };\n\n FiltersMixin.prototype.applyStoredFilters = function(projectSlug, key) {\n var filters;\n if (_.isEmpty(this.location.search())) {\n filters = this.getFilters(projectSlug, key);\n if (Object.keys(filters).length) {\n this.location.search(filters);\n this.location.replace();\n return true;\n }\n }\n return false;\n };\n\n FiltersMixin.prototype.storeFilters = function(projectSlug, params, filtersHashSuffix) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = taiga.generateHash([projectSlug, ns]);\n return this.storage.set(hash, params);\n };\n\n FiltersMixin.prototype.getFilters = function(projectSlug, filtersHashSuffix) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = taiga.generateHash([projectSlug, ns]);\n return this.storage.get(hash) || {};\n };\n\n FiltersMixin.prototype.formatSelectedFilters = function(type, list, urlIds) {\n var invalidAppliedTags, invalidTags, selectedFilters, selectedIds, validAppliedTags;\n selectedIds = urlIds.split(',');\n selectedFilters = _.filter(list, function(it) {\n return selectedIds.indexOf(_.toString(it.id)) !== -1;\n });\n invalidTags = _.filter(selectedIds, function(it) {\n return !_.find(selectedFilters, function(sit) {\n return _.toString(sit.id) === it;\n });\n });\n invalidAppliedTags = _.map(invalidTags, function(it) {\n return {\n id: it,\n key: type + \":\" + it,\n dataType: type,\n name: it\n };\n });\n validAppliedTags = _.map(selectedFilters, function(it) {\n return {\n id: it.id,\n key: type + \":\" + it.id,\n dataType: type,\n name: it.name,\n color: it.color\n };\n });\n return invalidAppliedTags.concat(validAppliedTags);\n };\n\n return FiltersMixin;\n\n })();\n\n taiga.FiltersMixin = FiltersMixin;\n\n UsFiltersMixin = (function() {\n function UsFiltersMixin() {}\n\n UsFiltersMixin.prototype.changeQ = function(q) {\n this.replaceFilter(\"q\", q);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.removeFilter = function(filter) {\n this.unselectFilter(filter.dataType, filter.id);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.addFilter = function(newFilter) {\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.selectCustomFilter = function(customFilter) {\n this.replaceAllFilters(customFilter.filter);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.epic = urlfilters.epic;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName).then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.storeCustomFiltersName).then(_this.generateFilters);\n };\n })(this));\n };\n\n UsFiltersMixin.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName).then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.storeCustomFiltersName).then(_this.generateFilters);\n return _this.generateFilters();\n };\n })(this));\n };\n\n UsFiltersMixin.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, i, len, ref;\n ref = this.selectedFilters;\n for (i = 0, len = ref.length; i < len; i++) {\n filter = ref[i];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n UsFiltersMixin.prototype.generateFilters = function(milestone) {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), this.storeFiltersName);\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.epic = urlfilters.epic;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n if (milestone) {\n loadFilters.milestone = milestone;\n }\n return this.q.all([this.rs.userstories.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName)]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, epic, owner, role, selected, statuses, tags, tagsWithAtLeastOneElement;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n epic = _.map(data.epics, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n it.name = \"#\" + it.ref + \" \" + it.subject;\n } else {\n it.id = \"null\";\n it.name = \"Not in an epic\";\n }\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.epic) {\n selected = _this.formatSelectedFilters(\"epic\", epic, loadFilters.epic);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.EPIC\"),\n dataType: \"epic\",\n content: epic\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(this));\n };\n\n return UsFiltersMixin;\n\n })();\n\n taiga.UsFiltersMixin = UsFiltersMixin;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaAdmin\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/auth.coffee\n */\n\n(function() {\n var AuthService, CancelAccountDirective, ChangeEmailDirective, ChangePasswordFromRecoveryDirective, ForgotPasswordDirective, InvitationDirective, LoginDirective, LoginPage, PublicRegisterMessageDirective, RegisterDirective, debounce, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAuth\", [\"taigaResources\"]);\n\n LoginPage = (function() {\n LoginPage.$inject = ['tgCurrentUserService', '$location', '$tgNavUrls', '$routeParams', '$tgAuth'];\n\n function LoginPage(currentUserService, $location, $navUrls, $routeParams, $auth) {\n var url;\n if (currentUserService.isAuthenticated()) {\n if (!$routeParams['force_login']) {\n url = $navUrls.resolve(\"home\");\n if ($routeParams['next']) {\n url = decodeURIComponent($routeParams['next']);\n $location.search('next', null);\n }\n if ($routeParams['unauthorized']) {\n $auth.clear();\n $auth.removeToken();\n } else {\n $location.url(url);\n }\n }\n }\n }\n\n return LoginPage;\n\n })();\n\n module.controller('LoginPage', LoginPage);\n\n AuthService = (function(superClass) {\n extend(AuthService, superClass);\n\n AuthService.$inject = [\"$rootScope\", \"$tgStorage\", \"$tgModel\", \"$tgResources\", \"$tgHttp\", \"$tgUrls\", \"$tgConfig\", \"$translate\", \"tgCurrentUserService\", \"tgThemeService\", \"$tgAnalytics\", \"tgTermsAnnouncementService\"];\n\n function AuthService(rootscope, storage, model, rs, http, urls, config1, translate, currentUserService1, themeService, analytics, termsAnnouncementService) {\n var userModel;\n this.rootscope = rootscope;\n this.storage = storage;\n this.model = model;\n this.rs = rs;\n this.http = http;\n this.urls = urls;\n this.config = config1;\n this.translate = translate;\n this.currentUserService = currentUserService1;\n this.themeService = themeService;\n this.analytics = analytics;\n this.termsAnnouncementService = termsAnnouncementService;\n AuthService.__super__.constructor.call(this);\n userModel = this.getUser();\n this._currentTheme = this._getUserTheme();\n this.setUserdata(userModel);\n }\n\n AuthService.prototype.setUserdata = function(userModel) {\n if (userModel) {\n this.userData = Immutable.fromJS(userModel.getAttrs());\n this.currentUserService.setUser(this.userData);\n } else {\n this.userData = null;\n }\n return this.analytics.setUserId();\n };\n\n AuthService.prototype._getUserTheme = function() {\n var ref;\n return ((ref = this.rootscope.user) != null ? ref.theme : void 0) || this.config.get(\"defaultTheme\") || \"taiga\";\n };\n\n AuthService.prototype._setTheme = function() {\n var newTheme;\n newTheme = this._getUserTheme();\n if (this._currentTheme !== newTheme) {\n this._currentTheme = newTheme;\n return this.themeService.use(this._currentTheme);\n }\n };\n\n AuthService.prototype._setLocales = function() {\n var lang, ref;\n lang = ((ref = this.rootscope.user) != null ? ref.lang : void 0) || this.config.get(\"defaultLanguage\") || \"en\";\n this.translate.preferredLanguage(lang);\n return this.translate.use(lang);\n };\n\n AuthService.prototype.getUser = function() {\n var user, userData;\n if (this.rootscope.user) {\n return this.rootscope.user;\n }\n userData = this.storage.get(\"userInfo\");\n if (userData) {\n user = this.model.make_model(\"users\", userData);\n this.rootscope.user = user;\n this._setLocales();\n this._setTheme();\n return user;\n } else {\n this._setTheme();\n }\n return null;\n };\n\n AuthService.prototype.setUser = function(user) {\n this.rootscope.auth = user;\n this.storage.set(\"userInfo\", user.getAttrs());\n this.rootscope.user = user;\n this.setUserdata(user);\n this._setLocales();\n return this._setTheme();\n };\n\n AuthService.prototype.clear = function() {\n this.rootscope.auth = null;\n this.rootscope.user = null;\n return this.storage.remove(\"userInfo\");\n };\n\n AuthService.prototype.setToken = function(token) {\n return this.storage.set(\"token\", token);\n };\n\n AuthService.prototype.getToken = function() {\n return this.storage.get(\"token\");\n };\n\n AuthService.prototype.removeToken = function() {\n return this.storage.remove(\"token\");\n };\n\n AuthService.prototype.isAuthenticated = function() {\n if (this.getUser() !== null) {\n return true;\n }\n return false;\n };\n\n AuthService.prototype.refresh = function() {\n var url;\n url = this.urls.resolve(\"user-me\");\n return this.http.get(url).then((function(_this) {\n return function(data, status) {\n var user;\n user = data.data;\n user.token = _this.getUser().auth_token;\n user = _this.model.make_model(\"users\", user);\n _this.setUser(user);\n _this.rootscope.$broadcast(\"auth:refresh\", user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.login = function(data, type) {\n var url;\n url = this.urls.resolve(\"auth\");\n data = _.clone(data, false);\n data.type = type ? type : \"normal\";\n this.removeToken();\n return this.http.post(url, data).then((function(_this) {\n return function(data, status) {\n var user;\n user = _this.model.make_model(\"users\", data.data);\n _this.setToken(user.auth_token);\n _this.setUser(user);\n _this.rootscope.$broadcast(\"auth:login\", user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.logout = function() {\n this.removeToken();\n this.clear();\n this.currentUserService.removeUser();\n this._setTheme();\n this._setLocales();\n this.rootscope.$broadcast(\"auth:logout\");\n return this.analytics.setUserId();\n };\n\n AuthService.prototype.register = function(data, type, existing) {\n var url;\n url = this.urls.resolve(\"auth-register\");\n data = _.clone(data, false);\n data.type = type ? type : \"public\";\n if (type === \"private\") {\n data.existing = existing ? existing : false;\n }\n this.removeToken();\n return this.http.post(url, data).then((function(_this) {\n return function(response) {\n var user;\n user = _this.model.make_model(\"users\", response.data);\n _this.setToken(user.auth_token);\n _this.setUser(user);\n _this.rootscope.$broadcast(\"auth:register\", user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.getInvitation = function(token) {\n return this.rs.invitations.get(token);\n };\n\n AuthService.prototype.acceptInvitiationWithNewUser = function(data) {\n return this.register(data, \"private\", false);\n };\n\n AuthService.prototype.forgotPassword = function(data) {\n var url;\n url = this.urls.resolve(\"users-password-recovery\");\n data = _.clone(data, false);\n this.removeToken();\n return this.http.post(url, data);\n };\n\n AuthService.prototype.changePasswordFromRecovery = function(data) {\n var url;\n url = this.urls.resolve(\"users-change-password-from-recovery\");\n data = _.clone(data, false);\n this.removeToken();\n return this.http.post(url, data);\n };\n\n AuthService.prototype.changeEmail = function(data) {\n var url;\n url = this.urls.resolve(\"users-change-email\");\n data = _.clone(data, false);\n return this.http.post(url, data);\n };\n\n AuthService.prototype.cancelAccount = function(data) {\n var url;\n url = this.urls.resolve(\"users-cancel-account\");\n data = _.clone(data, false);\n return this.http.post(url, data);\n };\n\n AuthService.prototype.exportProfile = function() {\n var url;\n url = this.urls.resolve(\"users-export\");\n return this.http.post(url);\n };\n\n AuthService.prototype.showTerms = function(data) {\n var user;\n user = this.getUser();\n if (!user || user.read_new_terms) {\n return;\n }\n return this.termsAnnouncementService.show();\n };\n\n return AuthService;\n\n })(taiga.Service);\n\n module.service(\"$tgAuth\", AuthService);\n\n PublicRegisterMessageDirective = function($config, $navUrls, $routeParams, templates) {\n var template, templateFn;\n template = templates.get(\"auth/login-text.html\", true);\n templateFn = function() {\n var nextUrl, publicRegisterEnabled, url;\n publicRegisterEnabled = $config.get(\"publicRegisterEnabled\");\n if (!publicRegisterEnabled) {\n return \"\";\n }\n url = $navUrls.resolve(\"register\");\n if ($routeParams['force_next']) {\n nextUrl = encodeURIComponent($routeParams['force_next']);\n url += \"?next=\" + nextUrl;\n }\n return template({\n url: url\n });\n };\n return {\n restrict: \"AE\",\n scope: {},\n template: templateFn\n };\n };\n\n module.directive(\"tgPublicRegisterMessage\", [\"$tgConfig\", \"$tgNavUrls\", \"$routeParams\", \"$tgTemplate\", PublicRegisterMessageDirective]);\n\n LoginDirective = function($auth, $confirm, $location, $config, $routeParams, $navUrls, $events, $translate, $window, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onError, onSuccess, submit;\n form = new checksley.Form($el.find(\"form.login-form\"));\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"login\")) {\n $scope.nextUrl = decodeURIComponent($routeParams['next']);\n } else {\n $scope.nextUrl = $navUrls.resolve(\"home\");\n }\n if ($routeParams['force_next']) {\n $scope.nextUrl = decodeURIComponent($routeParams['force_next']);\n }\n onSuccess = function(response) {\n $events.setupConnection();\n $analytics.trackEvent(\"auth\", \"login\", \"user login\", 1);\n $auth.showTerms();\n if ($scope.nextUrl.indexOf('http') === 0) {\n return $window.location.href = $scope.nextUrl;\n } else {\n return $location.url($scope.nextUrl);\n }\n };\n onError = function(response) {\n return $confirm.notify(\"light-error\", $translate.instant(\"LOGIN_FORM.ERROR_AUTH_INCORRECT\"));\n };\n $scope.onKeyUp = function(event) {\n var target, value;\n target = angular.element(event.currentTarget);\n value = target.val();\n $scope.iscapsLockActivated = false;\n if (value !== value.toLowerCase()) {\n return $scope.iscapsLockActivated = true;\n }\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var data, loginFormType, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n data = {\n \"username\": $el.find(\"form.login-form input[name=username]\").val(),\n \"password\": $el.find(\"form.login-form input[name=password]\").val()\n };\n loginFormType = $config.get(\"loginFormType\", \"normal\");\n promise = $auth.login(data, loginFormType);\n return promise.then(onSuccess, onError);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n window.prerenderReady = true;\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLogin\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgConfig\", \"$routeParams\", \"$tgNavUrls\", \"$tgEvents\", \"$translate\", \"$window\", \"$tgAnalytics\", LoginDirective]);\n\n RegisterDirective = function($auth, $confirm, $location, $navUrls, $config, $routeParams, $analytics, $translate, $window) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n if (!$config.get(\"publicRegisterEnabled\")) {\n $location.path($navUrls.resolve(\"not-found\"));\n $location.replace();\n }\n $scope.data = {};\n form = $el.find(\"form\").checksley({\n onlyOneErrorElement: true\n });\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"login\")) {\n $scope.nextUrl = decodeURIComponent($routeParams['next']);\n } else {\n $scope.nextUrl = $navUrls.resolve(\"home\");\n }\n onSuccessSubmit = function(response) {\n $analytics.trackEvent(\"auth\", \"register\", \"user registration\", 1);\n if ($scope.nextUrl.indexOf('http') === 0) {\n return $window.location.href = $scope.nextUrl;\n } else {\n return $location.url($scope.nextUrl);\n }\n };\n onErrorSubmit = function(response) {\n var text;\n if (response.data._error_message) {\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n $confirm.notify(\"light-error\", text);\n }\n return form.setErrors(response.data);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.register($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return window.prerenderReady = true;\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRegister\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfig\", \"$routeParams\", \"$tgAnalytics\", \"$translate\", \"$window\", RegisterDirective]);\n\n ForgotPasswordDirective = function($auth, $confirm, $location, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var message, title;\n $location.path($navUrls.resolve(\"login\"));\n title = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS_TITLE\");\n message = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS_TEXT\");\n return $confirm.success(title, message);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.ERROR\");\n return $confirm.notify(\"light-error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.forgotPassword($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return window.prerenderReady = true;\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgForgotPassword\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$translate\", ForgotPasswordDirective]);\n\n ChangePasswordFromRecoveryDirective = function($auth, $confirm, $location, $params, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit, text;\n $scope.data = {};\n if ($params.token != null) {\n $scope.tokenInParams = true;\n $scope.data.token = $params.token;\n } else {\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\");\n $confirm.notify(\"light-error\", text);\n }\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\");\n return $confirm.notify(\"light-error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.changePasswordFromRecovery($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgChangePasswordFromRecovery\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangePasswordFromRecoveryDirective]);\n\n InvitationDirective = function($auth, $confirm, $location, $config, $params, $navUrls, $analytics, $translate, config) {\n var link;\n link = function($scope, $el, $attrs) {\n var loginForm, onErrorSubmitLogin, onErrorSubmitRegister, onSuccessSubmitLogin, onSuccessSubmitRegister, promise, registerForm, submitLogin, submitRegister, token;\n token = $params.token;\n promise = $auth.getInvitation(token);\n promise.then(function(invitation) {\n $scope.invitation = invitation;\n return $scope.publicRegisterEnabled = config.get(\"publicRegisterEnabled\");\n });\n promise.then(null, function(response) {\n var text;\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"INVITATION_LOGIN_FORM.NOT_FOUND\");\n return $confirm.notify(\"light-error\", text);\n });\n $scope.dataLogin = {\n token: token\n };\n loginForm = $el.find(\"form.login-form\").checksley({\n onlyOneErrorElement: true\n });\n onSuccessSubmitLogin = function(response) {\n var text;\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with existing user\", 1);\n $location.path($navUrls.resolve(\"project\", {\n project: $scope.invitation.project_slug\n }));\n text = $translate.instant(\"INVITATION_LOGIN_FORM.SUCCESS\", {\n \"project_name\": $scope.invitation.project_name\n });\n return $confirm.notify(\"success\", text);\n };\n onErrorSubmitLogin = function(response) {\n return $confirm.notify(\"light-error\", response.data._error_message);\n };\n submitLogin = debounce(2000, (function(_this) {\n return function(event) {\n var data, loginFormType;\n event.preventDefault();\n if (!loginForm.validate()) {\n return;\n }\n loginFormType = $config.get(\"loginFormType\", \"normal\");\n data = $scope.dataLogin;\n promise = $auth.login({\n username: data.username,\n password: data.password,\n invitation_token: data.token\n }, loginFormType);\n return promise.then(onSuccessSubmitLogin, onErrorSubmitLogin);\n };\n })(this));\n $el.on(\"submit\", \"form.login-form\", submitLogin);\n $el.on(\"click\", \".button-login\", submitLogin);\n $scope.dataRegister = {\n token: token\n };\n registerForm = $el.find(\"form.register-form\").checksley({\n onlyOneErrorElement: true\n });\n onSuccessSubmitRegister = function(response) {\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with new user\", 1);\n $location.path($navUrls.resolve(\"project\", {\n project: $scope.invitation.project_slug\n }));\n return $confirm.notify(\"success\", \"You've successfully joined this project\", \"Welcome to \" + (_.escape($scope.invitation.project_name)));\n };\n onErrorSubmitRegister = function(response) {\n var text;\n if (response.data._error_message) {\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n $confirm.notify(\"light-error\", text);\n }\n return registerForm.setErrors(response.data);\n };\n submitRegister = debounce(2000, (function(_this) {\n return function(event) {\n event.preventDefault();\n if (!registerForm.validate()) {\n return;\n }\n promise = $auth.acceptInvitiationWithNewUser($scope.dataRegister);\n return promise.then(onSuccessSubmitRegister, onErrorSubmitRegister);\n };\n })(this));\n $el.on(\"submit\", \"form.register-form\", submitRegister);\n $el.on(\"click\", \".button-register\", submitRegister);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgInvitation\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgConfig\", \"$routeParams\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"$tgConfig\", InvitationDirective]);\n\n ChangeEmailDirective = function($repo, $model, $auth, $confirm, $location, $params, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n $scope.data.email_token = $params.email_token;\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n if ($auth.isAuthenticated()) {\n $repo.queryOne(\"users\", $auth.getUser().id).then((function(_this) {\n return function(data) {\n $auth.setUser(data);\n $location.path($navUrls.resolve(\"home\"));\n return $location.replace();\n };\n })(this));\n } else {\n $location.path($navUrls.resolve(\"login\"));\n $location.replace();\n }\n text = $translate.instant(\"CHANGE_EMAIL_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n return $confirm.notify(\"light-error\", text);\n };\n submit = function() {\n var promise;\n if (!form.validate()) {\n return;\n }\n promise = $auth.changeEmail($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n $el.on(\"submit\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \"a.button-change-email\", function(event) {\n event.preventDefault();\n return submit();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgChangeEmail\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangeEmailDirective]);\n\n CancelAccountDirective = function($repo, $model, $auth, $confirm, $location, $params, $navUrls) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n $scope.data.cancel_token = $params.cancel_token;\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n $auth.logout();\n $location.path($navUrls.resolve(\"home\"));\n text = $translate.instant(\"CANCEL_ACCOUNT.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n return $confirm.notify(\"error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.cancelAccount($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCancelAccount\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", CancelAccountDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaBacklog\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base.coffee\n */\n\n(function() {\n var TaigaMainDirective, bindOnce, groupBy, init, module, taiga, urls;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBase\", []);\n\n TaigaMainDirective = function($rootscope, $window) {\n var link;\n link = function($scope, $el, $attrs) {\n return $window.onresize = function() {\n return $rootscope.$broadcast(\"resize\");\n };\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMain\", [\"$rootScope\", \"$window\", TaigaMainDirective]);\n\n urls = {\n \"home\": \"/\",\n \"projects\": \"/projects\",\n \"error\": \"/error\",\n \"not-found\": \"/not-found\",\n \"permission-denied\": \"/permission-denied\",\n \"discover\": \"/discover\",\n \"discover-search\": \"/discover/search\",\n \"login\": \"/login\",\n \"forgot-password\": \"/forgot-password\",\n \"change-password\": \"/change-password/:token\",\n \"change-email\": \"/change-email/:token\",\n \"cancel-account\": \"/cancel-account/:token\",\n \"register\": \"/register\",\n \"invitation\": \"/invitation/:token\",\n \"create-project\": \"/project/new\",\n \"create-project-scrum\": \"/project/new/scrum\",\n \"create-project-kanban\": \"/project/new/kanban\",\n \"create-project-duplicate\": \"/project/new/duplicate\",\n \"create-project-import\": \"/project/new/import\",\n \"create-project-import-platform\": \"/project/new/import/:platform\",\n \"profile\": \"/profile\",\n \"user-profile\": \"/profile/:username\",\n \"blocked-project\": \"/blocked-project/:project\",\n \"project\": \"/project/:project\",\n \"project-detail-ref\": \"/project/:project/t/:ref\",\n \"project-backlog\": \"/project/:project/backlog\",\n \"project-taskboard\": \"/project/:project/taskboard/:sprint\",\n \"project-kanban\": \"/project/:project/kanban\",\n \"project-issues\": \"/project/:project/issues\",\n \"project-epics\": \"/project/:project/epics\",\n \"project-search\": \"/project/:project/search\",\n \"project-epics-detail\": \"/project/:project/epic/:ref\",\n \"project-userstories-detail\": \"/project/:project/us/:ref\",\n \"project-tasks-detail\": \"/project/:project/task/:ref\",\n \"project-issues-detail\": \"/project/:project/issue/:ref\",\n \"project-wiki\": \"/project/:project/wiki\",\n \"project-wiki-list\": \"/project/:project/wiki-list\",\n \"project-wiki-page\": \"/project/:project/wiki/:slug\",\n \"project-team\": \"/project/:project/team\",\n \"project-admin-home\": \"/project/:project/admin/project-profile/details\",\n \"project-admin-project-profile-details\": \"/project/:project/admin/project-profile/details\",\n \"project-admin-project-profile-default-values\": \"/project/:project/admin/project-profile/default-values\",\n \"project-admin-project-profile-modules\": \"/project/:project/admin/project-profile/modules\",\n \"project-admin-project-profile-export\": \"/project/:project/admin/project-profile/export\",\n \"project-admin-project-profile-reports\": \"/project/:project/admin/project-profile/reports\",\n \"project-admin-project-values-status\": \"/project/:project/admin/project-values/status\",\n \"project-admin-project-values-points\": \"/project/:project/admin/project-values/points\",\n \"project-admin-project-values-priorities\": \"/project/:project/admin/project-values/priorities\",\n \"project-admin-project-values-severities\": \"/project/:project/admin/project-values/severities\",\n \"project-admin-project-values-types\": \"/project/:project/admin/project-values/types\",\n \"project-admin-project-values-custom-fields\": \"/project/:project/admin/project-values/custom-fields\",\n \"project-admin-project-values-tags\": \"/project/:project/admin/project-values/tags\",\n \"project-admin-memberships\": \"/project/:project/admin/memberships\",\n \"project-admin-roles\": \"/project/:project/admin/roles\",\n \"project-admin-third-parties-webhooks\": \"/project/:project/admin/third-parties/webhooks\",\n \"project-admin-third-parties-github\": \"/project/:project/admin/third-parties/github\",\n \"project-admin-third-parties-gitlab\": \"/project/:project/admin/third-parties/gitlab\",\n \"project-admin-third-parties-bitbucket\": \"/project/:project/admin/third-parties/bitbucket\",\n \"project-admin-third-parties-gogs\": \"/project/:project/admin/third-parties/gogs\",\n \"project-admin-contrib\": \"/project/:project/admin/contrib/:plugin\",\n \"user-settings-user-profile\": \"/user-settings/user-profile\",\n \"user-settings-user-change-password\": \"/user-settings/user-change-password\",\n \"user-settings-user-avatar\": \"/user-settings/user-avatar\",\n \"user-settings-mail-notifications\": \"/user-settings/mail-notifications\",\n \"user-settings-live-notifications\": \"/user-settings/live-notifications\",\n \"user-settings-contrib\": \"/user-settings/contrib/:plugin\"\n };\n\n init = function($log, $navurls) {\n $log.debug(\"Initialize navigation urls\");\n return $navurls.update(urls);\n };\n\n module.run([\"$log\", \"$tgNavUrls\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common.coffee\n */\n\n(function() {\n var AnimationFrame, Autofocus, Capslock, CheckPermissionDirective, ClassPermissionDirective, CtrlClickDisable, DataPickerConfig, LightboxClose, ProjectUrl, Qqueue, QueueModelTransformation, SelectedText, Svg, Template, ToggleCommentDirective, module, taiga,\n slice = [].slice,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\", []);\n\n DataPickerConfig = function($translate) {\n return {\n get: function() {\n return {\n i18n: {\n previousMonth: $translate.instant(\"COMMON.PICKERDATE.PREV_MONTH\"),\n nextMonth: $translate.instant(\"COMMON.PICKERDATE.NEXT_MONTH\"),\n months: [$translate.instant(\"COMMON.PICKERDATE.MONTHS.JAN\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.FEB\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAR\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.APR\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAY\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUN\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUL\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.AUG\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.SEP\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.OCT\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.NOV\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.DEC\")],\n weekdays: [$translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SUN\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.MON\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.TUE\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.WED\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.THU\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.FRI\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SAT\")],\n weekdaysShort: [$translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT\")]\n },\n isRTL: $translate.instant(\"COMMON.PICKERDATE.IS_RTL\") === \"true\",\n firstDay: parseInt($translate.instant(\"COMMON.PICKERDATE.FIRST_DAY_OF_WEEK\"), 10),\n format: $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n };\n }\n };\n };\n\n module.factory(\"tgDatePickerConfigService\", [\"$translate\", DataPickerConfig]);\n\n SelectedText = function($window, $document) {\n var get;\n get = function() {\n if ($window.getSelection) {\n return $window.getSelection().toString();\n } else if ($document.selection) {\n return $document.selection.createRange().text;\n }\n return \"\";\n };\n return {\n get: get\n };\n };\n\n module.factory(\"$selectedText\", [\"$window\", \"$document\", SelectedText]);\n\n CheckPermissionDirective = function(projectService) {\n var link, render;\n render = function($el, project, permission) {\n if (project && permission) {\n if (project.get('my_permissions').indexOf(permission) > -1) {\n return $el.removeClass('hidden');\n }\n }\n };\n link = function($scope, $el, $attrs) {\n var permission, unObserve, unwatch;\n $el.addClass('hidden');\n permission = $attrs.tgCheckPermission;\n unwatch = $scope.$watch(function() {\n return projectService.project;\n }, function() {\n if (!projectService.project) {\n return;\n }\n render($el, projectService.project, permission);\n return unwatch();\n });\n unObserve = $attrs.$observe(\"tgCheckPermission\", function(permission) {\n if (!permission) {\n return;\n }\n render($el, projectService.project, permission);\n return unObserve();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CheckPermissionDirective.$inject = [\"tgProjectService\"];\n\n module.directive(\"tgCheckPermission\", CheckPermissionDirective);\n\n ClassPermissionDirective = function() {\n var link, name;\n name = \"tgClassPermission\";\n link = function($scope, $el, $attrs) {\n var checkPermissions, tgClassPermissionWatchAction, unbindWatcher;\n checkPermissions = function(project, className, permission) {\n var negation;\n negation = permission[0] === \"!\";\n if (negation) {\n permission = permission.slice(1);\n }\n if (negation && project.my_permissions.indexOf(permission) === -1) {\n return $el.addClass(className);\n } else if (!negation && project.my_permissions.indexOf(permission) !== -1) {\n return $el.addClass(className);\n } else {\n return $el.removeClass(className);\n }\n };\n tgClassPermissionWatchAction = function(project) {\n var className, classes, permission, results;\n if (project) {\n unbindWatcher();\n classes = $scope.$eval($attrs[name]);\n results = [];\n for (className in classes) {\n permission = classes[className];\n results.push(checkPermissions(project, className, permission));\n }\n return results;\n }\n };\n return unbindWatcher = $scope.$watch(\"project\", tgClassPermissionWatchAction);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgClassPermission\", ClassPermissionDirective);\n\n AnimationFrame = function() {\n var add, animationFrame, performAnimation, tail;\n animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n performAnimation = (function(_this) {\n return function(time) {\n var fn;\n fn = tail.shift();\n fn();\n if (tail.length) {\n return animationFrame(performAnimation);\n }\n };\n })(this);\n tail = [];\n add = function() {\n var fn, i, len, results;\n results = [];\n for (i = 0, len = arguments.length; i < len; i++) {\n fn = arguments[i];\n tail.push(fn);\n if (tail.length === 1) {\n results.push(animationFrame(performAnimation));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n return {\n add: add\n };\n };\n\n module.factory(\"animationFrame\", AnimationFrame);\n\n ToggleCommentDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.find(\"textarea\").on(\"focus\", function() {\n return $el.addClass(\"active\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgToggleComment\", ToggleCommentDirective);\n\n ProjectUrl = function($navurls) {\n var get;\n get = function(project) {\n var ctx;\n if (project.toJS) {\n project = project.toJS();\n }\n ctx = {\n project: project.slug\n };\n if (project.is_backlog_activated && project.my_permissions.indexOf(\"view_us\") > -1) {\n return $navurls.resolve(\"project-backlog\", ctx);\n }\n if (project.is_kanban_activated && project.my_permissions.indexOf(\"view_us\") > -1) {\n return $navurls.resolve(\"project-kanban\", ctx);\n }\n if (project.is_wiki_activated && project.my_permissions.indexOf(\"view_wiki_pages\") > -1) {\n return $navurls.resolve(\"project-wiki\", ctx);\n }\n if (project.is_issues_activated && project.my_permissions.indexOf(\"view_issues\") > -1) {\n return $navurls.resolve(\"project-issues\", ctx);\n }\n return $navurls.resolve(\"project\", ctx);\n };\n return {\n get: get\n };\n };\n\n module.factory(\"$projectUrl\", [\"$tgNavUrls\", ProjectUrl]);\n\n Qqueue = function($q) {\n var deferred, lastPromise, qqueue;\n deferred = $q.defer();\n deferred.resolve();\n lastPromise = deferred.promise;\n qqueue = {\n bindAdd: (function(_this) {\n return function(fn) {\n return function() {\n var args;\n args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n return lastPromise = lastPromise.then(function() {\n return fn.apply(_this, args);\n });\n };\n };\n })(this),\n add: (function(_this) {\n return function(fn) {\n if (!lastPromise) {\n lastPromise = fn();\n } else {\n lastPromise = lastPromise.then(fn);\n }\n return qqueue;\n };\n })(this)\n };\n return qqueue;\n };\n\n module.factory(\"$tgQqueue\", [\"$q\", Qqueue]);\n\n QueueModelTransformation = (function(superClass) {\n extend(QueueModelTransformation, superClass);\n\n QueueModelTransformation.$inject = [\"$tgQqueue\", \"$tgRepo\", \"$q\", \"$tgModel\"];\n\n function QueueModelTransformation(qqueue1, repo, q, model1) {\n this.qqueue = qqueue1;\n this.repo = repo;\n this.q = q;\n this.model = model1;\n }\n\n QueueModelTransformation.prototype.setObject = function(scope1, prop) {\n this.scope = scope1;\n this.prop = prop;\n };\n\n QueueModelTransformation.prototype.clone = function() {\n var attrs, model;\n attrs = _.cloneDeep(this.scope[this.prop]._attrs);\n model = this.model.make_model(this.scope[this.prop]._name, attrs);\n return model;\n };\n\n QueueModelTransformation.prototype.getObj = function() {\n return this.scope[this.prop];\n };\n\n QueueModelTransformation.prototype.save = function(transformation) {\n var defered;\n defered = this.q.defer();\n this.qqueue.add((function(_this) {\n return function() {\n var clone, comment, modified, obj, success;\n obj = _this.getObj();\n comment = obj.comment;\n obj.comment = '';\n clone = _this.clone();\n modified = _.omit(obj._modifiedAttrs, ['version']);\n clone = _.assign(clone, modified);\n transformation(clone);\n if (comment.length) {\n clone.comment = comment;\n }\n success = function() {\n _this.scope[_this.prop] = clone;\n return defered.resolve.apply(null, arguments);\n };\n return _this.repo.save(clone).then(success, defered.reject);\n };\n })(this));\n return defered.promise;\n };\n\n return QueueModelTransformation;\n\n })(taiga.Service);\n\n module.service(\"$tgQueueModelTransformation\", QueueModelTransformation);\n\n Template = function($templateCache) {\n return {\n get: (function(_this) {\n return function(name, lodash) {\n var tmp;\n if (lodash == null) {\n lodash = false;\n }\n tmp = $templateCache.get(name);\n if (lodash) {\n tmp = _.template(tmp);\n }\n return tmp;\n };\n })(this)\n };\n };\n\n module.factory(\"$tgTemplate\", [\"$templateCache\", Template]);\n\n Capslock = function() {\n var template;\n template = \"\";\n return {\n template: template\n };\n };\n\n module.directive(\"tgCapslock\", [Capslock]);\n\n LightboxClose = function() {\n var link, template;\n template = \"
    \\n \\n\";\n link = function(scope, elm, attrs) {};\n return {\n scope: {\n onClose: '&'\n },\n link: link,\n template: template\n };\n };\n\n module.directive(\"tgLightboxClose\", [LightboxClose]);\n\n Svg = function() {\n var template;\n template = \"\\n \\n {{svgTitle}}\\n {{svgTitleTranslate | translate: svgTitleTranslateValues}}\\n \\n\";\n return {\n scope: {\n svgIcon: \"@\",\n svgTitle: \"@\",\n svgTitleTranslate: \"@\",\n svgTitleTranslateValues: \"=\"\n },\n template: template\n };\n };\n\n module.directive(\"tgSvg\", [Svg]);\n\n Autofocus = function($timeout, $parse, animationFrame) {\n return {\n restrict: 'A',\n link: function($scope, $element, attrs) {\n var model;\n if (attrs.ngShow) {\n model = $parse(attrs.ngShow);\n return $scope.$watch(model, function(value) {\n if (value === true) {\n return $timeout(function() {\n return $element[0].focus();\n });\n }\n });\n } else {\n return $timeout(function() {\n return $element[0].focus();\n });\n }\n }\n };\n };\n\n module.directive('tgAutofocus', ['$timeout', '$parse', \"animationFrame\", Autofocus]);\n\n module.directive('tgPreloadImage', function() {\n var preload, spinner, template;\n spinner = \"loading...\";\n template = \"
    \\n \\n
    \";\n preload = function(src, onLoad) {\n var image;\n image = new Image();\n image.onload = onLoad;\n image.src = src;\n return image;\n };\n return {\n template: template,\n transclude: true,\n replace: true,\n link: function(scope, el, attrs) {\n var image, onLoad, timeout;\n image = el.find('img:last');\n timeout = null;\n onLoad = function() {\n el.find('.loading-spinner').remove();\n image.show();\n if (timeout) {\n clearTimeout(timeout);\n return timeout = null;\n }\n };\n return attrs.$observe('preloadSrc', function(src) {\n if (timeout) {\n clearTimeout(timeout);\n }\n el.find('.loading-spinner').remove();\n timeout = setTimeout(function() {\n return el.prepend(spinner);\n }, 200);\n image.hide();\n return preload(src, onLoad);\n });\n }\n };\n });\n\n CtrlClickDisable = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", function($event) {\n if ($event.ctrlKey || $event.metaKey) {\n return $event.preventDefault();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCtrlClickDisable\", CtrlClickDisable);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/detail.coffee\n */\n\n(function() {\n var DetailController, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaCommon\");\n\n DetailController = (function() {\n DetailController.$inject = ['$routeParams', '$tgRepo', \"tgProjectService\", \"$tgNavUrls\", \"$location\"];\n\n function DetailController(params, repo, projectService, navurls, location) {\n this.params = params;\n this.repo = repo;\n this.projectService = projectService;\n this.navurls = navurls;\n this.location = location;\n this.repo.resolve({\n pslug: this.params.pslug,\n ref: this.params.ref\n }).then((function(_this) {\n return function(result) {\n var url;\n if (result.issue) {\n url = _this.navurls.resolve('project-issues-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.task) {\n url = _this.navurls.resolve('project-tasks-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.us) {\n url = _this.navurls.resolve('project-userstories-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.epic) {\n url = _this.navurls.resolve('project-epics-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.wikipage) {\n url = _this.navurls.resolve('project-wiki-page', {\n project: _this.projectService.project.get('slug'),\n slug: _this.params.ref\n });\n }\n return _this.location.path(url);\n };\n })(this));\n }\n\n return DetailController;\n\n })();\n\n module.controller(\"DetailController\", DetailController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/epics.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaEpics\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/events.coffee\n */\n\n(function() {\n var EventsProvider, EventsService, bindMethods, module, startswith, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n startswith = this.taiga.startswith;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaEvents\", []);\n\n EventsService = (function() {\n function EventsService(win, log, config, auth, liveAnnouncementService1, rootScope) {\n this.win = win;\n this.log = log;\n this.config = config;\n this.auth = auth;\n this.liveAnnouncementService = liveAnnouncementService1;\n this.rootScope = rootScope;\n this.processMessage = bind(this.processMessage, this);\n bindMethods(this);\n }\n\n EventsService.prototype.initialize = function(sessionId) {\n this.sessionId = sessionId;\n this.subscriptions = {};\n this.connected = false;\n this.error = false;\n this.pendingMessages = [];\n this.missedHeartbeats = 0;\n this.heartbeatInterval = null;\n if (this.win.WebSocket === void 0) {\n return this.log.info(\"WebSockets not supported on your browser\");\n }\n };\n\n EventsService.prototype.setupConnection = function() {\n var loc, path, scheme, url;\n this.stopExistingConnection();\n url = this.config.get(\"eventsUrl\");\n if (!url) {\n return;\n }\n if (!startswith(url, \"ws:\") && !startswith(url, \"wss:\")) {\n loc = this.win.location;\n scheme = loc.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n path = _.trimStart(url, \"/\");\n url = scheme + \"//\" + loc.host + \"/\" + path;\n }\n this.error = false;\n this.ws = new this.win.WebSocket(url);\n this.ws.addEventListener(\"open\", this.onOpen);\n this.ws.addEventListener(\"message\", this.onMessage);\n this.ws.addEventListener(\"error\", this.onError);\n return this.ws.addEventListener(\"close\", this.onClose);\n };\n\n EventsService.prototype.stopExistingConnection = function() {\n if (this.ws === void 0) {\n return;\n }\n this.ws.removeEventListener(\"open\", this.onOpen);\n this.ws.removeEventListener(\"close\", this.onClose);\n this.ws.removeEventListener(\"error\", this.onError);\n this.ws.removeEventListener(\"message\", this.onMessage);\n this.stopHeartBeatMessages();\n this.ws.close();\n return delete this.ws;\n };\n\n EventsService.prototype.notifications = function() {\n return this.subscribe(null, 'notifications', (function(_this) {\n return function(data) {\n _this.liveAnnouncementService.show(data.title, data.desc);\n return _this.rootScope.$digest();\n };\n })(this));\n };\n\n EventsService.prototype.liveNotifications = function() {\n var subscribe, userId;\n if (this.auth.userData == null) {\n return;\n }\n userId = this.auth.userData.get('id');\n subscribe = (function(_this) {\n return function() {\n return _this.subscribe(null, \"live_notifications.\" + userId, function(data) {\n var notification;\n notification = new Notification(data.title, {\n icon: \"/\" + window._version + \"/images/favicon.png\",\n body: data.body,\n tag: data.id\n });\n notification.onshow = function() {\n if (data.timeout && data.timeout > 0) {\n return setTimeout(function() {\n return notification.close();\n }, data.timeout);\n }\n };\n if (data.url) {\n return notification.onclick = function() {\n return window.open(data.url);\n };\n }\n });\n };\n })(this);\n if (!Notification) {\n return console.log(\"This browser does not support desktop notification\");\n } else if (Notification.permission === \"granted\") {\n return subscribe();\n } else if (Notification.permission !== 'denied') {\n return Notification.requestPermission((function(_this) {\n return function(permission) {\n if (permission === \"granted\") {\n return subscribe();\n }\n };\n })(this));\n }\n };\n\n EventsService.prototype.startHeartBeatMessages = function() {\n var heartbeatIntervalTime, maxMissedHeartbeats, reconnectTryInterval;\n if (this.heartbeatInterval) {\n return;\n }\n maxMissedHeartbeats = this.config.get(\"eventsMaxMissedHeartbeats\", 5);\n heartbeatIntervalTime = this.config.get(\"eventsHeartbeatIntervalTime\", 60000);\n reconnectTryInterval = this.config.get(\"eventsReconnectTryInterval\", 10000);\n this.missedHeartbeats = 0;\n this.heartbeatInterval = setInterval((function(_this) {\n return function() {\n var e;\n try {\n if (_this.missedHeartbeats >= maxMissedHeartbeats) {\n throw new Error(\"Too many missed heartbeats PINGs.\");\n }\n _this.missedHeartbeats++;\n _this.sendMessage({\n cmd: \"ping\"\n });\n return _this.log.debug(\"HeartBeat send PING\");\n } catch (error1) {\n e = error1;\n _this.log.error(\"HeartBeat error: \" + e.message);\n return _this.setupConnection();\n }\n };\n })(this), heartbeatIntervalTime);\n return this.log.debug(\"HeartBeat enabled\");\n };\n\n EventsService.prototype.stopHeartBeatMessages = function() {\n if (!this.heartbeatInterval) {\n return;\n }\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n return this.log.debug(\"HeartBeat disabled\");\n };\n\n EventsService.prototype.processHeartBeatPongMessage = function(data) {\n this.missedHeartbeats = 0;\n return this.log.debug(\"HeartBeat recived PONG\");\n };\n\n EventsService.prototype.serialize = function(message) {\n if (_.isObject(message)) {\n return JSON.stringify(message);\n }\n return message;\n };\n\n EventsService.prototype.sendMessage = function(message) {\n var i, len, messages, msg, results;\n this.pendingMessages.push(message);\n if (!this.connected) {\n return;\n }\n messages = _.map(this.pendingMessages, this.serialize);\n this.pendingMessages = [];\n results = [];\n for (i = 0, len = messages.length; i < len; i++) {\n msg = messages[i];\n results.push(this.ws.send(msg));\n }\n return results;\n };\n\n EventsService.prototype.processMessage = function(data) {\n var routingKey, subscription;\n routingKey = data.routing_key;\n if (this.subscriptions[routingKey] == null) {\n return;\n }\n subscription = this.subscriptions[routingKey];\n if (subscription.scope) {\n return subscription.scope.$apply(function() {\n return subscription.callback(data.data);\n });\n } else {\n return subscription.callback(data.data);\n }\n };\n\n EventsService.prototype.subscribe = function(scope, routingKey, callback) {\n var message, subscription;\n if (this.error) {\n return;\n }\n this.log.debug(\"Subscribe to: \" + routingKey);\n subscription = {\n scope: scope,\n routingKey: routingKey,\n callback: _.debounce(callback, 500, {\n \"leading\": true,\n \"trailing\": false\n })\n };\n message = {\n \"cmd\": \"subscribe\",\n \"routing_key\": routingKey\n };\n this.subscriptions[routingKey] = subscription;\n this.sendMessage(message);\n if (scope) {\n return scope.$on(\"$destroy\", (function(_this) {\n return function() {\n return _this.unsubscribe(routingKey);\n };\n })(this));\n }\n };\n\n EventsService.prototype.unsubscribe = function(routingKey) {\n var message;\n if (this.error) {\n return;\n }\n this.log.debug(\"Unsubscribe from: \" + routingKey);\n message = {\n \"cmd\": \"unsubscribe\",\n \"routing_key\": routingKey\n };\n return this.sendMessage(message);\n };\n\n EventsService.prototype.onOpen = function() {\n var message, token;\n this.connected = true;\n this.log.debug(\"WebSocket connection opened\");\n token = this.auth.getToken();\n message = {\n cmd: \"auth\",\n data: {\n token: token,\n sessionId: this.sessionId\n }\n };\n this.sendMessage(message);\n this.startHeartBeatMessages();\n this.notifications();\n return this.liveNotifications();\n };\n\n EventsService.prototype.onMessage = function(event) {\n var data;\n this.log.debug(\"WebSocket message received: \" + event.data);\n data = JSON.parse(event.data);\n if (data.cmd === \"pong\") {\n return this.processHeartBeatPongMessage(data);\n } else {\n return this.processMessage(data);\n }\n };\n\n EventsService.prototype.onError = function(error) {\n this.log.error(\"WebSocket error: \" + error);\n this.error = true;\n return setTimeout(this.setupConnection, this.reconnectTryInterval);\n };\n\n EventsService.prototype.onClose = function() {\n this.log.debug(\"WebSocket closed.\");\n this.connected = false;\n this.stopHeartBeatMessages();\n return setTimeout(this.setupConnection, this.reconnectTryInterval);\n };\n\n return EventsService;\n\n })();\n\n EventsProvider = (function() {\n function EventsProvider() {}\n\n EventsProvider.prototype.setSessionId = function(sessionId) {\n return this.sessionId = sessionId;\n };\n\n EventsProvider.prototype.$get = function($win, $log, $conf, $auth, liveAnnouncementService, $rootScope) {\n var service;\n service = new EventsService($win, $log, $conf, $auth, liveAnnouncementService, $rootScope);\n service.initialize(this.sessionId);\n return service;\n };\n\n EventsProvider.prototype.$get.$inject = [\"$window\", \"$log\", \"$tgConfig\", \"$tgAuth\", \"tgLiveAnnouncementService\", \"$rootScope\"];\n\n return EventsProvider;\n\n })();\n\n module.provider(\"$tgEvents\", EventsProvider);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/feedback.coffee\n */\n\n(function() {\n var FeedbackDirective, bindOnce, debounce, groupBy, mixOf, module, taiga, trim;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n mixOf = this.taiga.mixOf;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n module = angular.module(\"taigaFeedback\", []);\n\n FeedbackDirective = function($lightboxService, $repo, $confirm, $loading, feedbackService) {\n var directive, link;\n link = function($scope, $el, $attrs) {\n var form, openLightbox, submit, submitButton;\n form = $el.find(\"form\").checksley();\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"feedback\", $scope.feedback);\n promise.then(function(data) {\n currentLoading.finish();\n $lightboxService.close($el);\n return $confirm.notify(\"success\", \"\\\\o/ we'll be happy to read your\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n openLightbox = function() {\n $scope.feedback = {};\n $lightboxService.open($el);\n return $el.find(\"textarea\").focus();\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return openLightbox();\n };\n directive = {\n link: link,\n templateUrl: \"common/lightbox-feedback.html\",\n scope: {}\n };\n return directive;\n };\n\n module.directive(\"tgLbFeedback\", [\"lightboxService\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgFeedbackService\", FeedbackDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/integrations.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaIntegrations\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaIssues\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaKanban\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaPlugins\", [\"ngRoute\"]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/projects.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaProject\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/related-tasks.coffee\n */\n\n(function() {\n var RelatedTaskAssignedToInlineEditionDirective, RelatedTaskCreateButtonDirective, RelatedTaskCreateFormDirective, RelatedTaskRowDirective, RelatedTasksDirective, debounce, module, taiga, trim;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaRelatedTasks\", []);\n\n RelatedTaskRowDirective = function($repo, $compile, $confirm, $rootscope, $loading, $template, $translate, $emojis) {\n var link, templateEdit, templateView;\n templateView = $template.get(\"task/related-task-row.html\", true);\n templateEdit = $template.get(\"task/related-task-row-edit.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var renderEdit, renderView, saveTask;\n this.childScope = $scope.$new();\n saveTask = debounce(2000, function(task) {\n var currentLoading, promise;\n task.subject = $el.find('input').val();\n currentLoading = $loading().target($el.find('.task-name')).start();\n promise = $repo.save(task);\n promise.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"related-tasks:update\");\n };\n })(this));\n promise.then(null, (function(_this) {\n return function() {\n currentLoading.finish();\n $el.find('input').val(task.subject);\n return $confirm.notify(\"error\");\n };\n })(this));\n return promise;\n });\n renderEdit = function(task) {\n this.childScope.$destroy();\n this.childScope = $scope.$new();\n $el.off();\n $el.html($compile(templateEdit({\n task: task\n }))(childScope));\n $el.find(\".task-name input\").val(task.subject);\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return saveTask($model.$modelValue).then(function() {\n return renderView($model.$modelValue);\n });\n } else if (event.keyCode === 27) {\n return renderView($model.$modelValue);\n }\n });\n $el.on(\"click\", \".save-task\", function(event) {\n return saveTask($model.$modelValue).then(function() {\n return renderView($model.$modelValue);\n });\n });\n return $el.on(\"click\", \".cancel-edit\", function(event) {\n return renderView($model.$modelValue);\n });\n };\n renderView = function(task) {\n var perms;\n perms = {\n modify_task: $scope.project.my_permissions.indexOf(\"modify_task\") !== -1,\n delete_task: $scope.project.my_permissions.indexOf(\"delete_task\") !== -1\n };\n $el.html($compile(templateView({\n task: task,\n perms: perms,\n emojify: function(text) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(text));\n }\n }))($scope));\n $el.on(\"click\", \".edit-task\", function() {\n renderEdit($model.$modelValue);\n return $el.find('input').focus().select();\n });\n return $el.on(\"click\", \".delete-task\", function(event) {\n var message, title;\n title = $translate.instant(\"TASK.TITLE_DELETE_ACTION\");\n task = $model.$modelValue;\n message = task.subject;\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = $repo.remove(task);\n promise.then(function() {\n askResponse.finish();\n return $scope.$emit(\"related-tasks:delete\");\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n });\n });\n };\n $scope.$watch($attrs.ngModel, function(val) {\n if (!val) {\n return;\n }\n return renderView(val);\n });\n $scope.$on(\"related-tasks:assigned-to-changed\", function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n $scope.$on(\"related-tasks:status-changed\", function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgRelatedTaskRow\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"$tgTemplate\", \"$translate\", \"$tgEmojis\", RelatedTaskRowDirective]);\n\n RelatedTaskCreateFormDirective = function($repo, $compile, $confirm, $tgmodel, $loading, $analytics) {\n var link, newTask;\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n link = function($scope, $el, $attrs) {\n var close, createTask, render, reset;\n createTask = function(task) {\n var currentLoading, promise;\n task.subject = $el.find('input').val();\n task.assigned_to = $scope.newTask.assigned_to;\n task.status = $scope.newTask.status;\n $scope.newTask.status = $scope.project.default_task_status;\n $scope.newTask.assigned_to = null;\n currentLoading = $loading().target($el.find('.task-name')).start();\n promise = $repo.create(\"tasks\", task);\n promise.then(function() {\n $analytics.trackEvent(\"task\", \"create\", \"create task on userstory\", 1);\n currentLoading.finish();\n return $scope.$emit(\"related-tasks:add\");\n });\n promise.then(null, function() {\n $el.find('input').val(task.subject);\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n return promise;\n };\n close = function() {\n $el.off();\n return $scope.openNewRelatedTask = false;\n };\n reset = function() {\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n newTask[\"status\"] = $scope.project.default_task_status;\n newTask[\"project\"] = $scope.project.id;\n newTask[\"user_story\"] = $scope.us.id;\n return $scope.newTask = $tgmodel.make_model(\"tasks\", newTask);\n };\n render = function() {\n if ($scope.openNewRelatedTask) {\n return;\n }\n $scope.openNewRelatedTask = true;\n return $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return createTask(newTask).then(function() {\n reset();\n return $el.find('input').focus();\n });\n } else if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return close();\n });\n }\n });\n };\n $scope.save = function() {\n return createTask(newTask).then(function() {\n return close();\n });\n };\n taiga.bindOnce($scope, \"us\", reset);\n $scope.$on(\"related-tasks:show-form\", function() {\n return $scope.$apply(render);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n link: link,\n templateUrl: 'task/related-task-create-form.html'\n };\n };\n\n module.directive(\"tgRelatedTaskCreateForm\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgLoading\", \"$tgAnalytics\", RelatedTaskCreateFormDirective]);\n\n RelatedTaskCreateButtonDirective = function($repo, $compile, $confirm, $tgmodel, $template) {\n var link, template;\n template = $template.get(\"common/components/add-button.html\", true);\n link = function($scope, $el, $attrs) {\n $scope.$watch(\"project\", function(val) {\n if (!val) {\n return;\n }\n $el.off();\n if ($scope.project.my_permissions.indexOf(\"add_task\") !== -1) {\n $el.html($compile(template())($scope));\n } else {\n $el.html(\"\");\n }\n return $el.on(\"click\", \".add-button\", function(event) {\n return $scope.$emit(\"related-tasks:add-new-clicked\");\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskCreateButton\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgTemplate\", RelatedTaskCreateButtonDirective]);\n\n RelatedTasksDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var _isEditable, _isVisible, loadTasks;\n loadTasks = function() {\n return $rs.tasks.list($scope.projectId, null, $scope.usId).then((function(_this) {\n return function(tasks) {\n $scope.tasks = _.sortBy(tasks, function(x) {\n return [x.us_order, x.ref];\n });\n return tasks;\n };\n })(this));\n };\n _isVisible = function() {\n if ($scope.project) {\n return $scope.project.my_permissions.indexOf(\"view_tasks\") !== -1;\n }\n return false;\n };\n _isEditable = function() {\n if ($scope.project) {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n }\n return false;\n };\n $scope.showRelatedTasks = function() {\n var ref;\n return _isVisible() && (_isEditable() || ((ref = $scope.tasks) != null ? ref.length : void 0));\n };\n $scope.$on(\"related-tasks:add\", function() {\n return loadTasks().then(function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n });\n $scope.$on(\"related-tasks:delete\", function() {\n return loadTasks().then(function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n });\n $scope.$on(\"related-tasks:add-new-clicked\", function() {\n return $scope.$broadcast(\"related-tasks:show-form\");\n });\n taiga.bindOnce($scope, \"us\", function(val) {\n return loadTasks();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", RelatedTasksDirective]);\n\n RelatedTaskAssignedToInlineEditionDirective = function($repo, $rootscope, $translate, avatarService) {\n var link, template;\n template = _.template(\"\\\" src=\\\"<%- imgurl %>\\\" alt=\\\"<%- name %>\\\"/>\\n
    <%- name %>
    \");\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task, updateRelatedTask;\n updateRelatedTask = function(task) {\n var avatar, ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\")\n };\n member = $scope.usersById[task.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = avatar.bg;\n if (member) {\n ctx.name = member.full_name_display;\n }\n $el.find(\".avatar\").html(template(ctx));\n return $el.find(\".task-assignedto\").attr('title', ctx.name);\n };\n $ctrl = $el.controller();\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition);\n notAutoSave = $scope.$eval($attrs.notAutoSave);\n autoSave = !notAutoSave;\n $scope.$watch($attrs.tgRelatedTaskAssignedToInlineEdition, function() {\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition);\n return updateRelatedTask(task);\n });\n updateRelatedTask(task);\n $el.on(\"click\", \".task-assignedto\", function(event) {\n return $rootscope.$broadcast(\"assigned-to:add\", task);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_task\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"assigned-to:added\", debounce(2000, (function(_this) {\n return function(ctx, userId, updatedRelatedTask) {\n if (updatedRelatedTask.id === task.id) {\n updatedRelatedTask.assigned_to = userId;\n if (autoSave) {\n $repo.save(updatedRelatedTask).then(function() {\n return $scope.$emit(\"related-tasks:assigned-to-changed\");\n });\n }\n return updateRelatedTask(updatedRelatedTask);\n }\n };\n })(this)));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", \"$translate\", \"tgAvatarService\", RelatedTaskAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources.coffee\n */\n\n(function() {\n var ResourcesService, initResources, initUrls, module, taiga, urls,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ResourcesService = (function(superClass) {\n extend(ResourcesService, superClass);\n\n function ResourcesService() {\n return ResourcesService.__super__.constructor.apply(this, arguments);\n }\n\n return ResourcesService;\n\n })(taiga.Service);\n\n urls = {\n \"auth\": \"/auth\",\n \"auth-register\": \"/auth/register\",\n \"invitations\": \"/invitations\",\n \"users\": \"/users\",\n \"by_username\": \"/users/by_username\",\n \"users-password-recovery\": \"/users/password_recovery\",\n \"users-change-password-from-recovery\": \"/users/change_password_from_recovery\",\n \"users-change-password\": \"/users/change_password\",\n \"users-change-email\": \"/users/change_email\",\n \"users-cancel-account\": \"/users/cancel\",\n \"users-export\": \"/users/export\",\n \"user-stats\": \"/users/%s/stats\",\n \"user-liked\": \"/users/%s/liked\",\n \"user-voted\": \"/users/%s/voted\",\n \"user-watched\": \"/users/%s/watched\",\n \"user-contacts\": \"/users/%s/contacts\",\n \"user-me\": \"/users/me\",\n \"permissions\": \"/permissions\",\n \"notify-policies\": \"/notify-policies\",\n \"user-storage\": \"/user-storage\",\n \"memberships\": \"/memberships\",\n \"bulk-create-memberships\": \"/memberships/bulk_create\",\n \"roles\": \"/roles\",\n \"permissions\": \"/permissions\",\n \"resolver\": \"/resolver\",\n \"projects\": \"/projects\",\n \"project-templates\": \"/project-templates\",\n \"project-modules\": \"/projects/%s/modules\",\n \"bulk-update-projects-order\": \"/projects/bulk_update_order\",\n \"project-like\": \"/projects/%s/like\",\n \"project-unlike\": \"/projects/%s/unlike\",\n \"project-watch\": \"/projects/%s/watch\",\n \"project-unwatch\": \"/projects/%s/unwatch\",\n \"project-contact\": \"contact\",\n \"project-transfer-validate-token\": \"/projects/%s/transfer_validate_token\",\n \"project-transfer-accept\": \"/projects/%s/transfer_accept\",\n \"project-transfer-reject\": \"/projects/%s/transfer_reject\",\n \"project-transfer-request\": \"/projects/%s/transfer_request\",\n \"project-transfer-start\": \"/projects/%s/transfer_start\",\n \"epic-statuses\": \"/epic-statuses\",\n \"userstory-statuses\": \"/userstory-statuses\",\n \"points\": \"/points\",\n \"task-statuses\": \"/task-statuses\",\n \"issue-statuses\": \"/issue-statuses\",\n \"issue-types\": \"/issue-types\",\n \"priorities\": \"/priorities\",\n \"severities\": \"/severities\",\n \"milestones\": \"/milestones\",\n \"epics\": \"/epics\",\n \"epic-upvote\": \"/epics/%s/upvote\",\n \"epic-downvote\": \"/epics/%s/downvote\",\n \"epic-watch\": \"/epics/%s/watch\",\n \"epic-unwatch\": \"/epics/%s/unwatch\",\n \"epic-related-userstories\": \"/epics/%s/related_userstories\",\n \"epic-related-userstories-bulk-create\": \"/epics/%s/related_userstories/bulk_create\",\n \"userstories\": \"/userstories\",\n \"bulk-create-us\": \"/userstories/bulk_create\",\n \"bulk-update-us-backlog-order\": \"/userstories/bulk_update_backlog_order\",\n \"bulk-update-us-milestone\": \"/userstories/bulk_update_milestone\",\n \"bulk-update-us-miles-order\": \"/userstories/bulk_update_sprint_order\",\n \"bulk-update-us-kanban-order\": \"/userstories/bulk_update_kanban_order\",\n \"bulk-update-us-milestone\": \"/userstories/bulk_update_milestone\",\n \"userstories-filters\": \"/userstories/filters_data\",\n \"userstory-upvote\": \"/userstories/%s/upvote\",\n \"userstory-downvote\": \"/userstories/%s/downvote\",\n \"userstory-watch\": \"/userstories/%s/watch\",\n \"userstory-unwatch\": \"/userstories/%s/unwatch\",\n \"tasks\": \"/tasks\",\n \"bulk-create-tasks\": \"/tasks/bulk_create\",\n \"bulk-update-task-taskboard-order\": \"/tasks/bulk_update_taskboard_order\",\n \"task-upvote\": \"/tasks/%s/upvote\",\n \"task-downvote\": \"/tasks/%s/downvote\",\n \"task-watch\": \"/tasks/%s/watch\",\n \"task-unwatch\": \"/tasks/%s/unwatch\",\n \"task-filters\": \"/tasks/filters_data\",\n \"issues\": \"/issues\",\n \"bulk-create-issues\": \"/issues/bulk_create\",\n \"issues-filters\": \"/issues/filters_data\",\n \"issue-upvote\": \"/issues/%s/upvote\",\n \"issue-downvote\": \"/issues/%s/downvote\",\n \"issue-watch\": \"/issues/%s/watch\",\n \"issue-unwatch\": \"/issues/%s/unwatch\",\n \"wiki\": \"/wiki\",\n \"wiki-restore\": \"/wiki/%s/restore\",\n \"wiki-links\": \"/wiki-links\",\n \"history/epic\": \"/history/epic\",\n \"history/us\": \"/history/userstory\",\n \"history/issue\": \"/history/issue\",\n \"history/task\": \"/history/task\",\n \"history/wiki\": \"/history/wiki/%s\",\n \"attachments/epic\": \"/epics/attachments\",\n \"attachments/us\": \"/userstories/attachments\",\n \"attachments/issue\": \"/issues/attachments\",\n \"attachments/task\": \"/tasks/attachments\",\n \"attachments/wiki_page\": \"/wiki/attachments\",\n \"custom-attributes/epic\": \"/epic-custom-attributes\",\n \"custom-attributes/userstory\": \"/userstory-custom-attributes\",\n \"custom-attributes/task\": \"/task-custom-attributes\",\n \"custom-attributes/issue\": \"/issue-custom-attributes\",\n \"custom-attributes-values/epic\": \"/epics/custom-attributes-values\",\n \"custom-attributes-values/userstory\": \"/userstories/custom-attributes-values\",\n \"custom-attributes-values/task\": \"/tasks/custom-attributes-values\",\n \"custom-attributes-values/issue\": \"/issues/custom-attributes-values\",\n \"webhooks\": \"/webhooks\",\n \"webhooks-test\": \"/webhooks/%s/test\",\n \"webhooklogs\": \"/webhooklogs\",\n \"webhooklogs-resend\": \"/webhooklogs/%s/resend\",\n \"epics-csv\": \"/epics/csv?uuid=%s\",\n \"userstories-csv\": \"/userstories/csv?uuid=%s\",\n \"tasks-csv\": \"/tasks/csv?uuid=%s\",\n \"issues-csv\": \"/issues/csv?uuid=%s\",\n \"timeline-profile\": \"/timeline/profile\",\n \"timeline-user\": \"/timeline/user\",\n \"timeline-project\": \"/timeline/project\",\n \"search\": \"/search\",\n \"exporter\": \"/exporter\",\n \"importer\": \"/importer/load_dump\",\n \"feedback\": \"/feedback\",\n \"locales\": \"/locales\",\n \"applications\": \"/applications\",\n \"application-tokens\": \"/application-tokens\",\n \"stats-discover\": \"/stats/discover\",\n \"importers-trello-auth-url\": \"/importers/trello/auth_url\",\n \"importers-trello-authorize\": \"/importers/trello/authorize\",\n \"importers-trello-list-projects\": \"/importers/trello/list_projects\",\n \"importers-trello-list-users\": \"/importers/trello/list_users\",\n \"importers-trello-import-project\": \"/importers/trello/import_project\",\n \"importers-jira-auth-url\": \"/importers/jira/auth_url\",\n \"importers-jira-authorize\": \"/importers/jira/authorize\",\n \"importers-jira-list-projects\": \"/importers/jira/list_projects\",\n \"importers-jira-list-users\": \"/importers/jira/list_users\",\n \"importers-jira-import-project\": \"/importers/jira/import_project\",\n \"importers-github-auth-url\": \"/importers/github/auth_url\",\n \"importers-github-authorize\": \"/importers/github/authorize\",\n \"importers-github-list-projects\": \"/importers/github/list_projects\",\n \"importers-github-list-users\": \"/importers/github/list_users\",\n \"importers-github-import-project\": \"/importers/github/import_project\",\n \"importers-asana-auth-url\": \"/importers/asana/auth_url\",\n \"importers-asana-authorize\": \"/importers/asana/authorize\",\n \"importers-asana-list-projects\": \"/importers/asana/list_projects\",\n \"importers-asana-list-users\": \"/importers/asana/list_users\",\n \"importers-asana-import-project\": \"/importers/asana/import_project\"\n };\n\n initUrls = function($log, $urls) {\n $log.debug(\"Initialize api urls\");\n return $urls.update(urls);\n };\n\n initResources = function($log, $rs) {\n var i, len, provider, providers, results;\n $log.debug(\"Initialize resources\");\n providers = _.toArray(arguments).slice(2);\n results = [];\n for (i = 0, len = providers.length; i < len; i++) {\n provider = providers[i];\n results.push(provider($rs));\n }\n return results;\n };\n\n module = angular.module(\"taigaResources\", [\"taigaBase\"]);\n\n module.service(\"$tgResources\", ResourcesService);\n\n module.run([\"$log\", \"$tgUrls\", initUrls]);\n\n module.run([\"$log\", \"$tgResources\", \"$tgProjectsResourcesProvider\", \"$tgCustomAttributesResourcesProvider\", \"$tgCustomAttributesValuesResourcesProvider\", \"$tgMembershipsResourcesProvider\", \"$tgNotifyPoliciesResourcesProvider\", \"$tgInvitationsResourcesProvider\", \"$tgRolesResourcesProvider\", \"$tgUserSettingsResourcesProvider\", \"$tgSprintsResourcesProvider\", \"$tgEpicsResourcesProvider\", \"$tgUserstoriesResourcesProvider\", \"$tgTasksResourcesProvider\", \"$tgIssuesResourcesProvider\", \"$tgWikiResourcesProvider\", \"$tgSearchResourcesProvider\", \"$tgMdRenderResourcesProvider\", \"$tgHistoryResourcesProvider\", \"$tgKanbanResourcesProvider\", \"$tgModulesResourcesProvider\", \"$tgWebhooksResourcesProvider\", \"$tgWebhookLogsResourcesProvider\", \"$tgLocalesResourcesProvider\", \"$tgUsersResourcesProvider\", initResources]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/search.coffee\n */\n\n(function() {\n var SearchBoxDirective, SearchController, SearchDirective, bindOnce, debounce, debounceLeading, groupBy, mixOf, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n mixOf = this.taiga.mixOf;\n\n debounceLeading = this.taiga.debounceLeading;\n\n trim = this.taiga.trim;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaSearch\", []);\n\n SearchController = (function(superClass) {\n extend(SearchController, superClass);\n\n SearchController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function SearchController(scope1, repo, rs, params, q, location, appMetaService, navUrls, translate, errorHandlingService, projectService1) {\n var description, loadSearchData, title;\n this.scope = scope1;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.scope.sectionName = \"Search\";\n this.loadInitialData();\n title = this.translate.instant(\"SEARCH.PAGE_TITLE\", {\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"SEARCH.PAGE_DESCRIPTION\", {\n projectName: this.scope.project.name,\n projectDescription: this.scope.project.description\n });\n this.appMetaService.setAll(title, description);\n this.scope.searchTerm = null;\n loadSearchData = debounceLeading(100, (function(_this) {\n return function(t) {\n return _this.loadSearchData(t);\n };\n })(this));\n bindOnce(this.scope, \"projectId\", (function(_this) {\n return function(projectId) {\n if (!_this.scope.searchResults && _this.scope.searchTerm) {\n return _this.loadSearchData();\n }\n };\n })(this));\n this.scope.$watch(\"searchTerm\", (function(_this) {\n return function(term) {\n if (term !== void 0 && _this.scope.projectId) {\n return _this.loadSearchData(term);\n }\n };\n })(this));\n }\n\n SearchController.prototype.loadFilters = function() {\n var defered;\n defered = this.q.defer();\n defered.resolve();\n return defered.promise;\n };\n\n SearchController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.epicStatusById = groupBy(project.epic_statuses, function(x) {\n return x.id;\n });\n this.scope.issueStatusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n this.scope.taskStatusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n\n SearchController.prototype.loadSearchData = function(term) {\n if (term == null) {\n term = \"\";\n }\n this.scope.loading = true;\n return this._loadSearchData(term).then((function(_this) {\n return function(data) {\n _this.scope.searchResults = data;\n return _this.scope.loading = false;\n };\n })(this));\n };\n\n SearchController.prototype._loadSearchData = function(term) {\n if (term == null) {\n term = \"\";\n }\n if (this._promise) {\n this._promise.abort();\n }\n this._promise = this.rs.search[\"do\"](this.scope.projectId, term);\n return this._promise;\n };\n\n SearchController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.scope.projectId = project.id;\n return this.fillUsersAndRoles(project.members, project.roles);\n };\n\n return SearchController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"SearchController\", SearchController);\n\n SearchBoxDirective = function(projectService, $lightboxService, $navurls, $location, $route) {\n var link;\n link = function($scope, $el, $attrs) {\n var openLightbox, project, submit;\n project = null;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var form, text, url;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n text = $el.find(\"#search-text\").val();\n url = $navurls.resolve(\"project-search\", {\n project: project.get(\"slug\")\n });\n return $scope.$apply(function() {\n $lightboxService.close($el);\n $location.path(url);\n $location.search(\"text\", text).path(url);\n return $route.reload();\n });\n };\n })(this));\n openLightbox = function() {\n project = projectService.project;\n return $lightboxService.open($el).then(function() {\n return $el.find(\"#search-text\").focus();\n });\n };\n $el.on(\"submit\", \"form\", submit);\n return openLightbox();\n };\n return {\n templateUrl: \"search/lightbox-search.html\",\n link: link\n };\n };\n\n SearchBoxDirective.$inject = [\"tgProjectService\", \"lightboxService\", \"$tgNavUrls\", \"$tgLocation\", \"$route\"];\n\n module.directive(\"tgSearchBox\", SearchBoxDirective);\n\n SearchDirective = function($log, $compile, $templatecache, $routeparams, $location, $analytics) {\n var link, linkTable;\n linkTable = function($scope, $el, $attrs, $ctrl) {\n var activeSectionName, applyAutoTab, getActiveSection, lastSearchResults, markSectionTabActive, renderFilterTabs, renderTableContent, tabsDom, templates;\n applyAutoTab = true;\n activeSectionName = \"userstories\";\n tabsDom = $el.find(\".search-filter\");\n lastSearchResults = null;\n getActiveSection = function(data) {\n var i, len, maxVal, name, ref, selectedSection, value;\n maxVal = 0;\n selectedSection = {};\n selectedSection.name = \"userstories\";\n selectedSection.value = [];\n if (!applyAutoTab) {\n selectedSection.name = activeSectionName;\n selectedSection.value = data[activeSectionName];\n return selectedSection;\n }\n if (data) {\n ref = [\"userstories\", \"epics\", \"issues\", \"tasks\", \"wikipages\"];\n for (i = 0, len = ref.length; i < len; i++) {\n name = ref[i];\n value = data[name];\n if (value.length > maxVal) {\n maxVal = value.length;\n selectedSection.name = name;\n selectedSection.value = value;\n break;\n }\n }\n }\n if (maxVal === 0) {\n return selectedSection;\n }\n return selectedSection;\n };\n renderFilterTabs = function(data) {\n var name, results, value;\n results = [];\n for (name in data) {\n value = data[name];\n tabsDom.find(\"li.\" + name).show();\n results.push(tabsDom.find(\"li.\" + name + \" .num\").html(value.length));\n }\n return results;\n };\n markSectionTabActive = function(section) {\n tabsDom.find(\"a.active\").removeClass(\"active\");\n tabsDom.find(\"li.\" + section.name + \" a\").addClass(\"active\");\n applyAutoTab = false;\n return activeSectionName = section.name;\n };\n templates = {\n epics: $templatecache.get(\"search-epics\"),\n issues: $templatecache.get(\"search-issues\"),\n tasks: $templatecache.get(\"search-tasks\"),\n userstories: $templatecache.get(\"search-userstories\"),\n wikipages: $templatecache.get(\"search-wikipages\")\n };\n renderTableContent = function(section) {\n var element, oldElements, oldScope, scope, template;\n oldElements = $el.find(\".search-result-table\").children();\n oldScope = oldElements.scope();\n if (oldScope) {\n oldScope.$destroy();\n oldElements.remove();\n }\n scope = $scope.$new();\n scope[section.name] = section.value;\n template = angular.element.parseHTML(trim(templates[section.name]));\n element = $compile(template)(scope);\n return $el.find(\".search-result-table\").html(element);\n };\n $scope.$watch(\"searchResults\", function(data) {\n var activeSection;\n lastSearchResults = data;\n if (!lastSearchResults) {\n return;\n }\n activeSection = getActiveSection(data);\n renderFilterTabs(data);\n renderTableContent(activeSection);\n return markSectionTabActive(activeSection);\n });\n $scope.$watch(\"searchTerm\", function(searchTerm) {\n if (searchTerm !== void 0) {\n $location.search(\"text\", searchTerm);\n }\n return $analytics.trackPage($location.url(), \"Search\");\n });\n return $el.on(\"click\", \".search-filter li > a\", function(event) {\n var section, sectionData, sectionName, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n sectionName = target.parent().data(\"name\");\n sectionData = !lastSearchResults ? [] : lastSearchResults[sectionName];\n section = {\n name: sectionName,\n value: sectionData\n };\n return $scope.$apply(function() {\n renderTableContent(section);\n return markSectionTabActive(section);\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, searchText;\n $ctrl = $el.controller();\n linkTable($scope, $el, $attrs, $ctrl);\n searchText = $routeparams.text;\n return $scope.$watch(\"projectId\", function(projectId) {\n if (projectId != null) {\n return $scope.searchTerm = searchText;\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSearch\", [\"$log\", \"$compile\", \"$templateCache\", \"$routeParams\", \"$tgLocation\", \"$tgAnalytics\", SearchDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTaskboard\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/tasks.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTasks\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/team.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTeam\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUserSettings\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/userstories.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUserStories\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaWiki\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/analytics.coffee\n */\n\n(function() {\n var AnalyticsService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n AnalyticsService = (function(superClass) {\n extend(AnalyticsService, superClass);\n\n AnalyticsService.$inject = [\"$rootScope\", \"$log\", \"$tgConfig\", \"$window\", \"$document\", \"$location\"];\n\n function AnalyticsService(rootscope, log, config, win, doc, location) {\n var conf;\n this.rootscope = rootscope;\n this.log = log;\n this.config = config;\n this.win = win;\n this.doc = doc;\n this.location = location;\n this.initialized = false;\n conf = this.config.get(\"analytics\", {});\n this.accountId = conf.accountId;\n this.pageEvent = conf.pageEvent || \"$routeChangeSuccess\";\n this.trackRoutes = conf.trackRoutes || true;\n this.ignoreFirstPageLoad = conf.ignoreFirstPageLoad || false;\n }\n\n AnalyticsService.prototype.initialize = function() {\n if (!this.accountId) {\n this.log.debug(\"Analytics: no acount id provided. Disabling.\");\n return;\n }\n this.injectAnalytics();\n this.win.ga(\"create\", this.accountId, \"auto\");\n this.win.ga(\"require\", \"ec\");\n this.win.ga(\"require\", \"displayfeatures\");\n if (this.trackRoutes && (!this.ignoreFirstPageLoad)) {\n this.win.ga(\"send\", \"pageview\", this.getUrl());\n }\n if (this.trackRoutes) {\n this.rootscope.$on(this.pageEvent, (function(_this) {\n return function() {\n return _this.trackPage(_this.getUrl(), \"Taiga\");\n };\n })(this));\n }\n this.initialized = true;\n return this.setUserId();\n };\n\n AnalyticsService.prototype.setUserId = function() {\n var ref, ref1;\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n return this.win.ga('set', 'userId', (ref = this.rootscope) != null ? (ref1 = ref.user) != null ? ref1.uuid : void 0 : void 0);\n };\n\n AnalyticsService.prototype.getUrl = function() {\n return this.location.path();\n };\n\n AnalyticsService.prototype.injectAnalytics = function() {\n var fn;\n fn = (function(i,s,o,g,r,a,m){i[\"GoogleAnalyticsObject\"]=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);});\n return fn(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\");\n };\n\n AnalyticsService.prototype.trackPage = function(url, title) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n title = title || this.doc[0].title;\n return this.win.ga(\"send\", \"pageview\", {\n \"page\": url,\n \"title\": title\n });\n };\n\n AnalyticsService.prototype.trackEvent = function(category, action, label, value) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n return this.win.ga(\"send\", \"event\", category, action, label, value);\n };\n\n AnalyticsService.prototype.ecViewPlan = function(plan) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'detail');\n return this.trackEvent(\"ecommerce\", \"view-product-detail\", plan.name, plan.plan_id);\n };\n\n AnalyticsService.prototype.ecClickPlan = function(plan) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'click');\n return this.trackEvent(\"ecommerce\", \"click-product\", plan.name, plan.plan_id);\n };\n\n AnalyticsService.prototype.ecListPlans = function(arg, page) {\n var i, len, plan, plans, position;\n plans = arg[0];\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n position = 1;\n for (i = 0, len = plans.length; i < len; i++) {\n plan = plans[i];\n this.win.ga('ec:addImpression', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'list': page,\n 'position': position\n });\n position++;\n }\n return this.trackEvent(\"ecommerce\", \"list-plans\");\n };\n\n AnalyticsService.prototype.ecAddToCart = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'add');\n return this.trackEvent('ecommerce', 'add-to-cart', 'Collect Payment Info', null);\n };\n\n AnalyticsService.prototype.ecConfirmChange = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'checkout', {\n 'step': 1\n });\n return this.trackEvent(\"ecommerce\", \"start-checkout\", \"start\", 1);\n };\n\n AnalyticsService.prototype.ecPurchase = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'checkout', {\n 'step': 2\n });\n this.trackEvent(\"ecommerce\", \"end-checkout\", \"end\", 2);\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'purchase', {\n 'id': plan_id,\n 'revenue': plan_price\n });\n return this.trackEvent('ecommerce', 'checkout', 'Plan checkout', null);\n };\n\n return AnalyticsService;\n\n })(taiga.Service);\n\n module.service(\"$tgAnalytics\", AnalyticsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: bind-scope.coffee\n */\n\n(function() {\n var BindScope, module;\n\n module = angular.module(\"taigaCommon\");\n\n BindScope = function(config) {\n var link;\n if (!config.debugInfo) {\n jQuery.fn.scope = function() {\n return this.data('scope');\n };\n }\n link = function($scope, $el) {\n if (!config.debugInfo) {\n return $el.data('scope', $scope).addClass('tg-scope');\n }\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBindScope\", [\"$tgConfig\", BindScope]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: compile-html.directive.coffee\n */\n\n(function() {\n var CompileHtmlDirective;\n\n CompileHtmlDirective = function($compile) {\n var link;\n link = function(scope, element, attrs) {\n return scope.$watch(attrs.tgCompileHtml, function(newValue, oldValue) {\n element.html(newValue);\n return $compile(element.contents())(scope);\n });\n };\n return {\n link: link\n };\n };\n\n CompileHtmlDirective.$inject = [\"$compile\"];\n\n angular.module(\"taigaCommon\").directive(\"tgCompileHtml\", CompileHtmlDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/components.coffee\n */\n\n(function() {\n var AssignedToDirective, AssignedUsersDirective, BlockButtonDirective, CreatedByDisplayDirective, DateRangeDirective, DateSelectorDirective, DeleteButtonDirective, ListItemAssignedtoDirective, ListItemEpicStatusDirective, ListItemIssueStatusDirective, ListItemPriorityDirective, ListItemSeverityDirective, ListItemTaskStatusDirective, ListItemTypeDirective, ListItemUsStatusDirective, SprintProgressBarDirective, TgMainTitleDirective, TgProgressBarDirective, UserDisplayDirective, WatchersDirective, bindOnce, module, taiga,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n DateRangeDirective = function($translate) {\n var link, renderRange;\n renderRange = function($el, first, second) {\n var endDate, initDate, prettyDate;\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\");\n initDate = moment(first).format(prettyDate);\n endDate = moment(second).format(prettyDate);\n return $el.html(initDate + \"-\" + endDate);\n };\n link = function($scope, $el, $attrs) {\n var first, ref, second;\n ref = $attrs.tgDateRange.split(\",\"), first = ref[0], second = ref[1];\n return bindOnce($scope, first, function(valFirst) {\n return bindOnce($scope, second, function(valSecond) {\n return renderRange($el, valFirst, valSecond);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgDateRange\", [\"$translate\", DateRangeDirective]);\n\n DateSelectorDirective = function($rootscope, datePickerConfigService) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var initialize, selectedDate, unbind;\n selectedDate = null;\n initialize = function() {\n var datePickerConfig;\n datePickerConfig = datePickerConfigService.get();\n _.merge(datePickerConfig, {\n field: $el[0]\n });\n return $el.picker = new Pikaday(datePickerConfig);\n };\n unbind = $rootscope.$on(\"$translateChangeEnd\", (function(_this) {\n return function(ctx) {\n if ($el.picker) {\n $el.picker.destroy();\n }\n return initialize();\n };\n })(this));\n $attrs.$observe(\"pickerValue\", function(val) {\n $el.val(val);\n if (val != null) {\n if ($el.picker) {\n $el.picker.destroy();\n }\n initialize();\n }\n return $el.picker.setDate(val);\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n unbind();\n return $el.picker.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgDateSelector\", [\"$rootScope\", \"tgDatePickerConfigService\", DateSelectorDirective]);\n\n SprintProgressBarDirective = function() {\n var link, renderProgress;\n renderProgress = function($el, percentage, visual_percentage) {\n if ($el.hasClass(\".current-progress\")) {\n return $el.css(\"width\", percentage + \"%\");\n } else {\n $el.find(\".current-progress\").css(\"width\", visual_percentage + \"%\");\n return $el.find(\".number\").html(percentage + \" %\");\n }\n };\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.tgSprintProgressbar, function(sprint) {\n var closedPoints, percentage, totalPoints, visual_percentage;\n closedPoints = sprint.closed_points;\n totalPoints = sprint.total_points;\n percentage = 0;\n if (totalPoints !== 0) {\n percentage = Math.round(100 * (closedPoints / totalPoints));\n }\n visual_percentage = 0;\n if (totalPoints !== 0) {\n visual_percentage = Math.round(98 * (closedPoints / totalPoints));\n }\n return renderProgress($el, percentage, visual_percentage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSprintProgressbar\", SprintProgressBarDirective);\n\n CreatedByDisplayDirective = function($template, $compile, $translate, $navUrls, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.ngModel, function(model) {\n var avatar, ref;\n if (model != null) {\n avatar = avatarService.getAvatar(model.owner_extra_info);\n $scope.owner = model.owner_extra_info || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n };\n $scope.owner.avatar = avatar.url;\n $scope.owner.bg = avatar.bg;\n $scope.url = ((ref = $scope.owner) != null ? ref.is_active : void 0) ? $navUrls.resolve(\"user-profile\", {\n username: $scope.owner.username\n }) : \"\";\n return $scope.date = moment(model.created_date).format($translate.instant(\"COMMON.DATETIME\"));\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n scope: true,\n templateUrl: \"common/components/created-by.html\"\n };\n };\n\n module.directive(\"tgCreatedByDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\", \"tgAvatarService\", CreatedByDisplayDirective]);\n\n UserDisplayDirective = function($template, $compile, $translate, $navUrls, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var avatar, id;\n id = $attrs.tgUserId;\n $scope.user = $scope.usersById[id] || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n };\n avatar = avatarService.getAvatar($scope.usersById[id] || null);\n $scope.user.avatar = avatar.url;\n $scope.user.bg = avatar.bg;\n $scope.url = $scope.user.is_active ? $navUrls.resolve(\"user-profile\", {\n username: $scope.user.username\n }) : \"\";\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n scope: true,\n templateUrl: \"common/components/user-display.html\"\n };\n };\n\n module.directive(\"tgUserDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\", \"tgAvatarService\", UserDisplayDirective]);\n\n WatchersDirective = function($rootscope, $confirm, $repo, $modelTransform, $template, $compile, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var deleteWatcher, isEditable, renderWatchers, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n save = function(watchers) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.watchers = watchers;\n return item;\n });\n transform.then(function() {\n watchers = _.map(watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n renderWatchers(watchers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n deleteWatcher = function(watcherIds) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.watchers = watcherIds;\n return item;\n });\n transform.then(function() {\n var item, watchers;\n item = $modelTransform.getObj();\n watchers = _.map(item.watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n renderWatchers(watchers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return transform.then(null, function() {\n item.revert();\n return $confirm.notify(\"error\");\n });\n };\n renderWatchers = function(watchers) {\n $scope.watchers = watchers;\n return $scope.isEditable = isEditable();\n };\n $el.on(\"click\", \".js-delete-watcher\", function(event) {\n var message, target, title, watcherId;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n watcherId = target.data(\"watcher-id\");\n title = $translate.instant(\"COMMON.WATCHERS.TITLE_LIGHTBOX_DELETE_WARTCHER\");\n message = $scope.usersById[watcherId].full_name_display;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var watcherIds;\n askResponse.finish();\n watcherIds = _.clone($model.$modelValue.watchers, false);\n watcherIds = _.pull(watcherIds, watcherId);\n return deleteWatcher(watcherIds);\n };\n })(this));\n });\n $scope.$on(\"watcher:added\", function(ctx, watcherId) {\n var watchers;\n watchers = _.clone($model.$modelValue.watchers, false);\n watchers.push(watcherId);\n watchers = _.uniq(watchers);\n return save(watchers);\n });\n $scope.$watch($attrs.ngModel, function(item) {\n var watchers;\n if (item == null) {\n return;\n }\n watchers = _.map(item.watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n watchers = _.filter(watchers, function(it) {\n return !!it;\n });\n return renderWatchers(watchers);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n templateUrl: \"common/components/watchers.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWatchers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", \"$translate\", WatchersDirective]);\n\n AssignedUsersDirective = function($rootscope, $confirm, $repo, $modelTransform, $template, $compile, $translate, $currentUserService) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var assignToMe, deleteAssignedUser, isAssigned, isEditable, openAssignedUsers, renderAssignedUsers, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n isAssigned = function() {\n return $scope.assignedUsers.length > 0;\n };\n save = function(assignedUsers, assignedToUser) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.assigned_users = assignedUsers;\n if (!item.assigned_to) {\n item.assigned_to = assignedToUser;\n }\n return item;\n });\n transform.then(function() {\n var result;\n assignedUsers = _.map(assignedUsers, function(assignedUserId) {\n return $scope.usersById[assignedUserId];\n });\n renderAssignedUsers(assignedUsers);\n return result = $rootscope.$broadcast(\"object:updated\");\n });\n return transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n openAssignedUsers = function() {\n var item;\n item = _.clone($model.$modelValue, false);\n return $rootscope.$broadcast(\"assigned-user:add\", item);\n };\n assignToMe = function() {\n var assignedUsers, currentUserId;\n if (!isEditable()) {\n return;\n }\n currentUserId = $currentUserService.getUser().get('id');\n assignedUsers = _.clone($model.$modelValue.assigned_users, false);\n assignedUsers.push(currentUserId);\n assignedUsers = _.uniq(assignedUsers);\n return save(assignedUsers, currentUserId);\n };\n deleteAssignedUser = function(assignedUserIds) {\n var transform;\n transform = $modelTransform.save(function(item) {\n var ref;\n item.assigned_users = assignedUserIds;\n if ((ref = item.assigned_to, indexOf.call(assignedUserIds, ref) < 0) && assignedUserIds.length > 0) {\n item.assigned_to = assignedUserIds[0];\n }\n if (assignedUserIds.length === 0) {\n item.assigned_to = null;\n }\n return item;\n });\n transform.then(function() {\n var assignedUsers, item;\n item = $modelTransform.getObj();\n assignedUsers = _.map(item.assignedUsers, function(assignedUserId) {\n return $scope.usersById[assignedUserId];\n });\n renderAssignedUsers(assignedUsers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return transform.then(null, function() {\n item.revert();\n return $confirm.notify(\"error\");\n });\n };\n renderAssignedUsers = function(assignedUsers) {\n $scope.assignedUsers = assignedUsers;\n $scope.isEditable = isEditable();\n $scope.isAssigned = isAssigned();\n $scope.openAssignedUsers = openAssignedUsers;\n return $scope.assignToMe = assignToMe;\n };\n $el.on(\"click\", \".remove-user\", function(event) {\n var assignedUserId, message, target, title;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n assignedUserId = target.data(\"assigned-user-id\");\n title = $translate.instant(\"COMMON.ASSIGNED_USERS.TITLE_LIGHTBOX_DELETE_ASSIGNED\");\n message = $scope.usersById[assignedUserId].full_name_display;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var assignedUserIds;\n askResponse.finish();\n assignedUserIds = _.clone($model.$modelValue.assigned_users, false);\n assignedUserIds = _.pull(assignedUserIds, assignedUserId);\n return deleteAssignedUser(assignedUserIds);\n };\n })(this));\n });\n $scope.$on(\"assigned-user:deleted\", function(ctx, assignedUserId) {\n var assignedUsersIds;\n assignedUsersIds = _.clone($model.$modelValue.assigned_users, false);\n assignedUsersIds = _.pull(assignedUsersIds, assignedUserId);\n assignedUsersIds = _.uniq(assignedUsersIds);\n return deleteAssignedUser(assignedUsersIds);\n });\n $scope.$on(\"assigned-user:added\", function(ctx, assignedUserId) {\n var assignedUsers;\n assignedUsers = _.clone($model.$modelValue.assigned_users, false);\n assignedUsers.push(assignedUserId);\n assignedUsers = _.uniq(assignedUsers);\n return save(assignedUsers, assignedUserId);\n });\n $scope.$watch($attrs.ngModel, function(item) {\n var assignedUsers;\n if (item == null) {\n return;\n }\n assignedUsers = _.map(item.assigned_users, function(assignedUserId) {\n return $scope.usersById[assignedUserId];\n });\n assignedUsers = _.filter(assignedUsers, function(it) {\n return !!it;\n });\n return renderAssignedUsers(assignedUsers);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n templateUrl: \"common/components/assigned-users.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgAssignedUsers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", \"$translate\", \"tgCurrentUserService\", AssignedUsersDirective]);\n\n AssignedToDirective = function($rootscope, $confirm, $repo, $loading, $modelTransform, $template, $translate, $compile, $currentUserService, avatarService) {\n var link, template;\n template = $template.get(\"common/components/assigned-to.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, renderAssignedTo, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n save = function(userId) {\n var currentLoading, item, transform;\n item = $model.$modelValue.clone();\n item.assigned_to = userId;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(item) {\n item.assigned_to = userId;\n return item;\n });\n transform.then(function() {\n currentLoading.finish();\n renderAssignedTo($modelTransform.getObj());\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n });\n return transform;\n };\n renderAssignedTo = function(assignedObject) {\n var avatar, bg, ctx, fullName, html, isIocaine, isUnassigned;\n avatar = avatarService.getAvatar(assignedObject != null ? assignedObject.assigned_to_extra_info : void 0);\n bg = null;\n if ((assignedObject != null ? assignedObject.assigned_to : void 0) != null) {\n fullName = assignedObject.assigned_to_extra_info.full_name_display;\n isUnassigned = false;\n bg = avatar.bg;\n } else {\n fullName = $translate.instant(\"COMMON.ASSIGNED_TO.ASSIGN\");\n isUnassigned = true;\n }\n isIocaine = assignedObject != null ? assignedObject.is_iocaine : void 0;\n ctx = {\n fullName: fullName,\n avatar: avatar.url,\n bg: bg,\n isUnassigned: isUnassigned,\n isEditable: isEditable(),\n isIocaine: isIocaine,\n fullNameVisible: !(isUnassigned && !$currentUserService.isAuthenticated())\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n $el.on(\"click\", \".user-assigned\", function(event) {\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n return $scope.$apply(function() {\n return $rootscope.$broadcast(\"assigned-to:add\", $model.$modelValue);\n });\n });\n $el.on(\"click\", \".assign-to-me\", function(event) {\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n $model.$modelValue.assigned_to = $currentUserService.getUser().get('id');\n return save($currentUserService.getUser().get('id'));\n });\n $el.on(\"click\", \".remove-user\", function(event) {\n var title;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n title = $translate.instant(\"COMMON.ASSIGNED_TO.CONFIRM_UNASSIGNED\");\n return $confirm.ask(title).then((function(_this) {\n return function(response) {\n response.finish();\n $model.$modelValue.assigned_to = null;\n return save(null);\n };\n })(this));\n });\n $scope.$on(\"assigned-to:added\", function(ctx, userId, item) {\n if (item.id !== $model.$modelValue.id) {\n return;\n }\n return save(userId);\n });\n $scope.$watch($attrs.ngModel, function(instance) {\n return renderAssignedTo(instance);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgAssignedTo\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$translate\", \"$compile\", \"tgCurrentUserService\", \"tgAvatarService\", AssignedToDirective]);\n\n BlockButtonDirective = function($rootscope, $loading, $template) {\n var link, template;\n template = $template.get(\"common/components/block-button.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n $scope.$watch($attrs.ngModel, function(item) {\n if (!item) {\n return;\n }\n if (isEditable()) {\n $el.find('.item-block').addClass('editable');\n }\n if (item.is_blocked) {\n $el.find('.item-block').removeClass('is-active');\n return $el.find('.item-unblock').addClass('is-active');\n } else {\n $el.find('.item-block').addClass('is-active');\n return $el.find('.item-unblock').removeClass('is-active');\n }\n });\n $el.on(\"click\", \".item-block\", function(event) {\n event.preventDefault();\n return $rootscope.$broadcast(\"block\", $model.$modelValue);\n });\n $el.on(\"click\", \".item-unblock\", function(event) {\n var currentLoading, finish;\n event.preventDefault();\n currentLoading = $loading().target($el.find(\".item-unblock\")).start();\n finish = function() {\n return currentLoading.finish();\n };\n return $rootscope.$broadcast(\"unblock\", $model.$modelValue, finish);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgBlockButton\", [\"$rootScope\", \"$tgLoading\", \"$tgTemplate\", BlockButtonDirective]);\n\n DeleteButtonDirective = function($log, $repo, $confirm, $location, $template) {\n var link, template;\n template = $template.get(\"common/components/delete-button.html\");\n link = function($scope, $el, $attrs, $model) {\n if (!$attrs.onDeleteGoToUrl) {\n return $log.error(\"DeleteButtonDirective requires on-delete-go-to-url set in scope.\");\n }\n if (!$attrs.onDeleteTitle) {\n return $log.error(\"DeleteButtonDirective requires on-delete-title set in scope.\");\n }\n $el.on(\"click\", \".button-delete\", function(event) {\n var subtitle, title;\n title = $attrs.onDeleteTitle;\n subtitle = $model.$modelValue.subject;\n return $confirm.askOnDelete(title, subtitle).then((function(_this) {\n return function(askResponse) {\n var promise;\n promise = $repo.remove($model.$modelValue);\n promise.then(function() {\n var url;\n askResponse.finish();\n url = $scope.$eval($attrs.onDeleteGoToUrl);\n return $location.path(url);\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgDeleteButton\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgTemplate\", DeleteButtonDirective]);\n\n ListItemEpicStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var epic;\n epic = $scope.$eval($attrs.tgListitemEpicStatus);\n return bindOnce($scope, \"epicStatusById\", function(epicStatusById) {\n return $el.html(epicStatusById[epic.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemEpicStatus\", ListItemEpicStatusDirective);\n\n ListItemUsStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var us;\n us = $scope.$eval($attrs.tgListitemUsStatus);\n return bindOnce($scope, \"usStatusById\", function(usStatusById) {\n return $el.html(usStatusById[us.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemUsStatus\", ListItemUsStatusDirective);\n\n ListItemTaskStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var task;\n task = $scope.$eval($attrs.tgListitemTaskStatus);\n return bindOnce($scope, \"taskStatusById\", function(taskStatusById) {\n return $el.html(taskStatusById[task.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemTaskStatus\", ListItemTaskStatusDirective);\n\n ListItemAssignedtoDirective = function($template, $translate, avatarService) {\n var link, template;\n template = $template.get(\"common/components/list-item-assigned-to-avatar.html\", true);\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"usersById\", function(usersById) {\n var avatar, ctx, item, member;\n item = $scope.$eval($attrs.tgListitemAssignedto);\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\")\n };\n member = usersById[item.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = avatar.bg;\n if (member) {\n ctx.name = member.full_name_display;\n }\n return $el.html(template(ctx));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemAssignedto\", [\"$tgTemplate\", \"$translate\", \"tgAvatarService\", ListItemAssignedtoDirective]);\n\n ListItemIssueStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemIssueStatus);\n return bindOnce($scope, \"issueStatusById\", function(issueStatusById) {\n return $el.html(issueStatusById[issue.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemIssueStatus\", ListItemIssueStatusDirective);\n\n ListItemTypeDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(issueTypeById, issue) {\n var domNode, type;\n type = issueTypeById[issue.type];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", type.color);\n return domNode.attr(\"title\", type.name);\n };\n bindOnce($scope, \"issueTypeById\", function(issueTypeById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemType);\n return render(issueTypeById, issue);\n });\n return $scope.$watch($attrs.tgListitemType, function(issue) {\n return render($scope.issueTypeById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemType\", ListItemTypeDirective);\n\n ListItemPriorityDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(priorityById, issue) {\n var domNode, priority;\n priority = priorityById[issue.priority];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", priority.color);\n return domNode.attr(\"title\", priority.name);\n };\n bindOnce($scope, \"priorityById\", function(priorityById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemPriority);\n return render(priorityById, issue);\n });\n return $scope.$watch($attrs.tgListitemPriority, function(issue) {\n return render($scope.priorityById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemPriority\", ListItemPriorityDirective);\n\n ListItemSeverityDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(severityById, issue) {\n var domNode, severity;\n severity = severityById[issue.severity];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", severity.color);\n return domNode.attr(\"title\", severity.name);\n };\n bindOnce($scope, \"severityById\", function(severityById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemSeverity);\n return render(severityById, issue);\n });\n return $scope.$watch($attrs.tgListitemSeverity, function(issue) {\n return render($scope.severityById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemSeverity\", ListItemSeverityDirective);\n\n TgProgressBarDirective = function($template) {\n var link, render, template;\n template = $template.get(\"common/components/progress-bar.html\", true);\n render = function(el, percentage) {\n return el.html(template({\n percentage: percentage\n }));\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch($attrs.tgProgressBar, function(percentage) {\n percentage = _.max([0, percentage]);\n percentage = _.min([100, percentage]);\n return render($el, percentage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProgressBar\", [\"$tgTemplate\", TgProgressBarDirective]);\n\n TgMainTitleDirective = function($translate) {\n var link;\n link = function($scope, $el, $attrs) {\n $attrs.$observe(\"i18nSectionName\", function(i18nSectionName) {\n return $scope.sectionName = i18nSectionName;\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/main-title.html\",\n scope: {\n projectName: \"=projectName\"\n }\n };\n };\n\n module.directive(\"tgMainTitle\", [\"$translate\", TgMainTitleDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/confirm.coffee\n */\n\n(function() {\n var ConfirmService, NOTIFICATION_MSG, bindMethods, cancelTimeout, debounce, module, taiga, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n timeout = this.taiga.timeout;\n\n cancelTimeout = this.taiga.cancelTimeout;\n\n debounce = this.taiga.debounce;\n\n bindMethods = this.taiga.bindMethods;\n\n NOTIFICATION_MSG = {\n \"success\": {\n title: \"NOTIFICATION.OK\",\n message: \"NOTIFICATION.SAVED\"\n },\n \"error\": {\n title: \"NOTIFICATION.WARNING\",\n message: \"NOTIFICATION.WARNING_TEXT\"\n },\n \"light-error\": {\n title: \"NOTIFICATION.WARNING\",\n message: \"NOTIFICATION.WARNING_TEXT\"\n }\n };\n\n ConfirmService = (function(superClass) {\n extend(ConfirmService, superClass);\n\n ConfirmService.$inject = [\"$q\", \"lightboxService\", \"$tgLoading\", \"$translate\"];\n\n function ConfirmService(q, lightboxService, loading, translate) {\n this.q = q;\n this.lightboxService = lightboxService;\n this.loading = loading;\n this.translate = translate;\n bindMethods(this);\n }\n\n ConfirmService.prototype.hide = function(el) {\n if (el) {\n this.lightboxService.close(el);\n return el.off(\".confirm-dialog\");\n }\n };\n\n ConfirmService.prototype.ask = function(title, subtitle, message, lightboxSelector) {\n var defered, el;\n if (lightboxSelector == null) {\n lightboxSelector = \".lightbox-generic-ask\";\n }\n defered = this.q.defer();\n el = angular.element(lightboxSelector);\n if (title) {\n el.find(\".title\").text(title);\n }\n if (subtitle) {\n el.find(\".subtitle\").text(subtitle);\n }\n if (message) {\n el.find(\".message\").text(message);\n }\n el.on(\"click.confirm-dialog\", \".button-green\", debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n currentLoading = _this.loading().target(target).start();\n return defered.resolve({\n finish: function(ok) {\n if (ok == null) {\n ok = true;\n }\n currentLoading.finish();\n if (ok) {\n return _this.hide(el);\n }\n }\n });\n };\n })(this)));\n el.on(\"click.confirm-dialog\", \".button-red\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.reject();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.askOnDelete = function(title, message, subtitle) {\n if (subtitle == null) {\n subtitle = this.translate.instant(\"NOTIFICATION.ASK_DELETE\");\n }\n return this.ask(title, subtitle, message);\n };\n\n ConfirmService.prototype.askChoice = function(title, subtitle, choices, replacement, warning, lightboxSelector) {\n var choicesField, defered, el;\n if (lightboxSelector == null) {\n lightboxSelector = \".lightbox-ask-choice\";\n }\n defered = this.q.defer();\n el = angular.element(lightboxSelector);\n el.find(\".title\").text(title);\n el.find(\".subtitle\").text(subtitle);\n if (replacement) {\n el.find(\".replacement\").text(replacement);\n } else {\n el.find(\".replacement\").remove();\n }\n if (warning) {\n el.find(\".warning\").text(warning);\n } else {\n el.find(\".warning\").remove();\n }\n choicesField = el.find(\".choices\");\n choicesField.html('');\n _.each(choices, function(value, key) {\n value = _.escape(value);\n return choicesField.append(angular.element(\"\"));\n });\n el.on(\"click.confirm-dialog\", \"a.button-green\", debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n currentLoading = _this.loading().target(target).start();\n return defered.resolve({\n selected: choicesField.val(),\n finish: function(ok) {\n if (ok == null) {\n ok = true;\n }\n currentLoading.finish();\n if (ok) {\n return _this.hide(el);\n }\n }\n });\n };\n })(this)));\n el.on(\"click.confirm-dialog\", \".button-red\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.reject();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.error = function(message) {\n var defered, el;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-error\");\n el.find(\".title\").html(message);\n el.on(\"click.confirm-dialog\", \".button-green\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n el.on(\"click.confirm-dialog\", \".close\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.success = function(title, message, icon) {\n var defered, detailImage, el, svgContainer, useSVG;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-success\");\n el.find(\"img\").remove();\n el.find(\"svg\").remove();\n if (icon) {\n if (icon.type === \"img\") {\n detailImage = $('').addClass('lb-icon').attr('src', icon.name);\n } else if (icon.type === \"svg\") {\n detailImage = document.createElement(\"div\");\n taiga.addClass(detailImage, \"icon\");\n taiga.addClass(detailImage, icon.name);\n taiga.addClass(detailImage, \"lb-icon\");\n svgContainer = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n useSVG = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n useSVG.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#' + icon.name);\n detailImage.appendChild(svgContainer).appendChild(useSVG);\n }\n if (detailImage) {\n el.find('section').prepend(detailImage);\n }\n }\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n el.on(\"click.confirm-dialog\", \".button-green\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n el.on(\"click.confirm-dialog\", \".close\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.loader = function(title, message, spin) {\n var el;\n if (spin == null) {\n spin = false;\n }\n el = angular.element(\".lightbox-generic-loading\");\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n if (spin) {\n el.find(\".spin\").removeClass(\"hidden\");\n }\n return {\n start: (function(_this) {\n return function() {\n return _this.lightboxService.open(el);\n };\n })(this),\n stop: (function(_this) {\n return function() {\n return _this.lightboxService.close(el);\n };\n })(this),\n update: (function(_this) {\n return function(status, title, message, percent) {\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n if (percent) {\n el.find(\".spin\").addClass(\"hidden\");\n el.find(\".progress-bar-wrapper\").removeClass(\"hidden\");\n el.find(\".progress-bar-wrapper > .bar\").width(percent + '%');\n return el.find(\".progress-bar-wrapper > span\").html(percent + '%').css('left', (percent - 9) + '%');\n } else {\n el.find(\".spin\").removeClass(\"hidden\");\n return el.find(\".progress-bar-wrapper\").addClass(\"hidden\");\n }\n };\n })(this)\n };\n };\n\n ConfirmService.prototype.notify = function(type, message, title, time) {\n var body, el, selector;\n selector = \".notification-message-\" + type;\n el = angular.element(selector);\n if (el.hasClass(\"active\")) {\n return;\n }\n if (title) {\n el.find(\"h4\").html(title);\n } else {\n el.find(\"h4\").html(this.translate.instant(NOTIFICATION_MSG[type].title));\n }\n if (message) {\n el.find(\"p\").html(message);\n } else {\n el.find(\"p\").html(this.translate.instant(NOTIFICATION_MSG[type].message));\n }\n body = angular.element(\"body\");\n body.find(\".notification-message .notification-light\").removeClass('active').addClass('inactive');\n body.find(selector).removeClass('inactive').addClass('active');\n if (this.tsem) {\n cancelTimeout(this.tsem);\n }\n if (!time) {\n time = type === 'error' || type === 'light-error' ? 3500 : 1500;\n }\n this.tsem = timeout(time, (function(_this) {\n return function() {\n body.find(selector).removeClass('active').addClass('inactive').one('animationend', function() {\n return $(this).removeClass('inactive');\n });\n return delete _this.tsem;\n };\n })(this));\n return el.on(\"click\", \".icon-close, .close\", (function(_this) {\n return function(event) {\n return body.find(selector).removeClass('active').addClass('inactive');\n };\n })(this));\n };\n\n return ConfirmService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaCommon\");\n\n module.service(\"$tgConfirm\", ConfirmService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/custom-field-values.coffee\n */\n\n(function() {\n var CustomAttributeValueDirective, CustomAttributesValuesController, CustomAttributesValuesDirective, DATE_TYPE, MULTILINE_TYPE, RICHTEXT_TYPE, TEXT_TYPE, TYPE_CHOICES, URL_TYPE, bindMethods, bindOnce, debounce, generateHash, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n bindMethods = this.taiga.bindMethods;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n generateHash = taiga.generateHash;\n\n module = angular.module(\"taigaCommon\");\n\n TEXT_TYPE = \"text\";\n\n RICHTEXT_TYPE = \"url\";\n\n MULTILINE_TYPE = \"multiline\";\n\n DATE_TYPE = \"date\";\n\n URL_TYPE = \"url\";\n\n TYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n }, {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }, {\n key: URL_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL\"\n }, {\n key: RICHTEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT\"\n }\n ];\n\n CustomAttributesValuesController = (function(superClass) {\n extend(CustomAttributesValuesController, superClass);\n\n CustomAttributesValuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$q\"];\n\n function CustomAttributesValuesController(scope1, rootscope, repo, rs, confirm, q) {\n this.scope = scope1;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.confirm = confirm;\n this.q = q;\n bindMethods(this);\n this.type = null;\n this.objectId = null;\n this.projectId = null;\n this.customAttributes = [];\n this.customAttributesValues = null;\n }\n\n CustomAttributesValuesController.prototype.initialize = function(type, objectId) {\n this.project = this.scope.project;\n this.type = type;\n this.objectId = objectId;\n return this.projectId = this.scope.projectId;\n };\n\n CustomAttributesValuesController.prototype.loadCustomAttributesValues = function() {\n if (!this.objectId) {\n return this.customAttributesValues;\n }\n return this.rs.customAttributesValues[this.type].get(this.objectId).then((function(_this) {\n return function(customAttributesValues) {\n _this.customAttributes = _this.project[_this.type + \"_custom_attributes\"];\n _this.customAttributesValues = customAttributesValues;\n return customAttributesValues;\n };\n })(this));\n };\n\n CustomAttributesValuesController.prototype.getAttributeValue = function(attribute) {\n var attributeValue;\n attributeValue = _.clone(attribute, false);\n attributeValue.value = this.customAttributesValues.attributes_values[attribute.id];\n return attributeValue;\n };\n\n CustomAttributesValuesController.prototype.updateAttributeValue = function(attributeValue) {\n var attributesValues, onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"custom-attributes-values:edit\");\n };\n })(this);\n onError = (function(_this) {\n return function(response) {\n _this.confirm.notify(\"error\");\n return _this.q.reject();\n };\n })(this);\n attributesValues = _.clone(this.customAttributesValues.attributes_values, true);\n attributesValues[attributeValue.id] = attributeValue.value;\n this.customAttributesValues.attributes_values = attributesValues;\n this.customAttributesValues.id = this.objectId;\n return this.repo.save(this.customAttributesValues).then(onSuccess, onError);\n };\n\n return CustomAttributesValuesController;\n\n })(taiga.Controller);\n\n CustomAttributesValuesDirective = function($templates, $storage) {\n var collapsedHash, link, template, templateFn;\n template = $templates.get(\"custom-attributes/custom-attributes-values.html\", true);\n collapsedHash = function(type) {\n return generateHash([\"custom-attributes-collapsed\", type]);\n };\n link = function($scope, $el, $attrs, $ctrls) {\n var $ctrl, $model, hash;\n $ctrl = $ctrls[0];\n $model = $ctrls[1];\n hash = collapsedHash($attrs.type);\n $scope.collapsed = $storage.get(hash) || false;\n bindOnce($scope, $attrs.ngModel, function(value) {\n $ctrl.initialize($attrs.type, value.id);\n return $ctrl.loadCustomAttributesValues();\n });\n $scope.toggleCollapse = function() {\n $scope.collapsed = !$scope.collapsed;\n return $storage.set(hash, $scope.collapsed);\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n templateFn = function($el, $attrs) {\n return template({\n requiredEditionPerm: $attrs.requiredEditionPerm\n });\n };\n return {\n require: [\"tgCustomAttributesValues\", \"ngModel\"],\n controller: CustomAttributesValuesController,\n controllerAs: \"ctrl\",\n restrict: \"AE\",\n scope: true,\n link: link,\n template: templateFn\n };\n };\n\n module.directive(\"tgCustomAttributesValues\", [\"$tgTemplate\", \"$tgStorage\", \"$translate\", CustomAttributesValuesDirective]);\n\n CustomAttributeValueDirective = function($template, $selectedText, $compile, $translate, datePickerConfigService, wysiwygService) {\n var link, template, templateEdit;\n template = $template.get(\"custom-attributes/custom-attribute-value.html\", true);\n templateEdit = $template.get(\"custom-attributes/custom-attribute-value-edit.html\", true);\n link = function($scope, $el, $attrs, $ctrl) {\n var attributeValue, isEditable, prettyDate, render, setFocusAndSelectOnInputField, submit;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n render = function(attributeValue, edit) {\n var ctx, datePickerConfig, editable, html, scope, value;\n if (edit == null) {\n edit = false;\n }\n if (attributeValue.type === DATE_TYPE && attributeValue.value) {\n value = moment(attributeValue.value, \"YYYY-MM-DD\").format(prettyDate);\n } else {\n value = attributeValue.value;\n }\n editable = isEditable();\n ctx = {\n id: attributeValue.id,\n name: attributeValue.name,\n description: attributeValue.description,\n value: value,\n isEditable: editable,\n type: attributeValue.type\n };\n scope = $scope.$new();\n scope.attributeHtml = wysiwygService.getHTML(value);\n if (editable && (edit || !value)) {\n html = templateEdit(ctx);\n html = $compile(html)(scope);\n $el.html(html);\n if (attributeValue.type === DATE_TYPE) {\n datePickerConfig = datePickerConfigService.get();\n _.merge(datePickerConfig, {\n field: $el.find(\"input[name=value]\")[0],\n onSelect: (function(_this) {\n return function(date) {\n var selectedDate;\n return selectedDate = date;\n };\n })(this),\n onOpen: (function(_this) {\n return function() {\n if (typeof selectedDate !== \"undefined\" && selectedDate !== null) {\n return $el.picker.setDate(selectedDate);\n }\n };\n })(this)\n });\n return $el.picker = new Pikaday(datePickerConfig);\n }\n } else {\n html = template(ctx);\n html = $compile(html)(scope);\n return $el.html(html);\n }\n };\n isEditable = function() {\n var permissions, requiredEditionPerm;\n permissions = $scope.project.my_permissions;\n requiredEditionPerm = $attrs.requiredEditionPerm;\n return permissions.indexOf(requiredEditionPerm) > -1;\n };\n $scope.saveCustomRichText = (function(_this) {\n return function(markdown, callback) {\n attributeValue.value = markdown;\n return $ctrl.updateAttributeValue(attributeValue).then(function() {\n callback();\n return render(attributeValue, false);\n });\n };\n })(this);\n $scope.cancelCustomRichText = (function(_this) {\n return function() {\n render(attributeValue, false);\n return null;\n };\n })(this);\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var form, input;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n input = $el.find(\"input[name=value], textarea[name='value']\");\n attributeValue.value = input.val();\n if (attributeValue.type === DATE_TYPE) {\n if (moment(attributeValue.value, prettyDate).isValid()) {\n attributeValue.value = moment(attributeValue.value, prettyDate).format(\"YYYY-MM-DD\");\n }\n }\n return $scope.$apply(function() {\n return $ctrl.updateAttributeValue(attributeValue).then(function() {\n return render(attributeValue, false);\n });\n });\n };\n })(this));\n setFocusAndSelectOnInputField = function() {\n return $el.find(\"input[name='value'], textarea[name='value']\").focus().select();\n };\n attributeValue = $scope.$eval($attrs.tgCustomAttributeValue);\n if (attributeValue.value === null || attributeValue.value === void 0) {\n attributeValue.value = \"\";\n }\n $scope.customAttributeValue = attributeValue;\n render(attributeValue);\n $el.on(\"click\", \".js-value-view-mode span a\", function(event) {\n return event.stopPropagation();\n });\n $el.on(\"click\", \".js-value-view-mode\", function() {\n if (!isEditable()) {\n return;\n }\n if ($selectedText.get().length) {\n return;\n }\n render(attributeValue, true);\n return setFocusAndSelectOnInputField();\n });\n $el.on(\"click\", \".js-edit-description\", function(event) {\n event.preventDefault();\n render(attributeValue, true);\n return setFocusAndSelectOnInputField();\n });\n $el.on(\"keyup\", \"input[name=value], textarea[name='value']\", function(event) {\n if (event.keyCode === 13 && event.currentTarget.type !== \"textarea\") {\n return submit(event);\n } else if (event.keyCode === 27) {\n return render(attributeValue, false);\n }\n });\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".js-save-description\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"^tgCustomAttributesValues\",\n restrict: \"AE\"\n };\n };\n\n module.directive(\"tgCustomAttributeValue\", [\"$tgTemplate\", \"$selectedText\", \"$compile\", \"$translate\", \"tgDatePickerConfigService\", \"tgWysiwygService\", CustomAttributeValueDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/analytics.coffee\n */\n\n(function() {\n var EmojisService, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n EmojisService = (function(superClass) {\n extend(EmojisService, superClass);\n\n EmojisService.$inject = [];\n\n function EmojisService() {\n this.replaceEmojiNameByHtmlImgs = bind(this.replaceEmojiNameByHtmlImgs, this);\n this.replaceEmojiNameByImgs = bind(this.replaceEmojiNameByImgs, this);\n this.replaceImgsByEmojiName = bind(this.replaceImgsByEmojiName, this);\n this.getEmojiByName = bind(this.getEmojiByName, this);\n this.getEmojiById = bind(this.getEmojiById, this);\n this.searchByName = bind(this.searchByName, this);\n this.emojis = _.map(taiga.emojis, function(it) {\n it.image = (\"/\" + window._version + \"/emojis/\") + it.image;\n return it;\n });\n this.emojisById = _.keyBy(this.emojis, 'id');\n this.emojisByName = _.keyBy(this.emojis, 'name');\n }\n\n EmojisService.prototype.searchByName = function(name) {\n return _.filter(this.emojis, function(it) {\n return it.name.indexOf(name) !== -1;\n });\n };\n\n EmojisService.prototype.getEmojiById = function(id) {\n return this.emojisById[id];\n };\n\n EmojisService.prototype.getEmojiByName = function(name) {\n return this.emojisByName[name];\n };\n\n EmojisService.prototype.replaceImgsByEmojiName = function(html) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(html, /emojis\\/([^\"]+).png\"/gi);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(']+\\>', 'g');\n emoji = this.getEmojiById(emojiId);\n html = html.replace(regexImgs, ':' + emoji.name + ':');\n }\n return html;\n };\n\n EmojisService.prototype.replaceEmojiNameByImgs = function(text) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(text, /:([\\w +-]*):/g);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(':' + emojiId + ':', 'g');\n emoji = this.getEmojiByName(emojiId);\n if (emoji) {\n text = text.replace(regexImgs, '![alt](' + emoji.image + ')');\n }\n }\n return text;\n };\n\n EmojisService.prototype.replaceEmojiNameByHtmlImgs = function(text) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(text, /:([\\w +-]*):/g);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(':' + _.escapeRegExp(emojiId) + ':', 'g');\n emoji = this.getEmojiByName(emojiId);\n if (emoji) {\n text = text.replace(regexImgs, '');\n }\n }\n return text;\n };\n\n return EmojisService;\n\n })(taiga.Service);\n\n module.service(\"$tgEmojis\", EmojisService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/estimation.coffee\n */\n\n(function() {\n var EstimationsService, LbUsEstimationDirective, UsEstimationDirective, groupBy, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaCommon\");\n\n LbUsEstimationDirective = function($tgEstimationsService, $rootScope, $repo, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $scope.$watch($attrs.ngModel, function(us) {\n var estimationProcess;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId, points) {\n us.points = points;\n estimationProcess.render();\n return $scope.$apply(function() {\n return $model.$setViewValue(us);\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, template;\n ctx = {\n totalPoints: this.calculateTotalPoints(),\n roles: this.calculateRoles(),\n editable: this.isEditable,\n loading: false\n };\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\";\n template = $template.get(mainTemplate, true);\n html = template(ctx);\n html = $compile(html)($scope);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgLbUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgTemplate\", \"$compile\", LbUsEstimationDirective]);\n\n UsEstimationDirective = function($tgEstimationsService, $rootScope, $repo, $template, $compile, $modelTransform, $confirm) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = function(points) {\n var onError, transform;\n transform = $modelTransform.save((function(_this) {\n return function(us) {\n us.points = points;\n return us;\n };\n })(this));\n onError = (function(_this) {\n return function() {\n return $confirm.notify(\"error\");\n };\n })(this);\n return transform.then(null, onError);\n };\n $scope.$watchCollection(function() {\n return $model.$modelValue && $model.$modelValue.points;\n }, function() {\n var estimationProcess, us;\n us = $model.$modelValue;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId, points) {\n estimationProcess.loading = roleId;\n estimationProcess.render();\n return save(points).then(function() {\n estimationProcess.loading = false;\n $rootScope.$broadcast(\"object:updated\");\n return estimationProcess.render();\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, template;\n ctx = {\n totalPoints: this.calculateTotalPoints(),\n roles: this.calculateRoles(),\n editable: this.isEditable,\n loading: estimationProcess.loading\n };\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\";\n template = $template.get(mainTemplate, true);\n html = template(ctx);\n html = $compile(html)($scope);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgTemplate\", \"$compile\", \"$tgQueueModelTransformation\", \"$tgConfirm\", UsEstimationDirective]);\n\n EstimationsService = function($template, $repo, $confirm, $q, $qqueue) {\n var EstimationProcess, create, pointsTemplate;\n pointsTemplate = $template.get(\"common/estimation/us-estimation-points.html\", true);\n EstimationProcess = (function() {\n function EstimationProcess($el1, us1, project1) {\n this.$el = $el1;\n this.us = us1;\n this.project = project1;\n this.bindClickEvents = bind(this.bindClickEvents, this);\n this.isEditable = this.project.my_permissions.indexOf(\"modify_us\") !== -1;\n this.roles = this.project.roles;\n this.points = this.project.points;\n this.loading = false;\n this.pointsById = groupBy(this.points, function(x) {\n return x.id;\n });\n this.onSelectedPointForRole = function(roleId, pointId) {};\n this.render = function() {};\n }\n\n EstimationProcess.prototype.save = function(roleId, pointId) {\n var deferred;\n deferred = $q.defer();\n $qqueue.add((function(_this) {\n return function() {\n var onError, onSuccess;\n onSuccess = function() {\n deferred.resolve();\n return _this.render();\n };\n onError = function() {\n $confirm.notify(\"error\");\n _this.us.revert();\n _this.render();\n return deferred.reject();\n };\n return $repo.save(_this.us).then(onSuccess, onError);\n };\n })(this));\n return deferred.promise;\n };\n\n EstimationProcess.prototype.calculateTotalPoints = function() {\n var notNullValues, values;\n values = _.map(this.us.points, (function(_this) {\n return function(v, k) {\n var ref;\n return (ref = _this.pointsById[v]) != null ? ref.value : void 0;\n };\n })(this));\n if (values.length === 0) {\n return \"?\";\n }\n notNullValues = _.filter(values, function(v) {\n return v != null;\n });\n if (notNullValues.length === 0) {\n return \"?\";\n }\n return _.reduce(notNullValues, function(acc, num) {\n return acc + num;\n });\n };\n\n EstimationProcess.prototype.calculateRoles = function() {\n var computableRoles, roles;\n computableRoles = _.filter(this.project.roles, \"computable\");\n roles = _.map(computableRoles, (function(_this) {\n return function(role) {\n var pointId, pointObj;\n pointId = _this.us.points[role.id];\n pointObj = _this.pointsById[pointId];\n role = _.clone(role, true);\n role.points = (pointObj != null) && (pointObj.name != null) ? pointObj.name : \"?\";\n return role;\n };\n })(this));\n return roles;\n };\n\n EstimationProcess.prototype.bindClickEvents = function() {\n this.$el.on(\"click\", \".total.clickable\", (function(_this) {\n return function(event) {\n var roleId, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n roleId = target.data(\"role-id\");\n _this.renderPointsSelector(roleId, target);\n target.siblings().removeClass('active');\n return target.addClass('active');\n };\n })(this));\n return this.$el.on(\"click\", \".point\", (function(_this) {\n return function(event) {\n var pointId, points, roleId, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n roleId = target.data(\"role-id\");\n pointId = target.data(\"point-id\");\n _this.$el.find(\".popover\").popover().close();\n points = _.clone(_this.us.points, true);\n points[roleId] = pointId;\n return _this.onSelectedPointForRole(roleId, pointId, points);\n };\n })(this));\n };\n\n EstimationProcess.prototype.renderPointsSelector = function(roleId, target) {\n var horizontalList, html, maxPointLength, points, pop;\n points = _.map(this.points, (function(_this) {\n return function(point) {\n point = _.clone(point, true);\n point.selected = _this.us.points[roleId] === point.id ? false : true;\n return point;\n };\n })(this));\n maxPointLength = 5;\n horizontalList = _.some(points, (function(_this) {\n return function(point) {\n return point.name.length > maxPointLength;\n };\n })(this));\n html = pointsTemplate({\n \"points\": points,\n roleId: roleId,\n horizontal: horizontalList\n });\n this.$el.find(\".popover\").popover().close();\n this.$el.find(\".pop-points-open\").remove();\n if (target != null) {\n this.$el.find(target).append(html);\n } else {\n this.$el.append(html);\n }\n this.$el.find(\".pop-points-open\").popover().open(function() {\n return $(this).removeClass(\"active\").closest(\"li\").removeClass(\"active\");\n });\n this.$el.find(\".pop-points-open\").show();\n pop = this.$el.find(\".pop-points-open\");\n if (pop.offset().top + pop.height() > document.body.clientHeight) {\n return pop.addClass('pop-bottom');\n }\n };\n\n return EstimationProcess;\n\n })();\n create = function($el, us, project) {\n var estimationProcess;\n $el.unbind(\"click\");\n estimationProcess = new EstimationProcess($el, us, project);\n if (estimationProcess.isEditable) {\n estimationProcess.bindClickEvents();\n }\n return estimationProcess;\n };\n return {\n create: create\n };\n };\n\n module.factory(\"$tgEstimationsService\", [\"$tgTemplate\", \"$tgRepo\", \"$tgConfirm\", \"$q\", \"$tgQqueue\", EstimationsService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/filters.coffee\n */\n\n(function() {\n var byRefFilter, darkerFilter, defaultFilter, emojify, inArray, markdownToHTML, module, momentFormat, momentFromNow, sizeFormat, taiga, toMutableFilter, unslugify, yesNoFilter;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n defaultFilter = function() {\n return function(value, defaultValue) {\n if (value === [null, void 0]) {\n return defaultValue;\n }\n return value;\n };\n };\n\n module.filter(\"default\", defaultFilter);\n\n yesNoFilter = function($translate) {\n return function(value) {\n if (value) {\n return $translate.instant(\"COMMON.YES\");\n }\n return $translate.instant(\"COMMON.NO\");\n };\n };\n\n module.filter(\"yesNo\", [\"$translate\", yesNoFilter]);\n\n unslugify = function() {\n return taiga.unslugify;\n };\n\n module.filter(\"unslugify\", unslugify);\n\n momentFormat = function() {\n return function(input, format) {\n if (input) {\n return moment(input).format(format);\n }\n return \"\";\n };\n };\n\n module.filter(\"momentFormat\", momentFormat);\n\n momentFromNow = function() {\n return function(input, without_suffix) {\n if (input) {\n return moment(input).fromNow(without_suffix || false);\n }\n return \"\";\n };\n };\n\n module.filter(\"momentFromNow\", momentFromNow);\n\n sizeFormat = (function(_this) {\n return function() {\n return _this.taiga.sizeFormat;\n };\n })(this);\n\n module.filter(\"sizeFormat\", sizeFormat);\n\n toMutableFilter = function() {\n var memoizedMutable, toMutable;\n toMutable = function(js) {\n return js.toJS();\n };\n memoizedMutable = _.memoize(toMutable);\n return function(input) {\n if (input instanceof Immutable.List) {\n return memoizedMutable(input);\n }\n return input;\n };\n };\n\n module.filter(\"toMutable\", toMutableFilter);\n\n byRefFilter = function($filterFilter) {\n return function(userstories, filter) {\n var cleanRef;\n if (filter != null ? filter.startsWith(\"#\") : void 0) {\n cleanRef = filter.substr(1);\n return _.filter(userstories, (function(_this) {\n return function(us) {\n return String(us.ref).startsWith(cleanRef);\n };\n })(this));\n }\n return $filterFilter(userstories, filter);\n };\n };\n\n module.filter(\"byRef\", [\"filterFilter\", byRefFilter]);\n\n darkerFilter = function() {\n return function(color, luminosity) {\n var black, c, i, j, len, newColor, ref, white;\n color = new String(color).replace(/[^0-9a-f]/gi, '');\n if (color.length < 6) {\n color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];\n }\n luminosity = luminosity || 0;\n newColor = \"#\";\n c = 0;\n i = 0;\n black = 0;\n white = 255;\n ref = [0, 1, 2];\n for (j = 0, len = ref.length; j < len; j++) {\n i = ref[j];\n c = parseInt(color.substr(i * 2, 2), 16);\n c = Math.round(Math.min(Math.max(black, c + (luminosity * white)), white)).toString(16);\n newColor += (\"00\" + c).substr(c.length);\n }\n return newColor;\n };\n };\n\n module.filter(\"darker\", darkerFilter);\n\n markdownToHTML = function(wysiwigService) {\n return function(input) {\n if (input) {\n return wysiwigService.getHTML(input);\n }\n return \"\";\n };\n };\n\n module.filter(\"markdownToHTML\", [\"tgWysiwygService\", markdownToHTML]);\n\n inArray = function($filter) {\n return function(list, arrayFilter, element) {\n var filter;\n if (arrayFilter) {\n filter = $filter(\"filter\");\n return filter(list, function(listItem) {\n return arrayFilter.indexOf(listItem[element]) !== -1;\n });\n }\n };\n };\n\n module.filter(\"inArray\", [\"$filter\", inArray]);\n\n emojify = function($emojis) {\n return function(input) {\n if (input) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(input));\n }\n return \"\";\n };\n };\n\n module.filter(\"emojify\", [\"$tgEmojis\", emojify]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/lightboxes.coffee\n */\n\n(function() {\n var AssignedToLightboxDirective, AssignedUsersLightboxDirective, BlockLightboxDirective, BlockingMessageInputDirective, CreateBulkUserstoriesDirective, CreateEditUserstoryDirective, LightboxDirective, LightboxKeyboardNavigationService, LightboxLeaveProjectWarningDirective, LightboxService, SetDueDateDirective, WatchersLightboxDirective, bindOnce, debounce, module, sizeFormat, timeout, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n module = angular.module(\"taigaCommon\");\n\n bindOnce = this.taiga.bindOnce;\n\n timeout = this.taiga.timeout;\n\n debounce = this.taiga.debounce;\n\n sizeFormat = this.taiga.sizeFormat;\n\n trim = this.taiga.trim;\n\n LightboxService = (function(superClass) {\n extend(LightboxService, superClass);\n\n function LightboxService(animationFrame, q, rootScope) {\n this.animationFrame = animationFrame;\n this.q = q;\n this.rootScope = rootScope;\n }\n\n LightboxService.prototype.open = function($el, onClose, onEsc) {\n var defered, docEl, lightboxContent;\n this.onClose = onClose;\n if (_.isString($el)) {\n $el = $($el);\n }\n defered = this.q.defer();\n lightboxContent = $el.children().not(\".close\");\n lightboxContent.hide();\n this.animationFrame.add(function() {\n return $el.css('display', 'flex');\n });\n this.animationFrame.add(function() {\n $el.addClass(\"open\");\n return $el.one(\"transitionend\", (function(_this) {\n return function() {\n var firstField;\n firstField = $el.find('input:not(.no-focus),textarea:not(.no-focus)').first();\n if (firstField.length) {\n return firstField.focus();\n } else if (document.activeElement) {\n return $(document.activeElement).blur();\n }\n };\n })(this));\n });\n this.animationFrame.add((function(_this) {\n return function() {\n lightboxContent.show();\n return defered.resolve();\n };\n })(this));\n docEl = angular.element(document);\n docEl.on(\"keydown.lightbox\", (function(_this) {\n return function(e) {\n var code;\n code = e.keyCode ? e.keyCode : e.which;\n if (code === 27) {\n if (onEsc) {\n return _this.rootScope.$applyAsync(onEsc);\n } else {\n return _this.close($el);\n }\n }\n };\n })(this));\n return defered.promise;\n };\n\n LightboxService.prototype.close = function($el) {\n return new Promise((function(_this) {\n return function(resolve) {\n var docEl, scope;\n if (_.isString($el)) {\n $el = $($el);\n }\n docEl = angular.element(document);\n docEl.off(\".lightbox\");\n docEl.off(\".keyboard-navigation\");\n $el.addClass('close-started');\n _this.animationFrame.add(function() {\n $el.addClass('close');\n return $el.one(\"transitionend\", function() {\n $el.removeAttr('style');\n $el.removeClass(\"open\").removeClass('close').removeClass('close-started');\n if (_this.onClose) {\n _this.rootScope.$apply(_this.onClose);\n }\n return resolve();\n });\n });\n if ($el.hasClass(\"remove-on-close\")) {\n scope = $el.data(\"scope\");\n if (scope) {\n scope.$destroy();\n }\n return $el.remove();\n }\n };\n })(this));\n };\n\n LightboxService.prototype.getLightboxOpen = function() {\n return $(\".lightbox.open:not(.close-started)\");\n };\n\n LightboxService.prototype.closeAll = function() {\n var docEl, i, len, lightboxEl, ref, results;\n docEl = angular.element(document);\n ref = docEl.find(\".lightbox.open\");\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n lightboxEl = ref[i];\n results.push(this.close($(lightboxEl)));\n }\n return results;\n };\n\n return LightboxService;\n\n })(taiga.Service);\n\n module.service(\"lightboxService\", [\"animationFrame\", \"$q\", \"$rootScope\", LightboxService]);\n\n LightboxKeyboardNavigationService = (function(superClass) {\n extend(LightboxKeyboardNavigationService, superClass);\n\n function LightboxKeyboardNavigationService() {\n return LightboxKeyboardNavigationService.__super__.constructor.apply(this, arguments);\n }\n\n LightboxKeyboardNavigationService.prototype.stop = function() {\n var docEl;\n docEl = angular.element(document);\n return docEl.off(\".keyboard-navigation\");\n };\n\n LightboxKeyboardNavigationService.prototype.dispatch = function($el, code) {\n var activeElement, next, prev;\n activeElement = $el.find(\".selected\");\n if (code === 13) {\n if ($el.find(\".user-list-single\").length === 1) {\n return $el.find('.user-list-single:first').trigger(\"click\");\n } else {\n return activeElement.trigger(\"click\");\n }\n } else if (code === 40) {\n if (!activeElement.length) {\n return $el.find('.user-list-single:not(\".is-active\"):first').addClass('selected');\n } else {\n next = activeElement.next('.user-list-single');\n if (next.length) {\n activeElement.removeClass('selected');\n return next.addClass('selected');\n }\n }\n } else if (code === 38) {\n if (!activeElement.length) {\n return $el.find('.user-list-single:last').addClass('selected');\n } else {\n prev = activeElement.prev('.user-list-single:not(\".is-active\")');\n if (prev.length) {\n activeElement.removeClass('selected');\n return prev.addClass('selected');\n }\n }\n }\n };\n\n LightboxKeyboardNavigationService.prototype.init = function($el) {\n var docEl;\n this.stop();\n docEl = angular.element(document);\n return docEl.on(\"keydown.keyboard-navigation\", (function(_this) {\n return function(event) {\n var code;\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 40 || code === 38 || code === 13) {\n event.preventDefault();\n return _this.dispatch($el, code);\n }\n };\n })(this));\n };\n\n return LightboxKeyboardNavigationService;\n\n })(taiga.Service);\n\n module.service(\"lightboxKeyboardNavigationService\", LightboxKeyboardNavigationService);\n\n LightboxDirective = function(lightboxService) {\n var link;\n link = function($scope, $el, $attrs) {\n if (!$attrs.$attr.visible) {\n return $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n }\n };\n return {\n restrict: \"C\",\n link: link\n };\n };\n\n module.directive(\"lightbox\", [\"lightboxService\", LightboxDirective]);\n\n BlockLightboxDirective = function($rootscope, $tgrepo, $confirm, lightboxService, $loading, $modelTransform, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var block, title, unblock;\n title = $translate.instant($attrs.title);\n $el.find(\"h2.title\").text(title);\n unblock = (function(_this) {\n return function(finishCallback) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.is_blocked = false;\n item.blocked_note = \"\";\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n return finishCallback();\n });\n transform.then(null, function() {\n $confirm.notify(\"error\");\n return item.revert();\n });\n transform[\"finally\"](function() {\n return finishCallback();\n });\n return transform;\n };\n })(this);\n block = function() {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\".button-green\")).start();\n transform = $modelTransform.save(function(item) {\n item.is_blocked = true;\n item.blocked_note = $el.find(\".reason\").val();\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n $scope.$on(\"block\", function() {\n $el.find(\".reason\").val($model.$modelValue.blocked_note);\n return lightboxService.open($el);\n });\n $scope.$on(\"unblock\", (function(_this) {\n return function(event, model, finishCallback) {\n return unblock(finishCallback);\n };\n })(this));\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return block();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-block.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgLbBlock\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"lightboxService\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$translate\", BlockLightboxDirective]);\n\n BlockingMessageInputDirective = function($log, $template, $compile) {\n var link, template, templateFn;\n template = $template.get(\"common/lightbox/lightbox-blocking-message-input.html\", true);\n link = function($scope, $el, $attrs, $model) {\n if (!$attrs.watch) {\n return $log.error(\"No watch attribute on tg-blocking-message-input directive\");\n }\n return $scope.$watch($attrs.watch, function(value) {\n if (value === !void 0 && value === true) {\n return $el.find(\".blocked-note\").removeClass(\"hidden\");\n } else {\n return $el.find(\".blocked-note\").addClass(\"hidden\");\n }\n });\n };\n templateFn = function($el, $attrs) {\n return template({\n ngmodel: $attrs.ngModel\n });\n };\n return {\n template: templateFn,\n link: link,\n require: \"ngModel\",\n restrict: \"EA\"\n };\n };\n\n module.directive(\"tgBlockingMessageInput\", [\"$log\", \"$tgTemplate\", \"$compile\", BlockingMessageInputDirective]);\n\n CreateEditUserstoryDirective = function($repo, $model, $rs, $rootScope, lightboxService, $loading, $translate, $confirm, $q, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, close, createAttachments, deleteAttachments, form, resetAttachments, submit, submitButton;\n form = null;\n $scope.createEditUs = {};\n $scope.isNew = true;\n attachmentsToAdd = Immutable.List();\n attachmentsToDelete = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return attachmentsToDelete = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n if (attachment.get(\"id\")) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n }\n };\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.us.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([value, color]);\n return $scope.us.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.us.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.us.tags = itemtags;\n return _.pull($scope.us.tags, value);\n };\n $scope.$on(\"usform:new\", function(ctx, projectId, status, statusList) {\n if (form) {\n form.reset();\n }\n $scope.isNew = true;\n $scope.usStatusList = statusList;\n $scope.attachments = Immutable.List();\n resetAttachments();\n $scope.us = $model.make_model(\"userstories\", {\n project: projectId,\n points: {},\n status: status,\n is_archived: false,\n tags: [],\n subject: \"\",\n description: \"\"\n });\n $el.find(\".button-green\").html($translate.instant(\"COMMON.CREATE\"));\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.NEW_US\"));\n $el.find(\".tag-input\").val(\"\");\n $el.find(\".blocked-note\").addClass(\"hidden\");\n $el.find(\"label.blocked\").removeClass(\"selected\");\n $el.find(\"label.team-requirement\").removeClass(\"selected\");\n $el.find(\"label.client-requirement\").removeClass(\"selected\");\n $scope.createEditUsOpen = true;\n return lightboxService.open($el, function() {\n return $scope.createEditUsOpen = false;\n });\n });\n $scope.$on(\"usform:edit\", function(ctx, us, attachments) {\n if (form) {\n form.reset();\n }\n $scope.us = us;\n $scope.attachments = Immutable.fromJS(attachments);\n $scope.isNew = false;\n resetAttachments();\n $el.find(\".button-green\").html($translate.instant(\"COMMON.SAVE\"));\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.EDIT_US\"));\n $el.find(\".tag-input\").val(\"\");\n if (us.is_blocked) {\n $el.find(\".blocked-note\").removeClass(\"hidden\");\n $el.find(\"label.blocked\").addClass(\"selected\");\n } else {\n $el.find(\".blocked-note\").addClass(\"hidden\");\n $el.find(\"label.blocked\").removeClass(\"selected\");\n }\n if (us.team_requirement) {\n $el.find(\"label.team-requirement\").addClass(\"selected\");\n } else {\n $el.find(\"label.team-requirement\").removeClass(\"selected\");\n }\n if (us.client_requirement) {\n $el.find(\"label.client-requirement\").addClass(\"selected\");\n } else {\n $el.find(\"label.client-requirement\").removeClass(\"selected\");\n }\n $scope.createEditUsOpen = true;\n return lightboxService.open($el, function() {\n return $scope.createEditUsOpen = false;\n });\n });\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.us.project, 'us');\n });\n return $q.all(promises);\n };\n deleteAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"us\", attachment.id);\n });\n return $q.all(promises);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, params, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n params = {\n include_attachments: true,\n include_tasks: true\n };\n if ($scope.isNew) {\n promise = $repo.create(\"userstories\", $scope.us);\n broadcastEvent = \"usform:new:success\";\n } else {\n promise = $repo.save($scope.us, true);\n broadcastEvent = \"usform:edit:success\";\n }\n promise.then(function(data) {\n return deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this)).then((function(_this) {\n return function() {\n currentLoading.finish();\n lightboxService.close($el);\n return $rs.userstories.getByRef(data.project, data.ref, params).then(function(us) {\n return $rootScope.$broadcast(broadcastEvent, us);\n });\n };\n })(this));\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n close = (function(_this) {\n return function() {\n if (!$scope.us.isModified()) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.us.revert();\n });\n } else {\n return $confirm.ask($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.CONFIRM_CLOSE\")).then(function(result) {\n lightboxService.close($el);\n $scope.us.revert();\n return result.finish();\n });\n }\n };\n })(this);\n $el.on(\"submit\", \"form\", submit);\n $el.find('.close').on(\"click\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return close();\n });\n $el.keydown(function(event) {\n var code;\n event.stopPropagation();\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n return close();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.find('.close').off();\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateEditUserstory\", [\"$tgRepo\", \"$tgModel\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$translate\", \"$tgConfirm\", \"$q\", \"tgAttachmentsService\", CreateEditUserstoryDirective]);\n\n CreateBulkUserstoriesDirective = function($repo, $rs, $rootscope, lightboxService, $loading, $model) {\n var link;\n link = function($scope, $el, attrs) {\n var form, submit, submitButton;\n form = null;\n $scope.$on(\"usform:bulk\", function(ctx, projectId, status) {\n if (form) {\n form.reset();\n }\n $scope[\"new\"] = {\n projectId: projectId,\n statusId: status,\n bulk: \"\"\n };\n return lightboxService.open($el);\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley({\n onlyOneErrorElement: true\n });\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $rs.userstories.bulkCreate($scope[\"new\"].projectId, $scope[\"new\"].statusId, $scope[\"new\"].bulk);\n promise.then(function(result) {\n result = _.map(result.data, (function(_this) {\n return function(x) {\n return $model.make_model('userstories', x);\n };\n })(this));\n currentLoading.finish();\n $rootscope.$broadcast(\"usform:bulk:success\", result);\n return lightboxService.close($el);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateBulkUserstories\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$tgModel\", CreateBulkUserstoriesDirective]);\n\n AssignedToLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, filterUsers, normalizeString, render, selectedItem, selectedUser, usersTemplate;\n selectedUser = null;\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true);\n normalizeString = function(string) {\n var normalizedString;\n normalizedString = string;\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\");\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\");\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\");\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\");\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\");\n return normalizedString;\n };\n filterUsers = function(text, user) {\n var username;\n username = user.full_name_display.toUpperCase();\n username = normalizeString(username);\n text = text.toUpperCase();\n text = normalizeString(text);\n return _.includes(username, text);\n };\n render = function(selected, text) {\n var ctx, html, users, visibleUsers;\n users = _.clone($scope.activeUsers, true);\n if (selected != null) {\n users = _.reject(users, {\n \"id\": selected.id\n });\n }\n users = _.sortBy(users, function(o) {\n if (o.id === $scope.user.id) {\n return 0;\n } else {\n return o.id;\n }\n });\n if (text != null) {\n users = _.filter(users, _.partial(filterUsers, text));\n }\n visibleUsers = _.slice(users, 0, 5);\n visibleUsers = _.map(visibleUsers, function(user) {\n return user.avatar = avatarService.getAvatar(user);\n });\n if (selected) {\n if (selected) {\n selected.avatar = avatarService.getAvatar(selected);\n }\n }\n ctx = {\n selected: selected,\n users: _.slice(users, 0, 5),\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".assigned-to-list\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"assigned-to:add\", function(ctx, item) {\n var assignedToId;\n selectedItem = item;\n assignedToId = item.assigned_to;\n selectedUser = $scope.usersById[assignedToId];\n render(selectedUser);\n return lightboxService.open($el).then(function() {\n $el.find('input').focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n if (searchingText != null) {\n render(selectedUser, searchingText);\n return $el.find('input').focus();\n }\n });\n $el.on(\"click\", \".user-list-single\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n closeLightbox();\n return $scope.$apply(function() {\n $scope.$broadcast(\"assigned-to:added\", target.data(\"user-id\"), selectedItem);\n return $scope.usersSearch = null;\n });\n });\n $el.on(\"click\", \".remove-assigned-to\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n closeLightbox();\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"assigned-to:added\", null, selectedItem);\n });\n });\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n closeLightbox();\n return $scope.$apply(function() {\n return $scope.usersSearch = null;\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-assigned-to.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbAssignedto\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", \"tgAvatarService\", AssignedToLightboxDirective]);\n\n AssignedUsersLightboxDirective = function($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, filterUsers, normalizeString, render, selectedItem, selectedUsers, usersTemplate;\n selectedUsers = [];\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-users-users.html\", true);\n normalizeString = function(string) {\n var normalizedString;\n normalizedString = string;\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\");\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\");\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\");\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\");\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\");\n return normalizedString;\n };\n filterUsers = function(text, user) {\n var username;\n username = user.full_name_display.toUpperCase();\n username = normalizeString(username);\n text = text.toUpperCase();\n text = normalizeString(text);\n return _.includes(username, text);\n };\n render = function(assignedUsersIds, text) {\n var ctx, html, selected, users, visible;\n users = _.clone($scope.activeUsers, true);\n users = _.sortBy(users, function(o) {\n if (o.id === $scope.user.id) {\n return 0;\n } else {\n return o.id;\n }\n });\n if (text != null) {\n users = _.filter(users, _.partial(filterUsers, text));\n }\n selected = [];\n _.map(users, function(user) {\n var ref;\n if (ref = user.id, indexOf.call(assignedUsersIds, ref) >= 0) {\n user.avatar = avatarService.getAvatar(user);\n return selected.push(user);\n }\n });\n visible = [];\n _.map(users, function(user) {\n var ref;\n if (ref = user.id, indexOf.call(assignedUsersIds, ref) < 0) {\n user.avatar = avatarService.getAvatar(user);\n return visible.push(user);\n }\n });\n ctx = {\n selected: selected,\n users: _.slice(visible, 0, 5),\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".assigned-to-list\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"assigned-user:add\", function(ctx, item) {\n selectedItem = item;\n selectedUsers = item.assigned_users;\n render(selectedUsers);\n return lightboxService.open($el).then(function() {\n $el.find(\"input\").focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n if (searchingText != null) {\n render(selectedUsers, searchingText);\n return $el.find('input').focus();\n }\n });\n $el.on(\"click\", \".user-list-single\", debounce(200, function(event) {\n var target;\n closeLightbox();\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"assigned-user:added\", target.data(\"user-id\"), selectedItem);\n });\n }));\n $el.on(\"click\", \".remove-assigned-to\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n event.stopPropagation();\n $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"assigned-user:deleted\", target.data(\"user-id\"), selectedItem);\n });\n return closeLightbox();\n });\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return closeLightbox();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-assigned-users.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbAssignedUsers\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", \"tgAvatarService\", AssignedUsersLightboxDirective]);\n\n WatchersLightboxDirective = function($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, getFilteredUsers, render, selectedItem, usersTemplate;\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true);\n getFilteredUsers = function(text) {\n var _filterUsers, users;\n if (text == null) {\n text = \"\";\n }\n _filterUsers = function(text, user) {\n var username;\n if (selectedItem && _.find(selectedItem.watchers, function(x) {\n return x === user.id;\n })) {\n return false;\n }\n username = user.full_name_display.toUpperCase();\n text = text.toUpperCase();\n return _.includes(username, text);\n };\n users = _.clone($scope.activeUsers, true);\n users = _.filter(users, _.partial(_filterUsers, text));\n return users;\n };\n render = function(users) {\n var ctx, html, visibleUsers;\n visibleUsers = _.slice(users, 0, 5);\n visibleUsers = _.map(visibleUsers, function(user) {\n user.avatar = avatarService.getAvatar(user);\n return user;\n });\n ctx = {\n selected: false,\n users: visibleUsers,\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".ticket-watchers\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"watcher:add\", function(ctx, item) {\n var users;\n selectedItem = item;\n users = getFilteredUsers();\n render(users);\n return lightboxService.open($el).then(function() {\n $el.find(\"input\").focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n var users;\n if (searchingText == null) {\n return;\n }\n users = getFilteredUsers(searchingText);\n render(users);\n return $el.find(\"input\").focus();\n });\n $el.on(\"click\", \".user-list-single\", debounce(200, function(event) {\n var target;\n closeLightbox();\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"watcher:added\", target.data(\"user-id\"));\n });\n }));\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n closeLightbox();\n return $scope.$apply(function() {\n return $scope.usersSearch = null;\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-users.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbWatchers\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", \"tgAvatarService\", WatchersLightboxDirective]);\n\n LightboxLeaveProjectWarningDirective = function(lightboxService, $template, $compile) {\n var link;\n link = function($scope, $el, attrs) {\n return lightboxService.open($el);\n };\n return {\n templateUrl: 'common/lightbox/lightbox-leave-project-warning.html',\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgLightboxLeaveProjectWarning\", [\"lightboxService\", LightboxLeaveProjectWarningDirective]);\n\n SetDueDateDirective = function(lightboxService, $loading, $translate, $confirm, $modelTransform) {\n var link;\n link = function($scope, $el, attrs) {\n var prettyDate, remove, save;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n lightboxService.open($el);\n if ($scope.object.due_date) {\n $scope.new_due_date = moment($scope.object.due_date).format(prettyDate);\n }\n $el.on(\"click\", \".suggestion\", function(event) {\n var quantity, target, unit, value;\n target = angular.element(event.currentTarget);\n quantity = target.data('quantity');\n unit = target.data('unit');\n value = moment().add(quantity, unit).format(prettyDate);\n return $el.find(\".due-date\").val(value);\n });\n save = function() {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\".submit-button\")).start();\n transform = $modelTransform.save(function(object) {\n var new_due_date;\n new_due_date = $('.due-date').val();\n object.due_date = new_due_date ? moment(new_due_date, prettyDate).format(\"YYYY-MM-DD\") : null;\n return object;\n });\n transform.then(function() {\n return $confirm.notify(\"success\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n $el.on(\"click\", \".submit-button\", function(event) {\n event.preventDefault();\n return save();\n });\n remove = function() {\n var message, subtitle, title;\n title = $translate.instant(\"LIGHTBOX.DELETE_DUE_DATE.TITLE\");\n subtitle = $translate.instant(\"LIGHTBOX.DELETE_DUE_DATE.SUBTITLE\");\n message = moment($scope.object.due_date).format(prettyDate);\n return $confirm.askOnDelete(title, message, subtitle).then(function(askResponse) {\n askResponse.finish();\n $('.due-date').val(null);\n $scope.object.due_date_reason = null;\n return save();\n });\n };\n return $el.on(\"click\", \".delete-due-date\", function(event) {\n event.preventDefault();\n return remove();\n });\n };\n return {\n templateUrl: 'common/lightbox/lightbox-due-date.html',\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgLbSetDueDate\", [\"lightboxService\", \"$tgLoading\", \"$translate\", \"$tgConfirm\", \"$tgQueueModelTransformation\", SetDueDateDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/loader.coffee\n */\n\n(function() {\n var Loader, LoaderDirective, module, sizeFormat, taiga, timeout;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaCommon\");\n\n LoaderDirective = function(tgLoader, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n tgLoader.onStart(function() {\n $(document.body).addClass(\"loader-active\");\n return $el.addClass(\"active\");\n });\n return tgLoader.onEnd(function() {\n $(document.body).removeClass(\"loader-active\");\n return $el.removeClass(\"active\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLoader\", [\"tgLoader\", \"$rootScope\", LoaderDirective]);\n\n Loader = function($rootscope) {\n var autoClose, config, lastResponseDate, open, pageLoaded, requestCount, start, startLoadTime;\n config = {\n minTime: 300\n };\n open = false;\n startLoadTime = 0;\n requestCount = 0;\n lastResponseDate = 0;\n pageLoaded = function(force) {\n var diff, endTime, timeoutValue;\n if (force == null) {\n force = false;\n }\n if (startLoadTime) {\n timeoutValue = 0;\n if (!force) {\n endTime = new Date().getTime();\n diff = endTime - startLoadTime;\n if (diff < config.minTime) {\n timeoutValue = config.minTime - diff;\n }\n }\n timeout(timeoutValue, function() {\n $rootscope.$broadcast(\"loader:end\");\n open = false;\n return window.prerenderReady = true;\n });\n }\n startLoadTime = 0;\n requestCount = 0;\n return lastResponseDate = 0;\n };\n autoClose = function() {\n var intervalAuto;\n return intervalAuto = setInterval((function() {\n if (lastResponseDate && requestCount === 0) {\n pageLoaded();\n return clearInterval(intervalAuto);\n }\n }), 50);\n };\n start = function() {\n startLoadTime = new Date().getTime();\n $rootscope.$broadcast(\"loader:start\");\n return open = true;\n };\n return {\n pageLoaded: pageLoaded,\n open: function() {\n return open;\n },\n start: function(auto) {\n if (auto == null) {\n auto = false;\n }\n if (!open) {\n start();\n if (auto) {\n return autoClose();\n }\n }\n },\n onStart: function(fn) {\n return $rootscope.$on(\"loader:start\", fn);\n },\n onEnd: function(fn) {\n return $rootscope.$on(\"loader:end\", fn);\n },\n logRequest: function() {\n return requestCount++;\n },\n logResponse: function() {\n requestCount--;\n return lastResponseDate = new Date().getTime();\n }\n };\n };\n\n Loader.$inject = [\"$rootScope\"];\n\n module.factory(\"tgLoader\", Loader);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/lightboxes.coffee\n */\n\n(function() {\n var LoadingDirective, TgLoadingService, module,\n slice = [].slice;\n\n module = angular.module(\"taigaCommon\");\n\n TgLoadingService = function($compile) {\n var spinner;\n spinner = \"loading...\";\n return function() {\n var service;\n service = {\n settings: {\n target: null,\n scope: null,\n classes: [],\n timeout: 0,\n template: null\n },\n target: function(target) {\n service.settings.target = target;\n return service;\n },\n scope: function(scope) {\n service.settings.scope = scope;\n return service;\n },\n template: function(template) {\n service.settings.template = template;\n return service;\n },\n removeClasses: function() {\n var classess;\n classess = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n service.settings.classes = classess;\n return service;\n },\n timeout: function(timeout) {\n service.settings.timeout = timeout;\n return service;\n },\n start: function() {\n var target, timeoutId;\n target = service.settings.target;\n service.settings.classes.map(function(className) {\n return target.removeClass(className);\n });\n if (!target.hasClass('loading') && !service.settings.template) {\n service.settings.template = target.html();\n }\n timeoutId = setTimeout((function() {\n if (!target.hasClass('loading')) {\n target.addClass('loading');\n return target.html(spinner);\n }\n }), service.settings.timeout);\n service.settings.timeoutId = timeoutId;\n return service;\n },\n finish: function() {\n var removeClasses, target, timeoutId;\n target = service.settings.target;\n timeoutId = service.settings.timeoutId;\n if (timeoutId) {\n clearTimeout(timeoutId);\n removeClasses = service.settings.classes;\n removeClasses.map(function(className) {\n return service.settings.target.addClass(className);\n });\n target.html(service.settings.template);\n target.removeClass('loading');\n if (service.settings.scope) {\n $compile(target.contents())(service.settings.scope);\n }\n }\n return service;\n }\n };\n return service;\n };\n };\n\n TgLoadingService.$inject = [\"$compile\"];\n\n module.factory(\"$tgLoading\", TgLoadingService);\n\n LoadingDirective = function($loading) {\n var link;\n link = function($scope, $el, attr) {\n var currentLoading, template;\n currentLoading = null;\n template = $el.html();\n return $scope.$watch(attr.tgLoading, (function(_this) {\n return function(showLoading) {\n if (showLoading) {\n return currentLoading = $loading().target($el).timeout(100).template(template).scope($scope).start();\n } else if (currentLoading) {\n return currentLoading.finish();\n }\n };\n })(this));\n };\n return {\n priority: 99999,\n link: link\n };\n };\n\n module.directive(\"tgLoading\", [\"$tgLoading\", LoadingDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/popovers.coffee\n */\n\n(function() {\n var RelatedTaskStatusDirective, UsStatusDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaCommon\");\n\n UsStatusDirective = function($repo, $template) {\n\n /*\n Print the status of a US and a popover to change it.\n - tg-us-status: The user story\n - on-update: Method call after US is updated\n \n Example:\n \n div.status(tg-us-status=\"us\" on-update=\"ctrl.loadSprintState()\")\n a.us-status(href=\"\", title=\"Status Name\")\n \n NOTE: This directive need 'usStatusById' and 'project'.\n */\n var link, template;\n template = $template.get(\"common/popover/popover-us-status.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, render, us;\n $ctrl = $el.controller();\n render = function(us) {\n var usStatusById, usStatusDom, usStatusDomParent;\n usStatusDomParent = $el.find(\".us-status\");\n usStatusDom = $el.find(\".us-status .us-status-bind\");\n usStatusById = $scope.usStatusById;\n if (usStatusById[us.status]) {\n usStatusDom.text(usStatusById[us.status].name);\n return usStatusDomParent.css(\"color\", usStatusById[us.status].color);\n }\n };\n $el.on(\"click\", \".us-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", debounce(2000, function(event) {\n var target, us;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n us = $scope.$eval($attrs.tgUsStatus);\n us.status = target.data(\"status-id\");\n render(us);\n $el.find(\".pop-status\").popover().close();\n return $scope.$apply(function() {\n return $repo.save(us).then(function() {\n return $scope.$eval($attrs.onUpdate);\n });\n });\n }));\n $scope.$on(\"userstories:loaded\", function() {\n return render($scope.$eval($attrs.tgUsStatus));\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n us = $scope.$eval($attrs.tgUsStatus);\n render(us);\n return bindOnce($scope, \"project\", function(project) {\n var html;\n html = template({\n \"statuses\": project.us_statuses\n });\n $el.append(html);\n if ($scope.project.my_permissions.indexOf(\"modify_us\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUsStatus\", [\"$tgRepo\", \"$tgTemplate\", UsStatusDirective]);\n\n RelatedTaskStatusDirective = function($repo, $template) {\n\n /*\n Print the status of a related task and a popover to change it.\n - tg-related-task-status: The related task\n - on-update: Method call after US is updated\n \n Example:\n \n div.status(tg-related-task-status=\"task\" on-update=\"ctrl.loadSprintState()\")\n a.task-status(href=\"\", title=\"Status Name\")\n \n NOTE: This directive need 'taskStatusById' and 'project'.\n */\n var link, selectionTemplate, updateTaskStatus;\n selectionTemplate = $template.get(\"common/popover/popover-related-task-status.html\", true);\n updateTaskStatus = function($el, task, taskStatusById) {\n var taskStatusDom, taskStatusDomParent;\n taskStatusDomParent = $el.find(\".us-status\");\n taskStatusDom = $el.find(\".task-status .task-status-bind\");\n if (taskStatusById[task.status]) {\n taskStatusDom.text(taskStatusById[task.status].name);\n return taskStatusDomParent.css('color', taskStatusById[task.status].color);\n }\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task;\n $ctrl = $el.controller();\n task = $scope.$eval($attrs.tgRelatedTaskStatus);\n notAutoSave = $scope.$eval($attrs.notAutoSave);\n autoSave = !notAutoSave;\n $el.on(\"click\", \".task-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n task.status = target.data(\"status-id\");\n $el.find(\".pop-status\").popover().close();\n updateTaskStatus($el, task, $scope.taskStatusById);\n if (autoSave) {\n return $scope.$apply(function() {\n return $repo.save(task).then(function() {\n $scope.$eval($attrs.onUpdate);\n return $scope.$emit(\"related-tasks:status-changed\");\n });\n });\n }\n }));\n $scope.$watch($attrs.tgRelatedTaskStatus, function() {\n task = $scope.$eval($attrs.tgRelatedTaskStatus);\n return updateTaskStatus($el, task, $scope.taskStatusById);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n $el.append(selectionTemplate({\n 'statuses': project.task_statuses\n }));\n updateTaskStatus($el, task, $scope.taskStatusById);\n if (project.my_permissions.indexOf(\"modify_task\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskStatus\", [\"$tgRepo\", \"$tgTemplate\", RelatedTaskStatusDirective]);\n\n $.fn.popover = function() {\n var $el, close, closeAll, closePopover, isVisible, open;\n $el = this;\n isVisible = (function(_this) {\n return function() {\n var docViewBottom, docViewLeft, docViewRight, docViewTop, docViewWidth, elemBottom, elemLeft, elemRight, elemTop, elemWidth;\n $el.css({\n \"display\": \"block\",\n \"visibility\": \"hidden\"\n });\n docViewTop = $(window).scrollTop();\n docViewBottom = docViewTop + $(window).height();\n docViewWidth = $(window).width();\n docViewRight = docViewWidth;\n docViewLeft = 0;\n elemTop = $el.offset().top;\n elemBottom = elemTop + $el.height();\n elemWidth = $el.width();\n elemLeft = $el.offset().left;\n elemRight = $el.offset().left + elemWidth;\n $el.css({\n \"display\": \"none\",\n \"visibility\": \"visible\"\n });\n return (elemBottom <= docViewBottom) && (elemTop >= docViewTop) && (elemLeft >= docViewLeft) && (elemRight <= docViewRight);\n };\n })(this);\n closePopover = (function(_this) {\n return function(onClose) {\n if (onClose) {\n onClose.call($el);\n }\n $el.fadeOut(function() {\n return $el.removeClass(\"active\").removeClass(\"fix\");\n });\n return $el.off(\"popup:close\");\n };\n })(this);\n closeAll = (function(_this) {\n return function() {\n return $(\".popover.active\").each(function() {\n return $(this).trigger(\"popup:close\");\n });\n };\n })(this);\n open = (function(_this) {\n return function(onClose) {\n if ($el.hasClass(\"active\")) {\n return close();\n } else {\n closeAll();\n if (!isVisible()) {\n $el.addClass(\"fix\");\n }\n $el.fadeIn(function() {\n $el.addClass(\"active\");\n $(document.body).off(\"popover\");\n return $(document.body).one(\"click.popover\", function() {\n return closeAll();\n });\n });\n return $el.on(\"popup:close\", function(e) {\n return closePopover(onClose);\n });\n }\n };\n })(this);\n close = (function(_this) {\n return function() {\n return $el.trigger(\"popup:close\");\n };\n })(this);\n return {\n open: open,\n close: close,\n closeAll: closeAll\n };\n };\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/raven-logger.coffee\n */\n\n(function() {\n var ExceptionHandlerFactory, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n ExceptionHandlerFactory = function($log, config) {\n var ravenConfig;\n this.config = config;\n ravenConfig = this.config.get(\"ravenConfig\", null);\n if (ravenConfig) {\n $log.debug(\"Using the RavenJS exception handler.\");\n Raven.config(ravenConfig).install();\n return function(exception, cause) {\n $log.error.apply($log, arguments);\n return Raven.captureException(exception);\n };\n } else {\n $log.debug(\"Using the default logging exception handler.\");\n return function(exception, cause) {\n return $log.error.apply($log, arguments);\n };\n }\n };\n\n module.factory(\"$exceptionHandler\", [\"$log\", \"$tgConfig\", ExceptionHandlerFactory]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/tags.coffee\n */\n\n(function() {\n var ColorizeTagsBacklogDirective, LbTagLineDirective, TagsDirective, bindOnce, module, taiga, trim,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n TagsDirective = function() {\n var formatter, link, parser;\n formatter = function(v) {\n if (_.isArray(v)) {\n return v.join(\", \");\n }\n return \"\";\n };\n parser = function(v) {\n var result;\n if (!v) {\n return [];\n }\n result = _(v.split(\",\")).map(function(x) {\n return _.trim(x);\n });\n return result.value();\n };\n link = function($scope, $el, $attrs, $ctrl) {\n $ctrl.$formatters.push(formatter);\n $ctrl.$parsers.push(parser);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n require: \"ngModel\",\n link: link\n };\n };\n\n module.directive(\"tgTags\", TagsDirective);\n\n ColorizeTagsBacklogDirective = function($emojis) {\n var link, template;\n template = _.template(\"<% _.each(tags, function(tag) { %>\\n <% if (tag[1] !== null) { %>\\n \\\"\\n title=\\\"<%- tag[0] %>\\\">\\n <%= emojify(tag[0]) %>\\n \\n <% } %>\\n<% }) %>\\n<% _.each(tags, function(tag) { %>\\n <% if (tag[1] === null) { %>\\n \\\">\\n <%= emojify(tag[0]) %>\\n \\n <% } %>\\n<% }) %>\");\n link = function($scope, $el, $attrs, $ctrl) {\n var render;\n render = function(tags) {\n var html;\n html = template({\n tags: tags,\n emojify: function(text) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(text));\n }\n });\n return $el.html(html);\n };\n $scope.$watch($attrs.tgColorizeBacklogTags, function(tags) {\n if (tags != null) {\n return render(tags);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgColorizeBacklogTags\", [\"$tgEmojis\", ColorizeTagsBacklogDirective]);\n\n LbTagLineDirective = function($rs, $template, $compile) {\n var COMMA_KEY, ENTER_KEY, autocomplete, link, templateTags;\n ENTER_KEY = 13;\n COMMA_KEY = 188;\n templateTags = $template.get(\"common/tag/lb-tag-line-tags.html\", true);\n autocomplete = null;\n link = function($scope, $el, $attrs, $model) {\n var addValue, deleteValue, hideSaveButton, renderTags, resetInput, saveInputTag, showSaveButton, withoutColors;\n withoutColors = _.has($attrs, \"withoutColors\");\n renderTags = function(tags, tagsColors) {\n var color, ctx, html;\n if (tagsColors == null) {\n tagsColors = [];\n }\n color = !withoutColors ? tagsColors[t] : null;\n ctx = {\n tags: _.map(tags, function(t) {\n return {\n name: t,\n style: color ? \"border-left: 5px solid \" + color : \"\"\n };\n })\n };\n html = $compile(templateTags(ctx))($scope);\n return $el.find(\".tags-container\").html(html);\n };\n showSaveButton = function() {\n return $el.find(\".save\").removeClass(\"hidden\");\n };\n hideSaveButton = function() {\n return $el.find(\".save\").addClass(\"hidden\");\n };\n resetInput = function() {\n $el.find(\"input\").val(\"\");\n return autocomplete.close();\n };\n addValue = function(value) {\n var tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue, false);\n if (tags == null) {\n tags = [];\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n $scope.$apply(function() {\n return $model.$setViewValue(tags);\n });\n return hideSaveButton();\n };\n deleteValue = function(value) {\n var tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue, false);\n tags = _.pull(tags, value);\n return $scope.$apply(function() {\n return $model.$setViewValue(tags);\n });\n };\n saveInputTag = function() {\n var value;\n value = $el.find(\"input\").val();\n addValue(value);\n return resetInput();\n };\n $el.on(\"keypress\", \"input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === ENTER_KEY) {\n event.preventDefault();\n return saveInputTag();\n } else if (String.fromCharCode(event.keyCode) === ',') {\n event.preventDefault();\n return saveInputTag();\n } else {\n if (target.val().length) {\n return showSaveButton();\n } else {\n return hideSaveButton();\n }\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return saveInputTag();\n });\n $el.on(\"click\", \".remove-tag\", function(event) {\n var target, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n value = target.siblings(\".tag-name\").text();\n return deleteValue(value);\n });\n bindOnce($scope, \"project\", function(project) {\n var input;\n input = $el.find(\"input\");\n autocomplete = new Awesomplete(input[0], {\n list: _.keys(project.tags_colors)\n });\n return input.on(\"awesomplete-selectcomplete\", function() {\n addValue(input.val());\n return input.val(\"\");\n });\n });\n $scope.$watch($attrs.ngModel, function(tags) {\n var ref, tagsColors;\n tagsColors = ((ref = $scope.project) != null ? ref.tags_colors : void 0) || [];\n return renderTags(tags, tagsColors);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\",\n templateUrl: \"common/tag/lb-tag-line.html\"\n };\n };\n\n module.directive(\"tgLbTagLine\", [\"$tgResources\", \"$tgTemplate\", \"$compile\", LbTagLineDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/lightboxes.coffee\n */\n\n(function() {\n var CreateEditSprint, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaBacklog\");\n\n CreateEditSprint = function($repo, $confirm, $rs, $rootscope, lightboxService, $loading, $translate) {\n var link;\n link = function($scope, $el, attrs) {\n var createSprint, form, getLastSprint, hasErrors, remove, resetSprint, submit, ussToAdd;\n hasErrors = false;\n createSprint = true;\n form = null;\n $scope.newSprint = {};\n ussToAdd = null;\n resetSprint = function() {\n if (form) {\n form.reset();\n }\n return $scope.newSprint = {\n project: null,\n name: null,\n estimated_start: null,\n estimated_finish: null\n };\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, estimated_end, estimated_start, newSprint, prettyDate, promise, submitButton, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n submitButton = $el.find(\".submit-button\");\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n hasErrors = true;\n $el.find(\".last-sprint-name\").addClass(\"disappear\");\n return;\n }\n hasErrors = false;\n broadcastEvent = null;\n estimated_start = $('.date-start').val();\n estimated_end = $('.date-end').val();\n if (createSprint) {\n newSprint = angular.copy($scope.newSprint);\n newSprint.estimated_start = moment(estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(estimated_end, prettyDate).format(\"YYYY-MM-DD\");\n promise = $repo.create(\"milestones\", newSprint);\n broadcastEvent = \"sprintform:create:success\";\n } else {\n newSprint = $scope.newSprint.realClone();\n newSprint.estimated_start = moment(estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(estimated_end, prettyDate).format(\"YYYY-MM-DD\");\n promise = $repo.save(newSprint);\n broadcastEvent = \"sprintform:edit:success\";\n }\n currentLoading = $loading().target(submitButton).start();\n promise.then(function(data) {\n currentLoading.finish();\n if (createSprint) {\n $scope.sprintsCounter += 1;\n }\n $scope.sprints = _.map($scope.sprints, function(it) {\n if (it.id === data.id) {\n return data;\n } else {\n return it;\n }\n });\n if (broadcastEvent === \"sprintform:create:success\" && ussToAdd) {\n $rootscope.$broadcast(broadcastEvent, data, ussToAdd);\n } else {\n $rootscope.$broadcast(broadcastEvent, data);\n }\n return lightboxService.close($el);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"light-error\", data._error_message);\n } else if (data.__all__) {\n return $confirm.notify(\"light-error\", data.__all__[0]);\n }\n });\n };\n })(this));\n remove = function() {\n var message, title;\n title = $translate.instant(\"LIGHTBOX.DELETE_SPRINT.TITLE\");\n message = $scope.newSprint.name;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onSuccess = function() {\n askResponse.finish();\n $scope.milestonesCounter -= 1;\n lightboxService.close($el);\n return $rootscope.$broadcast(\"sprintform:remove:success\", $scope.newSprint);\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove($scope.newSprint).then(onSuccess, onError);\n };\n })(this));\n };\n getLastSprint = function() {\n var openSprints, sortedSprints;\n openSprints = _.filter($scope.sprints, function(sprint) {\n return !sprint.closed;\n });\n sortedSprints = _.sortBy(openSprints, function(sprint) {\n return moment(sprint.estimated_finish, 'YYYY-MM-DD').format('X');\n });\n return sortedSprints[sortedSprints.length - 1];\n };\n $scope.$on(\"sprintform:create\", function(event, projectId, uss) {\n var estimatedFinish, estimatedStart, lastSprint, lastSprintNameDom, prettyDate, text;\n ussToAdd = uss;\n resetSprint();\n form = $el.find(\"form\").checksley();\n form.reset();\n createSprint = true;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.newSprint.project = projectId;\n $scope.newSprint.name = null;\n $scope.newSprint.slug = null;\n lastSprint = getLastSprint();\n estimatedStart = moment();\n if (lastSprint) {\n estimatedStart = moment(lastSprint.estimated_finish);\n } else if ($scope.newSprint.estimated_start) {\n estimatedStart = moment($scope.newSprint.estimated_start);\n }\n $scope.newSprint.estimated_start = estimatedStart.format(prettyDate);\n estimatedFinish = moment().add(2, \"weeks\");\n if (lastSprint) {\n estimatedFinish = moment(lastSprint.estimated_finish).add(2, \"weeks\");\n } else if ($scope.newSprint.estimated_finish) {\n estimatedFinish = moment($scope.newSprint.estimated_finish);\n }\n $scope.newSprint.estimated_finish = estimatedFinish.format(prettyDate);\n lastSprintNameDom = $el.find(\".last-sprint-name\");\n if ((lastSprint != null ? lastSprint.name : void 0) != null) {\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME\", {\n lastSprint: lastSprint.name\n });\n lastSprintNameDom.html(text);\n }\n $el.find(\".delete-sprint\").addClass(\"hidden\");\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.TITLE\");\n $el.find(\".title\").text(text);\n text = $translate.instant(\"COMMON.CREATE\");\n $el.find(\".button-green\").text(text);\n lightboxService.open($el);\n $el.find(\".sprint-name\").focus();\n return $el.find(\".last-sprint-name\").removeClass(\"disappear\");\n });\n $scope.$on(\"sprintform:edit\", function(ctx, sprint) {\n var editSprint, prettyDate, save;\n resetSprint();\n createSprint = false;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.$apply(function() {\n $scope.newSprint = sprint.realClone();\n $scope.newSprint.estimated_start = moment($scope.newSprint.estimated_start).format(prettyDate);\n return $scope.newSprint.estimated_finish = moment($scope.newSprint.estimated_finish).format(prettyDate);\n });\n $el.find(\".delete-sprint\").removeClass(\"hidden\");\n editSprint = $translate.instant(\"BACKLOG.EDIT_SPRINT\");\n $el.find(\".title\").text(editSprint);\n save = $translate.instant(\"COMMON.SAVE\");\n $el.find(\".button-green\").text(save);\n lightboxService.open($el);\n $el.find(\".sprint-name\").focus().select();\n return $el.find(\".last-sprint-name\").addClass(\"disappear\");\n });\n $el.on(\"keyup\", \".sprint-name\", function(event) {\n if ($el.find(\".sprint-name\").val().length > 0 || hasErrors) {\n return $el.find(\".last-sprint-name\").addClass(\"disappear\");\n } else {\n return $el.find(\".last-sprint-name\").removeClass(\"disappear\");\n }\n });\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".delete-sprint\", function(event) {\n event.preventDefault();\n return remove();\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return resetSprint();\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateEditSprint\", [\"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$translate\", CreateEditSprint]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/main.coffee\n */\n\n(function() {\n var BacklogController, BacklogDirective, BurndownBacklogGraphDirective, TgBacklogProgressBarDirective, ToggleBurndownVisibility, UsPointsDirective, UsRolePointsSelectorDirective, bindMethods, bindOnce, generateHash, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n generateHash = this.taiga.generateHash;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogController = (function(superClass) {\n extend(BacklogController, superClass);\n\n BacklogController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"$tgLoading\", \"tgResources\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\"];\n\n BacklogController.prototype.storeCustomFiltersName = 'backlog-custom-filters';\n\n BacklogController.prototype.storeFiltersName = 'backlog-filters';\n\n BacklogController.prototype.backlogOrder = {};\n\n BacklogController.prototype.milestonesOrder = {};\n\n function BacklogController(scope1, rootscope, repo, confirm, rs, params1, q, location, appMetaService, navUrls, events, analytics, translate, loading, rs2, modelTransform, errorHandlingService, storage, filterRemoteStorageService, projectService) {\n var promise;\n this.scope = scope1;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params1;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.loading = loading;\n this.rs2 = rs2;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService;\n bindMethods(this);\n this.backlogOrder = {};\n this.milestonesOrder = {};\n this.page = 1;\n this.disablePagination = false;\n this.firstLoadComplete = false;\n this.scope.userstories = [];\n if (this.applyStoredFilters(this.params.pslug, \"backlog-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"BACKLOG.SECTION_NAME\");\n this.showTags = false;\n this.activeFilters = false;\n this.scope.showGraphPlaceholder = null;\n this.displayVelocity = false;\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n _this.firstLoadComplete = true;\n title = _this.translate.instant(\"BACKLOG.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"BACKLOG.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n _this.appMetaService.setAll(title, description);\n if (_this.rs.userstories.getShowTags(_this.scope.projectId)) {\n _this.showTags = true;\n return _this.scope.$broadcast(\"showTags\", _this.showTags);\n }\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n BacklogController.prototype.filtersReloadContent = function() {\n return this.loadUserstories(true);\n };\n\n BacklogController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function() {\n _this.loadUserstories(true);\n _this.loadProjectStats();\n _this.confirm.notify(\"success\");\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"sprintform:create:success\", (function(_this) {\n return function(e, data, ussToMove) {\n _this.loadSprints().then(function() {\n return _this.scope.$broadcast(\"sprintform:create:success:callback\", ussToMove);\n });\n _this.loadProjectStats();\n _this.confirm.notify(\"success\");\n return _this.analytics.trackEvent(\"sprint\", \"create\", \"create sprint on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function() {\n _this.loadUserstories(true);\n _this.loadProjectStats();\n _this.rootscope.$broadcast(\"filters:update\");\n _this.confirm.notify(\"success\");\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"create userstory on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"sprintform:edit:success\", (function(_this) {\n return function() {\n return _this.loadProjectStats();\n };\n })(this));\n this.scope.$on(\"sprintform:remove:success\", (function(_this) {\n return function(event, sprint) {\n _this.loadSprints();\n _this.loadProjectStats();\n _this.loadUserstories(true);\n if (sprint.closed) {\n _this.loadClosedSprints();\n }\n return _this.rootscope.$broadcast(\"filters:update\");\n };\n })(this));\n this.scope.$on(\"usform:edit:success\", (function(_this) {\n return function(event, data) {\n var index;\n index = _.findIndex(_this.scope.userstories, function(us) {\n return us.id === data.id;\n });\n _this.scope.userstories[index] = data;\n return _this.rootscope.$broadcast(\"filters:update\");\n };\n })(this));\n this.scope.$on(\"sprint:us:move\", this.moveUs);\n this.scope.$on(\"sprint:us:moved\", (function(_this) {\n return function() {\n _this.loadSprints();\n return _this.loadProjectStats();\n };\n })(this));\n this.scope.$on(\"backlog:load-closed-sprints\", this.loadClosedSprints);\n return this.scope.$on(\"backlog:unload-closed-sprints\", this.unloadClosedSprints);\n };\n\n BacklogController.prototype.initializeSubscription = function() {\n var routingKey1, routingKey2;\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n _this.loadAllPaginatedUserstories();\n return _this.loadSprints();\n };\n })(this));\n routingKey2 = \"changes.project.\" + this.scope.projectId + \".milestones\";\n return this.events.subscribe(this.scope, routingKey2, (function(_this) {\n return function(message) {\n return _this.loadSprints();\n };\n })(this));\n };\n\n BacklogController.prototype.toggleShowTags = function() {\n return this.scope.$apply((function(_this) {\n return function() {\n _this.showTags = !_this.showTags;\n return _this.rs.userstories.storeShowTags(_this.scope.projectId, _this.showTags);\n };\n })(this));\n };\n\n BacklogController.prototype.toggleActiveFilters = function() {\n return this.activeFilters = !this.activeFilters;\n };\n\n BacklogController.prototype.toggleVelocityForecasting = function() {\n this.displayVelocity = !this.displayVelocity;\n if (!this.displayVelocity) {\n this.scope.visibleUserStories = _.map(this.scope.userstories, function(it) {\n return it.ref;\n });\n } else {\n this.scope.visibleUserStories = _.map(this.forecastedStories, function(it) {\n return it.ref;\n });\n }\n return scopeDefer(this.scope, (function(_this) {\n return function() {\n return _this.scope.$broadcast(\"userstories:loaded\");\n };\n })(this));\n };\n\n BacklogController.prototype.loadProjectStats = function() {\n return this.rs.projects.stats(this.scope.projectId).then((function(_this) {\n return function(stats) {\n var totalPoints;\n _this.scope.stats = stats;\n totalPoints = stats.total_points ? stats.total_points : stats.defined_points;\n if (totalPoints) {\n _this.scope.stats.completedPercentage = Math.round(100 * stats.closed_points / totalPoints);\n } else {\n _this.scope.stats.completedPercentage = 0;\n }\n _this.scope.showGraphPlaceholder = !((stats.total_points != null) && (stats.total_milestones != null));\n _this.calculateForecasting();\n return stats;\n };\n })(this));\n };\n\n BacklogController.prototype.setMilestonesOrder = function(sprints) {\n var it, j, len, results, sprint;\n results = [];\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n this.milestonesOrder[sprint.id] = {};\n results.push((function() {\n var l, len1, ref1, results1;\n ref1 = sprint.user_stories;\n results1 = [];\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n it = ref1[l];\n results1.push(this.milestonesOrder[sprint.id][it.id] = it.sprint_order);\n }\n return results1;\n }).call(this));\n }\n return results;\n };\n\n BacklogController.prototype.unloadClosedSprints = function() {\n return this.scope.$apply((function(_this) {\n return function() {\n _this.scope.closedSprints = [];\n return _this.rootscope.$broadcast(\"closed-sprints:reloaded\", []);\n };\n })(this));\n };\n\n BacklogController.prototype.loadClosedSprints = function() {\n var params;\n params = {\n closed: true\n };\n return this.rs.sprints.list(this.scope.projectId, params).then((function(_this) {\n return function(result) {\n var j, len, sprint, sprints;\n sprints = result.milestones;\n _this.setMilestonesOrder(sprints);\n _this.scope.totalClosedMilestones = result.closed;\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\");\n }\n _this.scope.closedSprints = sprints;\n _this.scope.closedSprintsById = groupBy(sprints, function(x) {\n return x.id;\n });\n _this.rootscope.$broadcast(\"closed-sprints:reloaded\", sprints);\n return sprints;\n };\n })(this));\n };\n\n BacklogController.prototype.loadSprints = function() {\n var params;\n params = {\n closed: false\n };\n return this.rs.sprints.list(this.scope.projectId, params).then((function(_this) {\n return function(result) {\n var j, len, sprint, sprints;\n sprints = result.milestones;\n _this.setMilestonesOrder(sprints);\n _this.scope.totalMilestones = sprints;\n _this.scope.totalClosedMilestones = result.closed;\n _this.scope.totalOpenMilestones = result.open;\n _this.scope.totalMilestones = _this.scope.totalOpenMilestones + _this.scope.totalClosedMilestones;\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\");\n }\n _this.scope.sprints = sprints;\n if (!_this.scope.closedSprints) {\n _this.scope.closedSprints = [];\n }\n _this.scope.sprintsCounter = sprints.length;\n _this.scope.sprintsById = groupBy(sprints, function(x) {\n return x.id;\n });\n _this.rootscope.$broadcast(\"sprints:loaded\", sprints);\n _this.scope.currentSprint = _this.findCurrentSprint();\n return sprints;\n };\n })(this));\n };\n\n BacklogController.prototype.openSprints = function() {\n return _.filter(this.scope.sprints, (function(_this) {\n return function(sprint) {\n return !sprint.closed;\n };\n })(this)).reverse();\n };\n\n BacklogController.prototype.loadAllPaginatedUserstories = function() {\n var page;\n page = this.page;\n return this.loadUserstories(true, this.scope.userstories.length).then((function(_this) {\n return function() {\n return _this.page = page;\n };\n })(this));\n };\n\n BacklogController.prototype.loadUserstories = function(resetPagination, pageSize) {\n var params, promise;\n if (resetPagination == null) {\n resetPagination = false;\n }\n if (!this.scope.projectId) {\n return null;\n }\n this.loadingUserstories = true;\n this.disablePagination = true;\n params = _.clone(this.location.search());\n this.rs.userstories.storeQueryParams(this.scope.projectId, params);\n if (resetPagination) {\n this.page = 1;\n }\n params.page = this.page;\n promise = this.rs.userstories.listUnassigned(this.scope.projectId, params, pageSize);\n return promise.then((function(_this) {\n return function(result) {\n var header, it, j, len, ref1, userstories;\n userstories = result[0];\n header = result[1];\n if (resetPagination) {\n _this.scope.userstories = [];\n }\n _this.scope.userstories = _this.scope.userstories.concat(_.sortBy(userstories, \"backlog_order\"));\n _this.scope.visibleUserStories = _.map(_this.scope.userstories, function(it) {\n return it.ref;\n });\n ref1 = _this.scope.userstories;\n for (j = 0, len = ref1.length; j < len; j++) {\n it = ref1[j];\n _this.backlogOrder[it.id] = it.backlog_order;\n }\n _this.loadingUserstories = false;\n if (header('x-pagination-next')) {\n _this.disablePagination = false;\n _this.page++;\n }\n scopeDefer(_this.scope, function() {\n return _this.scope.$broadcast(\"userstories:loaded\");\n });\n return userstories;\n };\n })(this));\n };\n\n BacklogController.prototype.loadBacklog = function() {\n return this.q.all([this.loadProjectStats(), this.loadSprints(), this.loadUserstories()]).then(this.calculateForecasting);\n };\n\n BacklogController.prototype.calculateForecasting = function() {\n var backlog_points_sum, current_sum, j, len, ref1, results, stats, total_points, us;\n stats = this.scope.stats;\n total_points = stats.total_points;\n current_sum = stats.assigned_points;\n backlog_points_sum = 0;\n this.forecastedStories = [];\n ref1 = this.scope.userstories;\n results = [];\n for (j = 0, len = ref1.length; j < len; j++) {\n us = ref1[j];\n current_sum += us.total_points;\n backlog_points_sum += us.total_points;\n this.forecastedStories.push(us);\n if (stats.speed > 0 && backlog_points_sum > stats.speed) {\n break;\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n BacklogController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_backlog_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.closedMilestones = !!project.total_closed_milestones;\n this.scope.$emit('project:loaded', project);\n this.scope.points = _.sortBy(project.points, \"order\");\n this.scope.pointsById = groupBy(project.points, function(x) {\n return x.id;\n });\n this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n this.scope.usStatusList = _.sortBy(project.us_statuses, \"id\");\n return project;\n };\n\n BacklogController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n return this.loadBacklog().then((function(_this) {\n return function() {\n var milestone;\n return _this.generateFilters(milestone = \"null\");\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.scope.$emit(\"backlog:loaded\");\n };\n })(this));\n };\n\n BacklogController.prototype.prepareBulkUpdateData = function(uses, field) {\n if (field == null) {\n field = \"backlog_order\";\n }\n return _.map(uses, function(x) {\n return {\n \"us_id\": x.id,\n \"order\": x[field]\n };\n });\n };\n\n BacklogController.prototype.moveUs = function(ctx, usList, newUsIndex, newSprintId) {\n var afterDestination, beforeDestination, currentSprintId, data, it, j, key, l, len, len1, len2, len3, len4, len5, len6, list, m, modifiedUs, n, newSprint, o, oldSprintId, options, orderField, orderList, p, previous, previousWithTheSameOrder, project, promise, q, ref1, ref2, setOrders, setPreviousOrders, sprint, startIndex, us;\n oldSprintId = usList[0].milestone;\n project = usList[0].project;\n if (oldSprintId) {\n sprint = this.scope.sprintsById[oldSprintId] || this.scope.closedSprintsById[oldSprintId];\n }\n if (newSprintId) {\n newSprint = this.scope.sprintsById[newSprintId] || this.scope.closedSprintsById[newSprintId];\n }\n currentSprintId = newSprintId !== oldSprintId ? newSprintId : oldSprintId;\n orderList = null;\n orderField = \"\";\n if (newSprintId !== oldSprintId) {\n if (newSprintId === null) {\n for (key = j = 0, len = usList.length; j < len; key = ++j) {\n us = usList[key];\n _.remove(sprint.user_stories, function(it) {\n return it.id === us.id;\n });\n }\n orderField = \"backlog_order\";\n orderList = this.backlogOrder;\n beforeDestination = _.slice(this.scope.userstories, 0, newUsIndex);\n afterDestination = _.slice(this.scope.userstories, newUsIndex);\n this.scope.userstories = this.scope.userstories.concat(usList);\n } else {\n for (l = 0, len1 = usList.length; l < len1; l++) {\n us = usList[l];\n _.remove(this.scope.userstories, function(it) {\n return it.id === us.id;\n });\n }\n orderField = \"sprint_order\";\n orderList = this.milestonesOrder[newSprint.id];\n beforeDestination = _.slice(newSprint.user_stories, 0, newUsIndex);\n afterDestination = _.slice(newSprint.user_stories, newUsIndex);\n newSprint.user_stories = newSprint.user_stories.concat(usList);\n }\n } else {\n if (oldSprintId === null) {\n orderField = \"backlog_order\";\n orderList = this.backlogOrder;\n list = _.filter(this.scope.userstories, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(list, 0, newUsIndex);\n afterDestination = _.slice(list, newUsIndex);\n } else {\n orderField = \"sprint_order\";\n orderList = this.milestonesOrder[sprint.id];\n list = _.filter(newSprint.user_stories, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(list, 0, newUsIndex);\n afterDestination = _.slice(list, newUsIndex);\n }\n }\n previous = beforeDestination[beforeDestination.length - 1];\n setPreviousOrders = [];\n if (!previous) {\n startIndex = 0;\n } else if (previous) {\n startIndex = orderList[previous.id] + 1;\n previousWithTheSameOrder = _.filter(beforeDestination, function(it) {\n return it[orderField] === orderList[previous.id];\n });\n if (previousWithTheSameOrder.length > 1) {\n setPreviousOrders = _.map(previousWithTheSameOrder, function(it) {\n return {\n us_id: it.id,\n order: orderList[it.id]\n };\n });\n }\n }\n modifiedUs = [];\n for (key = m = 0, len2 = usList.length; m < len2; key = ++m) {\n us = usList[key];\n us.milestone = currentSprintId;\n us[orderField] = startIndex + key;\n orderList[us.id] = us[orderField];\n modifiedUs.push({\n us_id: us.id,\n order: us[orderField]\n });\n }\n startIndex = orderList[usList[usList.length - 1].id];\n for (key = n = 0, len3 = afterDestination.length; n < len3; key = ++n) {\n it = afterDestination[key];\n orderList[it.id] = startIndex + key + 1;\n }\n this.scope.userstories = _.sortBy(this.scope.userstories, (function(_this) {\n return function(it) {\n return _this.backlogOrder[it.id];\n };\n })(this));\n this.scope.visibleUserStories = _.map(this.scope.userstories, function(it) {\n return it.ref;\n });\n ref1 = this.scope.sprints;\n for (o = 0, len4 = ref1.length; o < len4; o++) {\n sprint = ref1[o];\n sprint.user_stories = _.sortBy(sprint.user_stories, (function(_this) {\n return function(it) {\n return _this.milestonesOrder[sprint.id][it.id];\n };\n })(this));\n }\n ref2 = this.scope.closedSprints;\n for (p = 0, len5 = ref2.length; p < len5; p++) {\n sprint = ref2[p];\n sprint.user_stories = _.sortBy(sprint.user_stories, (function(_this) {\n return function(it) {\n return _this.milestonesOrder[sprint.id][it.id];\n };\n })(this));\n }\n if (usList.length > 1 && (newSprintId !== oldSprintId)) {\n data = modifiedUs.concat(setPreviousOrders);\n promise = this.rs.userstories.bulkUpdateMilestone(project, newSprintId, data);\n } else if (usList.length > 1) {\n data = modifiedUs.concat(setPreviousOrders);\n promise = this.rs.userstories.bulkUpdateBacklogOrder(project, data);\n } else {\n setOrders = {};\n for (q = 0, len6 = setPreviousOrders.length; q < len6; q++) {\n it = setPreviousOrders[q];\n setOrders[it.us_id] = it.order;\n }\n options = {\n headers: {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n promise = this.repo.save(usList[0], true, {}, options, true);\n }\n promise.then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"sprint:us:moved\");\n if (_this.scope.closedSprintsById && _this.scope.closedSprintsById[oldSprintId]) {\n return _this.rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n };\n })(this));\n return promise;\n };\n\n BacklogController.prototype.updateUserStoryStatus = function() {\n return this.generateFilters().then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"filters:update\");\n _this.loadProjectStats();\n if (_this.isFilterDataTypeSelected('status')) {\n return _this.filtersReloadContent();\n }\n };\n })(this));\n };\n\n BacklogController.prototype.editUserStory = function(projectId, ref, $event) {\n var currentLoading, target;\n target = $($event.target);\n currentLoading = this.loading().target(target).removeClasses(\"edit-story\").timeout(200).start();\n return this.rs.userstories.getByRef(projectId, ref).then((function(_this) {\n return function(us) {\n return _this.rs2.attachments.list(\"us\", us.id, projectId).then(function(attachments) {\n _this.rootscope.$broadcast(\"usform:edit\", us, attachments.toJS());\n return currentLoading.finish();\n });\n };\n })(this));\n };\n\n BacklogController.prototype.deleteUserStory = function(us) {\n var message, title;\n title = this.translate.instant(\"US.TITLE_DELETE_ACTION\");\n message = us.subject;\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var promise;\n _this.scope.userstories = _.without(_this.scope.userstories, us);\n promise = _this.repo.remove(us);\n promise.then(function() {\n askResponse.finish();\n return _this.q.all([_this.loadProjectStats(), _this.loadSprints()]);\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return _this.confirm.notify(\"error\");\n });\n };\n })(this));\n };\n\n BacklogController.prototype.addNewUs = function(type) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"usform:new\", this.scope.projectId, this.scope.project.default_us_status, this.scope.usStatusList);\n case \"bulk\":\n return this.rootscope.$broadcast(\"usform:bulk\", this.scope.projectId, this.scope.project.default_us_status);\n }\n };\n\n BacklogController.prototype.addNewSprint = function() {\n return this.rootscope.$broadcast(\"sprintform:create\", this.scope.projectId);\n };\n\n BacklogController.prototype.findCurrentSprint = function() {\n var currentDate;\n currentDate = new Date().getTime();\n return _.find(this.scope.sprints, function(sprint) {\n var end, start;\n start = moment(sprint.estimated_start, 'YYYY-MM-DD').format('x');\n end = moment(sprint.estimated_finish, 'YYYY-MM-DD').format('x');\n return currentDate >= start && currentDate <= end;\n });\n };\n\n return BacklogController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin, taiga.UsFiltersMixin));\n\n module.controller(\"BacklogController\", BacklogController);\n\n BacklogDirective = function($repo, $rootscope, $translate, $rs) {\n var doomLineTemplate, link, linkDoomLine, linkFilters, linkToolbar, openFilterInit, showHideFilter, showHideTags;\n doomLineTemplate = _.template(\"
    <%- text %>
    \");\n linkDoomLine = function($scope, $el, $attrs, $ctrl) {\n var addDoomLineDom, getUsItems, reloadDoomLine, removeDoomlineDom;\n reloadDoomLine = function() {\n var current_sum, domElement, i, j, len, ref1, results, stats, total_points, us;\n if ($scope.displayVelocity) {\n removeDoomlineDom();\n }\n if (($scope.stats != null) && ($scope.stats.total_points != null) && $scope.stats.total_points !== 0 && ($scope.displayVelocity == null)) {\n removeDoomlineDom();\n stats = $scope.stats;\n total_points = stats.total_points;\n current_sum = stats.assigned_points;\n if (!$scope.userstories) {\n return;\n }\n ref1 = $scope.userstories;\n results = [];\n for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n us = ref1[i];\n current_sum += us.total_points;\n if (current_sum > total_points) {\n domElement = $el.find('.backlog-table-body .us-item-row')[i];\n addDoomLineDom(domElement);\n break;\n } else {\n results.push(void 0);\n }\n }\n return results;\n }\n };\n removeDoomlineDom = function() {\n return $el.find(\".doom-line\").remove();\n };\n addDoomLineDom = function(element) {\n var text;\n text = $translate.instant(\"BACKLOG.DOOMLINE\");\n return $(element).before(doomLineTemplate({\n \"text\": text\n }));\n };\n getUsItems = function() {\n var rowElements;\n rowElements = $el.find('.backlog-table-body .us-item-row');\n return _.map(rowElements, function(x) {\n return angular.element(x);\n });\n };\n $scope.$on(\"userstories:loaded\", reloadDoomLine);\n $scope.$on(\"userstories:forecast\", removeDoomlineDom);\n return $scope.$watch(\"stats\", reloadDoomLine);\n };\n linkToolbar = function($scope, $el, $attrs, $ctrl) {\n var checkSelected, getUsToMove, lastChecked, moveToCurrentSprint, moveToLatestSprint, moveUssToSprint, shiftPressed;\n getUsToMove = function() {\n var ussDom;\n ussDom = $el.find(\".backlog-table-body input:checkbox:checked\");\n return _.map(ussDom, function(item) {\n var itemScope;\n item = $(item).closest('.tg-scope');\n itemScope = item.scope();\n itemScope.us.milestone = $scope.sprints[0].id;\n return itemScope.us;\n });\n };\n moveUssToSprint = function(selectedUss, sprint) {\n var data, extraPoints, totalExtraPoints, ussCurrent;\n ussCurrent = _($scope.userstories);\n $scope.userstories = ussCurrent.without.apply(ussCurrent, selectedUss).value();\n extraPoints = _.map(selectedUss, function(v, k) {\n return v.total_points;\n });\n totalExtraPoints = _.reduce(extraPoints, function(acc, num) {\n return acc + num;\n });\n sprint.user_stories = _.union(sprint.user_stories, selectedUss);\n sprint.total_points += totalExtraPoints;\n data = _.map(selectedUss, function(us) {\n return {\n us_id: us.id,\n order: us.sprint_order\n };\n });\n $rs.userstories.bulkUpdateMilestone($scope.project.id, $scope.sprints[0].id, data).then((function(_this) {\n return function() {\n $ctrl.loadSprints();\n $ctrl.loadProjectStats();\n $ctrl.toggleVelocityForecasting();\n return $ctrl.calculateForecasting();\n };\n })(this));\n return $el.find(\".move-to-sprint\").hide();\n };\n moveToCurrentSprint = function(selectedUss) {\n return moveUssToSprint(selectedUss, $scope.currentSprint);\n };\n moveToLatestSprint = function(selectedUss) {\n return moveUssToSprint(selectedUss, $scope.sprints[0]);\n };\n $scope.$on(\"sprintform:create:success:callback\", function(e, ussToMove) {\n return _.partial(moveToCurrentSprint, ussToMove)();\n });\n shiftPressed = false;\n lastChecked = null;\n checkSelected = function(target) {\n var moveToSprintDom, selectedUsDom;\n lastChecked = target.closest(\".us-item-row\");\n target.closest('.us-item-row').toggleClass('ui-multisortable-multiple');\n moveToSprintDom = $el.find(\".move-to-sprint\");\n selectedUsDom = $el.find(\".backlog-table-body input:checkbox:checked\");\n if (selectedUsDom.length > 0 && $scope.sprints.length > 0) {\n return moveToSprintDom.show();\n } else {\n return moveToSprintDom.hide();\n }\n };\n $(window).on(\"keydown.shift-pressed keyup.shift-pressed\", function(event) {\n shiftPressed = !!event.shiftKey;\n return true;\n });\n $el.on(\"change\", \".backlog-table-body input:checkbox\", function(event) {\n var current, elements, nextAll, prevAll, target;\n if (lastChecked && shiftPressed) {\n elements = [];\n current = $(event.currentTarget).closest(\".us-item-row\");\n nextAll = lastChecked.nextAll();\n prevAll = lastChecked.prevAll();\n if (_.some(nextAll, function(next) {\n return next === current[0];\n })) {\n elements = lastChecked.nextUntil(current);\n } else if (_.some(prevAll, function(prev) {\n return prev === current[0];\n })) {\n elements = lastChecked.prevUntil(current);\n }\n _.map(elements, function(elm) {\n var input;\n input = $(elm).find(\"input:checkbox\");\n input.prop('checked', true);\n return checkSelected(input);\n });\n }\n target = angular.element(event.currentTarget);\n target.closest(\".us-item-row\").toggleClass('is-checked');\n return checkSelected(target);\n });\n $el.on(\"click\", \"#move-to-latest-sprint\", (function(_this) {\n return function(event) {\n var ussToMove;\n ussToMove = getUsToMove();\n return $scope.$apply(_.partial(moveToLatestSprint, ussToMove));\n };\n })(this));\n $el.on(\"click\", \"#move-to-current-sprint\", (function(_this) {\n return function(event) {\n var ussToMove;\n ussToMove = getUsToMove();\n return $scope.$apply(_.partial(moveToCurrentSprint, ussToMove));\n };\n })(this));\n $el.on(\"click\", \"#show-tags\", function(event) {\n event.preventDefault();\n $ctrl.toggleShowTags();\n return showHideTags($ctrl);\n });\n return $el.on(\"click\", \".forecasting-add-sprint\", function(event) {\n var ussToMove, ussToMoveList;\n ussToMoveList = $ctrl.forecastedStories;\n if ($scope.currentSprint) {\n ussToMove = _.map(ussToMoveList, function(us, index) {\n us.milestone = $scope.currentSprint.id;\n us.order = index;\n return us;\n });\n return $scope.$apply(_.partial(moveToCurrentSprint, ussToMove));\n } else {\n ussToMove = _.map(ussToMoveList, function(us, index) {\n us.order = index;\n return us;\n });\n return $rootscope.$broadcast(\"sprintform:create\", $scope.projectId, ussToMove);\n }\n });\n };\n showHideTags = function($ctrl) {\n var elm, text;\n elm = angular.element(\"#show-tags\");\n if ($ctrl.showTags) {\n elm.addClass(\"active\");\n text = $translate.instant(\"BACKLOG.TAGS.HIDE\");\n return elm.text(text);\n } else {\n elm.removeClass(\"active\");\n text = $translate.instant(\"BACKLOG.TAGS.SHOW\");\n return elm.text(text);\n }\n };\n openFilterInit = function($scope, $el, $ctrl) {\n var sidebar;\n sidebar = $el.find(\"sidebar.backlog-filter\");\n sidebar.addClass(\"active\");\n return $ctrl.activeFilters = true;\n };\n showHideFilter = function($scope, $el, $ctrl) {\n var hideText, showText, sidebar, target;\n sidebar = $el.find(\"sidebar.backlog-filter\");\n sidebar.one(\"transitionend\", function() {\n return timeout(150, function() {\n $rootscope.$broadcast(\"resize\");\n return $('.burndown').css(\"visibility\", \"visible\");\n });\n });\n target = angular.element(\"#show-filters-button\");\n $('.burndown').css(\"visibility\", \"hidden\");\n sidebar.toggleClass(\"active\");\n target.toggleClass(\"active\");\n hideText = $translate.instant(\"BACKLOG.FILTERS.HIDE\");\n showText = $translate.instant(\"BACKLOG.FILTERS.SHOW\");\n toggleText(target, [hideText, showText]);\n return $ctrl.toggleActiveFilters();\n };\n linkFilters = function($scope, $el, $attrs, $ctrl) {\n $scope.filtersSearch = {};\n return $el.on(\"click\", \"#show-filters-button\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n return showHideFilter($scope, $el, $ctrl);\n });\n });\n };\n link = function($scope, $el, $attrs, $rootscope) {\n var $ctrl, filters;\n $ctrl = $el.controller();\n linkToolbar($scope, $el, $attrs, $ctrl);\n linkFilters($scope, $el, $attrs, $ctrl);\n linkDoomLine($scope, $el, $attrs, $ctrl);\n filters = $ctrl.location.search();\n if (filters.status || filters.tags || filters.q || filters.assigned_to || filters.owner) {\n openFilterInit($scope, $el, $ctrl);\n }\n $scope.$on(\"showTags\", function() {\n return showHideTags($ctrl);\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return $(window).off(\".shift-pressed\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklog\", [\"$tgRepo\", \"$rootScope\", \"$translate\", \"$tgResources\", BacklogDirective]);\n\n UsRolePointsSelectorDirective = function($rootscope, $template, $compile, $translate) {\n var link, selectionTemplate;\n selectionTemplate = $template.get(\"backlog/us-role-points-popover.html\", true);\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n var numberOfRoles, roles;\n roles = _.filter(project.roles, \"computable\");\n numberOfRoles = _.size(roles);\n if (numberOfRoles > 1) {\n return $el.append($compile(selectionTemplate({\n \"roles\": roles\n }))($scope));\n } else {\n $el.find(\".icon-arrow-down\").remove();\n return $el.find(\".header-points\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"uspoints:select\", function(ctx, roleId, roleName) {\n $el.find(\".popover\").popover().close();\n return $el.find(\".header-points\").html(roleName + \"/Total\");\n });\n $scope.$on(\"uspoints:clear-selection\", function(ctx, roleId) {\n var text;\n $el.find(\".popover\").popover().close();\n text = $translate.instant(\"COMMON.FIELDS.POINTS\");\n return $el.find(\".header-points\").text(text);\n });\n $el.on(\"click\", function(event) {\n var target;\n target = angular.element(event.target);\n if (target.is(\"span\") || target.is(\"div\")) {\n event.stopPropagation();\n }\n return $el.find(\".popover\").popover().open();\n });\n $el.on(\"click\", \".clear-selection\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $rootscope.$broadcast(\"uspoints:clear-selection\");\n });\n $el.on(\"click\", \".role\", function(event) {\n var rolScope, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n rolScope = target.scope();\n return $rootscope.$broadcast(\"uspoints:select\", target.data(\"role-id\"), target.text());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUsRolePointsSelector\", [\"$rootScope\", \"$tgTemplate\", \"$compile\", \"$translate\", UsRolePointsSelectorDirective]);\n\n UsPointsDirective = function($tgEstimationsService, $repo, $tgTemplate) {\n var link, rolesTemplate;\n rolesTemplate = $tgTemplate.get(\"common/estimation/us-points-roles-popover.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, bindClickElements, estimationProcess, filteringRoleId, renderRolesSelector, selectedRoleId, updatingSelectedRoleId;\n $ctrl = $el.controller();\n updatingSelectedRoleId = null;\n selectedRoleId = null;\n filteringRoleId = null;\n estimationProcess = null;\n $scope.$on(\"uspoints:select\", function(ctx, roleId, roleName) {\n var us;\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n selectedRoleId = roleId;\n return estimationProcess.render();\n });\n $scope.$on(\"uspoints:clear-selection\", function(ctx) {\n var us;\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n selectedRoleId = null;\n return estimationProcess.render();\n });\n $scope.$watch($attrs.tgBacklogUsPoints, function(us) {\n var roles;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n roles = estimationProcess.calculateRoles();\n if (roles.length === 0) {\n $el.find(\".icon-arrow-bottom\").remove();\n $el.find(\"a.us-points\").addClass(\"not-clickable\");\n } else if (roles.length === 1) {\n selectedRoleId = _.keys(us.points)[0];\n }\n if (estimationProcess.isEditable) {\n bindClickElements();\n }\n estimationProcess.onSelectedPointForRole = function(roleId, pointId, points) {\n us.points = points;\n estimationProcess.render();\n return this.save(roleId, pointId).then(function() {\n return $ctrl.loadProjectStats();\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, pointId, pointObj, template, text, title, totalPoints;\n totalPoints = this.calculateTotalPoints();\n if ((selectedRoleId == null) || roles.length === 1) {\n text = totalPoints;\n title = totalPoints;\n } else {\n pointId = this.us.points[selectedRoleId];\n pointObj = this.pointsById[pointId];\n text = pointObj.name + \" / \" + totalPoints + \"\";\n title = pointObj.name + \" / \" + totalPoints;\n }\n ctx = {\n totalPoints: totalPoints,\n roles: this.calculateRoles(),\n editable: this.isEditable,\n text: text,\n title: title\n };\n mainTemplate = \"common/estimation/us-estimation-total.html\";\n template = $tgTemplate.get(mainTemplate, true);\n html = template(ctx);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n renderRolesSelector = function() {\n var html, roles;\n roles = estimationProcess.calculateRoles();\n html = rolesTemplate({\n \"roles\": roles\n });\n $el.append(html);\n return $el.find(\".pop-role\").popover().open(function() {\n return $(this).remove();\n });\n };\n bindClickElements = function() {\n $el.on(\"click\", \"a.us-points\", function(event) {\n var us;\n event.preventDefault();\n event.stopPropagation();\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n updatingSelectedRoleId = selectedRoleId;\n if (selectedRoleId != null) {\n return estimationProcess.renderPointsSelector(selectedRoleId);\n } else {\n return renderRolesSelector();\n }\n });\n return $el.on(\"click\", \".role\", function(event) {\n var popRolesDom, target, us;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n updatingSelectedRoleId = target.data(\"role-id\");\n popRolesDom = $el.find(\".pop-role\");\n popRolesDom.find(\"a\").removeClass(\"active\");\n popRolesDom.find(\"a[data-role-id='\" + updatingSelectedRoleId + \"']\").addClass(\"active\");\n return estimationProcess.renderPointsSelector(updatingSelectedRoleId);\n });\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogUsPoints\", [\"$tgEstimationsService\", \"$tgRepo\", \"$tgTemplate\", UsPointsDirective]);\n\n ToggleBurndownVisibility = function($storage) {\n var hide, link, show;\n hide = function() {\n $(\".js-burndown-graph\").removeClass(\"shown\");\n $(\".js-toggle-burndown-visibility-button\").removeClass(\"active\");\n return $(\".js-burndown-graph\").removeClass(\"open\");\n };\n show = function(firstLoad) {\n $(\".js-toggle-burndown-visibility-button\").addClass(\"active\");\n if (firstLoad) {\n return $(\".js-burndown-graph\").addClass(\"shown\");\n } else {\n return $(\".js-burndown-graph\").addClass(\"open\");\n }\n };\n link = function($scope, $el, $attrs) {\n var firstLoad, hash, toggleGraph;\n firstLoad = true;\n hash = generateHash([\"is-burndown-grpahs-collapsed\"]);\n $scope.isBurndownGraphCollapsed = $storage.get(hash) || false;\n toggleGraph = function() {\n if ($scope.isBurndownGraphCollapsed) {\n hide(firstLoad);\n } else {\n show(firstLoad);\n }\n return firstLoad = false;\n };\n $scope.$watch(\"showGraphPlaceholder\", function() {\n if ($scope.showGraphPlaceholder != null) {\n $scope.isBurndownGraphCollapsed = $scope.isBurndownGraphCollapsed || $scope.showGraphPlaceholder;\n return toggleGraph();\n }\n });\n $el.on(\"click\", \".js-toggle-burndown-visibility-button\", function() {\n $scope.isBurndownGraphCollapsed = !$scope.isBurndownGraphCollapsed;\n $storage.set(hash, $scope.isBurndownGraphCollapsed);\n return toggleGraph();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgToggleBurndownVisibility\", [\"$tgStorage\", ToggleBurndownVisibility]);\n\n BurndownBacklogGraphDirective = function($translate) {\n var link, redrawChart;\n redrawChart = function(element, dataToDraw) {\n var client_increment_line, colors, data, evolution_line, j, milestonesRange, optimal_line, options, ref1, results, team_increment_line, width, zero_line;\n width = element.width();\n element.height(width / 6);\n milestonesRange = (function() {\n results = [];\n for (var j = 0, ref1 = dataToDraw.milestones.length - 1; 0 <= ref1 ? j <= ref1 : j >= ref1; 0 <= ref1 ? j++ : j--){ results.push(j); }\n return results;\n }).apply(this);\n data = [];\n zero_line = _.map(dataToDraw.milestones, function(ml) {\n return 0;\n });\n data.push({\n data: _.zip(milestonesRange, zero_line),\n lines: {\n fillColor: \"rgba(0,0,0,0)\"\n },\n points: {\n show: false\n }\n });\n optimal_line = _.map(dataToDraw.milestones, function(ml) {\n return ml.optimal;\n });\n data.push({\n data: _.zip(milestonesRange, optimal_line),\n lines: {\n fillColor: \"rgba(120,120,120,0.2)\"\n }\n });\n evolution_line = _.filter(_.map(dataToDraw.milestones, function(ml) {\n return ml.evolution;\n }), function(evolution) {\n return evolution != null;\n });\n data.push({\n data: _.zip(milestonesRange, evolution_line),\n lines: {\n fillColor: \"rgba(102,153,51,0.3)\"\n }\n });\n client_increment_line = _.map(dataToDraw.milestones, function(ml) {\n return -ml[\"team-increment\"] - ml[\"client-increment\"];\n });\n data.push({\n data: _.zip(milestonesRange, client_increment_line),\n lines: {\n fillColor: \"rgba(255,51,51,0.3)\"\n }\n });\n team_increment_line = _.map(dataToDraw.milestones, function(ml) {\n return -ml[\"team-increment\"];\n });\n data.push({\n data: _.zip(milestonesRange, team_increment_line),\n lines: {\n fillColor: \"rgba(153,51,51,0.3)\"\n }\n });\n colors = [\"rgba(0,0,0,1)\", \"rgba(120,120,120,0.2)\", \"rgba(102,153,51,1)\", \"rgba(153,51,51,1)\", \"rgba(255,51,51,1)\"];\n options = {\n grid: {\n borderWidth: {\n top: 0,\n right: 1,\n left: 0,\n bottom: 0\n },\n borderColor: \"#ccc\",\n hoverable: true\n },\n xaxis: {\n ticks: dataToDraw.milestones.length,\n axisLabel: $translate.instant(\"BACKLOG.CHART.XAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\",\n axisLabelPadding: 5,\n tickFormatter: function(val, axis) {\n return \"\";\n }\n },\n yaxis: {\n axisLabel: $translate.instant(\"BACKLOG.CHART.YAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\",\n axisLabelPadding: 5\n },\n series: {\n shadowSize: 0,\n lines: {\n show: true,\n fill: true\n },\n points: {\n show: true,\n fill: true,\n radius: 4,\n lineWidth: 2\n }\n },\n colors: colors,\n tooltip: true,\n tooltipOpts: {\n content: function(label, xval, yval, flotItem) {\n var ctx;\n if (flotItem.seriesIndex === 1) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.OPTIMAL\", ctx);\n } else if (flotItem.seriesIndex === 2) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.REAL\", ctx);\n } else if (flotItem.seriesIndex === 3) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_CLIENT\", ctx);\n } else {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_TEAM\", ctx);\n }\n }\n }\n };\n element.empty();\n return element.plot(data, options).data(\"plot\");\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch(\"stats\", function(value) {\n if ($scope.stats != null) {\n redrawChart(element, $scope.stats);\n return $scope.$on(\"resize\", function() {\n return redrawChart(element, $scope.stats);\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBurndownBacklogGraph\", [\"$translate\", BurndownBacklogGraphDirective]);\n\n TgBacklogProgressBarDirective = function($template, $compile) {\n var adjustPercentaje, link, render, template;\n template = $template.get(\"backlog/progress-bar.html\", true);\n render = function(scope, el, projectPointsPercentaje, closedPointsPercentaje) {\n var html;\n html = template({\n projectPointsPercentaje: projectPointsPercentaje,\n closedPointsPercentaje: closedPointsPercentaje\n });\n html = $compile(html)(scope);\n return el.html(html);\n };\n adjustPercentaje = function(percentage) {\n var adjusted;\n adjusted = _.max([0, percentage]);\n adjusted = _.min([100, adjusted]);\n return Math.round(adjusted);\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch($attrs.tgBacklogProgressBar, function(stats) {\n var closedPoints, closedPointsPercentaje, definedPoints, projectPointsPercentaje, totalPoints;\n if (stats != null) {\n totalPoints = stats.total_points ? stats.total_points : stats.defined_points;\n definedPoints = stats.defined_points;\n closedPoints = stats.closed_points;\n if (definedPoints > totalPoints) {\n projectPointsPercentaje = totalPoints * 100 / definedPoints;\n closedPointsPercentaje = closedPoints * 100 / definedPoints;\n } else {\n projectPointsPercentaje = 100;\n closedPointsPercentaje = closedPoints * 100 / totalPoints;\n }\n projectPointsPercentaje = adjustPercentaje(projectPointsPercentaje - 3);\n closedPointsPercentaje = adjustPercentaje(closedPointsPercentaje - 3);\n return render($scope, $el, projectPointsPercentaje, closedPointsPercentaje);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogProgressBar\", [\"$tgTemplate\", \"$compile\", TgBacklogProgressBarDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/sortable.coffee\n */\n\n(function() {\n var BacklogSortableDirective, bindOnce, deleteElement, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBacklog\");\n\n deleteElement = function(el) {\n $(el).scope().$destroy();\n $(el).off();\n return $(el).remove();\n };\n\n BacklogSortableDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"project\", function(project) {\n var drake, initIsBacklog, scroll;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n initIsBacklog = false;\n drake = dragula([$el[0], $('.js-empty-backlog')[0]], {\n copySortSource: false,\n copy: false,\n isContainer: function(el) {\n return el.classList.contains('sprint-table');\n },\n moves: function(item) {\n if (!$(item).hasClass('row')) {\n return false;\n }\n return true;\n }\n });\n drake.on('drag', function(item, container) {\n var isChecked, parent;\n parent = $(item).parent();\n initIsBacklog = parent.hasClass('backlog-table-body');\n $(document.body).addClass(\"drag-active\");\n isChecked = $(item).find(\"input[type='checkbox']\").is(\":checked\");\n return window.dragMultiple.start(item, container);\n });\n drake.on('cloned', function(item) {\n return $(item).addClass('multiple-drag-mirror');\n });\n drake.on('dragend', function(item) {\n var dragMultipleItems, firstElement, index, isBacklog, parent, sameContainer, sprint, usList;\n parent = $(item).parent();\n $('.doom-line').remove();\n parent = $(item).parent();\n isBacklog = parent.hasClass('backlog-table-body') || parent.hasClass('js-empty-backlog');\n if (initIsBacklog || isBacklog) {\n sameContainer = initIsBacklog === isBacklog;\n } else {\n sameContainer = $(item).scope().sprint.id === parent.scope().sprint.id;\n }\n dragMultipleItems = window.dragMultiple.stop();\n $(document.body).removeClass(\"drag-active\");\n sprint = null;\n firstElement = dragMultipleItems.length ? dragMultipleItems[0] : item;\n if (isBacklog) {\n index = $(firstElement).index(\".backlog-table-body .row\");\n } else {\n index = $(firstElement).index();\n sprint = parent.scope().sprint.id;\n }\n if (!sameContainer) {\n if (dragMultipleItems.length) {\n usList = _.map(dragMultipleItems, function(item) {\n return item = $(item).scope().us;\n });\n } else {\n usList = [$(item).scope().us];\n }\n if (dragMultipleItems.length) {\n _.each(dragMultipleItems, function(item) {\n return deleteElement(item);\n });\n } else {\n deleteElement(item);\n }\n } else {\n if (dragMultipleItems.length) {\n usList = _.map(dragMultipleItems, function(item) {\n return item = $(item).scope().us;\n });\n } else {\n usList = [$(item).scope().us];\n }\n }\n return $scope.$emit(\"sprint:us:move\", usList, index, sprint);\n });\n scroll = autoScroll([window], {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSortable\", BacklogSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/sprints.coffee\n */\n\n(function() {\n var BacklogSprintDirective, BacklogSprintHeaderDirective, ToggleExcludeClosedSprintsVisualization, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogSprintDirective = function($repo, $rootscope) {\n var link, slideOptions, sprintTableMinHeight, toggleSprint;\n sprintTableMinHeight = 50;\n slideOptions = {\n duration: 500,\n easing: 'linear'\n };\n toggleSprint = (function(_this) {\n return function($el) {\n var sprintArrow, sprintTable;\n sprintTable = $el.find(\".sprint-table\");\n sprintArrow = $el.find(\".compact-sprint\");\n sprintArrow.toggleClass('active');\n return sprintTable.toggleClass('open');\n };\n })(this);\n link = function($scope, $el, $attrs) {\n $scope.$watch($attrs.tgBacklogSprint, function(sprint) {\n sprint = $scope.$eval($attrs.tgBacklogSprint);\n if (sprint.closed) {\n return $el.addClass(\"sprint-closed\");\n } else {\n return toggleSprint($el);\n }\n });\n $el.on(\"click\", \".sprint-name > .compact-sprint\", function(event) {\n event.preventDefault();\n toggleSprint($el);\n return $el.find(\".sprint-table\").slideToggle(slideOptions);\n });\n $el.on(\"click\", \".edit-sprint\", function(event) {\n var sprint;\n event.preventDefault();\n sprint = $scope.$eval($attrs.tgBacklogSprint);\n return $rootscope.$broadcast(\"sprintform:edit\", sprint);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSprint\", [\"$tgRepo\", \"$rootScope\", BacklogSprintDirective]);\n\n BacklogSprintHeaderDirective = function($navUrls, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"backlog/sprint-header.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable, isVisible, prettyDate, render;\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\");\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_milestone\") !== -1;\n };\n isVisible = function() {\n return $scope.project.my_permissions.indexOf(\"view_milestones\") !== -1;\n };\n render = function(sprint) {\n var compiledTemplate, ctx, estimatedDateRange, finish, start, taskboardUrl, templateScope;\n taskboardUrl = $navUrls.resolve(\"project-taskboard\", {\n project: $scope.project.slug,\n sprint: sprint.slug\n });\n start = moment(sprint.estimated_start).format(prettyDate);\n finish = moment(sprint.estimated_finish).format(prettyDate);\n estimatedDateRange = start + \"-\" + finish;\n ctx = {\n name: sprint.name,\n taskboardUrl: taskboardUrl,\n estimatedDateRange: estimatedDateRange,\n closedPoints: sprint.closed_points || 0,\n totalPoints: sprint.total_points || 0,\n isVisible: isVisible(),\n isEditable: isEditable()\n };\n templateScope = $scope.$new();\n _.assign(templateScope, ctx);\n compiledTemplate = $compile(template)(templateScope);\n return $el.html(compiledTemplate);\n };\n $scope.$watch(\"sprint\", function(sprint) {\n return render(sprint);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\"\n };\n };\n\n module.directive(\"tgBacklogSprintHeader\", [\"$tgNavUrls\", \"$tgTemplate\", \"$compile\", \"$translate\", BacklogSprintHeaderDirective]);\n\n ToggleExcludeClosedSprintsVisualization = function($rootscope, $loading, $translate) {\n var excludeClosedSprints, link;\n excludeClosedSprints = true;\n link = function($scope, $el, $attrs) {\n var currentLoading, loadingElm;\n loadingElm = $(\"
    \");\n $el.after(loadingElm);\n currentLoading = null;\n $el.on(\"click\", function(event) {\n event.preventDefault();\n excludeClosedSprints = !excludeClosedSprints;\n currentLoading = $loading().target(loadingElm).start();\n if (excludeClosedSprints) {\n return $rootscope.$broadcast(\"backlog:unload-closed-sprints\");\n } else {\n return $rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $scope.$on(\"closed-sprints:reloaded\", (function(_this) {\n return function(ctx, sprints) {\n var key, text;\n currentLoading.finish();\n if (sprints.length > 0) {\n key = \"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS\";\n } else {\n key = \"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS\";\n }\n text = $translate.instant(key);\n return $el.find(\".text\").text(text);\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogToggleClosedSprintsVisualization\", [\"$rootScope\", \"$tgLoading\", \"$translate\", ToggleExcludeClosedSprintsVisualization]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/charts.coffee\n */\n\n(function() {\n var SprintGraphDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaTaskboard\");\n\n SprintGraphDirective = function($translate) {\n var link, redrawChart;\n redrawChart = function(element, dataToDraw) {\n var data, days, options, width;\n width = element.width();\n element.height(240);\n days = _.map(dataToDraw, function(x) {\n return moment(new Date(x.day).getTime());\n });\n data = [];\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, function(d) {\n return d.optimal_points;\n })),\n lines: {\n fillColor: \"rgba(120,120,120,0.2)\"\n }\n });\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, function(d) {\n return d.open_points;\n })),\n lines: {\n fillColor: \"rgba(102,153,51,0.3)\"\n }\n });\n options = {\n grid: {\n borderWidth: {\n top: 0,\n right: 1,\n left: 0,\n bottom: 0\n },\n borderColor: '#ccc',\n hoverable: true\n },\n xaxis: {\n tickSize: [1, \"day\"],\n min: days[0],\n max: _.last(days),\n mode: \"time\",\n daysNames: days,\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.XAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif',\n axisLabelPadding: 5\n },\n yaxis: {\n min: 0,\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.YAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif',\n axisLabelPadding: 5\n },\n series: {\n shadowSize: 0,\n lines: {\n show: true,\n fill: true\n },\n points: {\n show: true,\n fill: true,\n radius: 4,\n lineWidth: 2\n }\n },\n colors: [\"rgba(102,153,51,1)\", \"rgba(120,120,120,0.2)\"],\n tooltip: true,\n tooltipOpts: {\n content: function(label, xval, yval, flotItem) {\n var formattedDate, roundedValue;\n formattedDate = moment(xval).format($translate.instant(\"TASKBOARD.CHARTS.DATE\"));\n roundedValue = Math.round(yval);\n if (flotItem.seriesIndex === 1) {\n return $translate.instant(\"TASKBOARD.CHARTS.OPTIMAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n });\n } else {\n return $translate.instant(\"TASKBOARD.CHARTS.REAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n });\n }\n }\n }\n };\n element.empty();\n return element.plot(data, options).data(\"plot\");\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$on(\"resize\", function() {\n if ($scope.stats) {\n return redrawChart(element, $scope.stats.days);\n }\n });\n $scope.$on(\"taskboard:graph:toggle-visibility\", function() {\n $el.parent().toggleClass('open');\n return timeout(100, function() {\n if ($scope.stats) {\n return redrawChart(element, $scope.stats.days);\n }\n });\n });\n $scope.$watch('stats', function(value) {\n if ($scope.stats == null) {\n return;\n }\n return redrawChart(element, $scope.stats.days);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSprintGraph\", [\"$translate\", SprintGraphDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/lightboxes.coffee\n */\n\n(function() {\n var CreateBulkTasksDirective, CreateEditTaskDirective, bindOnce, debounce, module, taiga, trim,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n CreateEditTaskDirective = function($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate, $q, $confirm, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, close, createAttachments, deleteAttachments, resetAttachments, submit, submitButton, tagsToAdd;\n $scope.isNew = true;\n attachmentsToAdd = Immutable.List();\n attachmentsToDelete = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return attachmentsToDelete = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n if (attachment.get(\"id\")) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n }\n };\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.task.project, 'task');\n });\n return $q.all(promises);\n };\n deleteAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"task\", attachment.id);\n });\n return $q.all(promises);\n };\n tagsToAdd = [];\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.task.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([tag, color]);\n return $scope.task.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.task.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.task.tags = itemtags;\n return _.pull($scope.task.tags, value);\n };\n $scope.$on(\"taskform:new\", function(ctx, sprintId, usId) {\n var create, newTask;\n $scope.task = $model.make_model('tasks', {\n project: $scope.projectId,\n milestone: sprintId,\n user_story: usId,\n is_archived: false,\n status: $scope.project.default_task_status,\n assigned_to: null,\n tags: [],\n subject: \"\",\n description: \"\"\n });\n $scope.isNew = true;\n $scope.attachments = Immutable.List();\n resetAttachments();\n create = $translate.instant(\"COMMON.CREATE\");\n $el.find(\".button-green\").html(create);\n newTask = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.TITLE\");\n $el.find(\".title\").html(newTask + \" \");\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el, function() {\n return $scope.createEditTaskOpen = false;\n });\n return $scope.createEditTaskOpen = true;\n });\n $scope.$on(\"taskform:edit\", function(ctx, task, attachments) {\n var edit, save;\n $scope.task = task;\n $scope.isNew = false;\n $scope.attachments = Immutable.fromJS(attachments);\n resetAttachments();\n save = $translate.instant(\"COMMON.SAVE\");\n edit = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.ACTION_EDIT\");\n $el.find(\".button-green\").html(save);\n $el.find(\".title\").html(edit + \" \");\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el, function() {\n return $scope.createEditTaskOpen = false;\n });\n return $scope.createEditTaskOpen = true;\n });\n submitButton = $el.find(\".submit-button\");\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, params, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n params = {\n include_attachments: true,\n include_tasks: true\n };\n if ($scope.isNew) {\n promise = $repo.create(\"tasks\", $scope.task);\n broadcastEvent = \"taskform:new:success\";\n } else {\n promise = $repo.save($scope.task);\n broadcastEvent = \"taskform:edit:success\";\n }\n promise.then(function(data) {\n return deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this)).then((function(_this) {\n return function() {\n return $rs.tasks.getByRef(data.project, data.ref, params).then(function(task) {\n return $rootscope.$broadcast(broadcastEvent, task);\n });\n };\n })(this));\n });\n currentLoading = $loading().target(submitButton).start();\n return promise.then(function(data) {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n close = (function(_this) {\n return function() {\n if (!$scope.task.isModified()) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.task.revert();\n });\n } else {\n return $confirm.ask($translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.CONFIRM_CLOSE\")).then(function(result) {\n lightboxService.close($el);\n $scope.task.revert();\n return result.finish();\n });\n }\n };\n })(this);\n $el.find('.close').on(\"click\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return close();\n });\n $el.keydown(function(event) {\n var code;\n event.stopPropagation();\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n return close();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.find('.close').off();\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CreateBulkTasksDirective = function($repo, $rs, $rootscope, $loading, lightboxService, $model) {\n var link;\n link = function($scope, $el, attrs) {\n var submit, submitButton;\n $scope.form = {\n data: \"\",\n usId: null\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, data, form, projectId, promise, sprintId, usId;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n data = $scope.form.data;\n projectId = $scope.projectId;\n sprintId = $scope.form.sprintId;\n usId = $scope.form.usId;\n promise = $rs.tasks.bulkCreate(projectId, sprintId, usId, data);\n promise.then(function(result) {\n result = _.map(result, (function(_this) {\n return function(x) {\n return $model.make_model('tasks', x);\n };\n })(this));\n currentLoading.finish();\n $rootscope.$broadcast(\"taskform:bulk:success\", result);\n return lightboxService.close($el);\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return console.log(\"FAIL\");\n });\n };\n })(this));\n $scope.$on(\"taskform:bulk\", function(ctx, sprintId, usId) {\n lightboxService.open($el);\n return $scope.form = {\n data: \"\",\n sprintId: sprintId,\n usId: usId\n };\n });\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaTaskboard\");\n\n module.directive(\"tgLbCreateEditTask\", [\"$tgRepo\", \"$tgModel\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", \"$translate\", \"$q\", \"$tgConfirm\", \"tgAttachmentsService\", CreateEditTaskDirective]);\n\n module.directive(\"tgLbCreateBulkTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", \"$tgModel\", CreateBulkTasksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard.coffee\n */\n\n(function() {\n var TaskboardController, TaskboardDirective, TaskboardSquishColumnDirective, bindMethods, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n toggleText = this.taiga.toggleText;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n scopeDefer = this.taiga.scopeDefer;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaTaskboard\");\n\n TaskboardController = (function(superClass) {\n extend(TaskboardController, superClass);\n\n TaskboardController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"tgAppMetaService\", \"$tgLocation\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"tgTaskboardTasks\", \"$tgStorage\", \"tgFilterRemoteStorageService\"];\n\n function TaskboardController(scope, rootscope, repo, confirm, rs1, rs2, params1, q1, appMetaService, location, navUrls, events, analytics, translate, errorHandlingService, taskboardTasksService, storage, filterRemoteStorageService) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.rs2 = rs2;\n this.params = params1;\n this.q = q1;\n this.appMetaService = appMetaService;\n this.location = location;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.taskboardTasksService = taskboardTasksService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n bindMethods(this);\n this.taskboardTasksService.reset();\n this.scope.userstories = [];\n this.openFilter = false;\n if (this.applyStoredFilters(this.params.pslug, \"tasks-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"TASKBOARD.SECTION_NAME\");\n this.initializeEventHandlers();\n taiga.defineImmutableProperty(this.scope, \"usTasks\", (function(_this) {\n return function() {\n return _this.taskboardTasksService.usTasks;\n };\n })(this));\n }\n\n TaskboardController.prototype.firstLoad = function() {\n var promise;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n return promise.then(null, this.onInitialDataError.bind(this));\n };\n\n TaskboardController.prototype.setZoom = function(zoomLevel, zoom) {\n var previousZoomLevel;\n if (this.zoomLevel === zoomLevel) {\n return null;\n }\n this.isFirstLoad = !this.zoomLevel;\n previousZoomLevel = this.zoomLevel;\n this.zoomLevel = zoomLevel;\n this.zoom = zoom;\n if (this.isFirstLoad) {\n this.firstLoad().then((function(_this) {\n return function() {\n _this.isFirstLoad = false;\n return _this.taskboardTasksService.resetFolds();\n };\n })(this));\n } else if (this.zoomLevel > 1 && previousZoomLevel <= 1) {\n this.zoomLoading = true;\n this.loadTasks().then((function(_this) {\n return function() {\n _this.zoomLoading = false;\n return _this.taskboardTasksService.resetFolds();\n };\n })(this));\n }\n if (this.zoomLevel === '0') {\n return this.rootscope.$broadcast(\"sprint:zoom0\");\n }\n };\n\n TaskboardController.prototype.changeQ = function(q) {\n this.replaceFilter(\"q\", q);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.removeFilter = function(filter) {\n this.unselectFilter(filter.dataType, filter.id);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.addFilter = function(newFilter) {\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.selectCustomFilter = function(customFilter) {\n this.replaceAllFilters(customFilter.filter);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters').then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, 'tasks-custom-filters').then(_this.generateFilters);\n };\n })(this));\n };\n\n TaskboardController.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, i, len, ref;\n ref = this.selectedFilters;\n for (i = 0, len = ref.length; i < len; i++) {\n filter = ref[i];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n TaskboardController.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters').then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, 'tasks-custom-filters').then(_this.generateFilters);\n };\n })(this));\n };\n\n TaskboardController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), \"tasks-filters\");\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.milestone = this.scope.sprintId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n return this.q.all([this.rs.tasks.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters')]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, owner, role, selected, statuses, tags, tagsWithAtLeastOneElement;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(this));\n };\n\n TaskboardController.prototype._setMeta = function() {\n var description, prettyDate, title;\n prettyDate = this.translate.instant(\"BACKLOG.SPRINTS.DATE\");\n title = this.translate.instant(\"TASKBOARD.PAGE_TITLE\", {\n projectName: this.scope.project.name,\n sprintName: this.scope.sprint.name\n });\n description = this.translate.instant(\"TASKBOARD.PAGE_DESCRIPTION\", {\n projectName: this.scope.project.name,\n sprintName: this.scope.sprint.name,\n startDate: moment(this.scope.sprint.estimated_start).format(prettyDate),\n endDate: moment(this.scope.sprint.estimated_finish).format(prettyDate),\n completedPercentage: this.scope.stats.completedPercentage || \"0\",\n completedPoints: this.scope.stats.completedPointsSum || \"--\",\n totalPoints: this.scope.stats.totalPointsSum || \"--\",\n openTasks: this.scope.stats.openTasks || \"--\",\n totalTasks: this.scope.stats.total_tasks || \"--\"\n });\n return this.appMetaService.setAll(title, description);\n };\n\n TaskboardController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"taskform:bulk:success\", (function(_this) {\n return function(event, tasks) {\n _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.add(tasks);\n });\n return _this.analytics.trackEvent(\"task\", \"create\", \"bulk create task on taskboard\", 1);\n };\n })(this));\n this.scope.$on(\"taskform:new:success\", (function(_this) {\n return function(event, task) {\n _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.add(task);\n });\n return _this.analytics.trackEvent(\"task\", \"create\", \"create task on taskboard\", 1);\n };\n })(this));\n this.scope.$on(\"taskform:edit:success\", (function(_this) {\n return function(event, task) {\n return _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.replaceModel(task);\n });\n };\n })(this));\n this.scope.$on(\"taskboard:task:deleted\", (function(_this) {\n return function(event, task) {\n return _this.loadTasks();\n };\n })(this));\n this.scope.$on(\"taskboard:task:move\", this.taskMove);\n return this.scope.$on(\"assigned-to:added\", this.onAssignedToChanged);\n };\n\n TaskboardController.prototype.onAssignedToChanged = function(ctx, userid, taskModel) {\n taskModel.assigned_to = userid;\n this.taskboardTasksService.replaceModel(taskModel);\n return this.repo.save(taskModel).then((function(_this) {\n return function() {\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('assigned_to') || _this.isFilterDataTypeSelected('role')) {\n return _this.loadTasks();\n }\n };\n })(this));\n };\n\n TaskboardController.prototype.initializeSubscription = function() {\n var routingKey, routingKey1;\n routingKey = \"changes.project.\" + this.scope.projectId + \".tasks\";\n this.events.subscribe(this.scope, routingKey, (function(_this) {\n return function(message) {\n return _this.loadTaskboard();\n };\n })(this));\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n return this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n _this.refreshTagsColors();\n _this.loadSprintStats();\n return _this.loadSprint();\n };\n })(this));\n };\n\n TaskboardController.prototype.loadProject = function() {\n return this.rs.projects.get(this.scope.projectId).then((function(_this) {\n return function(project) {\n if (!project.is_backlog_activated) {\n _this.errorHandlingService.permissionDenied();\n }\n _this.scope.project = project;\n _this.scope.pointsList = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(project.points, function(e) {\n return e.id;\n });\n _this.scope.roleById = groupBy(project.roles, function(e) {\n return e.id;\n });\n _this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n _this.scope.usStatusById = groupBy(project.us_statuses, function(e) {\n return e.id;\n });\n _this.scope.$emit('project:loaded', project);\n _this.fillUsersAndRoles(project.members, project.roles);\n return project;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadSprintStats = function() {\n return this.rs.sprints.stats(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(stats) {\n var completedPointsSum, remainingPointsSum, remainingTasks, totalPointsSum;\n totalPointsSum = _.reduce(_.values(stats.total_points), (function(res, n) {\n return res + n;\n }), 0);\n completedPointsSum = _.reduce(_.values(stats.completed_points), (function(res, n) {\n return res + n;\n }), 0);\n remainingPointsSum = totalPointsSum - completedPointsSum;\n remainingTasks = stats.total_tasks - stats.completed_tasks;\n _this.scope.stats = stats;\n _this.scope.stats.totalPointsSum = totalPointsSum;\n _this.scope.stats.completedPointsSum = completedPointsSum;\n _this.scope.stats.remainingPointsSum = remainingPointsSum;\n _this.scope.stats.remainingTasks = remainingTasks;\n if (stats.totalPointsSum) {\n _this.scope.stats.completedPercentage = Math.round(100 * stats.completedPointsSum / stats.totalPointsSum);\n } else {\n _this.scope.stats.completedPercentage = 0;\n }\n _this.scope.stats.openTasks = stats.total_tasks - stats.completed_tasks;\n return stats;\n };\n })(this));\n };\n\n TaskboardController.prototype.refreshTagsColors = function() {\n return this.rs.projects.tagsColors(this.scope.projectId).then((function(_this) {\n return function(tags_colors) {\n return _this.scope.project.tags_colors = tags_colors._attrs;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadSprint = function() {\n return this.rs.sprints.get(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n _this.scope.userstories = _.sortBy(sprint.user_stories, \"sprint_order\");\n _this.taskboardTasksService.setUserstories(_this.scope.userstories);\n return sprint;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTasks = function() {\n var params;\n params = {};\n if (this.zoomLevel > 1) {\n params.include_attachments = 1;\n }\n params = _.merge(params, this.location.search());\n return this.rs.tasks.list(this.scope.projectId, this.scope.sprintId, null, params).then((function(_this) {\n return function(tasks) {\n _this.taskboardTasksService.init(_this.scope.project, _this.scope.usersById);\n return _this.taskboardTasksService.set(tasks);\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTaskboard = function() {\n return this.q.all([\n this.refreshTagsColors(), this.loadSprintStats(), this.loadSprint().then((function(_this) {\n return function() {\n return _this.loadTasks();\n };\n })(this))\n ]);\n };\n\n TaskboardController.prototype.loadInitialData = function() {\n var params, promise;\n params = {\n pslug: this.params.pslug,\n sslug: this.params.sslug\n };\n promise = this.repo.resolve(params).then((function(_this) {\n return function(data) {\n _this.scope.projectId = data.project;\n _this.scope.sprintId = data.milestone;\n _this.initializeSubscription();\n return data;\n };\n })(this));\n return promise.then((function(_this) {\n return function() {\n return _this.loadProject();\n };\n })(this)).then((function(_this) {\n return function() {\n _this.generateFilters();\n return _this.loadTaskboard().then(function() {\n return _this.setRolePoints();\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.showPlaceHolder = function(statusId, usId) {\n if (!this.taskboardTasksService.tasksRaw.length) {\n if (this.scope.taskStatusList[0].id === statusId && (!this.scope.userstories.length || this.scope.userstories[0].id === usId)) {\n return true;\n }\n }\n return false;\n };\n\n TaskboardController.prototype.editTask = function(id) {\n var task;\n task = this.taskboardTasksService.getTask(id);\n task = task.set('loading-edit', true);\n this.taskboardTasksService.replace(task);\n return this.rs.tasks.getByRef(task.getIn(['model', 'project']), task.getIn(['model', 'ref'])).then((function(_this) {\n return function(editingTask) {\n return _this.rs2.attachments.list(\"task\", task.get('id'), task.getIn(['model', 'project'])).then(function(attachments) {\n _this.rootscope.$broadcast(\"taskform:edit\", editingTask, attachments.toJS());\n task = task.set('loading', false);\n return _this.taskboardTasksService.replace(task);\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.deleteTask = function(id) {\n var task;\n task = this.taskboardTasksService.getTask(id);\n task = task.set('loading-delete', true);\n return this.rs.tasks.getByRef(task.getIn(['model', 'project']), task.getIn(['model', 'ref'])).then((function(_this) {\n return function(deletingTask) {\n var message, title;\n task = task.set('loading-delete', false);\n title = _this.translate.instant(\"TASK.TITLE_DELETE_ACTION\");\n message = deletingTask.subject;\n return _this.confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = _this.repo.remove(deletingTask);\n promise.then(function() {\n _this.scope.$broadcast(\"taskboard:task:deleted\");\n return askResponse.finish();\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return this.confirm.notify(\"error\");\n });\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.taskMove = function(ctx, task, oldStatusId, usId, statusId, order) {\n var moveUpdateData, options, params, promise;\n task = this.taskboardTasksService.getTaskModel(task.get('id'));\n moveUpdateData = this.taskboardTasksService.move(task.id, usId, statusId, order);\n params = {\n status__is_archived: false,\n include_attachments: true\n };\n options = {\n headers: {\n \"set-orders\": JSON.stringify(moveUpdateData.set_orders)\n }\n };\n return promise = this.repo.save(task, true, params, options, true).then((function(_this) {\n return function(result) {\n var headers;\n headers = result[1];\n if (headers && headers['taiga-info-order-updated']) {\n order = JSON.parse(headers['taiga-info-order-updated']);\n _this.taskboardTasksService.assignOrders(order);\n }\n _this.loadSprintStats();\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('status')) {\n return _this.loadTasks();\n }\n };\n })(this));\n };\n\n TaskboardController.prototype.addNewTask = function(type, us) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"taskform:new\", this.scope.sprintId, us != null ? us.id : void 0);\n case \"bulk\":\n return this.rootscope.$broadcast(\"taskform:bulk\", this.scope.sprintId, us != null ? us.id : void 0);\n }\n };\n\n TaskboardController.prototype.toggleFold = function(id) {\n return this.taskboardTasksService.toggleFold(id);\n };\n\n TaskboardController.prototype.changeTaskAssignedTo = function(id) {\n var task;\n task = this.taskboardTasksService.getTaskModel(id);\n return this.rootscope.$broadcast(\"assigned-to:add\", task);\n };\n\n TaskboardController.prototype.setRolePoints = function() {\n var computableRoles, getPoint, getRole, pointsByRole;\n computableRoles = _.filter(this.scope.project.roles, \"computable\");\n getRole = (function(_this) {\n return function(roleId) {\n roleId = parseInt(roleId, 10);\n return _.find(computableRoles, function(role) {\n return role.id === roleId;\n });\n };\n })(this);\n getPoint = (function(_this) {\n return function(pointId) {\n var poitnId;\n poitnId = parseInt(pointId, 10);\n return _.find(_this.scope.project.points, function(point) {\n return point.id === pointId;\n });\n };\n })(this);\n pointsByRole = _.reduce(this.scope.userstories, (function(_this) {\n return function(result, us, key) {\n _.forOwn(us.points, function(pointId, roleId) {\n var point, role;\n role = getRole(roleId);\n point = getPoint(pointId);\n if (!result[role.id]) {\n result[role.id] = role;\n result[role.id].points = 0;\n }\n return result[role.id].points += point.value;\n });\n return result;\n };\n })(this), {});\n return this.scope.pointsByRole = Object.keys(pointsByRole).map(function(key) {\n return pointsByRole[key];\n });\n };\n\n return TaskboardController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"TaskboardController\", TaskboardController);\n\n TaskboardDirective = function($rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, tableBodyDom;\n $ctrl = $el.controller();\n $el.on(\"click\", \".toggle-analytics-visibility\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.toggleClass('active');\n return $rootscope.$broadcast(\"taskboard:graph:toggle-visibility\");\n });\n tableBodyDom = $el.find(\".taskboard-table-body\");\n tableBodyDom.on(\"scroll\", function(event) {\n var tableHeaderDom, target;\n target = angular.element(event.currentTarget);\n tableHeaderDom = $el.find(\".taskboard-table-header .taskboard-table-inner\");\n return tableHeaderDom.css(\"left\", -1 * target.scrollLeft());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboard\", [\"$rootScope\", TaskboardDirective]);\n\n TaskboardSquishColumnDirective = function(rs) {\n var avatarWidth, link, maxColumnWidth;\n avatarWidth = 40;\n maxColumnWidth = 300;\n link = function($scope, $el, $attrs) {\n var getCeilWidth, recalculateStatusColumnWidth, recalculateTaskboardWidth, refreshTaskboardTableWidth, setStatusColumnWidth;\n $scope.$on(\"sprint:zoom0\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n $scope.$on(\"sprint:task:moved\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n $scope.$watch(\"usTasks\", function() {\n if ($scope.project) {\n $scope.statusesFolded = rs.tasks.getStatusColumnModes($scope.project.id);\n $scope.usFolded = rs.tasks.getUsRowModes($scope.project.id, $scope.sprintId);\n return recalculateTaskboardWidth();\n }\n });\n $scope.foldStatus = function(status) {\n $scope.statusesFolded[status.id] = !!!$scope.statusesFolded[status.id];\n rs.tasks.storeStatusColumnModes($scope.projectId, $scope.statusesFolded);\n return recalculateTaskboardWidth();\n };\n $scope.foldUs = function(us) {\n if (!us) {\n $scope.usFolded[null] = !!!$scope.usFolded[null];\n } else {\n $scope.usFolded[us.id] = !!!$scope.usFolded[us.id];\n }\n rs.tasks.storeUsRowModes($scope.projectId, $scope.sprintId, $scope.usFolded);\n return recalculateTaskboardWidth();\n };\n getCeilWidth = (function(_this) {\n return function(usId, statusId) {\n var tasks, tasksMatrixSize, width;\n if (usId) {\n tasks = $scope.usTasks.getIn([usId.toString(), statusId.toString()]).size;\n } else {\n tasks = $scope.usTasks.getIn(['null', statusId.toString()]).size;\n }\n if ($scope.statusesFolded[statusId]) {\n if (tasks && $scope.usFolded[usId]) {\n tasksMatrixSize = Math.round(Math.sqrt(tasks));\n width = avatarWidth * tasksMatrixSize;\n } else {\n width = avatarWidth;\n }\n return width;\n }\n return 0;\n };\n })(this);\n setStatusColumnWidth = (function(_this) {\n return function(statusId, width) {\n var column;\n column = $el.find(\".squish-status-\" + statusId);\n if (width) {\n return column.css('max-width', width);\n } else {\n if ($scope.ctrl.zoomLevel === '0') {\n return column.css(\"max-width\", 148);\n } else {\n return column.css(\"max-width\", maxColumnWidth);\n }\n }\n };\n })(this);\n refreshTaskboardTableWidth = (function(_this) {\n return function() {\n var columnWidths, columns, totalWidth;\n columnWidths = [];\n columns = $el.find(\".task-colum-name\");\n columnWidths = _.map(columns, function(column) {\n return $(column).outerWidth(true);\n });\n totalWidth = _.reduce(columnWidths, function(total, width) {\n return total + width;\n });\n return $el.find('.taskboard-table-inner').css(\"width\", totalWidth);\n };\n })(this);\n recalculateStatusColumnWidth = (function(_this) {\n return function(statusId) {\n var statusFoldedWidth;\n statusFoldedWidth = getCeilWidth(null, statusId);\n _.forEach($scope.userstories, function(us) {\n var width;\n width = getCeilWidth(us.id, statusId);\n if (width > statusFoldedWidth) {\n return statusFoldedWidth = width;\n }\n });\n return setStatusColumnWidth(statusId, statusFoldedWidth);\n };\n })(this);\n return recalculateTaskboardWidth = (function(_this) {\n return function() {\n _.forEach($scope.taskStatusList, function(status) {\n return recalculateStatusColumnWidth(status.id);\n });\n refreshTaskboardTableWidth();\n };\n })(this);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSquishColumn\", [\"$tgResources\", TaskboardSquishColumnDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/sortable.coffee\n */\n\n(function() {\n var TaskboardSortableDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaBacklog\");\n\n TaskboardSortableDirective = function($repo, $rs, $rootscope, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch;\n return unwatch = $scope.$watch(\"usTasks\", function(usTasks) {\n var containers, deleteElement, drake, filterError, itemEl, newParentScope, oldParentScope, scroll, tdom;\n if (!usTasks || !usTasks.size) {\n return;\n }\n unwatch();\n if (!($scope.project.my_permissions.indexOf(\"modify_task\") > -1)) {\n return;\n }\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n filterError = function() {\n var text;\n text = $translate.instant(\"BACKLOG.SORTABLE_FILTER_ERROR\");\n return $tgConfirm.notify(\"error\", text);\n };\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n containers = _.map($el.find('.task-column'), function(item) {\n return item;\n });\n drake = dragula(containers, {\n copySortSource: false,\n copy: false,\n accepts: function(el, target) {\n return !$(target).hasClass('taskboard-userstory-box');\n },\n moves: function(item) {\n return $(item).is('tg-card');\n }\n });\n drake.on('drag', function(item) {\n oldParentScope = $(item).parent().scope();\n if ($el.hasClass(\"active-filters\")) {\n filterError();\n setTimeout((function() {\n return drake.cancel(true);\n }), 0);\n return false;\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex, itemTask, newStatusId, newUsId, oldStatusId, oldUsId, parentEl;\n parentEl = $(item).parent();\n itemEl = $(item);\n itemTask = itemEl.scope().task;\n itemIndex = itemEl.index();\n newParentScope = parentEl.scope();\n oldUsId = oldParentScope.us ? oldParentScope.us.id : null;\n oldStatusId = oldParentScope.st.id;\n newUsId = newParentScope.us ? newParentScope.us.id : null;\n newStatusId = newParentScope.st.id;\n if (newStatusId !== oldStatusId || newUsId !== oldUsId) {\n deleteElement(itemEl);\n }\n return $scope.$apply(function() {\n return $rootscope.$broadcast(\"taskboard:task:move\", itemTask, itemTask.getIn(['model', 'status']), newUsId, newStatusId, itemIndex);\n });\n });\n scroll = autoScroll([$('.taskboard-table-body')[0]], {\n margin: 100,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$translate\", TaskboardSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.service.coffee\n */\n\n(function() {\n var TaskboardTasksService, groupBy,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n groupBy = this.taiga.groupBy;\n\n TaskboardTasksService = (function(superClass) {\n extend(TaskboardTasksService, superClass);\n\n TaskboardTasksService.$inject = [];\n\n function TaskboardTasksService() {\n this.reset();\n }\n\n TaskboardTasksService.prototype.reset = function() {\n this.tasksRaw = [];\n this.foldStatusChanged = {};\n return this.usTasks = Immutable.Map();\n };\n\n TaskboardTasksService.prototype.init = function(project, usersById) {\n this.project = project;\n return this.usersById = usersById;\n };\n\n TaskboardTasksService.prototype.resetFolds = function() {\n this.foldStatusChanged = {};\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.toggleFold = function(taskId) {\n this.foldStatusChanged[taskId] = !this.foldStatusChanged[taskId];\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.add = function(task) {\n this.tasksRaw = this.tasksRaw.concat(task);\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.set = function(tasks) {\n this.tasksRaw = tasks;\n this.refreshRawOrder();\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.setUserstories = function(userstories) {\n return this.userstories = userstories;\n };\n\n TaskboardTasksService.prototype.refreshRawOrder = function() {\n var i, len, ref, results, task;\n this.order = {};\n ref = this.tasksRaw;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n task = ref[i];\n results.push(this.order[task.id] = task.taskboard_order);\n }\n return results;\n };\n\n TaskboardTasksService.prototype.assignOrders = function(order) {\n order = _.invert(order);\n this.order = _.assign(this.order, order);\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.getTask = function(id) {\n var findedTask;\n findedTask = null;\n this.usTasks.forEach(function(us) {\n us.forEach(function(status) {\n findedTask = status.find(function(task) {\n return task.get('id') === id;\n });\n if (findedTask) {\n return false;\n }\n });\n if (findedTask) {\n return false;\n }\n });\n return findedTask;\n };\n\n TaskboardTasksService.prototype.replace = function(task) {\n return this.usTasks = this.usTasks.map(function(us) {\n return us.map(function(status) {\n var findedIndex;\n findedIndex = status.findIndex(function(usItem) {\n return usItem.get('id') === us.get('id');\n });\n if (findedIndex !== -1) {\n status = status.set(findedIndex, task);\n }\n return status;\n });\n });\n };\n\n TaskboardTasksService.prototype.getTaskModel = function(id) {\n return _.find(this.tasksRaw, function(task) {\n return task.id === id;\n });\n };\n\n TaskboardTasksService.prototype.replaceModel = function(task) {\n this.tasksRaw = _.map(this.tasksRaw, function(it) {\n if (task.id === it.id) {\n return task;\n } else {\n return it;\n }\n });\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.move = function(id, usId, statusId, index) {\n var afterDestination, beforeDestination, i, it, j, key, len, len1, previous, previousWithTheSameOrder, setOrders, taksWithoutMoved, task, taskByUsStatus;\n task = this.getTaskModel(id);\n taskByUsStatus = _.filter(this.tasksRaw, (function(_this) {\n return function(task) {\n return task.status === statusId && task.user_story === usId;\n };\n })(this));\n taskByUsStatus = _.sortBy(taskByUsStatus, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n taksWithoutMoved = _.filter(taskByUsStatus, (function(_this) {\n return function(it) {\n return it.id !== id;\n };\n })(this));\n beforeDestination = _.slice(taksWithoutMoved, 0, index);\n afterDestination = _.slice(taksWithoutMoved, index);\n setOrders = {};\n previous = beforeDestination[beforeDestination.length - 1];\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return _this.order[it.id] === _this.order[previous.id];\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n for (i = 0, len = previousWithTheSameOrder.length; i < len; i++) {\n it = previousWithTheSameOrder[i];\n setOrders[it.id] = this.order[it.id];\n }\n }\n if (!previous) {\n this.order[task.id] = 0;\n } else if (previous) {\n this.order[task.id] = this.order[previous.id] + 1;\n }\n for (key = j = 0, len1 = afterDestination.length; j < len1; key = ++j) {\n it = afterDestination[key];\n this.order[it.id] = this.order[task.id] + key + 1;\n }\n task.status = statusId;\n task.user_story = usId;\n task.taskboard_order = this.order[task.id];\n this.refresh();\n return {\n \"task_id\": task.id,\n \"order\": this.order[task.id],\n \"set_orders\": setOrders\n };\n };\n\n TaskboardTasksService.prototype.refresh = function() {\n var i, j, k, len, len1, len2, model, ref, status, task, taskModel, taskStatusList, tasks, us, usTasks;\n this.tasksRaw = _.sortBy(this.tasksRaw, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n tasks = this.tasksRaw;\n taskStatusList = _.sortBy(this.project.task_statuses, \"order\");\n usTasks = {};\n ref = _.union(this.userstories, [\n {\n id: null\n }\n ]);\n for (i = 0, len = ref.length; i < len; i++) {\n us = ref[i];\n usTasks[us.id] = {};\n for (j = 0, len1 = taskStatusList.length; j < len1; j++) {\n status = taskStatusList[j];\n usTasks[us.id][status.id] = [];\n }\n }\n for (k = 0, len2 = tasks.length; k < len2; k++) {\n taskModel = tasks[k];\n if ((usTasks[taskModel.user_story] != null) && (usTasks[taskModel.user_story][taskModel.status] != null)) {\n task = {};\n model = taskModel.getAttrs();\n task.foldStatusChanged = this.foldStatusChanged[taskModel.id];\n task.model = model;\n task.images = _.filter(model.attachments, function(it) {\n return !!it.thumbnail_card_url;\n });\n task.id = taskModel.id;\n task.assigned_to = this.usersById[taskModel.assigned_to];\n task.colorized_tags = _.map(task.model.tags, (function(_this) {\n return function(tag) {\n return {\n name: tag[0],\n color: tag[1]\n };\n };\n })(this));\n usTasks[taskModel.user_story][taskModel.status].push(task);\n }\n }\n return this.usTasks = Immutable.fromJS(usTasks);\n };\n\n return TaskboardTasksService;\n\n })(taiga.Service);\n\n angular.module(\"taigaKanban\").service(\"tgTaskboardTasks\", TaskboardTasksService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: kanban-userstories.service.coffee\n */\n\n(function() {\n var KanbanUserstoriesService, groupBy,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n groupBy = this.taiga.groupBy;\n\n KanbanUserstoriesService = (function(superClass) {\n extend(KanbanUserstoriesService, superClass);\n\n KanbanUserstoriesService.$inject = [];\n\n function KanbanUserstoriesService() {\n this.reset();\n }\n\n KanbanUserstoriesService.prototype.reset = function() {\n this.userstoriesRaw = [];\n this.archivedStatus = [];\n this.statusHide = [];\n this.foldStatusChanged = {};\n return this.usByStatus = Immutable.Map();\n };\n\n KanbanUserstoriesService.prototype.init = function(project, usersById) {\n this.project = project;\n return this.usersById = usersById;\n };\n\n KanbanUserstoriesService.prototype.resetFolds = function() {\n this.foldStatusChanged = {};\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.toggleFold = function(usId) {\n this.foldStatusChanged[usId] = !this.foldStatusChanged[usId];\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.set = function(userstories) {\n this.userstoriesRaw = userstories;\n this.refreshRawOrder();\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.add = function(us) {\n this.userstoriesRaw = this.userstoriesRaw.concat(us);\n this.refreshRawOrder();\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.addArchivedStatus = function(statusId) {\n return this.archivedStatus.push(statusId);\n };\n\n KanbanUserstoriesService.prototype.isUsInArchivedHiddenStatus = function(usId) {\n var us;\n us = this.getUsModel(usId);\n return this.archivedStatus.indexOf(us.status) !== -1 && this.statusHide.indexOf(us.status) !== -1;\n };\n\n KanbanUserstoriesService.prototype.hideStatus = function(statusId) {\n this.deleteStatus(statusId);\n return this.statusHide.push(statusId);\n };\n\n KanbanUserstoriesService.prototype.showStatus = function(statusId) {\n return _.remove(this.statusHide, function(it) {\n return it === statusId;\n });\n };\n\n KanbanUserstoriesService.prototype.getStatus = function(statusId) {\n return _.filter(this.userstoriesRaw, function(us) {\n return us.status === statusId;\n });\n };\n\n KanbanUserstoriesService.prototype.deleteStatus = function(statusId) {\n var toDelete;\n toDelete = _.filter(this.userstoriesRaw, function(us) {\n return us.status === statusId;\n });\n toDelete = _.map(function(it) {\n return it.id;\n });\n this.archived = _.difference(this.archived, toDelete);\n this.userstoriesRaw = _.filter(this.userstoriesRaw, function(us) {\n return us.status !== statusId;\n });\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.refreshRawOrder = function() {\n var i, it, len, ref, results;\n this.order = {};\n ref = this.userstoriesRaw;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n it = ref[i];\n results.push(this.order[it.id] = it.kanban_order);\n }\n return results;\n };\n\n KanbanUserstoriesService.prototype.assignOrders = function(order) {\n this.order = _.assign(this.order, order);\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.move = function(usList, statusId, index) {\n var afterDestination, beforeDestination, i, initialLength, it, j, k, key, len, len1, len2, modifiedUs, previous, previousWithTheSameOrder, setNextOrders, setOrders, setPreviousOrders, startIndex, us, usByStatus, usByStatusWithoutMoved;\n initialLength = usList.length;\n usByStatus = _.filter(this.userstoriesRaw, (function(_this) {\n return function(it) {\n return it.status === statusId;\n };\n })(this));\n usByStatus = _.sortBy(usByStatus, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n usByStatusWithoutMoved = _.filter(usByStatus, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(usByStatusWithoutMoved, 0, index);\n afterDestination = _.slice(usByStatusWithoutMoved, index);\n setOrders = {};\n previous = beforeDestination[beforeDestination.length - 1];\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return _this.order[it.id] === _this.order[previous.id];\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n for (i = 0, len = previousWithTheSameOrder.length; i < len; i++) {\n it = previousWithTheSameOrder[i];\n setOrders[it.id] = this.order[it.id];\n }\n }\n modifiedUs = [];\n setPreviousOrders = [];\n setNextOrders = [];\n if (!previous) {\n startIndex = 0;\n } else if (previous) {\n startIndex = this.order[previous.id] + 1;\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return it.kanban_order === _this.order[previous.id];\n };\n })(this));\n for (key = j = 0, len1 = afterDestination.length; j < len1; key = ++j) {\n it = afterDestination[key];\n this.order[it.id] = this.order[previous.id] + key + initialLength + 1;\n it.kanban_order = this.order[it.id];\n }\n setNextOrders = _.map(afterDestination, (function(_this) {\n return function(it) {\n return {\n us_id: it.id,\n order: _this.order[it.id]\n };\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n setPreviousOrders = _.map(previousWithTheSameOrder, (function(_this) {\n return function(it) {\n return {\n us_id: it.id,\n order: _this.order[it.id]\n };\n };\n })(this));\n }\n }\n for (key = k = 0, len2 = usList.length; k < len2; key = ++k) {\n us = usList[key];\n us.status = statusId;\n us.kanban_order = startIndex + key;\n this.order[us.id] = us.kanban_order;\n modifiedUs.push({\n us_id: us.id,\n order: us.kanban_order\n });\n }\n this.refresh();\n return {\n bulkOrders: modifiedUs.concat(setPreviousOrders, setNextOrders),\n usList: modifiedUs,\n set_orders: setOrders\n };\n };\n\n KanbanUserstoriesService.prototype.moveToEnd = function(id, statusId) {\n var us;\n us = this.getUsModel(id);\n this.order[us.id] = -1;\n us.status = statusId;\n us.kanban_order = this.order[us.id];\n this.refresh();\n return {\n \"us_id\": us.id,\n \"order\": -1\n };\n };\n\n KanbanUserstoriesService.prototype.replace = function(us) {\n return this.usByStatus = this.usByStatus.map(function(status) {\n var findedIndex;\n findedIndex = status.findIndex(function(usItem) {\n return usItem.get('id') === us.get('id');\n });\n if (findedIndex !== -1) {\n status = status.set(findedIndex, us);\n }\n return status;\n });\n };\n\n KanbanUserstoriesService.prototype.replaceModel = function(us) {\n this.userstoriesRaw = _.map(this.userstoriesRaw, function(usItem) {\n if (us.id === usItem.id) {\n return us;\n } else {\n return usItem;\n }\n });\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.getUs = function(id) {\n var findedUs;\n findedUs = null;\n this.usByStatus.forEach(function(status) {\n findedUs = status.find(function(us) {\n return us.get('id') === id;\n });\n if (findedUs) {\n return false;\n }\n });\n return findedUs;\n };\n\n KanbanUserstoriesService.prototype.getUsModel = function(id) {\n return _.find(this.userstoriesRaw, function(us) {\n return us.id === id;\n });\n };\n\n KanbanUserstoriesService.prototype.refresh = function() {\n var usByStatus, userstories;\n this.userstoriesRaw = _.sortBy(this.userstoriesRaw, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n userstories = this.userstoriesRaw;\n userstories = _.map(userstories, (function(_this) {\n return function(usModel) {\n var model, us;\n us = {};\n model = usModel.getAttrs();\n us.foldStatusChanged = _this.foldStatusChanged[usModel.id];\n us.model = model;\n us.images = _.filter(model.attachments, function(it) {\n return !!it.thumbnail_card_url;\n });\n us.id = usModel.id;\n us.assigned_to = _this.usersById[usModel.assigned_to];\n us.assigned_users = [];\n usModel.assigned_users.forEach(function(assignedUserId) {\n var assignedUserData;\n assignedUserData = _this.usersById[assignedUserId];\n return us.assigned_users.push(assignedUserData);\n });\n us.colorized_tags = _.map(us.model.tags, function(tag) {\n return {\n name: tag[0],\n color: tag[1]\n };\n });\n return us;\n };\n })(this));\n usByStatus = _.groupBy(userstories, function(us) {\n return us.model.status;\n });\n return this.usByStatus = Immutable.fromJS(usByStatus);\n };\n\n return KanbanUserstoriesService;\n\n })(taiga.Service);\n\n angular.module(\"taigaKanban\").service(\"tgKanbanUserstories\", KanbanUserstoriesService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban/main.coffee\n */\n\n(function() {\n var KanbanArchivedStatusHeaderDirective, KanbanArchivedStatusIntroDirective, KanbanController, KanbanDirective, KanbanSquishColumnDirective, KanbanWipLimitDirective, bindMethods, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaKanban\");\n\n KanbanController = (function(superClass) {\n extend(KanbanController, superClass);\n\n KanbanController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"$tgModel\", \"tgKanbanUserstories\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\"];\n\n KanbanController.prototype.storeCustomFiltersName = 'kanban-custom-filters';\n\n KanbanController.prototype.storeFiltersName = 'kanban-filters';\n\n function KanbanController(scope, rootscope, repo, confirm, rs1, rs2, params1, q, location, appMetaService, navUrls, events, analytics, translate, errorHandlingService, model, kanbanUserstoriesService1, storage, filterRemoteStorageService, projectService1) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.rs2 = rs2;\n this.params = params1;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.model = model;\n this.kanbanUserstoriesService = kanbanUserstoriesService1;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService1;\n bindMethods(this);\n this.kanbanUserstoriesService.reset();\n this.openFilter = false;\n this.selectedUss = {};\n if (this.applyStoredFilters(this.params.pslug, \"kanban-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"KANBAN.SECTION_NAME\");\n this.initializeEventHandlers();\n taiga.defineImmutableProperty(this.scope, \"usByStatus\", (function(_this) {\n return function() {\n return _this.kanbanUserstoriesService.usByStatus;\n };\n })(this));\n }\n\n KanbanController.prototype.cleanSelectedUss = function() {\n var key, results;\n results = [];\n for (key in this.selectedUss) {\n results.push(this.selectedUss[key] = false);\n }\n return results;\n };\n\n KanbanController.prototype.toggleSelectedUs = function(usId) {\n return this.selectedUss[usId] = !this.selectedUss[usId];\n };\n\n KanbanController.prototype.firstLoad = function() {\n var promise;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"KANBAN.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"KANBAN.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n return promise.then(null, this.onInitialDataError.bind(this));\n };\n\n KanbanController.prototype.setZoom = function(zoomLevel, zoom) {\n var previousZoomLevel;\n if (this.zoomLevel === zoomLevel) {\n return null;\n }\n this.isFirstLoad = !this.zoomLevel;\n previousZoomLevel = this.zoomLevel;\n this.zoomLevel = zoomLevel;\n this.zoom = zoom;\n if (this.isFirstLoad) {\n return this.firstLoad().then((function(_this) {\n return function() {\n _this.isFirstLoad = false;\n return _this.kanbanUserstoriesService.resetFolds();\n };\n })(this));\n } else if (this.zoomLevel > 1 && previousZoomLevel <= 1) {\n this.zoomLoading = true;\n return this.loadUserstories().then((function(_this) {\n return function() {\n _this.zoomLoading = false;\n return _this.kanbanUserstoriesService.resetFolds();\n };\n })(this));\n }\n };\n\n KanbanController.prototype.filtersReloadContent = function() {\n return this.loadUserstories().then((function(_this) {\n return function() {\n var i, len, openArchived, results, statusId;\n openArchived = _.difference(_this.kanbanUserstoriesService.archivedStatus, _this.kanbanUserstoriesService.statusHide);\n if (openArchived.length) {\n results = [];\n for (i = 0, len = openArchived.length; i < len; i++) {\n statusId = openArchived[i];\n results.push(_this.loadUserStoriesForStatus({}, statusId));\n }\n return results;\n }\n };\n })(this));\n };\n\n KanbanController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function(event, us) {\n _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.add(us);\n });\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"create userstory on kanban\", 1);\n };\n })(this));\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function(event, uss) {\n _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.add(uss);\n });\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on kanban\", 1);\n };\n })(this));\n this.scope.$on(\"usform:edit:success\", (function(_this) {\n return function(event, us) {\n return _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.replaceModel(us);\n });\n };\n })(this));\n this.scope.$on(\"kanban:us:deleted\", (function(_this) {\n return function(event, us) {\n return _this.filtersReloadContent();\n };\n })(this));\n this.scope.$on(\"assigned-to:added\", this.onAssignedToChanged);\n this.scope.$on(\"assigned-user:added\", this.onAssignedUsersChanged);\n this.scope.$on(\"assigned-user:deleted\", this.onAssignedUsersDeleted);\n this.scope.$on(\"kanban:us:move\", this.moveUs);\n this.scope.$on(\"kanban:show-userstories-for-status\", this.loadUserStoriesForStatus);\n return this.scope.$on(\"kanban:hide-userstories-for-status\", this.hideUserStoriesForStatus);\n };\n\n KanbanController.prototype.addNewUs = function(type, statusId) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"usform:new\", this.scope.projectId, statusId, this.scope.usStatusList);\n case \"bulk\":\n return this.rootscope.$broadcast(\"usform:bulk\", this.scope.projectId, statusId);\n }\n };\n\n KanbanController.prototype.editUs = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUs(id);\n us = us.set('loading-edit', true);\n this.kanbanUserstoriesService.replace(us);\n return this.rs.userstories.getByRef(us.getIn(['model', 'project']), us.getIn(['model', 'ref'])).then((function(_this) {\n return function(editingUserStory) {\n return _this.rs2.attachments.list(\"us\", us.get('id'), us.getIn(['model', 'project'])).then(function(attachments) {\n _this.rootscope.$broadcast(\"usform:edit\", editingUserStory, attachments.toJS());\n us = us.set('loading-edit', false);\n return _this.kanbanUserstoriesService.replace(us);\n });\n };\n })(this));\n };\n\n KanbanController.prototype.deleteUs = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUs(id);\n us = us.set('loading-delete', true);\n return this.rs.userstories.getByRef(us.getIn(['model', 'project']), us.getIn(['model', 'ref'])).then((function(_this) {\n return function(deletingUserStory) {\n var message, title;\n us = us.set('loading-delete', false);\n title = _this.translate.instant(\"US.TITLE_DELETE_ACTION\");\n message = deletingUserStory.subject;\n return _this.confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = _this.repo.remove(deletingUserStory);\n promise.then(function() {\n _this.scope.$broadcast(\"kanban:us:deleted\");\n return askResponse.finish();\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return this.confirm.notify(\"error\");\n });\n });\n };\n })(this));\n };\n\n KanbanController.prototype.showPlaceHolder = function(statusId) {\n if (this.scope.usStatusList[0].id === statusId && !this.kanbanUserstoriesService.userstoriesRaw.length) {\n return true;\n }\n return false;\n };\n\n KanbanController.prototype.toggleFold = function(id) {\n return this.kanbanUserstoriesService.toggleFold(id);\n };\n\n KanbanController.prototype.isUsInArchivedHiddenStatus = function(usId) {\n return this.kanbanUserstoriesService.isUsInArchivedHiddenStatus(usId);\n };\n\n KanbanController.prototype.changeUsAssignedTo = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUsModel(id);\n return this.rootscope.$broadcast(\"assigned-to:add\", us);\n };\n\n KanbanController.prototype.changeUsAssignedUsers = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUsModel(id);\n return this.rootscope.$broadcast(\"assigned-user:add\", us);\n };\n\n KanbanController.prototype.onAssignedToChanged = function(ctx, userid, usModel) {\n usModel.assigned_to = userid;\n this.kanbanUserstoriesService.replaceModel(usModel);\n return this.repo.save(usModel).then((function(_this) {\n return function() {\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('assigned_to') || _this.isFilterDataTypeSelected('role')) {\n return _this.filtersReloadContent();\n }\n };\n })(this));\n };\n\n KanbanController.prototype.onAssignedUsersChanged = function(ctx, userid, usModel) {\n var assignedUsers, promise;\n assignedUsers = _.clone(usModel.assigned_users, false);\n assignedUsers.push(userid);\n assignedUsers = _.uniq(assignedUsers);\n usModel.assigned_users = assignedUsers;\n if (!usModel.assigned_to) {\n usModel.assigned_to = userid;\n }\n this.kanbanUserstoriesService.replaceModel(usModel);\n promise = this.repo.save(usModel);\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n\n KanbanController.prototype.onAssignedUsersDeleted = function(ctx, userid, usModel) {\n var assignedUsersIds, promise, ref;\n assignedUsersIds = _.clone(usModel.assigned_users, false);\n assignedUsersIds = _.pull(assignedUsersIds, userid);\n assignedUsersIds = _.uniq(assignedUsersIds);\n usModel.assigned_users = assignedUsersIds;\n if ((ref = usModel.assigned_to, indexOf.call(assignedUsersIds, ref) < 0) && assignedUsersIds.length > 0) {\n usModel.assigned_to = assignedUsersIds[0];\n }\n if (assignedUsersIds.length === 0) {\n usModel.assigned_to = null;\n }\n this.kanbanUserstoriesService.replaceModel(usModel);\n promise = this.repo.save(usModel);\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n\n KanbanController.prototype.refreshTagsColors = function() {\n return this.rs.projects.tagsColors(this.scope.projectId).then((function(_this) {\n return function(tags_colors) {\n return _this.scope.project.tags_colors = tags_colors._attrs;\n };\n })(this));\n };\n\n KanbanController.prototype.loadUserstories = function() {\n var params, promise;\n params = {\n status__is_archived: false\n };\n if (this.zoomLevel > 1) {\n params.include_attachments = 1;\n params.include_tasks = 1;\n }\n params = _.merge(params, this.location.search());\n promise = this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n _this.kanbanUserstoriesService.init(_this.scope.project, _this.scope.usersById);\n _this.kanbanUserstoriesService.set(userstories);\n scopeDefer(_this.scope, function() {\n return _this.scope.$broadcast(\"userstories:loaded\", userstories);\n });\n return userstories;\n };\n })(this));\n promise.then((function(_this) {\n return function() {\n return _this.scope.$broadcast(\"redraw:wip\");\n };\n })(this));\n return promise;\n };\n\n KanbanController.prototype.loadUserStoriesForStatus = function(ctx, statusId) {\n var filteredStatus, params;\n filteredStatus = this.location.search().status;\n if (filteredStatus) {\n filteredStatus = filteredStatus.split(\",\").map(function(it) {\n return parseInt(it, 10);\n });\n if (filteredStatus.indexOf(statusId) === -1) {\n return;\n }\n }\n params = {\n status: statusId,\n include_attachments: true,\n include_tasks: true\n };\n params = _.merge(params, this.location.search());\n return this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n _this.scope.$broadcast(\"kanban:shown-userstories-for-status\", statusId, userstories);\n return userstories;\n };\n })(this));\n };\n\n KanbanController.prototype.hideUserStoriesForStatus = function(ctx, statusId) {\n return this.scope.$broadcast(\"kanban:hidden-userstories-for-status\", statusId);\n };\n\n KanbanController.prototype.loadKanban = function() {\n return this.q.all([this.refreshTagsColors(), this.loadUserstories()]);\n };\n\n KanbanController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_kanban_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.projectId = project.id;\n this.scope.points = _.sortBy(project.points, \"order\");\n this.scope.pointsById = groupBy(project.points, function(x) {\n return x.id;\n });\n this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n this.scope.$emit(\"project:loaded\", project);\n return project;\n };\n\n KanbanController.prototype.initializeSubscription = function() {\n var routingKey1;\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n return this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n return _this.loadUserstories();\n };\n })(this));\n };\n\n KanbanController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n this.loadKanban();\n return this.generateFilters();\n };\n\n KanbanController.prototype.prepareBulkUpdateData = function(uses, field) {\n if (field == null) {\n field = \"kanban_order\";\n }\n return _.map(uses, function(x) {\n return {\n \"us_id\": x.id,\n \"order\": x[field]\n };\n });\n };\n\n KanbanController.prototype.moveUs = function(ctx, usList, newStatusId, index) {\n var data, promise;\n this.cleanSelectedUss();\n usList = _.map(usList, (function(_this) {\n return function(us) {\n return _this.kanbanUserstoriesService.getUsModel(us.id);\n };\n })(this));\n data = this.kanbanUserstoriesService.move(usList, newStatusId, index);\n promise = this.rs.userstories.bulkUpdateKanbanOrder(this.scope.projectId, newStatusId, data.bulkOrders);\n return promise.then((function(_this) {\n return function() {\n var options, params, promises;\n options = {\n headers: {\n \"set-orders\": JSON.stringify(data.setOrders)\n }\n };\n params = {\n include_attachments: true,\n include_tasks: true\n };\n promises = _.map(usList, function(us) {\n return _this.repo.save(us, true, params, options, true);\n });\n promise = _this.q.all(promises);\n return promise.then(function(result) {\n var headers, order;\n headers = result[1];\n if (headers && headers['taiga-info-order-updated']) {\n order = JSON.parse(headers['taiga-info-order-updated']);\n _this.kanbanUserstoriesService.assignOrders(order);\n }\n _this.scope.$broadcast(\"redraw:wip\");\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('status')) {\n _this.filtersReloadContent();\n }\n return promise;\n });\n };\n })(this));\n };\n\n return KanbanController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin, taiga.UsFiltersMixin));\n\n module.controller(\"KanbanController\", KanbanController);\n\n KanbanDirective = function($repo, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var tableBodyDom;\n tableBodyDom = $el.find(\".kanban-table-body\");\n tableBodyDom.on(\"scroll\", function(event) {\n var tableHeaderDom, target;\n target = angular.element(event.currentTarget);\n tableHeaderDom = $el.find(\".kanban-table-header .kanban-table-inner\");\n return tableHeaderDom.css(\"left\", -1 * target.scrollLeft());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanban\", [\"$tgRepo\", \"$rootScope\", KanbanDirective]);\n\n KanbanArchivedStatusHeaderDirective = function($rootscope, $translate, kanbanUserstoriesService) {\n var hideArchivedText, link, showArchivedText;\n showArchivedText = $translate.instant(\"KANBAN.ACTION_SHOW_ARCHIVED\");\n hideArchivedText = $translate.instant(\"KANBAN.ACTION_HIDE_ARCHIVED\");\n link = function($scope, $el, $attrs) {\n var hidden, status;\n status = $scope.$eval($attrs.tgKanbanArchivedStatusHeader);\n hidden = true;\n kanbanUserstoriesService.addArchivedStatus(status.id);\n kanbanUserstoriesService.hideStatus(status.id);\n $scope[\"class\"] = \"icon-watch\";\n $scope.title = showArchivedText;\n $el.on(\"click\", function(event) {\n hidden = !hidden;\n return $scope.$apply(function() {\n if (hidden) {\n $scope[\"class\"] = \"icon-watch\";\n $scope.title = showArchivedText;\n $rootscope.$broadcast(\"kanban:hide-userstories-for-status\", status.id);\n return kanbanUserstoriesService.hideStatus(status.id);\n } else {\n $scope[\"class\"] = \"icon-unwatch\";\n $scope.title = hideArchivedText;\n $rootscope.$broadcast(\"kanban:show-userstories-for-status\", status.id);\n return kanbanUserstoriesService.showStatus(status.id);\n }\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanArchivedStatusHeader\", [\"$rootScope\", \"$translate\", \"tgKanbanUserstories\", KanbanArchivedStatusHeaderDirective]);\n\n KanbanArchivedStatusIntroDirective = function($translate, kanbanUserstoriesService) {\n var link, userStories;\n userStories = [];\n link = function($scope, $el, $attrs) {\n var hiddenUserStoriexText, status, updateIntroText;\n hiddenUserStoriexText = $translate.instant(\"KANBAN.HIDDEN_USER_STORIES\");\n status = $scope.$eval($attrs.tgKanbanArchivedStatusIntro);\n $el.text(hiddenUserStoriexText);\n updateIntroText = function(hasArchived) {\n if (hasArchived) {\n return $el.text(\"\");\n } else {\n return $el.text(hiddenUserStoriexText);\n }\n };\n $scope.$on(\"kanban:us:move\", function(ctx, itemUs, oldStatusId, newStatusId, itemIndex) {\n var hasArchived;\n hasArchived = !!kanbanUserstoriesService.getStatus(newStatusId).length;\n return updateIntroText(hasArchived);\n });\n $scope.$on(\"kanban:shown-userstories-for-status\", function(ctx, statusId, userStoriesLoaded) {\n var hasArchived;\n if (statusId === status.id) {\n kanbanUserstoriesService.deleteStatus(statusId);\n kanbanUserstoriesService.add(userStoriesLoaded);\n hasArchived = !!kanbanUserstoriesService.getStatus(statusId).length;\n return updateIntroText(hasArchived);\n }\n });\n $scope.$on(\"kanban:hidden-userstories-for-status\", function(ctx, statusId) {\n if (statusId === status.id) {\n return updateIntroText(false);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanArchivedStatusIntro\", [\"$translate\", \"tgKanbanUserstories\", KanbanArchivedStatusIntroDirective]);\n\n KanbanSquishColumnDirective = function(rs, projectService) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch, updateTableWidth;\n $scope.foldStatus = function(status) {\n $scope.folds[status.id] = !!!$scope.folds[status.id];\n rs.kanban.storeStatusColumnModes($scope.projectId, $scope.folds);\n updateTableWidth();\n };\n updateTableWidth = function() {\n var columnWidths, totalWidth;\n columnWidths = _.map($scope.usStatusList, function(status) {\n if ($scope.folds[status.id]) {\n return 40;\n } else {\n return 310;\n }\n });\n totalWidth = _.reduce(columnWidths, function(total, width) {\n return total + width;\n });\n return $el.find('.kanban-table-inner').css(\"width\", totalWidth);\n };\n return unwatch = $scope.$watch('usByStatus', function(usByStatus) {\n if (usByStatus.size) {\n $scope.folds = rs.kanban.getStatusColumnModes(projectService.project.get('id'));\n updateTableWidth();\n return unwatch();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSquishColumn\", [\"$tgResources\", \"tgProjectService\", KanbanSquishColumnDirective]);\n\n KanbanWipLimitDirective = function($timeout) {\n var link;\n link = function($scope, $el, $attrs) {\n var redrawWipLimit, status;\n status = $scope.$eval($attrs.tgKanbanWipLimit);\n redrawWipLimit = (function(_this) {\n return function() {\n $el.find(\".kanban-wip-limit\").remove();\n return $timeout(function() {\n var element;\n element = $el.find(\"tg-card\")[status.wip_limit];\n if (element) {\n return angular.element(element).before(\"
    \");\n }\n });\n };\n })(this);\n if (status && !status.is_archived) {\n $scope.$on(\"redraw:wip\", redrawWipLimit);\n $scope.$on(\"kanban:us:move\", redrawWipLimit);\n $scope.$on(\"usform:new:success\", redrawWipLimit);\n $scope.$on(\"usform:bulk:success\", redrawWipLimit);\n }\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanWipLimit\", [\"$timeout\", KanbanWipLimitDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban/sortable.coffee\n */\n\n(function() {\n var KanbanSortableDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaKanban\");\n\n KanbanSortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch;\n return unwatch = $scope.$watch(\"usByStatus\", function(usByStatus) {\n var containers, deleteElement, drake, itemEl, newParentScope, scroll, tdom;\n if (!usByStatus || !usByStatus.size) {\n return;\n }\n unwatch();\n if (!($scope.project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n containers = _.map($el.find('.task-column'), function(item) {\n return item;\n });\n drake = dragula(containers, {\n copySortSource: false,\n copy: false,\n moves: function(item) {\n return $(item).is('tg-card');\n }\n });\n drake.on('drag', function(item) {\n return window.dragMultiple.start(item, containers);\n });\n drake.on('cloned', function(item, dropTarget) {\n return $(item).addClass('multiple-drag-mirror');\n });\n drake.on('dragend', function(item) {\n var dragMultipleItems, finalUsList, firstElement, index, newStatus, newStatusId, parentEl, usList;\n parentEl = $(item).parent();\n newParentScope = parentEl.scope();\n newStatusId = newParentScope.s.id;\n dragMultipleItems = window.dragMultiple.stop();\n if (!dragMultipleItems.length) {\n dragMultipleItems = [item];\n }\n firstElement = dragMultipleItems[0];\n index = $(firstElement).index();\n newStatus = newParentScope.s.id;\n usList = _.map(dragMultipleItems, function(item) {\n return $(item).scope().us;\n });\n finalUsList = _.map(usList, function(item) {\n return {\n id: item.get('id'),\n oldStatusId: item.getIn(['model', 'status'])\n };\n });\n return $scope.$apply(function() {\n _.each(usList, (function(_this) {\n return function(item, key) {\n var oldStatus, sameContainer;\n oldStatus = item.getIn(['model', 'status']);\n sameContainer = newStatus === oldStatus;\n if (!sameContainer) {\n itemEl = $(dragMultipleItems[key]);\n return deleteElement(itemEl);\n }\n };\n })(this));\n return $rootscope.$broadcast(\"kanban:us:move\", finalUsList, newStatus, index);\n });\n });\n scroll = autoScroll(containers, {\n margin: 100,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", KanbanSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/epics/detail.coffee\n */\n\n(function() {\n var EpicDetailController, EpicStatusButtonDirective, EpicStatusDisplayDirective, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaEpics\");\n\n EpicDetailController = (function(superClass) {\n extend(EpicDetailController, superClass);\n\n EpicDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgAnalytics\", \"$tgNavUrls\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function EpicDetailController(scope, rootscope, repo, confirm, rs, rs2, params, q, location, log, appMetaService, analytics, navUrls, translate, modelTransform, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.rs2 = rs2;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.analytics = analytics;\n this.navUrls = navUrls;\n this.translate = translate;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.epicRef = this.params.epicref;\n this.scope.sectionName = this.translate.instant(\"EPIC.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n EpicDetailController.prototype._setMeta = function() {\n var description, ref, title;\n title = this.translate.instant(\"EPIC.PAGE_TITLE\", {\n epicRef: \"#\" + this.scope.epic.ref,\n epicSubject: this.scope.epic.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"EPIC.PAGE_DESCRIPTION\", {\n epicStatus: ((ref = this.scope.statusById[this.scope.epic.status]) != null ? ref.name : void 0) || \"--\",\n epicDescription: angular.element(this.scope.epic.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n EpicDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on epic\", 1);\n };\n })(this));\n this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadEpic();\n };\n })(this));\n return this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n };\n\n EpicDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-epics\", ctx);\n };\n\n EpicDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.immutableProject = this.projectService.project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.epic_statuses;\n this.scope.statusById = groupBy(project.epic_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n\n EpicDetailController.prototype.loadEpic = function() {\n return this.rs.epics.getByRef(this.scope.projectId, this.params.epicref).then((function(_this) {\n return function(epic) {\n var ctx, ref, ref1;\n _this.scope.epic = epic;\n _this.scope.immutableEpic = Immutable.fromJS(epic._attrs);\n _this.scope.epicId = epic.id;\n _this.scope.commentModel = epic;\n _this.modelTransform.setObject(_this.scope, 'epic');\n if (((ref = _this.scope.epic.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.epic.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-epics-detail\", ctx);\n }\n if (((ref1 = _this.scope.epic.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.epic.neighbors.next.ref\n };\n return _this.scope.nextUrl = _this.navUrls.resolve(\"project-epics-detail\", ctx);\n }\n };\n })(this));\n };\n\n EpicDetailController.prototype.loadUserstories = function() {\n return this.rs2.userstories.listInEpic(this.scope.epicId).then((function(_this) {\n return function(data) {\n return _this.scope.userstories = data;\n };\n })(this));\n };\n\n EpicDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadEpic().then((function(_this) {\n return function() {\n return _this.loadUserstories();\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n EpicDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.epics.upvote(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.epics.downvote(this.scope.epicId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n EpicDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.epics.watch(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.epics.unwatch(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onSelectColor = function(color) {\n var onSelectColorError, onSelectColorSuccess, transform;\n onSelectColorSuccess = (function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"object:updated\");\n return _this.confirm.notify('success');\n };\n })(this);\n onSelectColorError = (function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this);\n transform = this.modelTransform.save(function(epic) {\n epic.color = color;\n return epic;\n });\n return transform.then(onSelectColorSuccess, onSelectColorError);\n };\n\n return EpicDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"EpicDetailController\", EpicDetailController);\n\n EpicStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(epic) {\n var html, status;\n status = $scope.statusById[epic.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(epic) {\n if (epic != null) {\n return render(epic);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgEpicStatusDisplay\", [\"$tgTemplate\", \"$compile\", EpicStatusDisplayDirective]);\n\n EpicStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"common/components/status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_epic\") !== -1;\n };\n render = (function(_this) {\n return function(epic) {\n var html, status;\n status = $scope.statusById[epic.status];\n html = $compile(template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n }))($scope);\n return $el.html(html);\n };\n })(this);\n save = function(status) {\n var currentLoading, onError, onSuccess, transform;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(epic) {\n epic.status = status;\n return epic;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n $.fn.popover().closeAll();\n return save(target.data(\"status-id\"));\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var epic;\n epic = $model.$modelValue;\n if (epic) {\n return render(epic);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgEpicStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$compile\", \"$translate\", \"$tgTemplate\", EpicStatusButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/detail.coffee\n */\n\n(function() {\n var IssueDetailController, IssuePriorityButtonDirective, IssueSeverityButtonDirective, IssueStatusButtonDirective, IssueStatusDisplayDirective, IssueTypeButtonDirective, PromoteIssueToUsButtonDirective, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaIssues\");\n\n IssueDetailController = (function(superClass) {\n extend(IssueDetailController, superClass);\n\n IssueDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgAnalytics\", \"$tgNavUrls\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function IssueDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, analytics, navUrls, translate, modelTransform, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.analytics = analytics;\n this.navUrls = navUrls;\n this.translate = translate;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.issueRef = this.params.issueref;\n this.scope.sectionName = this.translate.instant(\"ISSUES.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n IssueDetailController.prototype._setMeta = function() {\n var description, ref, ref1, ref2, ref3, title;\n title = this.translate.instant(\"ISSUE.PAGE_TITLE\", {\n issueRef: \"#\" + this.scope.issue.ref,\n issueSubject: this.scope.issue.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"ISSUE.PAGE_DESCRIPTION\", {\n issueStatus: ((ref = this.scope.statusById[this.scope.issue.status]) != null ? ref.name : void 0) || \"--\",\n issueType: ((ref1 = this.scope.typeById[this.scope.issue.type]) != null ? ref1.name : void 0) || \"--\",\n issueSeverity: ((ref2 = this.scope.severityById[this.scope.issue.severity]) != null ? ref2.name : void 0) || \"--\",\n issuePriority: ((ref3 = this.scope.priorityById[this.scope.issue.priority]) != null ? ref3.name : void 0) || \"--\",\n issueDescription: angular.element(this.scope.issue.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n IssueDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on issue\", 1);\n };\n })(this));\n this.scope.$on(\"promote-issue-to-us:success\", (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"issue\", \"promoteToUserstory\", \"promote issue to userstory\", 1);\n _this.rootscope.$broadcast(\"object:updated\");\n return _this.loadIssue();\n };\n })(this));\n this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadIssue();\n };\n })(this));\n return this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n };\n\n IssueDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n if (this.scope.project.is_issues_activated) {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-issues\", ctx);\n } else {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n }\n };\n\n IssueDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.issue_statuses;\n this.scope.statusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n this.scope.typeById = groupBy(project.issue_types, function(x) {\n return x.id;\n });\n this.scope.typeList = _.sortBy(project.issue_types, \"order\");\n this.scope.severityList = project.severities;\n this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n this.scope.priorityList = project.priorities;\n this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n return project;\n };\n\n IssueDetailController.prototype.loadIssue = function() {\n return this.rs.issues.getByRef(this.scope.projectId, this.params.issueref).then((function(_this) {\n return function(issue) {\n var ctx, ref, ref1;\n _this.scope.issue = issue;\n _this.scope.issueId = issue.id;\n _this.scope.commentModel = issue;\n _this.modelTransform.setObject(_this.scope, 'issue');\n if (((ref = _this.scope.issue.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.issue.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-issues-detail\", ctx);\n }\n if (((ref1 = _this.scope.issue.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.issue.neighbors.next.ref\n };\n return _this.scope.nextUrl = _this.navUrls.resolve(\"project-issues-detail\", ctx);\n }\n };\n })(this));\n };\n\n IssueDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadIssue();\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n IssueDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.upvote(this.scope.issueId).then(onSuccess, onError);\n };\n\n IssueDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.downvote(this.scope.issueId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n IssueDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.watch(this.scope.issueId).then(onSuccess, onError);\n };\n\n IssueDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.unwatch(this.scope.issueId).then(onSuccess, onError);\n };\n\n return IssueDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"IssueDetailController\", IssueDetailController);\n\n IssueStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(issue) {\n var html, status;\n status = $scope.statusById[issue.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue != null) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueStatusDisplay\", [\"$tgTemplate\", \"$compile\", IssueStatusDisplayDirective]);\n\n IssueStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, status;\n status = $scope.statusById[issue.status];\n html = template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = function(statusId) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(issue) {\n issue.status = statusId;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n return save(target.data(\"status-id\"));\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueStatusButtonDirective]);\n\n IssueTypeButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-type-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, type;\n type = $scope.typeById[issue.type];\n html = template({\n type: type,\n typees: $scope.typeList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = function(type) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.type = type;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".type-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-type\").popover().open();\n });\n $el.on(\"click\", \".type\", function(event) {\n var target, type;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n type = target.data(\"type-id\");\n return save(type);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.type : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueTypeButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueTypeButtonDirective]);\n\n IssueSeverityButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-severity-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, severity;\n severity = $scope.severityById[issue.severity];\n html = template({\n severity: severity,\n severityes: $scope.severityList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = function(severity) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.severity = severity;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".severity-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-severity\").popover().open();\n });\n $el.on(\"click\", \".severity\", function(event) {\n var severity, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n severity = target.data(\"severity-id\");\n return save(severity);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.severity : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueSeverityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueSeverityButtonDirective]);\n\n IssuePriorityButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-priority-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, priority;\n priority = $scope.priorityById[issue.priority];\n html = template({\n priority: priority,\n priorityes: $scope.priorityList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = function(priority) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.priority = priority;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".priority-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-priority\").popover().open();\n });\n $el.on(\"click\", \".priority\", function(event) {\n var priority, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n priority = target.data(\"priority-id\");\n return save(priority);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.priority : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssuePriorityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssuePriorityButtonDirective]);\n\n PromoteIssueToUsButtonDirective = function($rootScope, $repo, $confirm, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = (function(_this) {\n return function(issue, askResponse) {\n var data, onError, onSuccess;\n data = {\n generated_from_issue: issue.id,\n project: issue.project,\n subject: issue.subject,\n description: issue.description,\n tags: issue.tags,\n is_blocked: issue.is_blocked,\n blocked_note: issue.blocked_note,\n due_date: issue.due_date\n };\n onSuccess = function() {\n askResponse.finish();\n $confirm.notify(\"success\");\n return $rootScope.$broadcast(\"promote-issue-to-us:success\");\n };\n onError = function() {\n askResponse.finish();\n return $confirm.notify(\"error\");\n };\n return $repo.create(\"userstories\", data).then(onSuccess, onError);\n };\n })(this);\n $el.on(\"click\", \"a\", function(event) {\n var issue, message, subtitle, title;\n event.preventDefault();\n issue = $model.$modelValue;\n title = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.TITLE\");\n message = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.MESSAGE\");\n subtitle = issue.subject;\n return $confirm.ask(title, subtitle, message).then((function(_this) {\n return function(response) {\n return save(issue, response);\n };\n })(this));\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n restrict: \"AE\",\n require: \"ngModel\",\n templateUrl: \"issue/promote-issue-to-us-button.html\",\n link: link\n };\n };\n\n module.directive(\"tgPromoteIssueToUsButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$translate\", PromoteIssueToUsButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/lightboxes.coffee\n */\n\n(function() {\n var CreateBulkIssuesDirective, CreateIssueDirective, bindOnce, debounce, module, taiga, trim,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n module = angular.module(\"taigaIssues\");\n\n CreateIssueDirective = function($repo, $confirm, $rootscope, lightboxService, $loading, $q, attachmentsService) {\n var link;\n link = function($scope, $el, $attrs) {\n var attachmentsToAdd, createAttachments, form, resetAttachments, submit, submitButton;\n form = $el.find(\"form\").checksley();\n $scope.issue = {};\n $scope.attachments = Immutable.List();\n $scope.$on(\"issueform:new\", function(ctx, project) {\n form.reset();\n resetAttachments();\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el, function() {\n return $scope.createIssueOpen = false;\n });\n $scope.issue = {\n project: project.id,\n subject: \"\",\n status: project.default_issue_status,\n type: project.default_issue_type,\n priority: project.default_priority,\n severity: project.default_severity,\n tags: []\n };\n return $scope.createIssueOpen = true;\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.issue.project, 'issue');\n });\n return $q.all(promises);\n };\n attachmentsToAdd = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return $scope.attachments = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n };\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.issue.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([tag, color]);\n return $scope.issue.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.issue.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.issue.tags = itemtags;\n return _.pull($scope.issue.tags, value);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"issues\", $scope.issue);\n promise.then(function(data) {\n return createAttachments(data);\n });\n promise.then(function(data) {\n currentLoading.finish();\n $rootscope.$broadcast(\"issueform:new:success\", data);\n lightboxService.close($el);\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateIssue\", [\"$tgRepo\", \"$tgConfirm\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$q\", \"tgAttachmentsService\", CreateIssueDirective]);\n\n CreateBulkIssuesDirective = function($repo, $rs, $confirm, $rootscope, $loading, lightboxService) {\n var link;\n link = function($scope, $el, attrs) {\n var form, submit, submitButton;\n form = null;\n $scope.$on(\"issueform:bulk\", function(ctx, projectId, status) {\n if (form) {\n form.reset();\n }\n lightboxService.open($el);\n return $scope[\"new\"] = {\n projectId: projectId,\n bulk: \"\"\n };\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, data, projectId, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n data = $scope[\"new\"].bulk;\n projectId = $scope[\"new\"].projectId;\n promise = $rs.issues.bulkCreate(projectId, data);\n promise.then(function(result) {\n currentLoading.finish();\n $rootscope.$broadcast(\"issueform:new:success\", result);\n lightboxService.close($el);\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateBulkIssues\", [\"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", CreateBulkIssuesDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/list.coffee\n */\n\n(function() {\n var IssueAssignedToInlineEditionDirective, IssueStatusInlineEditionDirective, IssuesController, IssuesDirective, bindMethods, bindOnce, debounceLeading, groupBy, joinStr, mixOf, module, startswith, taiga, toString, trim,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounceLeading = this.taiga.debounceLeading;\n\n startswith = this.taiga.startswith;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaIssues\");\n\n IssuesController = (function(superClass) {\n extend(IssuesController, superClass);\n\n IssuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$tgUrls\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\", \"tgUserActivityService\"];\n\n IssuesController.prototype.filtersHashSuffix = \"issues-filters\";\n\n IssuesController.prototype.myFiltersHashSuffix = \"issues-my-filters\";\n\n function IssuesController(scope, rootscope, repo, confirm, rs, urls, params1, q1, location, appMetaService, navUrls, events, analytics, translate, errorHandlingService, storage, filterRemoteStorageService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.urls = urls;\n this.params = params1;\n this.q = q1;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService;\n this.loadIssues = bind(this.loadIssues, this);\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"PROJECT.SECTION.ISSUES\");\n this.voting = false;\n if (this.applyStoredFilters(this.params.pslug, this.filtersHashSuffix)) {\n return;\n }\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ISSUES.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"ISSUES.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"issueform:new:success\", (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"issue\", \"create\", \"create issue on issues list\", 1);\n return _this.loadIssues();\n };\n })(this));\n }\n\n IssuesController.prototype.changeQ = function(q) {\n this.unselectFilter(\"page\");\n this.replaceFilter(\"q\", q);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.removeFilter = function(filter) {\n this.unselectFilter(\"page\");\n this.unselectFilter(filter.dataType, filter.id);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.addFilter = function(newFilter) {\n this.unselectFilter(\"page\");\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.selectCustomFilter = function(customFilter) {\n var orderBy;\n orderBy = this.location.search().order_by;\n if (orderBy) {\n customFilter.filter.order_by = orderBy;\n }\n this.unselectFilter(\"page\");\n this.replaceAllFilters(customFilter.filter);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix).then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.myFiltersHashSuffix).then(_this.generateFilters);\n };\n })(this));\n };\n\n IssuesController.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, j, len, ref;\n ref = this.selectedFilters;\n for (j = 0, len = ref.length; j < len; j++) {\n filter = ref[j];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n IssuesController.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.type = urlfilters.type;\n filters.severity = urlfilters.severity;\n filters.priority = urlfilters.priority;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix).then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.myFiltersHashSuffix).then(_this.generateFilters);\n };\n })(this));\n };\n\n IssuesController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), this.filtersHashSuffix);\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.type = urlfilters.type;\n loadFilters.severity = urlfilters.severity;\n loadFilters.priority = urlfilters.priority;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n return this.q.all([this.rs.issues.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix)]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, owner, priority, role, selected, severity, statuses, tags, tagsWithAtLeastOneElement, type;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n type = _.map(data.types, function(it) {\n it.id = it.id.toString();\n return it;\n });\n severity = _.map(data.severities, function(it) {\n it.id = it.id.toString();\n return it;\n });\n priority = _.map(data.priorities, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.type) {\n selected = _this.formatSelectedFilters(\"type\", type, loadFilters.type);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.severity) {\n selected = _this.formatSelectedFilters(\"severity\", severity, loadFilters.severity);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.priority) {\n selected = _this.formatSelectedFilters(\"priority\", priority, loadFilters.priority);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TYPE\"),\n dataType: \"type\",\n content: type\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.SEVERITY\"),\n dataType: \"severity\",\n content: severity\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.PRIORITIES\"),\n dataType: \"priority\",\n content: priority\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(this));\n };\n\n IssuesController.prototype.initializeSubscription = function() {\n var routingKey;\n routingKey = \"changes.project.\" + this.scope.projectId + \".issues\";\n return this.events.subscribe(this.scope, routingKey, (function(_this) {\n return function(message) {\n return _this.loadIssues();\n };\n })(this));\n };\n\n IssuesController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_issues_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.issueStatusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n this.scope.severityList = _.sortBy(project.severities, \"order\");\n this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n this.scope.priorityList = _.sortBy(project.priorities, \"order\");\n this.scope.issueTypes = _.sortBy(project.issue_types, \"order\");\n this.scope.issueTypeById = groupBy(project.issue_types, function(x) {\n return x.id;\n });\n return project;\n };\n\n IssuesController.prototype.loadIssuesRequests = 0;\n\n IssuesController.prototype.loadIssues = function() {\n var params, promise;\n params = this.location.search();\n promise = this.rs.issues.list(this.scope.projectId, params);\n this.loadIssuesRequests += 1;\n promise.index = this.loadIssuesRequests;\n promise.then((function(_this) {\n return function(data) {\n if (promise.index === _this.loadIssuesRequests) {\n _this.scope.issues = data.models;\n _this.scope.page = data.current;\n _this.scope.count = data.count;\n _this.scope.paginatedBy = data.paginatedBy;\n }\n return data;\n };\n })(this));\n return promise;\n };\n\n IssuesController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n this.generateFilters();\n return this.loadIssues();\n };\n\n IssuesController.prototype.addNewIssue = function() {\n return this.rootscope.$broadcast(\"issueform:new\", this.scope.project);\n };\n\n IssuesController.prototype.addIssuesInBulk = function() {\n return this.rootscope.$broadcast(\"issueform:bulk\", this.scope.projectId);\n };\n\n IssuesController.prototype.upVoteIssue = function(issueId) {\n var onError, onSuccess;\n this.voting = issueId;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssues();\n return _this.voting = null;\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.voting = null;\n };\n })(this);\n return this.rs.issues.upvote(issueId).then(onSuccess, onError);\n };\n\n IssuesController.prototype.downVoteIssue = function(issueId) {\n var onError, onSuccess;\n this.voting = issueId;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssues();\n return _this.voting = null;\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.voting = null;\n };\n })(this);\n return this.rs.issues.downvote(issueId).then(onSuccess, onError);\n };\n\n IssuesController.prototype.getOrderBy = function() {\n if (_.isString(this.location.search().order_by)) {\n return this.location.search().order_by;\n } else {\n return \"created_date\";\n }\n };\n\n return IssuesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"IssuesController\", IssuesController);\n\n IssuesDirective = function($log, $location, $template, $compile) {\n var link, linkOrdering, linkPagination, template;\n template = $template.get(\"issue/issue-paginator.html\", true);\n linkPagination = function($scope, $el, $attrs, $ctrl) {\n var $pagEl, afterCurrent, atBegin, atEnd, beforeCurrent, getNumPages, renderPagination;\n afterCurrent = 2;\n beforeCurrent = 4;\n atBegin = 2;\n atEnd = 2;\n $pagEl = $el.find(\".issues-paginator\");\n getNumPages = function() {\n var numPages;\n numPages = $scope.count / $scope.paginatedBy;\n if (parseInt(numPages, 10) < numPages) {\n numPages = parseInt(numPages, 10) + 1;\n } else {\n numPages = parseInt(numPages, 10);\n }\n return numPages;\n };\n renderPagination = function() {\n var cpage, html, i, j, numPages, options, pages, ref;\n numPages = getNumPages();\n if (numPages <= 1) {\n $pagEl.hide();\n return;\n }\n $pagEl.show();\n pages = [];\n options = {};\n options.pages = pages;\n options.showPrevious = $scope.page > 1;\n options.showNext = !($scope.page === numPages);\n cpage = $scope.page;\n for (i = j = 1, ref = numPages; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (i === (cpage + afterCurrent) && numPages > (cpage + afterCurrent + atEnd)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i === (cpage - beforeCurrent) && cpage > (atBegin + beforeCurrent)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i > (cpage + afterCurrent) && i <= (numPages - atEnd)) {\n\n } else if (i < (cpage - beforeCurrent) && i > atBegin) {\n\n } else if (i === cpage) {\n pages.push({\n classes: \"active\",\n num: i,\n type: \"page-active\"\n });\n } else {\n pages.push({\n classes: \"page\",\n num: i,\n type: \"page\"\n });\n }\n }\n html = template(options);\n html = $compile(html)($scope);\n return $pagEl.html(html);\n };\n $scope.$watch(\"issues\", function(value) {\n if (!value) {\n return;\n }\n return renderPagination();\n });\n $el.on(\"click\", \".issues-paginator a.next\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page + 1);\n return $ctrl.loadIssues();\n });\n });\n $el.on(\"click\", \".issues-paginator a.previous\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n return $ctrl.loadIssues();\n });\n });\n return $el.on(\"click\", \".issues-paginator li.page > a\", function(event) {\n var pagenum, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n pagenum = target.data(\"pagenum\");\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", pagenum);\n return $ctrl.loadIssues();\n });\n });\n };\n linkOrdering = function($scope, $el, $attrs, $ctrl) {\n var colHeadElement, currentOrder, icon, svg;\n currentOrder = $ctrl.getOrderBy();\n if (currentOrder) {\n icon = startswith(currentOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-down\";\n colHeadElement = $el.find(\".row.title > div[data-fieldname='\" + (trim(currentOrder, \"-\")) + \"']\");\n svg = $(\"\").attr(\"svg-icon\", icon);\n colHeadElement.append(svg);\n $compile(colHeadElement.contents())($scope);\n }\n return $el.on(\"click\", \".row.title > div\", function(event) {\n var finalOrder, newOrder, target;\n target = angular.element(event.currentTarget);\n currentOrder = $ctrl.getOrderBy();\n newOrder = target.data(\"fieldname\");\n if (newOrder === 'total_voters' && currentOrder !== \"-total_voters\") {\n currentOrder = \"total_voters\";\n }\n finalOrder = currentOrder === newOrder ? \"-\" + newOrder : newOrder;\n return $scope.$apply(function() {\n $ctrl.replaceFilter(\"order_by\", finalOrder);\n $ctrl.storeFilters($ctrl.params.pslug, $location.search(), $ctrl.filtersHashSuffix);\n return $ctrl.loadIssues().then(function() {\n $el.find(\".row.title > div > tg-svg\").remove();\n icon = startswith(finalOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-down\";\n svg = $(\"\").attr(\"svg-icon\", icon);\n target.append(svg);\n return $compile(target.contents())($scope);\n });\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n linkOrdering($scope, $el, $attrs, $ctrl);\n linkPagination($scope, $el, $attrs, $ctrl);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssues\", [\"$log\", \"$tgLocation\", \"$tgTemplate\", \"$compile\", IssuesDirective]);\n\n IssueStatusInlineEditionDirective = function($repo, $template, $rootscope) {\n\n /*\n Print the status of an Issue and a popover to change it.\n - tg-issue-status-inline-edition: The issue\n \n Example:\n \n div.status(tg-issue-status-inline-edition=\"issue\")\n a.issue-status(href=\"\")\n \n NOTE: This directive need 'issueStatusById' and 'project'.\n */\n var link, selectionTemplate, updateIssueStatus;\n selectionTemplate = $template.get(\"issue/issue-status-inline-edition-selection.html\", true);\n updateIssueStatus = function($el, issue, issueStatusById) {\n var issueStatusDom, issueStatusDomParent, status;\n issueStatusDomParent = $el.find(\".issue-status\");\n issueStatusDom = $el.find(\".issue-status .issue-status-bind\");\n status = issueStatusById[issue.status];\n if (status) {\n issueStatusDom.text(status.name);\n issueStatusDom.prop(\"title\", status.name);\n return issueStatusDomParent.css('color', status.color);\n }\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, issue;\n $ctrl = $el.controller();\n issue = $scope.$eval($attrs.tgIssueStatusInlineEdition);\n $el.on(\"click\", \".issue-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n issue.status = target.data(\"status-id\");\n $el.find(\".pop-status\").popover().close();\n updateIssueStatus($el, issue, $scope.issueStatusById);\n return $scope.$apply(function() {\n return $repo.save(issue).then(function() {\n $ctrl.generateFilters();\n if ($ctrl.isFilterDataTypeSelected('status')) {\n return $ctrl.loadIssues();\n }\n });\n });\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n $el.append(selectionTemplate({\n 'statuses': project.issue_statuses\n }));\n updateIssueStatus($el, issue, $scope.issueStatusById);\n if (project.my_permissions.indexOf(\"modify_issue\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$watch($attrs.tgIssueStatusInlineEdition, (function(_this) {\n return function(val) {\n return updateIssueStatus($el, val, $scope.issueStatusById);\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssueStatusInlineEdition\", [\"$tgRepo\", \"$tgTemplate\", \"$rootScope\", IssueStatusInlineEditionDirective]);\n\n IssueAssignedToInlineEditionDirective = function($repo, $rootscope, $translate, avatarService) {\n var link, template;\n template = _.template(\"\\\" src=\\\"<%- imgurl %>\\\" alt=\\\"<%- name %>\\\"/>\\n
    <%- name %>
    \");\n link = function($scope, $el, $attrs) {\n var $ctrl, issue, updateIssue;\n updateIssue = function(issue) {\n var avatar, ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\"\n };\n member = $scope.usersById[issue.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = null;\n if (member) {\n ctx.name = member.full_name_display;\n ctx.bg = avatar.bg;\n }\n $el.find(\".avatar\").html(template(ctx));\n return $el.find(\".issue-assignedto\").attr('title', ctx.name);\n };\n $ctrl = $el.controller();\n issue = $scope.$eval($attrs.tgIssueAssignedToInlineEdition);\n updateIssue(issue);\n $el.on(\"click\", \".issue-assignedto\", function(event) {\n return $rootscope.$broadcast(\"assigned-to:add\", issue);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_issue\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"assigned-to:added\", function(ctx, userId, updatedIssue) {\n if (updatedIssue.id === issue.id) {\n updatedIssue.assigned_to = userId;\n return $repo.save(issue).then(function() {\n updateIssue(updatedIssue);\n $ctrl.generateFilters();\n if ($ctrl.isFilterDataTypeSelected('assigned_to') || $ctrl.isFilterDataTypeSelected('role')) {\n return $ctrl.loadIssues();\n }\n });\n }\n });\n $scope.$watch($attrs.tgIssueAssignedToInlineEdition, function(val) {\n return updateIssue(val);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssueAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", \"$translate\", \"tgAvatarService\", IssueAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/userstories/detail.coffee\n */\n\n(function() {\n var UsClientRequirementButtonDirective, UsStatusButtonDirective, UsStatusDisplayDirective, UsTeamRequirementButtonDirective, UserStoryDetailController, bindMethods, bindOnce, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaUserStories\");\n\n UserStoryDetailController = (function(superClass) {\n extend(UserStoryDetailController, superClass);\n\n UserStoryDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"$tgConfig\", \"tgProjectService\", \"tgWysiwygService\"];\n\n function UserStoryDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate, modelTransform, errorHandlingService, configService, projectService, wysiwigService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.configService = configService;\n this.projectService = projectService;\n this.wysiwigService = wysiwigService;\n bindMethods(this);\n this.scope.usRef = this.params.usref;\n this.scope.sectionName = this.translate.instant(\"US.SECTION_NAME\");\n this.scope.tribeEnabled = this.configService.config.tribeHost;\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserStoryDetailController.prototype._setMeta = function() {\n var closedTasks, description, progressPercentage, ref, title, totalTasks;\n totalTasks = this.scope.tasks.length;\n closedTasks = _.filter(this.scope.tasks, (function(_this) {\n return function(t) {\n return _this.scope.taskStatusById[t.status].is_closed;\n };\n })(this)).length;\n progressPercentage = totalTasks > 0 ? Math.round(100 * closedTasks / totalTasks) : 0;\n title = this.translate.instant(\"US.PAGE_TITLE\", {\n userStoryRef: \"#\" + this.scope.us.ref,\n userStorySubject: this.scope.us.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"US.PAGE_DESCRIPTION\", {\n userStoryStatus: ((ref = this.scope.statusById[this.scope.us.status]) != null ? ref.name : void 0) || \"--\",\n userStoryPoints: this.scope.us.total_points,\n userStoryDescription: angular.element(this.wysiwigService.getHTML(this.scope.us.description) || \"\").text(),\n userStoryClosedTasks: closedTasks,\n userStoryTotalTasks: totalTasks,\n userStoryProgressPercentage: progressPercentage\n });\n return this.appMetaService.setAll(title, description);\n };\n\n UserStoryDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"related-tasks:update\", (function(_this) {\n return function() {\n var allClosed;\n _this.scope.tasks = _.clone(_this.scope.tasks, false);\n allClosed = _.every(_this.scope.tasks, function(task) {\n return task.is_closed;\n });\n if (_this.scope.us.is_closed !== allClosed) {\n return _this.loadUs();\n }\n };\n })(this));\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on userstory\", 1);\n };\n })(this));\n return this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadUs();\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n if (this.scope.project.is_backlog_activated) {\n if (this.scope.us.milestone) {\n ctx.sprint = this.scope.sprint.slug;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-taskboard\", ctx);\n } else {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-backlog\", ctx);\n }\n } else if (this.scope.project.is_kanban_activated) {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-kanban\", ctx);\n }\n };\n\n UserStoryDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.us_statuses;\n this.scope.statusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n this.scope.taskStatusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n this.scope.pointsList = _.sortBy(project.points, \"order\");\n this.scope.pointsById = groupBy(this.scope.pointsList, function(e) {\n return e.id;\n });\n return project;\n };\n\n UserStoryDetailController.prototype.loadUs = function() {\n var httpParams, kanbanStaus, milestone, noMilestone;\n httpParams = _.pick(this.location.search(), \"milestone\", \"no-milestone\", \"kanban-status\");\n milestone = httpParams.milestone;\n if (milestone) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n milestone: milestone,\n order_by: \"sprint_order\"\n });\n }\n noMilestone = httpParams[\"no-milestone\"];\n if (noMilestone) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n milestone: \"null\",\n order_by: \"backlog_order\"\n });\n }\n kanbanStaus = httpParams[\"kanban-status\"];\n if (kanbanStaus) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n status: kanbanStaus,\n order_by: \"kanban_order\"\n });\n }\n return this.rs.userstories.getByRef(this.scope.projectId, this.params.usref).then((function(_this) {\n return function(us) {\n _this.scope.us = us;\n _this.scope.usId = us.id;\n _this.scope.commentModel = us;\n _this.modelTransform.setObject(_this.scope, 'us');\n return us;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadSprint = function() {\n if (this.scope.us.milestone) {\n return this.rs.sprints.get(this.scope.us.project, this.scope.us.milestone).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n return sprint;\n };\n })(this));\n }\n };\n\n UserStoryDetailController.prototype.loadTasks = function() {\n return this.rs.tasks.list(this.scope.projectId, null, this.scope.usId).then((function(_this) {\n return function(tasks) {\n _this.scope.tasks = tasks;\n return tasks;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadUs().then((function(_this) {\n return function() {\n return _this.q.all([_this.loadSprint(), _this.loadTasks()]);\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n UserStoryDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.upvote(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.downvote(this.scope.usId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n UserStoryDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.watch(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.unwatch(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onTribeInfo = function() {\n var image, publishDesc, publishTitle, text;\n publishTitle = this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TITLE\");\n image = $('').attr({\n 'src': \"/\" + window._version + \"/images/monster-fight.png\",\n 'alt': this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TITLE\")\n });\n text = this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TEXT\");\n publishDesc = $('
    ').append(image).append(text);\n return this.confirm.success(publishTitle, publishDesc);\n };\n\n return UserStoryDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserStoryDetailController\", UserStoryDetailController);\n\n UsStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(us) {\n var html, status;\n status = $scope.statusById[us.status];\n html = template({\n is_closed: us.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(us) {\n if (us != null) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsStatusDisplay\", [\"$tgTemplate\", \"$compile\", UsStatusDisplayDirective]);\n\n UsStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = (function(_this) {\n return function(us) {\n var html, status;\n status = $scope.statusById[us.status];\n html = template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n });\n $el.html(html);\n return $compile($el.contents())($scope);\n };\n })(this);\n save = (function(_this) {\n return function(status) {\n var currentLoading, onError, onSuccess, transform;\n $el.find(\".pop-status\").popover().close();\n currentLoading = $loading().target($el.find('.js-edit-status')).start();\n transform = $modelTransform.save(function(us) {\n us.status = status;\n return us;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n })(this);\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var status, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n status = target.data(\"status-id\");\n return save(status);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsStatusButtonDirective]);\n\n UsTeamRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"us/us-team-requirement-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var canEdit, render, save;\n canEdit = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = function(us) {\n var ctx, html;\n ctx = {\n canEdit: canEdit(),\n isRequired: us.team_requirement\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n save = function(team_requirement) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\"label\")).start();\n transform = $modelTransform.save(function(us) {\n us.team_requirement = team_requirement;\n return us;\n });\n transform.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return transform.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n $el.on(\"click\", \".team-requirement\", function(event) {\n var team_requirement;\n if (!canEdit()) {\n return;\n }\n team_requirement = !$model.$modelValue.team_requirement;\n return save(team_requirement);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.team_requirement : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsTeamRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsTeamRequirementButtonDirective]);\n\n UsClientRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"us/us-client-requirement-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var canEdit, render, save;\n canEdit = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = function(us) {\n var ctx, html;\n ctx = {\n canEdit: canEdit(),\n isRequired: us.client_requirement\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n save = function(client_requirement) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\"label\")).start();\n transform = $modelTransform.save(function(us) {\n us.client_requirement = client_requirement;\n return us;\n });\n transform.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n $el.on(\"click\", \".client-requirement\", function(event) {\n var client_requirement;\n if (!canEdit()) {\n return;\n }\n client_requirement = !$model.$modelValue.client_requirement;\n return save(client_requirement);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.client_requirement : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsClientRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsClientRequirementButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/tasks/detail.coffee\n */\n\n(function() {\n var TaskDetailController, TaskIsIocaineButtonDirective, TaskStatusButtonDirective, TaskStatusDisplayDirective, bindMethods, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaTasks\");\n\n TaskDetailController = (function(superClass) {\n extend(TaskDetailController, superClass);\n\n TaskDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function TaskDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate, modelTransform, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.taskRef = this.params.taskref;\n this.scope.sectionName = this.translate.instant(\"TASK.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TaskDetailController.prototype._setMeta = function() {\n var description, ref, title;\n title = this.translate.instant(\"TASK.PAGE_TITLE\", {\n taskRef: \"#\" + this.scope.task.ref,\n taskSubject: this.scope.task.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"TASK.PAGE_DESCRIPTION\", {\n taskStatus: ((ref = this.scope.statusById[this.scope.task.status]) != null ? ref.name : void 0) || \"--\",\n taskDescription: angular.element(this.scope.task.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n TaskDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on task\", 1);\n };\n })(this));\n this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadTask();\n };\n })(this));\n };\n\n TaskDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n if (this.scope.project.is_backlog_activated) {\n if (this.scope.task.milestone) {\n ctx.sprint = this.scope.sprint.slug;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-taskboard\", ctx);\n } else if (this.scope.task.us) {\n ctx.ref = this.scope.us.ref;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n } else if (this.scope.project.is_kanban_activated) {\n if (this.scope.us) {\n ctx.ref = this.scope.us.ref;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n }\n };\n\n TaskDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.task_statuses;\n this.scope.statusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n\n TaskDetailController.prototype.loadTask = function() {\n return this.rs.tasks.getByRef(this.scope.projectId, this.params.taskref).then((function(_this) {\n return function(task) {\n var ctx, ref, ref1;\n _this.scope.task = task;\n _this.scope.taskId = task.id;\n _this.scope.commentModel = task;\n _this.modelTransform.setObject(_this.scope, 'task');\n if (((ref = _this.scope.task.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.task.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-tasks-detail\", ctx);\n }\n if (((ref1 = _this.scope.task.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.task.neighbors.next.ref\n };\n _this.scope.nextUrl = _this.navUrls.resolve(\"project-tasks-detail\", ctx);\n }\n return task;\n };\n })(this));\n };\n\n TaskDetailController.prototype.loadSprint = function() {\n if (this.scope.task.milestone) {\n return this.rs.sprints.get(this.scope.task.project, this.scope.task.milestone).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n return sprint;\n };\n })(this));\n }\n };\n\n TaskDetailController.prototype.loadUserStory = function() {\n if (this.scope.task.user_story) {\n return this.rs.userstories.get(this.scope.task.project, this.scope.task.user_story).then((function(_this) {\n return function(us) {\n _this.scope.us = us;\n return us;\n };\n })(this));\n }\n };\n\n TaskDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadTask().then((function(_this) {\n return function() {\n return _this.q.all([_this.loadSprint(), _this.loadUserStory()]);\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n TaskDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.upvote(this.scope.taskId).then(onSuccess, onError);\n };\n\n TaskDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.downvote(this.scope.taskId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n TaskDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.watch(this.scope.taskId).then(onSuccess, onError);\n };\n\n TaskDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.unwatch(this.scope.taskId).then(onSuccess, onError);\n };\n\n return TaskDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TaskDetailController\", TaskDetailController);\n\n TaskStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(task) {\n var html, status;\n status = $scope.statusById[task.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(task) {\n if (task != null) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskStatusDisplay\", [\"$tgTemplate\", \"$compile\", TaskStatusDisplayDirective]);\n\n TaskStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"common/components/status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n };\n render = (function(_this) {\n return function(task) {\n var html, status;\n status = $scope.statusById[task.status];\n html = $compile(template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n }))($scope);\n return $el.html(html);\n };\n })(this);\n save = function(status) {\n var currentLoading, onError, onSuccess, transform;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(task) {\n task.status = status;\n return task;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n $.fn.popover().closeAll();\n return save(target.data(\"status-id\"));\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var task;\n task = $model.$modelValue;\n if (task) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$compile\", \"$translate\", \"$tgTemplate\", TaskStatusButtonDirective]);\n\n TaskIsIocaineButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $compile, $template) {\n var link, template;\n template = $template.get(\"issue/iocaine-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n };\n render = function(task) {\n var ctx, html;\n if (!isEditable() && !task.is_iocaine) {\n $el.html(\"\");\n return;\n }\n ctx = {\n isIocaine: task.is_iocaine,\n isEditable: isEditable()\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n save = function(is_iocaine) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find('label')).start();\n transform = $modelTransform.save(function(task) {\n task.is_iocaine = is_iocaine;\n return task;\n });\n transform.then(function() {\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\n $el.on(\"click\", \".is-iocaine\", function(event) {\n var is_iocaine;\n if (!isEditable()) {\n return;\n }\n is_iocaine = !$model.$modelValue.is_iocaine;\n return save(is_iocaine);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.is_iocaine : void 0;\n }, function() {\n var task;\n task = $model.$modelValue;\n if (task) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskIsIocaineButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$compile\", \"$tgTemplate\", TaskIsIocaineButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/team/main.coffee\n */\n\n(function() {\n var LeaveProjectDirective, TeamController, TeamFiltersDirective, TeamMemberCurrentUserDirective, TeamMemberStatsDirective, TeamMembersDirective, membersFilter, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n module = angular.module(\"taigaTeam\");\n\n TeamController = (function(superClass) {\n extend(TeamController, superClass);\n\n TeamController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$location\", \"$tgNavUrls\", \"tgAppMetaService\", \"$tgAuth\", \"$translate\", \"tgProjectService\", \"tgErrorHandlingService\"];\n\n function TeamController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, auth, translate, projectService, errorHandlingService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\n this.errorHandlingService = errorHandlingService;\n this.scope.sectionName = \"TEAM.SECTION_NAME\";\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"TEAM.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"TEAM.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TeamController.prototype.setRole = function(role) {\n if (role) {\n return this.scope.filtersRole = role;\n } else {\n return this.scope.filtersRole = null;\n }\n };\n\n TeamController.prototype.loadMembers = function() {\n var i, len, member, ref, user;\n user = this.auth.getUser();\n this.scope.totals = {};\n ref = this.scope.activeUsers;\n for (i = 0, len = ref.length; i < len; i++) {\n member = ref[i];\n this.scope.totals[member.id] = 0;\n }\n this.scope.currentUser = _.find(this.scope.activeUsers, {\n id: user != null ? user.id : void 0\n });\n return this.scope.memberships = _.reject(this.scope.activeUsers, {\n id: user != null ? user.id : void 0\n });\n };\n\n TeamController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.issuesEnabled = project.is_issues_activated;\n this.scope.tasksEnabled = project.is_kanban_activated || project.is_backlog_activated;\n this.scope.wikiEnabled = project.is_wiki_activated;\n this.scope.owner = project.owner.id;\n return project;\n };\n\n TeamController.prototype.loadMemberStats = function() {\n return this.rs.projects.memberStats(this.scope.projectId).then((function(_this) {\n return function(stats) {\n var totals;\n totals = {};\n _.forEach(_this.scope.totals, function(total, userId) {\n var vals;\n vals = _.map(stats, function(memberStats, statsKey) {\n return memberStats[userId];\n });\n total = _.reduce(vals, function(sum, el) {\n return sum + el;\n });\n return _this.scope.totals[userId] = total;\n });\n _this.scope.stats = _this._processStats(stats);\n return _this.scope.stats.totals = _this.scope.totals;\n };\n })(this));\n };\n\n TeamController.prototype._processStat = function(stat) {\n var key, max, min, singleStat, value;\n max = _.max(_.toArray(stat));\n min = _.min(_.toArray(stat));\n singleStat = Object();\n for (key in stat) {\n if (!hasProp.call(stat, key)) continue;\n value = stat[key];\n if (value === min) {\n singleStat[key] = 0.1;\n } else if (value === max) {\n singleStat[key] = 1;\n } else {\n singleStat[key] = (value * 0.5) / max;\n }\n }\n return singleStat;\n };\n\n TeamController.prototype._processStats = function(stats) {\n var key, value;\n for (key in stats) {\n value = stats[key];\n stats[key] = this._processStat(value);\n }\n return stats;\n };\n\n TeamController.prototype.loadInitialData = function() {\n var project, userRoles;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.loadMembers();\n userRoles = _.map(this.scope.users, function(user) {\n return user.role;\n });\n this.scope.roles = _.filter(this.scope.roles, function(role) {\n return userRoles.indexOf(role.id) !== -1;\n });\n return this.loadMemberStats();\n };\n\n return TeamController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TeamController\", TeamController);\n\n TeamFiltersDirective = function() {\n return {\n templateUrl: \"team/team-filter.html\"\n };\n };\n\n module.directive(\"tgTeamFilters\", [TeamFiltersDirective]);\n\n TeamMemberStatsDirective = function() {\n return {\n templateUrl: \"team/team-member-stats.html\",\n scope: {\n stats: \"=\",\n userId: \"=user\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\"\n }\n };\n };\n\n module.directive(\"tgTeamMemberStats\", TeamMemberStatsDirective);\n\n TeamMemberCurrentUserDirective = function() {\n return {\n templateUrl: \"team/team-member-current-user.html\",\n scope: {\n project: \"=project\",\n currentUser: \"=currentuser\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\",\n owner: \"=owner\"\n }\n };\n };\n\n module.directive(\"tgTeamCurrentUser\", TeamMemberCurrentUserDirective);\n\n TeamMembersDirective = function() {\n var template;\n template = \"team/team-members.html\";\n return {\n templateUrl: template,\n scope: {\n memberships: \"=\",\n filtersQ: \"=filtersq\",\n filtersRole: \"=filtersrole\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\",\n owner: \"=owner\"\n }\n };\n };\n\n module.directive(\"tgTeamMembers\", TeamMembersDirective);\n\n LeaveProjectDirective = function($repo, $confirm, $location, $rs, $navurls, $translate, lightboxFactory, currentUserService) {\n var link;\n link = function($scope, $el, $attrs) {\n var leaveConfirm;\n leaveConfirm = function() {\n var confirm_leave_project_text, leave_project_text;\n leave_project_text = $translate.instant(\"TEAM.ACTION_LEAVE_PROJECT\");\n confirm_leave_project_text = $translate.instant(\"TEAM.CONFIRM_LEAVE_PROJECT\");\n return $confirm.ask(leave_project_text, confirm_leave_project_text).then((function(_this) {\n return function(response) {\n var promise;\n promise = $rs.projects.leave($scope.project.id);\n promise.then(function() {\n return currentUserService.loadProjects().then(function() {\n response.finish();\n $confirm.notify(\"success\");\n return $location.path($navurls.resolve(\"home\"));\n });\n });\n return promise.then(null, function(response) {\n response.finish();\n return $confirm.notify('error', response.data._error_message);\n });\n };\n })(this));\n };\n return $scope.leave = function() {\n if ($scope.project.owner.id === $scope.user.id) {\n return lightboxFactory.create(\"tg-lightbox-leave-project-warning\", {\n \"class\": \"lightbox lightbox-leave-project-warning\"\n }, {\n isCurrentUser: true,\n project: $scope.project\n });\n } else {\n return leaveConfirm();\n }\n };\n };\n return {\n scope: {\n user: \"=\",\n project: \"=\"\n },\n templateUrl: \"team/leave-project.html\",\n link: link\n };\n };\n\n module.directive(\"tgLeaveProject\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgResources\", \"$tgNavUrls\", \"$translate\", \"tgLightboxFactory\", \"tgCurrentUserService\", LeaveProjectDirective]);\n\n membersFilter = function() {\n return function(members, filtersQ, filtersRole) {\n return _.filter(members, function(m) {\n return (!filtersRole || m.role === filtersRole.id) && (!filtersQ || m.full_name.search(new RegExp(filtersQ, \"i\")) >= 0);\n });\n };\n };\n\n module.filter('membersFilter', membersFilter);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/detail.coffee\n */\n\n(function() {\n var WikiDetailController, WikiSummaryDirective, WikiWysiwyg, bindOnce, debounce, groupBy, mixOf, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaWiki\");\n\n WikiDetailController = (function(superClass) {\n extend(WikiDetailController, superClass);\n\n WikiDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgModel\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$filter\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WikiDetailController(scope, rootscope, repo, model, confirm, rs, params, q, location, filter, log, appMetaService, navUrls, analytics, translate, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.model = model;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.filter = filter;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this.moveLink = bind(this.moveLink, this);\n this.loadWiki = bind(this.loadWiki, this);\n this.scope.$on(\"wiki:links:move\", this.moveLink);\n this.scope.$on(\"wikipage:add\", this.loadWiki);\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\n this.scope.sectionName = \"Wiki\";\n this.scope.linksVisible = false;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n WikiDetailController.prototype._setMeta = function() {\n var description, ref, ref1, ref2, title;\n title = this.translate.instant(\"WIKI.PAGE_TITLE\", {\n wikiPageName: this.scope.wikiSlug,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"WIKI.PAGE_DESCRIPTION\", {\n wikiPageContent: angular.element(((ref = this.scope.wiki) != null ? ref.html : void 0) || \"\").text(),\n totalEditions: ((ref1 = this.scope.wiki) != null ? ref1.editions : void 0) || 0,\n lastModifiedDate: moment((ref2 = this.scope.wiki) != null ? ref2.modified_date : void 0).format(this.translate.instant(\"WIKI.DATETIME\"))\n });\n return this.appMetaService.setAll(title, description);\n };\n\n WikiDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_wiki_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WikiDetailController.prototype.loadWiki = function() {\n var promise;\n promise = this.rs.wiki.getBySlug(this.scope.projectId, this.params.slug);\n promise.then((function(_this) {\n return function(wiki) {\n _this.scope.wiki = wiki;\n _this.scope.wikiId = wiki.id;\n return _this.scope.wiki;\n };\n })(this));\n return promise.then(null, (function(_this) {\n return function(xhr) {\n var data;\n _this.scope.wikiId = null;\n if (_this.scope.project.my_permissions.indexOf(\"add_wiki_page\") === -1) {\n return null;\n }\n data = {\n project: _this.scope.projectId,\n slug: _this.scope.wikiSlug,\n content: \"\"\n };\n _this.scope.wiki = _this.model.make_model(\"wiki\", data);\n return _this.scope.wiki;\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadWikiLinks = function() {\n return this.rs.wiki.listLinks(this.scope.projectId).then((function(_this) {\n return function(wikiLinks) {\n var i, len, link, ref, selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n ref = _this.scope.wikiLinks;\n for (i = 0, len = ref.length; i < len; i++) {\n link = ref[i];\n link.url = _this.navUrls.resolve(\"project-wiki-page\", {\n project: _this.scope.projectSlug,\n slug: link.href\n });\n }\n return selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.q.all([this.loadWikiLinks(), this.loadWiki()]).then(this.checkLinksPerms.bind(this));\n };\n\n WikiDetailController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"add_wiki_link\") !== -1 || (this.scope.project.my_permissions.indexOf(\"view_wiki_links\") !== -1 && this.scope.wikiLinks.length)) {\n return this.scope.linksVisible = true;\n }\n };\n\n WikiDetailController.prototype[\"delete\"] = function() {\n var message, title;\n title = this.translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\");\n message = this.scope.wikiSlug;\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onSuccess = function() {\n var ctx;\n askResponse.finish();\n ctx = {\n project: _this.scope.projectSlug\n };\n _this.location.path(_this.navUrls.resolve(\"project-wiki\", ctx));\n _this.confirm.notify(\"success\");\n return _this.loadWiki();\n };\n onError = function() {\n askResponse.finish(false);\n return _this.confirm.notify(\"error\");\n };\n return _this.repo.remove(_this.scope.wiki).then(onSuccess, onError);\n };\n })(this));\n };\n\n WikiDetailController.prototype.moveLink = function(ctx, item, itemIndex) {\n var r, values;\n values = this.scope.wikiLinks;\n r = values.indexOf(item);\n values.splice(r, 1);\n values.splice(itemIndex, 0, item);\n _.each(values, function(value, index) {\n return value.order = index;\n });\n return this.repo.saveAll(values);\n };\n\n return WikiDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"WikiDetailController\", WikiDetailController);\n\n WikiSummaryDirective = function($log, $template, $compile, $translate, avatarService) {\n var link, template;\n template = $template.get(\"wiki/wiki-summary.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var render;\n render = function(wiki) {\n var avatar, ctx, html, user;\n if ($scope.usersById == null) {\n $log.error(\"WikiSummaryDirective requires userById set in scope.\");\n } else {\n user = $scope.usersById[wiki.last_modifier];\n }\n avatar = avatarService.getAvatar(user);\n if (user === void 0) {\n user = {\n name: \"unknown\",\n avatar: avatar\n };\n } else {\n user = {\n name: user.full_name_display,\n avatar: avatar\n };\n }\n ctx = {\n totalEditions: wiki.editions,\n lastModifiedDate: moment(wiki.modified_date).format($translate.instant(\"WIKI.DATETIME\")),\n user: user\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(wikiPage) {\n if (!wikiPage) {\n return;\n }\n return render(wikiPage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWikiSummary\", [\"$log\", \"$tgTemplate\", \"$compile\", \"$translate\", \"tgAvatarService\", WikiSummaryDirective]);\n\n WikiWysiwyg = function($modelTransform, $rootscope, $confirm, attachmentsFullService, $qqueue, $repo, $analytics, wikiHistoryService) {\n var link;\n link = function($scope, $el, $attrs) {\n var uploadFile;\n $scope.editableDescription = false;\n $scope.saveDescription = $qqueue.bindAdd(function(description, cb) {\n var onError, onSuccess, promise;\n onSuccess = function(wikiPage) {\n if ($scope.item.id == null) {\n $analytics.trackEvent(\"wikipage\", \"create\", \"create wiki page\", 1);\n $scope.$emit(\"wikipage:add\");\n }\n wikiHistoryService.loadHistoryEntries();\n return $confirm.notify(\"success\");\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n $scope.item.content = description;\n if ($scope.item.id != null) {\n promise = $repo.save($scope.item).then(onSuccess, onError);\n } else {\n promise = $repo.create(\"wiki\", $scope.item).then(onSuccess, onError);\n }\n return promise[\"finally\"](cb);\n });\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, 'wiki_page', file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.$watch($attrs.model, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n $scope.version = value.version;\n return $scope.storageKey = $scope.project.id + \"-\" + value.id + \"-wiki\";\n });\n return $scope.$watch('project', function(project) {\n if (!project) {\n return;\n }\n return $scope.editableDescription = project.my_permissions.indexOf(\"modify_wiki_page\") !== -1;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n\\n
    \\n\\n \\n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\\n
    \\n
    \"\n };\n };\n\n module.directive(\"tgWikiWysiwyg\", [\"$tgQueueModelTransformation\", \"$rootScope\", \"$tgConfirm\", \"tgAttachmentsFullService\", \"$tgQqueue\", \"$tgRepo\", \"$tgAnalytics\", \"tgWikiHistoryService\", WikiWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/detail.coffee\n */\n\n(function() {\n var WikiNavDirective, bindOnce, groupBy, mixOf, module, taiga;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaWiki\");\n\n WikiNavDirective = function($tgrepo, $log, $location, $confirm, $analytics, $loading, $template, $compile, $translate) {\n var link, linkWikiLinks, template;\n template = $template.get(\"wiki/wiki-nav.html\", true);\n linkWikiLinks = function($scope, $el, $attrs) {\n var $ctrl, addWikiLinkPermission, drake, render;\n $ctrl = $el.controller();\n if ($attrs.ngModel == null) {\n return $log.error(\"WikiNavDirective: no ng-model attr is defined\");\n }\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1;\n drake = null;\n render = function(wikiLinks) {\n var deleteWikiLinkPermission, html, itemEl, scroll, tdom;\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1;\n deleteWikiLinkPermission = $scope.project.my_permissions.indexOf(\"delete_wiki_link\") > -1;\n html = template({\n wikiLinks: wikiLinks,\n projectSlug: $scope.projectSlug,\n addWikiLinkPermission: addWikiLinkPermission,\n deleteWikiLinkPermission: deleteWikiLinkPermission\n });\n html = $compile(html)($scope);\n $el.off();\n if (addWikiLinkPermission && drake) {\n drake.destroy();\n }\n $el.html(html);\n if (addWikiLinkPermission) {\n itemEl = null;\n tdom = $el.find(\".sortable\");\n drake = dragula([tdom[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: tdom[0],\n moves: function(item) {\n return $(item).is('li');\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex;\n itemEl = $(item);\n item = itemEl.scope().link;\n itemIndex = itemEl.index();\n return $scope.$emit(\"wiki:links:move\", item, itemIndex);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n }\n $el.on(\"click\", \".add-button\", function(event) {\n event.preventDefault();\n $el.find(\".new\").removeClass(\"hidden\");\n $el.find(\".new input\").focus();\n return $el.find(\".add-button\").hide();\n });\n $el.on(\"click\", \".js-delete-link\", function(event) {\n var linkId, message, target, title;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n linkId = target.parents('.wiki-link').data('id');\n title = $translate.instant(\"WIKI.DELETE_LINK_TITLE\");\n message = $scope.wikiLinks[linkId].title;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var promise;\n promise = $tgrepo.remove($scope.wikiLinks[linkId]);\n promise.then(function() {\n promise = $ctrl.loadWikiLinks();\n promise.then(function() {\n askResponse.finish();\n return render($scope.wikiLinks);\n });\n return promise.then(null, function() {\n return askResponse.finish();\n });\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n });\n return $el.on(\"keyup\", \".new input\", function(event) {\n var currentLoading, newLink, promise, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newLink = target.val();\n currentLoading = $loading().target($el.find(\".new\")).start();\n promise = $tgrepo.create(\"wiki-links\", {\n project: $scope.projectId,\n title: newLink\n });\n promise.then(function() {\n var loadPromise;\n $analytics.trackEvent(\"wikilink\", \"create\", \"create wiki link\", 1);\n loadPromise = $ctrl.loadWikiLinks();\n loadPromise.then(function() {\n currentLoading.finish();\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n $el.find(\".add-button\").show();\n return render($scope.wikiLinks);\n });\n return loadPromise.then(null, function() {\n currentLoading.finish();\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n $el.find(\".add-button\").show();\n return $confirm.notify(\"error\", \"Error loading wiki links\");\n });\n });\n return promise.then(null, function(error) {\n var ref;\n currentLoading.finish();\n $el.find(\".new input\").val(newLink);\n $el.find(\".new input\").focus().select();\n if ((error != null ? (ref = error.__all__) != null ? ref[0] : void 0 : void 0) != null) {\n return $confirm.notify(\"error\", \"The link already exists\");\n } else {\n return $confirm.notify(\"error\");\n }\n });\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n return $el.find(\".add-button\").show();\n }\n });\n };\n return bindOnce($scope, $attrs.ngModel, render);\n };\n link = function($scope, $el, $attrs) {\n linkWikiLinks($scope, $el, $attrs);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgWikiNav\", [\"$tgRepo\", \"$log\", \"$tgLocation\", \"$tgConfirm\", \"$tgAnalytics\", \"$tgLoading\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiNavDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/pages-list.coffee\n */\n\n(function() {\n var WikiPagesListController, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n module = angular.module(\"taigaWiki\");\n\n WikiPagesListController = (function(superClass) {\n extend(WikiPagesListController, superClass);\n\n WikiPagesListController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgModel\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgNavUrls\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WikiPagesListController(scope, rootscope, repo, model, confirm, rs, params, q, navUrls, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.model = model;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.navUrls = navUrls;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\n this.scope.sectionName = \"Wiki\";\n this.scope.linksVisible = false;\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n WikiPagesListController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_wiki_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WikiPagesListController.prototype.loadWikiPages = function() {\n var promise;\n return promise = this.rs.wiki.list(this.scope.projectId).then((function(_this) {\n return function(wikipages) {\n return _this.scope.wikipages = wikipages;\n };\n })(this));\n };\n\n WikiPagesListController.prototype.loadWikiLinks = function() {\n return this.rs.wiki.listLinks(this.scope.projectId).then((function(_this) {\n return function(wikiLinks) {\n var i, len, link, ref, selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n ref = _this.scope.wikiLinks;\n for (i = 0, len = ref.length; i < len; i++) {\n link = ref[i];\n link.url = _this.navUrls.resolve(\"project-wiki-page\", {\n project: _this.scope.projectSlug,\n slug: link.href\n });\n }\n return selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n };\n })(this));\n };\n\n WikiPagesListController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.q.all([this.loadWikiLinks(), this.loadWikiPages()]).then(this.checkLinksPerms.bind(this));\n };\n\n WikiPagesListController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"add_wiki_link\") !== -1 || (this.scope.project.my_permissions.indexOf(\"view_wiki_links\") !== -1 && this.scope.wikiLinks.length)) {\n return this.scope.linksVisible = true;\n }\n };\n\n return WikiPagesListController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"WikiPagesListController\", WikiPagesListController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/lightboxes.coffee\n */\n\n(function() {\n var ChangeOwnerLightboxController, ChangeOwnerLightboxDirective, LbRequestOwnershipDirective, LightboxAddMembersWarningMessageDirective, TransferProjectStartSuccessDirective, debounce, module, taiga;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaKanban\");\n\n LightboxAddMembersWarningMessageDirective = function() {\n return {\n templateUrl: \"admin/memberships-warning-message.html\",\n scope: {\n project: \"=\"\n }\n };\n };\n\n module.directive(\"tgLightboxAddMembersWarningMessage\", [LightboxAddMembersWarningMessageDirective]);\n\n LbRequestOwnershipDirective = function(lightboxService, rs, confirmService, $translate) {\n return {\n link: function(scope, el) {\n lightboxService.open(el);\n return scope.request = function() {\n scope.loading = true;\n return rs.projects.transferRequest(scope.projectId).then(function() {\n scope.loading = false;\n lightboxService.close(el);\n return confirmService.notify(\"success\", $translate.instant(\"ADMIN.PROJECT_PROFILE.REQUEST_OWNERSHIP_SUCCESS\"));\n });\n };\n },\n templateUrl: \"common/lightbox/lightbox-request-ownership.html\"\n };\n };\n\n module.directive('tgLbRequestOwnership', [\"lightboxService\", \"tgResources\", \"$tgConfirm\", \"$translate\", LbRequestOwnershipDirective]);\n\n ChangeOwnerLightboxController = (function() {\n function ChangeOwnerLightboxController(rs1, lightboxService1, confirm, translate) {\n this.rs = rs1;\n this.lightboxService = lightboxService1;\n this.confirm = confirm;\n this.translate = translate;\n this.users = [];\n this.q = \"\";\n this.commentOpen = false;\n }\n\n ChangeOwnerLightboxController.prototype.limit = 3;\n\n ChangeOwnerLightboxController.prototype.normalizeString = function(normalizedString) {\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\");\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\");\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\");\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\");\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\");\n return normalizedString;\n };\n\n ChangeOwnerLightboxController.prototype.filterUsers = function(user) {\n var text, username;\n username = user.full_name_display.toUpperCase();\n username = this.normalizeString(username);\n text = this.q.toUpperCase();\n text = this.normalizeString(text);\n return _.includes(username, text);\n };\n\n ChangeOwnerLightboxController.prototype.getUsers = function() {\n var users;\n if (!this.users.length && !this.q.length) {\n users = this.activeUsers;\n } else {\n users = this.users;\n }\n users = users.slice(0, this.limit);\n users = _.reject(users, {\n \"selected\": true\n });\n return _.reject(users, {\n \"id\": this.currentOwnerId\n });\n };\n\n ChangeOwnerLightboxController.prototype.userSearch = function() {\n this.users = this.activeUsers;\n this.selected = _.find(this.users, {\n \"selected\": true\n });\n if (this.q) {\n return this.users = _.filter(this.users, this.filterUsers.bind(this));\n }\n };\n\n ChangeOwnerLightboxController.prototype.selectUser = function(user) {\n this.activeUsers = _.map(this.activeUsers, function(user) {\n user.selected = false;\n return user;\n });\n user.selected = true;\n return this.userSearch();\n };\n\n ChangeOwnerLightboxController.prototype.submit = function() {\n this.loading = true;\n return this.rs.projects.transferStart(this.projectId, this.selected.id, this.comment).then((function(_this) {\n return function() {\n var desc, title;\n _this.loading = false;\n _this.lightboxService.closeAll();\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.CHANGE_OWNER_SUCCESS_TITLE\");\n desc = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.CHANGE_OWNER_SUCCESS_DESC\");\n return _this.confirm.success(title, desc, {\n type: \"svg\",\n name: \"icon-speak-up\"\n });\n };\n })(this));\n };\n\n return ChangeOwnerLightboxController;\n\n })();\n\n ChangeOwnerLightboxController.$inject = [\"tgResources\", \"lightboxService\", \"$tgConfirm\", \"$translate\"];\n\n module.controller('ChangeOwnerLightbox', ChangeOwnerLightboxController);\n\n ChangeOwnerLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile) {\n var link;\n link = function(scope, el) {\n return lightboxService.open(el);\n };\n return {\n scope: true,\n controller: \"ChangeOwnerLightbox\",\n controllerAs: \"vm\",\n bindToController: {\n currentOwnerId: \"=\",\n projectId: \"=\",\n activeUsers: \"=\"\n },\n templateUrl: \"common/lightbox/lightbox-change-owner.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbChangeOwner\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", ChangeOwnerLightboxDirective]);\n\n TransferProjectStartSuccessDirective = function(lightboxService) {\n var link;\n link = function(scope, el) {\n scope.close = function() {\n return lightboxService.close(el);\n };\n return lightboxService.open(el);\n };\n return {\n templateUrl: \"common/lightbox/lightbox-transfer-project-start-success.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbTransferProjectStartSuccess\", [\"lightboxService\", TransferProjectStartSuccessDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/memberships.coffee\n */\n\n(function() {\n var MembershipsController, MembershipsDirective, MembershipsRowActionsDirective, MembershipsRowAdminCheckboxDirective, MembershipsRowAvatarDirective, MembershipsRowRoleSelectorDirective, NoMoreMembershipsExplanationDirective, bindMethods, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaAdmin\");\n\n MembershipsController = (function(superClass) {\n extend(MembershipsController, superClass);\n\n MembershipsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAnalytics\", \"tgAppMetaService\", \"$translate\", \"$tgAuth\", \"tgLightboxFactory\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function MembershipsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, analytics, appMetaService, translate, auth, lightboxFactory1, errorHandlingService, projectService1) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.auth = auth;\n this.lightboxFactory = lightboxFactory1;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n bindMethods(this);\n this.scope.project = {};\n this.scope.filters = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.MEMBERSHIPS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"membersform:new:success\", (function(_this) {\n return function() {\n _this.loadInitialData();\n return _this.analytics.trackEvent(\"membership\", \"create\", \"create memberships on admin\", 1);\n };\n })(this));\n }\n\n MembershipsController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.canAddUsers = project.max_memberships === null || project.max_memberships > project.total_memberships;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n MembershipsController.prototype.loadMembers = function() {\n var httpFilters;\n httpFilters = this.getUrlFilters();\n return this.rs.memberships.list(this.scope.projectId, httpFilters).then((function(_this) {\n return function(data) {\n _this.scope.memberships = _.filter(data.models, function(membership) {\n return membership.user === null || membership.is_user_active;\n });\n _this.scope.page = data.current;\n _this.scope.count = data.count;\n _this.scope.paginatedBy = data.paginatedBy;\n return data;\n };\n })(this));\n };\n\n MembershipsController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.q.all([this.loadMembers(), this.auth.refresh()]);\n };\n\n MembershipsController.prototype.getUrlFilters = function() {\n var filters;\n filters = _.pick(this.location.search(), \"page\");\n if (!filters.page) {\n filters.page = 1;\n }\n return filters;\n };\n\n MembershipsController.prototype.addNewMembers = function() {\n return this.lightboxFactory.create('tg-lb-add-members', {\n \"class\": \"lightbox lightbox-add-member\",\n \"project\": \"project\"\n }, {\n \"project\": this.scope.project\n });\n };\n\n MembershipsController.prototype.showLimitUsersWarningMessage = function() {\n var icon, message, title;\n title = this.translate.instant(\"ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING\");\n message = this.translate.instant(\"ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING_MESSAGE\", {\n members: this.scope.project.max_memberships\n });\n icon = \"/\" + window._version + \"/svg/icons/team-question.svg\";\n return this.confirm.success(title, message, {\n name: icon,\n type: \"img\"\n });\n };\n\n return MembershipsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"MembershipsController\", MembershipsController);\n\n MembershipsDirective = function($template, $compile) {\n var link, linkPagination, template;\n template = $template.get(\"admin/admin-membership-paginator.html\", true);\n linkPagination = function($scope, $el, $attrs, $ctrl) {\n var $pagEl, afterCurrent, atBegin, atEnd, beforeCurrent, getNumPages, renderPagination;\n afterCurrent = 2;\n beforeCurrent = 4;\n atBegin = 2;\n atEnd = 2;\n $pagEl = $el.find(\".memberships-paginator\");\n getNumPages = function() {\n var numPages;\n numPages = $scope.count / $scope.paginatedBy;\n if (parseInt(numPages, 10) < numPages) {\n numPages = parseInt(numPages, 10) + 1;\n } else {\n numPages = parseInt(numPages, 10);\n }\n return numPages;\n };\n renderPagination = function() {\n var cpage, html, i, j, numPages, options, pages, ref;\n numPages = getNumPages();\n if (numPages <= 1) {\n $pagEl.hide();\n return;\n }\n pages = [];\n options = {};\n options.pages = pages;\n options.showPrevious = $scope.page > 1;\n options.showNext = !($scope.page === numPages);\n cpage = $scope.page;\n for (i = j = 1, ref = numPages; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (i === (cpage + afterCurrent) && numPages > (cpage + afterCurrent + atEnd)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i === (cpage - beforeCurrent) && cpage > (atBegin + beforeCurrent)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i > (cpage + afterCurrent) && i <= (numPages - atEnd)) {\n\n } else if (i < (cpage - beforeCurrent) && i > atBegin) {\n\n } else if (i === cpage) {\n pages.push({\n classes: \"active\",\n num: i,\n type: \"page-active\"\n });\n } else {\n pages.push({\n classes: \"page\",\n num: i,\n type: \"page\"\n });\n }\n }\n html = template(options);\n html = $compile(html)($scope);\n $pagEl.html(html);\n return $pagEl.show();\n };\n $scope.$watch(\"memberships\", function(value) {\n if (!value) {\n return;\n }\n return renderPagination();\n });\n $el.on(\"click\", \".memberships-paginator a.next\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page + 1);\n return $ctrl.loadMembers();\n });\n });\n $el.on(\"click\", \".memberships-paginator a.previous\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n return $ctrl.loadMembers();\n });\n });\n return $el.on(\"click\", \".memberships-paginator li.page > a\", function(event) {\n var pagenum, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n pagenum = target.data(\"pagenum\");\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", pagenum);\n return $ctrl.loadMembers();\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n linkPagination($scope, $el, $attrs, $ctrl);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMemberships\", [\"$tgTemplate\", \"$compile\", MembershipsDirective]);\n\n MembershipsRowAvatarDirective = function($log, $template, $translate, $compile, avatarService) {\n var link, template;\n template = $template.get(\"admin/memberships-row-avatar.html\", true);\n link = function($scope, $el, $attrs) {\n var member, pending, render;\n pending = $translate.instant(\"ADMIN.MEMBERSHIP.STATUS_PENDING\");\n render = function(member) {\n var avatar, ctx, html;\n avatar = avatarService.getAvatar(member);\n ctx = {\n full_name: member.full_name ? member.full_name : \"\",\n email: member.user_email ? member.user_email : member.email,\n imgurl: avatar.url,\n bg: avatar.bg,\n pending: !member.is_user_active ? pending : \"\",\n isOwner: member.is_owner\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowAvatar == null) {\n return $log.error(\"MembershipsRowAvatarDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAvatar);\n render(member);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowAvatar\", [\"$log\", \"$tgTemplate\", '$translate', \"$compile\", \"tgAvatarService\", MembershipsRowAvatarDirective]);\n\n MembershipsRowAdminCheckboxDirective = function($log, $repo, $confirm, $template, $compile) {\n var link, template;\n template = $template.get(\"admin/admin-memberships-row-checkbox.html\", true);\n link = function($scope, $el, $attrs) {\n var html, member, render;\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n if ($attrs.tgMembershipsRowAdminCheckbox == null) {\n return $log.error(\"MembershipsRowAdminCheckboxDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAdminCheckbox);\n if (member.is_owner) {\n $el.find(\".js-check\").remove();\n return;\n }\n render = function(member) {\n var ctx, html;\n ctx = {\n inputId: \"is-admin-\" + member.id\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $el.on(\"click\", \":checkbox\", (function(_this) {\n return function(event) {\n var onError, onSuccess, target;\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function(data) {\n member.revert();\n $el.find(\":checkbox\").prop(\"checked\", member.is_admin);\n return $confirm.notify(\"error\", data.is_admin[0]);\n };\n target = angular.element(event.currentTarget);\n member.is_admin = target.prop(\"checked\");\n return $repo.save(member).then(onSuccess, onError);\n };\n })(this));\n html = render(member);\n if (member.is_admin) {\n return $el.find(\":checkbox\").prop(\"checked\", true);\n }\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowAdminCheckbox\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgTemplate\", \"$compile\", MembershipsRowAdminCheckboxDirective]);\n\n MembershipsRowRoleSelectorDirective = function($log, $repo, $confirm) {\n var link, template;\n template = _.template(\"\");\n link = function($scope, $el, $attrs) {\n var $ctrl, html, member, render;\n render = function(member) {\n var ctx, html;\n ctx = {\n roleList: $scope.project.roles,\n selectedRole: member.role\n };\n html = template(ctx);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowRoleSelector == null) {\n return $log.error(\"MembershipsRowRoleSelectorDirective: the directive need a member\");\n }\n $ctrl = $el.controller();\n member = $scope.$eval($attrs.tgMembershipsRowRoleSelector);\n html = render(member);\n $el.on(\"change\", \"select\", (function(_this) {\n return function(event) {\n var newRole, onError, onSuccess, target;\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n target = angular.element(event.currentTarget);\n newRole = parseInt(target.val(), 10);\n if (member.role !== newRole) {\n member.role = newRole;\n return $repo.save(member).then(onSuccess, onError);\n }\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowRoleSelector\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", MembershipsRowRoleSelectorDirective]);\n\n MembershipsRowActionsDirective = function($log, $repo, $rs, $confirm, $compile, $translate, $location, $navUrls, lightboxFactory, projectService) {\n var activedTemplate, link, pendingTemplate;\n activedTemplate = \"
    \\n
    \\n\\n \\n\";\n pendingTemplate = \"\\n\\n\\n \\n\";\n link = function($scope, $el, $attrs) {\n var $ctrl, leaveConfirm, member, render;\n render = function(member) {\n var html;\n if (member.user) {\n html = $compile(activedTemplate)($scope);\n } else {\n html = $compile(pendingTemplate)($scope);\n }\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowActions == null) {\n return $log.error(\"MembershipsRowActionsDirective: the directive need a member\");\n }\n $ctrl = $el.controller();\n member = $scope.$eval($attrs.tgMembershipsRowActions);\n render(member);\n $el.on(\"click\", \".js-resend\", function(event) {\n var onError, onSuccess;\n event.preventDefault();\n onSuccess = function() {\n var text;\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION\", {\n email: $scope.member.email\n });\n return $confirm.notify(\"success\", text);\n };\n onError = function() {\n var text;\n text = $translate.instant(\"ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION\");\n return $confirm.notify(\"error\", text);\n };\n return $rs.memberships.resendInvitation($scope.member.id).then(onSuccess, onError);\n });\n leaveConfirm = function() {\n var defaultMsg, message, title;\n title = $translate.instant(\"ADMIN.MEMBERSHIP.DELETE_MEMBER\");\n defaultMsg = $translate.instant(\"ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE\", {\n email: member.email\n });\n message = member.user ? member.full_name : defaultMsg;\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n var text;\n askResponse.finish();\n if (member.user !== $scope.user.id) {\n if ($scope.page > 1 && ($scope.count - 1) <= $scope.paginatedBy) {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n }\n projectService.fetchProject().then(function() {\n return $ctrl.loadInitialData();\n });\n } else {\n $location.path($navUrls.resolve(\"home\"));\n }\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_DELETE\", {\n message: message\n });\n return $confirm.notify(\"success\", text, null, 5000);\n };\n })(this);\n onError = (function(_this) {\n return function() {\n var text;\n askResponse.finish(false);\n text = $translate.instant(\"ADMIN.MEMBERSHIP.ERROR_DELETE\", {\n message: message\n });\n return $confirm.notify(\"error\", text);\n };\n })(this);\n return $repo.remove(member).then(onSuccess, onError);\n });\n };\n $el.on(\"click\", \".delete\", function(event) {\n var isCurrentUser;\n event.preventDefault();\n if ($scope.project.owner.id === member.user) {\n isCurrentUser = $scope.user.id === member.user;\n return lightboxFactory.create(\"tg-lightbox-leave-project-warning\", {\n \"class\": \"lightbox lightbox-leave-project-warning\"\n }, {\n isCurrentUser: isCurrentUser,\n project: $scope.project\n });\n } else {\n return leaveConfirm();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowActions\", [\"$log\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$compile\", \"$translate\", \"$tgLocation\", \"$tgNavUrls\", \"tgLightboxFactory\", \"tgProjectService\", MembershipsRowActionsDirective]);\n\n NoMoreMembershipsExplanationDirective = function() {\n return {\n templateUrl: \"admin/no-more-memberships-explanation.html\",\n scope: {\n project: \"=\"\n }\n };\n };\n\n module.directive(\"tgNoMoreMembershipsExplanation\", [NoMoreMembershipsExplanationDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/nav.coffee\n */\n\n(function() {\n var AdminNavigationDirective, module;\n\n AdminNavigationDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var section;\n section = $attrs.tgAdminNavigation;\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\"#adminmenu-\" + section + \" a\").addClass(\"active\");\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaAdmin\");\n\n module.directive(\"tgAdminNavigation\", AdminNavigationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/project-profile.coffee\n */\n\n(function() {\n var AdminProjectChangeOwnerDirective, AdminProjectRequestOwnershipDirective, AdminProjectRestrictionsDirective, CsvEpicDirective, CsvExporterController, CsvExporterEpicsController, CsvExporterIssuesController, CsvExporterTasksController, CsvExporterUserstoriesController, CsvIssueDirective, CsvTaskDirective, CsvUsDirective, ProjectDefaultValuesDirective, ProjectExportDirective, ProjectLogoDirective, ProjectLogoModelDirective, ProjectModulesDirective, ProjectProfileController, ProjectProfileDirective, bindOnce, debounce, groupBy, joinStr, mixOf, module, scopeDefer, taiga, toString, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n scopeDefer = this.taiga.scopeDefer;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAdmin\");\n\n ProjectProfileController = (function(superClass) {\n extend(ProjectProfileController, superClass);\n\n ProjectProfileController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\", \"$tgAuth\", \"tgCurrentUserService\", \"tgErrorHandlingService\", \"tgProjectService\", \"$tgModel\"];\n\n function ProjectProfileController(scope1, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate, tgAuth, currentUserService1, errorHandlingService, projectService1, model1) {\n var promise;\n this.scope = scope1;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.tgAuth = tgAuth;\n this.currentUserService = currentUserService1;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.model = model1;\n this.scope.project = {};\n this.scope.projectTags = [];\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName,\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n _this.appMetaService.setAll(title, description);\n return _this.fillUsersAndRoles(_this.scope.project.members, _this.scope.project.roles);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:loaded\", (function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName,\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n }\n\n ProjectProfileController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n project = this.model.make_model(\"projects\", project);\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.epicStatusList = _.sortBy(project.epic_statuses, \"order\");\n this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n this.scope.pointsList = _.sortBy(project.points, \"order\");\n this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n this.scope.issueTypesList = _.sortBy(project.issue_types, \"order\");\n this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n this.scope.prioritiesList = _.sortBy(project.priorities, \"order\");\n this.scope.severitiesList = _.sortBy(project.severities, \"order\");\n scopeDefer(this.scope, (function(_this) {\n return function() {\n return _this.scope.$emit('project:loaded', project);\n };\n })(this));\n this.scope.projectTags = _.map(this.scope.project.tags, (function(_this) {\n return function(it) {\n return [it, _this.scope.project.tags_colors[it]];\n };\n })(this));\n return project;\n };\n\n ProjectProfileController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.tgAuth.refresh();\n };\n\n ProjectProfileController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.project);\n };\n\n ProjectProfileController.prototype.addTag = function(name, color) {\n var tags;\n tags = _.clone(this.scope.project.tags);\n tags.push(name);\n this.scope.projectTags.push([name, null]);\n return this.scope.project.tags = tags;\n };\n\n ProjectProfileController.prototype.deleteTag = function(tag) {\n var tags;\n tags = _.clone(this.scope.project.tags);\n _.pull(tags, tag[0]);\n _.remove(this.scope.projectTags, (function(_this) {\n return function(it) {\n return it[0] === tag[0];\n };\n })(this));\n return this.scope.project.tags = tags;\n };\n\n return ProjectProfileController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectProfileController\", ProjectProfileController);\n\n ProjectProfileDirective = function($repo, $confirm, $loading, $navurls, $location, projectService, currentUserService, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, form, submit, submitButton;\n $ctrl = $el.controller();\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, privacyChanged, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n privacyChanged = $scope.project.isAttributeModified(\"is_private\");\n promise = $repo.save($scope.project);\n promise.then(function() {\n var newUrl;\n currentLoading.finish();\n if (privacyChanged && $scope.project.is_private) {\n $analytics.trackEvent(\"project-privacy-changed\", \"from-public-to-private\", \"Change project privacy from public to private\", 1);\n } else if (privacyChanged && !$scope.project.is_private) {\n $analytics.trackEvent(\"project-privacy-changed\", \"from-private-to-public\", \"Change project privacy from private to public\", 1);\n }\n $confirm.notify(\"success\");\n newUrl = $navurls.resolve(\"project-admin-project-profile-details\", {\n project: $scope.project.slug\n });\n $location.path(newUrl);\n projectService.fetchProject().then((function(_this) {\n return function() {\n return $ctrl.loadInitialData();\n };\n })(this));\n return currentUserService.loadProjects();\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectProfile\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgNavUrls\", \"$tgLocation\", \"tgProjectService\", \"tgCurrentUserService\", \"$tgAnalytics\", ProjectProfileDirective]);\n\n ProjectDefaultValuesDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.save($scope.project);\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectDefaultValues\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", ProjectDefaultValuesDirective]);\n\n ProjectModulesDirective = function($repo, $confirm, $loading, projectService) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n submit = (function(_this) {\n return function() {\n var form, promise;\n form = $el.find(\"form\").checksley();\n form.initializeFields();\n form.reset();\n if (!form.validate()) {\n return;\n }\n promise = $repo.save($scope.project);\n promise.then(function() {\n $scope.$emit(\"project:loaded\", $scope.project);\n $confirm.notify(\"success\");\n return projectService.fetchProject();\n });\n return promise.then(null, function(data) {\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this);\n $el.on(\"change\", \".module-activation.module-direct-active input\", function(event) {\n event.preventDefault();\n return $scope.$applyAsync(submit);\n });\n $el.on(\"submit\", \"form\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"keydown\", \".videoconference-attributes input\", function(e) {\n return e.which !== 32;\n });\n $scope.$watch(\"project.videoconferences\", function(newVal, oldVal) {\n if ((newVal != null) && (oldVal != null) && newVal !== oldVal) {\n return $scope.project.videoconferences_extra_data = \"\";\n }\n });\n $scope.$watch(\"isVideoconferenceActivated\", function(newValue, oldValue) {\n if (newValue === false) {\n $scope.project.videoconferences = null;\n $scope.project.videoconferences_extra_data = \"\";\n if (oldValue === true) {\n return submit();\n }\n }\n });\n return $scope.$watch(\"project\", function(project) {\n if (project.videoconferences != null) {\n return $scope.isVideoconferenceActivated = true;\n } else {\n return $scope.isVideoconferenceActivated = false;\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectModules\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgProjectService\", ProjectModulesDirective]);\n\n ProjectExportDirective = function($window, $rs, $confirm, $translate, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var asyn_message, buttonsEl, dump_ready_text, hideButtons, hideResult, hideSpinner, loading_msg, loading_title, resultEl, resultMessageEl, resultTitleEl, setAsyncMessage, setAsyncTitle, setLoadingMessage, setLoadingTitle, setSyncMessage, setSyncTitle, showButtons, showErrorMode, showExportResultAsyncMode, showExportResultSyncMode, showLoadingMode, showResult, showSpinner, spinnerEl, syn_message;\n buttonsEl = $el.find(\".admin-project-export-buttons\");\n showButtons = function() {\n return buttonsEl.removeClass(\"hidden\");\n };\n hideButtons = function() {\n return buttonsEl.addClass(\"hidden\");\n };\n resultEl = $el.find(\".admin-project-export-result\");\n showResult = function() {\n return resultEl.removeClass(\"hidden\");\n };\n hideResult = function() {\n return resultEl.addClass(\"hidden\");\n };\n spinnerEl = $el.find(\".spin\");\n showSpinner = function() {\n return spinnerEl.removeClass(\"hidden\");\n };\n hideSpinner = function() {\n return spinnerEl.addClass(\"hidden\");\n };\n resultTitleEl = $el.find(\".result-title\");\n loading_title = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_TITLE\");\n loading_msg = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_MESSAGE\");\n dump_ready_text = function() {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.DUMP_READY\"));\n };\n asyn_message = function() {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE\"));\n };\n syn_message = function(url) {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.SYNC_MESSAGE\", {\n url: url\n }));\n };\n setLoadingTitle = function() {\n return resultTitleEl.html(loading_title);\n };\n setAsyncTitle = function() {\n return resultTitleEl.html(loading_msg);\n };\n setSyncTitle = function() {\n return resultTitleEl.html(dump_ready_text);\n };\n resultMessageEl = $el.find(\".result-message \");\n setLoadingMessage = function() {\n return resultMessageEl.html(loading_msg);\n };\n setAsyncMessage = function() {\n return resultMessageEl.html(asyn_message);\n };\n setSyncMessage = function(url) {\n return resultMessageEl.html(syn_message(url));\n };\n showLoadingMode = function() {\n showSpinner();\n setLoadingTitle();\n setLoadingMessage();\n hideButtons();\n return showResult();\n };\n showExportResultAsyncMode = function() {\n hideSpinner();\n setAsyncTitle();\n return setAsyncMessage();\n };\n showExportResultSyncMode = function(url) {\n hideSpinner();\n setSyncTitle();\n return setSyncMessage(url);\n };\n showErrorMode = function() {\n hideSpinner();\n hideResult();\n return showButtons();\n };\n return $el.on(\"click\", \"a.button-export\", debounce(2000, (function(_this) {\n return function(event) {\n var onError, onSuccess;\n event.preventDefault();\n onSuccess = function(result) {\n var dumpUrl;\n $analytics.trackEvent(\"exporter\", \"export-project\", \"Exported project\", 1);\n if (result.status === 202) {\n return showExportResultAsyncMode();\n } else {\n dumpUrl = result.data.url;\n showExportResultSyncMode(dumpUrl);\n return $window.open(dumpUrl, \"_blank\");\n }\n };\n onError = function(result) {\n var errorMsg, ref;\n showErrorMode();\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\", {\n message: result.data._error_message\n });\n }\n return $confirm.notify(\"error\", errorMsg);\n };\n showLoadingMode();\n return $rs.projects[\"export\"]($scope.projectId).then(onSuccess, onError);\n };\n })(this)));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectExport\", [\"$window\", \"$tgResources\", \"$tgConfirm\", \"$translate\", \"$tgAnalytics\", ProjectExportDirective]);\n\n CsvExporterController = (function(superClass) {\n extend(CsvExporterController, superClass);\n\n CsvExporterController.$inject = [\"$scope\", \"$rootScope\", \"$tgUrls\", \"$tgConfirm\", \"$tgResources\", \"$translate\"];\n\n function CsvExporterController(scope1, rootscope, urls, confirm, rs, translate) {\n this.scope = scope1;\n this.rootscope = rootscope;\n this.urls = urls;\n this.confirm = confirm;\n this.rs = rs;\n this.translate = translate;\n this._generateUuid = bind(this._generateUuid, this);\n this.setCsvUuid = bind(this.setCsvUuid, this);\n this.rootscope.$on(\"project:loaded\", this.setCsvUuid);\n this.scope.$watch(\"csvUuid\", (function(_this) {\n return function(value) {\n if (value) {\n return _this.scope.csvUrl = _this.urls.resolveAbsolute(_this.type + \"-csv\", value);\n } else {\n return _this.scope.csvUrl = \"\";\n }\n };\n })(this));\n }\n\n CsvExporterController.prototype.setCsvUuid = function() {\n return this.scope.csvUuid = this.scope.project[this.type + \"_csv_uuid\"];\n };\n\n CsvExporterController.prototype._generateUuid = function(response) {\n var promise;\n if (response == null) {\n response = null;\n }\n promise = this.rs.projects[\"regenerate_\" + this.type + \"_csv_uuid\"](this.scope.projectId);\n promise.then((function(_this) {\n return function(data) {\n var ref;\n return _this.scope.csvUuid = (ref = data.data) != null ? ref.uuid : void 0;\n };\n })(this));\n promise.then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n promise[\"finally\"](function() {\n if (response) {\n return response.finish();\n }\n });\n return promise;\n };\n\n CsvExporterController.prototype.regenerateUuid = function() {\n var subtitle, title;\n if (this.scope.csvUuid) {\n title = this.translate.instant(\"ADMIN.REPORTS.REGENERATE_TITLE\");\n subtitle = this.translate.instant(\"ADMIN.REPORTS.REGENERATE_SUBTITLE\");\n return this.confirm.ask(title, subtitle).then(this._generateUuid);\n } else {\n return this._generateUuid();\n }\n };\n\n return CsvExporterController;\n\n })(taiga.Controller);\n\n CsvExporterEpicsController = (function(superClass) {\n extend(CsvExporterEpicsController, superClass);\n\n function CsvExporterEpicsController() {\n return CsvExporterEpicsController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterEpicsController.prototype.type = \"epics\";\n\n return CsvExporterEpicsController;\n\n })(CsvExporterController);\n\n CsvExporterUserstoriesController = (function(superClass) {\n extend(CsvExporterUserstoriesController, superClass);\n\n function CsvExporterUserstoriesController() {\n return CsvExporterUserstoriesController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterUserstoriesController.prototype.type = \"userstories\";\n\n return CsvExporterUserstoriesController;\n\n })(CsvExporterController);\n\n CsvExporterTasksController = (function(superClass) {\n extend(CsvExporterTasksController, superClass);\n\n function CsvExporterTasksController() {\n return CsvExporterTasksController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterTasksController.prototype.type = \"tasks\";\n\n return CsvExporterTasksController;\n\n })(CsvExporterController);\n\n CsvExporterIssuesController = (function(superClass) {\n extend(CsvExporterIssuesController, superClass);\n\n function CsvExporterIssuesController() {\n return CsvExporterIssuesController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterIssuesController.prototype.type = \"issues\";\n\n return CsvExporterIssuesController;\n\n })(CsvExporterController);\n\n module.controller(\"CsvExporterEpicsController\", CsvExporterEpicsController);\n\n module.controller(\"CsvExporterUserstoriesController\", CsvExporterUserstoriesController);\n\n module.controller(\"CsvExporterTasksController\", CsvExporterTasksController);\n\n module.controller(\"CsvExporterIssuesController\", CsvExporterIssuesController);\n\n CsvEpicDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_EPIC\";\n };\n return {\n controller: \"CsvExporterEpicsController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvEpic\", [\"$translate\", CsvEpicDirective]);\n\n CsvUsDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_US\";\n };\n return {\n controller: \"CsvExporterUserstoriesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvUs\", [\"$translate\", CsvUsDirective]);\n\n CsvTaskDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_TASK\";\n };\n return {\n controller: \"CsvExporterTasksController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvTask\", [\"$translate\", CsvTaskDirective]);\n\n CsvIssueDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_ISSUE\";\n };\n return {\n controller: \"CsvExporterIssuesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvIssue\", [\"$translate\", CsvIssueDirective]);\n\n ProjectLogoDirective = function($auth, $model, $rs, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var onError, onSuccess, showSizeInfo;\n showSizeInfo = function() {\n return $el.find(\".size-info\").addClass(\"active\");\n };\n onSuccess = function(response) {\n var project;\n project = $model.make_model(\"projects\", response.data);\n $scope.project = project;\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('success');\n };\n onError = function(response) {\n if (response.status === 413) {\n showSizeInfo();\n }\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('error', response.data._error_message);\n };\n $el.on(\"click\", \".js-change-logo\", function() {\n return $el.find(\"#logo-field\").click();\n });\n $el.on(\"change\", \"#logo-field\", function(event) {\n if ($scope.logoAttachment) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.projects.changeLogo($scope.project.id, $scope.logoAttachment).then(onSuccess, onError);\n }\n });\n $el.on(\"click\", \"a.js-use-default-logo\", function(event) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.projects.removeLogo($scope.project.id).then(onSuccess, onError);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectLogo\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", ProjectLogoDirective]);\n\n ProjectLogoModelDirective = function($parse) {\n var link;\n link = function($scope, $el, $attrs) {\n var model, modelSetter;\n model = $parse($attrs.tgProjectLogoModel);\n modelSetter = model.assign;\n return $el.bind('change', function() {\n return $scope.$apply(function() {\n return modelSetter($scope, $el[0].files[0]);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive('tgProjectLogoModel', ['$parse', ProjectLogoModelDirective]);\n\n AdminProjectRestrictionsDirective = function() {\n return {\n scope: {\n \"project\": \"=\"\n },\n templateUrl: \"admin/admin-project-restrictions.html\"\n };\n };\n\n module.directive('tgAdminProjectRestrictions', [AdminProjectRestrictionsDirective]);\n\n AdminProjectRequestOwnershipDirective = function(lightboxFactory) {\n return {\n link: function(scope) {\n return scope.requestOwnership = function() {\n return lightboxFactory.create(\"tg-lb-request-ownership\", {\n \"class\": \"lightbox lightbox-request-ownership\"\n }, {\n projectId: scope.projectId\n });\n };\n },\n scope: {\n \"projectId\": \"=\",\n \"owner\": \"=\"\n },\n templateUrl: \"admin/admin-project-request-ownership.html\"\n };\n };\n\n module.directive('tgAdminProjectRequestOwnership', [\"tgLightboxFactory\", AdminProjectRequestOwnershipDirective]);\n\n AdminProjectChangeOwnerDirective = function(lightboxFactory) {\n return {\n link: function(scope) {\n return scope.changeOwner = function() {\n return lightboxFactory.create(\"tg-lb-change-owner\", {\n \"class\": \"lightbox lightbox-select-user\",\n \"project-id\": \"projectId\",\n \"active-users\": \"activeUsers\",\n \"current-owner-id\": \"currentOwnerId\"\n }, {\n projectId: scope.projectId,\n activeUsers: scope.activeUsers,\n currentOwnerId: scope.owner.id,\n members: scope.members\n });\n };\n },\n scope: {\n \"activeUsers\": \"=\",\n \"projectId\": \"=\",\n \"owner\": \"=\",\n \"members\": \"=\"\n },\n templateUrl: \"admin/admin-project-change-owner.html\"\n };\n };\n\n module.directive('tgAdminProjectChangeOwner', [\"tgLightboxFactory\", AdminProjectChangeOwnerDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/project-profile.coffee\n */\n\n(function() {\n var ColorSelectionDirective, DATE_TYPE, MULTILINE_TYPE, ProjectCustomAttributesController, ProjectCustomAttributesDirective, ProjectTagsController, ProjectTagsDirective, ProjectValuesController, ProjectValuesDirective, ProjectValuesSectionController, RICHTEXT_TYPE, TEXT_TYPE, TYPE_CHOICES, URL_TYPE, bindOnce, debounce, getDefaulColorList, groupBy, joinStr, mixOf, module, taiga, toString, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n getDefaulColorList = this.taiga.getDefaulColorList;\n\n module = angular.module(\"taigaAdmin\");\n\n ProjectValuesSectionController = (function(superClass) {\n extend(ProjectValuesSectionController, superClass);\n\n ProjectValuesSectionController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function ProjectValuesSectionController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate, errorHandlingService, projectService1) {\n var description, sectionName, title;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.scope.project = {};\n this.loadInitialData();\n sectionName = this.translate.instant(this.scope.sectionName);\n title = this.translate.instant(\"ADMIN.PROJECT_VALUES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": this.scope.project.name\n });\n description = this.scope.project.description;\n this.appMetaService.setAll(title, description);\n }\n\n ProjectValuesSectionController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n ProjectValuesSectionController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise;\n };\n\n return ProjectValuesSectionController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectValuesSectionController\", ProjectValuesSectionController);\n\n ProjectValuesController = (function(superClass) {\n extend(ProjectValuesController, superClass);\n\n ProjectValuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\"];\n\n function ProjectValuesController(scope, rootscope, repo, confirm, rs) {\n var unwatch;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.moveValue = bind(this.moveValue, this);\n this.loadValues = bind(this.loadValues, this);\n this.scope.$on(\"admin:project-values:move\", this.moveValue);\n unwatch = this.scope.$watch(\"resource\", (function(_this) {\n return function(resource) {\n if (resource) {\n _this.loadValues();\n return unwatch();\n }\n };\n })(this));\n }\n\n ProjectValuesController.prototype.loadValues = function() {\n return this.rs[this.scope.resource].listValues(this.scope.projectId, this.scope.type).then((function(_this) {\n return function(values) {\n _this.scope.values = values;\n _this.scope.maxValueOrder = _.maxBy(values, \"order\").order;\n return values;\n };\n })(this));\n };\n\n ProjectValuesController.prototype.moveValue = function(ctx, itemValue, itemIndex) {\n var r, values;\n values = this.scope.values;\n r = values.indexOf(itemValue);\n values.splice(r, 1);\n values.splice(itemIndex, 0, itemValue);\n _.each(values, function(value, index) {\n return value.order = index;\n });\n return this.repo.saveAll(values);\n };\n\n return ProjectValuesController;\n\n })(taiga.Controller);\n\n module.controller(\"ProjectValuesController\", ProjectValuesController);\n\n ProjectValuesDirective = function($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope, projectService) {\n var link, linkDragAndDrop, linkValue;\n linkDragAndDrop = function($scope, $el, $attrs) {\n var drake, itemEl, newParentScope, oldParentScope, scroll, tdom;\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el.find(\".sortable\");\n drake = dragula([tdom[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: tdom[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex, itemValue;\n itemEl = $(item);\n itemValue = itemEl.scope().value;\n itemIndex = itemEl.index();\n return $scope.$broadcast(\"admin:project-values:move\", itemValue, itemIndex);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n };\n linkValue = function($scope, $el, $attrs) {\n var $ctrl, cancel, goToBottomList, initializeNewValue, initializeTextTranslations, objName, saveNewValue, saveValue, valueType;\n $ctrl = $el.controller();\n valueType = $attrs.type;\n objName = $attrs.objname;\n initializeNewValue = function() {\n return $scope.newValue = {\n \"name\": \"\",\n \"is_closed\": false,\n \"is_archived\": false\n };\n };\n initializeTextTranslations = function() {\n return $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_\" + (objName.toUpperCase()) + \".ACTION_ADD\");\n };\n initializeNewValue();\n initializeTextTranslations();\n $rootscope.$on(\"$translateChangeEnd\", function() {\n return $scope.$evalAsync(initializeTextTranslations);\n });\n goToBottomList = (function(_this) {\n return function(focus) {\n var table;\n if (focus == null) {\n focus = false;\n }\n table = $el.find(\".table-main\");\n $(document.body).scrollTop(table.offset().top + table.height());\n if (focus) {\n return $el.find(\".new-value input:visible\").first().focus();\n }\n };\n })(this);\n saveValue = function(target) {\n var form, formEl, promise, value;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n value = formEl.scope().value;\n promise = $repo.save(value);\n promise.then((function(_this) {\n return function() {\n var row;\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n row.siblings(\".visualization\").removeClass('hidden');\n return projectService.fetchProject();\n };\n })(this));\n return promise.then(null, function(data) {\n return form.setErrors(data);\n });\n };\n saveNewValue = function(target) {\n var form, formEl, promise;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.newValue.project = $scope.project.id;\n $scope.newValue.order = $scope.maxValueOrder ? $scope.maxValueOrder + 1 : 1;\n promise = $repo.create(valueType, $scope.newValue);\n promise.then((function(_this) {\n return function(data) {\n target.addClass(\"hidden\");\n $scope.values.push(data);\n $scope.maxValueOrder = data.order;\n return initializeNewValue();\n };\n })(this));\n return promise.then(null, function(data) {\n return form.setErrors(data);\n });\n };\n cancel = function(target) {\n var formEl, row, value;\n row = target.parents(\".row.table-main\");\n formEl = target.parents(\"form\");\n value = formEl.scope().value;\n return $scope.$apply(function() {\n row.addClass(\"hidden\");\n value.revert();\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n };\n $el.on(\"click\", \".show-add-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").removeClass('hidden');\n return goToBottomList(true);\n });\n $el.on(\"click\", \".add-new\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n }));\n $el.on(\"click\", \".delete-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n });\n $el.on(\"click\", \".edit-value\", function(event) {\n var editionRow, row, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n editionRow = row.siblings(\".edition\");\n editionRow.removeClass('hidden');\n return editionRow.find('input:visible').first().focus().select();\n });\n $el.on(\"keyup\", \".new-value input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n } else if (event.keyCode === 27) {\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return saveValue(target);\n });\n $el.on(\"click\", \".cancel\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return cancel(target);\n });\n return $el.on(\"click\", \".delete-value\", function(event) {\n var choices, formEl, subtitle, target, text, title, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.parents(\"form\");\n value = formEl.scope().value;\n choices = {};\n _.each($scope.values, function(option) {\n if (value.id !== option.id) {\n return choices[option.id] = option.name;\n }\n });\n subtitle = value.name;\n if (_.keys(choices).length === 0) {\n return $confirm.error($translate.instant(\"ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL\"));\n }\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE\");\n text = $translate.instant(\"ADMIN.PROJECT_VALUES.REPLACEMENT\");\n return $confirm.askChoice(title, subtitle, choices, text).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadValues()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $repo.remove(value, {\n \"moveTo\": response.selected\n }).then(onSucces, onError);\n });\n });\n };\n link = function($scope, $el, $attrs) {\n linkDragAndDrop($scope, $el, $attrs);\n linkValue($scope, $el, $attrs);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectValues\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", \"tgProjectService\", ProjectValuesDirective]);\n\n ColorSelectionDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var $ctrl;\n $scope.colorList = getDefaulColorList();\n $scope.allowEmpty = false;\n if ($attrs.tgAllowEmpty) {\n $scope.allowEmpty = true;\n }\n $ctrl = $el.controller();\n $scope.$watch($attrs.ngModel, function(element) {\n return $scope.color = element.color;\n });\n $el.on(\"click\", \".current-color\", function(event) {\n var body, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n $(\".select-color\").hide();\n target.siblings(\".select-color\").show();\n body = angular.element(\"body\");\n return body.on(\"click\", (function(_this) {\n return function(event) {\n if (angular.element(event.target).parent(\".select-color\").length === 0) {\n $el.find(\".select-color\").hide();\n return body.unbind(\"click\");\n }\n };\n })(this));\n });\n $el.on(\"click\", \".select-color .color\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n $scope.$apply(function() {\n return $model.$modelValue.color = target.data(\"color\");\n });\n return $el.find(\".select-color\").hide();\n });\n $el.on(\"click\", \".select-color .selected-color\", function(event) {\n event.preventDefault();\n $scope.$apply(function() {\n return $model.$modelValue.color = $scope.color;\n });\n return $el.find(\".select-color\").hide();\n });\n $el.on(\"keyup\", \"input\", function(event) {\n event.stopPropagation();\n if (event.keyCode === 13) {\n $scope.$apply(function() {\n return $model.$modelValue.color = $scope.color;\n });\n return $el.find(\".select-color\").hide();\n } else if (event.keyCode === 27) {\n return $el.find(\".select-color\").hide();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgColorSelection\", ColorSelectionDirective);\n\n TEXT_TYPE = \"text\";\n\n MULTILINE_TYPE = \"multiline\";\n\n RICHTEXT_TYPE = \"richtext\";\n\n DATE_TYPE = \"date\";\n\n URL_TYPE = \"url\";\n\n TYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n }, {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n }, {\n key: RICHTEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }, {\n key: URL_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL\"\n }\n ];\n\n ProjectCustomAttributesController = (function(superClass) {\n extend(ProjectCustomAttributesController, superClass);\n\n ProjectCustomAttributesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function ProjectCustomAttributesController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, translate, projectService1) {\n var description, sectionName, title;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService1;\n this.moveCustomAttributes = bind(this.moveCustomAttributes, this);\n this.deleteCustomAttribute = bind(this.deleteCustomAttribute, this);\n this.saveCustomAttribute = bind(this.saveCustomAttribute, this);\n this.createCustomAttribute = bind(this.createCustomAttribute, this);\n this.loadCustomAttributes = bind(this.loadCustomAttributes, this);\n this.scope.TYPE_CHOICES = TYPE_CHOICES;\n this.scope.project = this.projectService.project.toJS();\n this.scope.projectId = this.scope.project.id;\n sectionName = this.translate.instant(this.scope.sectionName);\n title = this.translate.instant(\"ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": this.scope.project.name\n });\n description = this.scope.project.description;\n this.appMetaService.setAll(title, description);\n this.scope.init = (function(_this) {\n return function(type) {\n _this.scope.type = type;\n return _this.loadCustomAttributes();\n };\n })(this);\n }\n\n ProjectCustomAttributesController.prototype.loadCustomAttributes = function() {\n return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then((function(_this) {\n return function(customAttributes) {\n var ref;\n _this.scope.customAttributes = customAttributes;\n _this.scope.maxOrder = (ref = _.maxBy(customAttributes, \"order\")) != null ? ref.order : void 0;\n return customAttributes;\n };\n })(this));\n };\n\n ProjectCustomAttributesController.prototype.createCustomAttribute = function(attrValues) {\n return this.repo.create(\"custom-attributes/\" + this.scope.type, attrValues);\n };\n\n ProjectCustomAttributesController.prototype.saveCustomAttribute = function(attrModel) {\n return this.repo.save(attrModel);\n };\n\n ProjectCustomAttributesController.prototype.deleteCustomAttribute = function(attrModel) {\n return this.repo.remove(attrModel);\n };\n\n ProjectCustomAttributesController.prototype.moveCustomAttributes = function(attrModel, newIndex) {\n var customAttributes, r;\n customAttributes = this.scope.customAttributes;\n r = customAttributes.indexOf(attrModel);\n customAttributes.splice(r, 1);\n customAttributes.splice(newIndex, 0, attrModel);\n _.each(customAttributes, function(val, idx) {\n return val.order = idx;\n });\n return this.repo.saveAll(customAttributes);\n };\n\n return ProjectCustomAttributesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectCustomAttributesController\", ProjectCustomAttributesController);\n\n ProjectCustomAttributesDirective = function($log, $confirm, animationFrame, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, cancelCreate, cancelUpdate, create, deleteCustomAttribute, drake, hideAddButton, hideCancelButton, hideCreateForm, hideEditForm, resetNewAttr, revertChangesInCustomAttribute, showAddButton, showCancelButton, showCreateForm, showEditForm, sortableEl, update;\n $ctrl = $el.controller();\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n sortableEl = $el.find(\".js-sortable\");\n drake = dragula([sortableEl[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: sortableEl[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var itemAttr, itemEl, itemIndex;\n itemEl = $(item);\n itemAttr = itemEl.scope().attr;\n itemIndex = itemEl.index();\n return $ctrl.moveCustomAttributes(itemAttr, itemIndex);\n });\n showCreateForm = function() {\n $el.find(\".js-new-custom-field\").removeClass(\"hidden\");\n return $el.find(\".js-new-custom-field input:visible\").first().focus();\n };\n hideCreateForm = function() {\n return $el.find(\".js-new-custom-field\").addClass(\"hidden\");\n };\n showAddButton = function() {\n return $el.find(\".js-add-custom-field-button\").removeClass(\"hidden\");\n };\n hideAddButton = function() {\n return $el.find(\".js-add-custom-field-button\").addClass(\"hidden\");\n };\n showCancelButton = function() {\n return $el.find(\".js-cancel-new-custom-field-button\").removeClass(\"hidden\");\n };\n hideCancelButton = function() {\n return $el.find(\".js-cancel-new-custom-field-button\").addClass(\"hidden\");\n };\n resetNewAttr = function() {\n return $scope.newAttr = {};\n };\n create = function(formEl) {\n var attr, form, onError, onSucces;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n onSucces = (function(_this) {\n return function() {\n $ctrl.loadCustomAttributes();\n hideCreateForm();\n resetNewAttr();\n return $confirm.notify(\"success\");\n };\n })(this);\n onError = (function(_this) {\n return function(data) {\n return form.setErrors(data);\n };\n })(this);\n attr = $scope.newAttr;\n attr.project = $scope.projectId;\n attr.order = $scope.maxOrder ? $scope.maxOrder + 1 : 1;\n return $ctrl.createCustomAttribute(attr).then(onSucces, onError);\n };\n cancelCreate = function() {\n hideCreateForm();\n return resetNewAttr();\n };\n $scope.$watch(\"customAttributes\", function(customAttributes) {\n if (!customAttributes) {\n return;\n }\n if (customAttributes.length === 0) {\n hideCancelButton();\n hideAddButton();\n return showCreateForm();\n } else {\n hideCreateForm();\n showAddButton();\n return showCancelButton();\n }\n });\n $el.on(\"click\", \".js-add-custom-field-button\", function(event) {\n event.preventDefault();\n return showCreateForm();\n });\n $el.on(\"click\", \".js-create-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return create(formEl);\n }));\n $el.on(\"click\", \".js-cancel-new-custom-field-button\", function(event) {\n event.preventDefault();\n return cancelCreate();\n });\n $el.on(\"keyup\", \".js-new-custom-field input\", function(event) {\n var formEl, target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return create(formEl);\n } else if (event.keyCode === 27) {\n return cancelCreate();\n }\n });\n showEditForm = function(formEl) {\n formEl.find(\".js-view-custom-field\").addClass(\"hidden\");\n formEl.find(\".js-edit-custom-field\").removeClass(\"hidden\");\n return formEl.find(\".js-edit-custom-field input:visible\").first().focus().select();\n };\n hideEditForm = function(formEl) {\n formEl.find(\".js-edit-custom-field\").addClass(\"hidden\");\n return formEl.find(\".js-view-custom-field\").removeClass(\"hidden\");\n };\n revertChangesInCustomAttribute = function(formEl) {\n return $scope.$apply(function() {\n return formEl.scope().attr.revert();\n });\n };\n update = function(formEl) {\n var attr, form, onError, onSucces;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n onSucces = (function(_this) {\n return function() {\n $ctrl.loadCustomAttributes();\n hideEditForm(formEl);\n return $confirm.notify(\"success\");\n };\n })(this);\n onError = (function(_this) {\n return function(data) {\n return form.setErrors(data);\n };\n })(this);\n attr = formEl.scope().attr;\n return $ctrl.saveCustomAttribute(attr).then(onSucces, onError);\n };\n cancelUpdate = function(formEl) {\n hideEditForm(formEl);\n return revertChangesInCustomAttribute(formEl);\n };\n $el.on(\"click\", \".js-edit-custom-field-button\", function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return showEditForm(formEl);\n });\n $el.on(\"click\", \".js-update-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return update(formEl);\n }));\n $el.on(\"click\", \".js-cancel-edit-custom-field-button\", function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return cancelUpdate(formEl);\n });\n $el.on(\"keyup\", \".js-edit-custom-field input\", function(event) {\n var formEl, target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return update(formEl);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return cancelUpdate(formEl);\n }\n });\n deleteCustomAttribute = function(formEl) {\n var attr, message, text, title;\n attr = formEl.scope().attr;\n message = attr.name;\n title = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.DELETE\");\n text = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE\");\n return $confirm.ask(title, text, message).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadCustomAttributes()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\", null, \"We have not been able to delete '\" + message + \"'.\");\n };\n return $ctrl.deleteCustomAttribute(attr).then(onSucces, onError);\n });\n };\n return $el.on(\"click\", \".js-delete-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return deleteCustomAttribute(formEl);\n }));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectCustomAttributes\", [\"$log\", \"$tgConfirm\", \"animationFrame\", \"$translate\", ProjectCustomAttributesDirective]);\n\n ProjectTagsController = (function(superClass) {\n extend(ProjectTagsController, superClass);\n\n ProjectTagsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$tgModel\", \"tgProjectService\"];\n\n function ProjectTagsController(scope, rootscope, repo, confirm, rs, model, projectService1) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.model = model;\n this.projectService = projectService1;\n this.mixingClass = bind(this.mixingClass, this);\n this.cancelMixingTags = bind(this.cancelMixingTags, this);\n this.confirmMixingTags = bind(this.confirmMixingTags, this);\n this.toggleMixingFromTags = bind(this.toggleMixingFromTags, this);\n this.startMixingTags = bind(this.startMixingTags, this);\n this.deleteTag = bind(this.deleteTag, this);\n this.editTag = bind(this.editTag, this);\n this.createTag = bind(this.createTag, this);\n this.filterAndSortTags = bind(this.filterAndSortTags, this);\n this.loadTags = bind(this.loadTags, this);\n this.loading = true;\n this.loadTags();\n }\n\n ProjectTagsController.prototype.loadTags = function() {\n var project;\n project = this.projectService.project.toJS();\n return this.rs.projects.tagsColors(project.id).then((function(_this) {\n return function(tags) {\n _this.scope.projectTagsAll = _.map(tags.getAttrs(), function(color, name) {\n return _this.model.make_model('tag', {\n name: name,\n color: color\n });\n });\n _this.filterAndSortTags();\n return _this.loading = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.filterAndSortTags = function() {\n this.scope.projectTags = _.sortBy(this.scope.projectTagsAll, function(it) {\n return it.name.toLowerCase();\n });\n return this.scope.projectTags = _.filter(this.scope.projectTags, (function(_this) {\n return function(tag) {\n return tag.name.indexOf(_this.scope.tagsFilter.name) !== -1;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.createTag = function(tag, color) {\n return this.rs.projects.createTag(this.scope.projectId, tag, color);\n };\n\n ProjectTagsController.prototype.editTag = function(from_tag, to_tag, color) {\n if (from_tag === to_tag) {\n to_tag = null;\n }\n return this.rs.projects.editTag(this.scope.projectId, from_tag, to_tag, color);\n };\n\n ProjectTagsController.prototype.deleteTag = function(tag) {\n this.scope.loadingDelete = true;\n return this.rs.projects.deleteTag(this.scope.projectId, tag)[\"finally\"]((function(_this) {\n return function() {\n return _this.scope.loadingDelete = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.startMixingTags = function(tag) {\n return this.scope.mixingTags.toTag = tag.name;\n };\n\n ProjectTagsController.prototype.toggleMixingFromTags = function(tag) {\n var index;\n if (tag.name !== this.scope.mixingTags.toTag) {\n index = this.scope.mixingTags.fromTags.indexOf(tag.name);\n if (index === -1) {\n return this.scope.mixingTags.fromTags.push(tag.name);\n } else {\n return this.scope.mixingTags.fromTags.splice(index, 1);\n }\n }\n };\n\n ProjectTagsController.prototype.confirmMixingTags = function() {\n var fromTags, toTag;\n toTag = this.scope.mixingTags.toTag;\n fromTags = this.scope.mixingTags.fromTags;\n this.scope.loadingMixing = true;\n return this.rs.projects.mixTags(this.scope.projectId, toTag, fromTags).then((function(_this) {\n return function() {\n _this.cancelMixingTags();\n return _this.loadTags();\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.scope.loadingMixing = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.cancelMixingTags = function() {\n this.scope.mixingTags.toTag = null;\n return this.scope.mixingTags.fromTags = [];\n };\n\n ProjectTagsController.prototype.mixingClass = function(tag) {\n if (this.scope.mixingTags.toTag !== null) {\n if (tag.name === this.scope.mixingTags.toTag) {\n return \"mixing-tags-to\";\n } else if (this.scope.mixingTags.fromTags.indexOf(tag.name) !== -1) {\n return \"mixing-tags-from\";\n }\n }\n };\n\n return ProjectTagsController;\n\n })(taiga.Controller);\n\n module.controller(\"ProjectTagsController\", ProjectTagsController);\n\n ProjectTagsDirective = function($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, $window, cancel, goToBottomList, initializeMixingTags, initializeNewValue, initializeTagsFilter, initializeTextTranslations, objName, saveNewValue, saveValue, valueType;\n $window = $(window);\n $ctrl = $el.controller();\n valueType = $attrs.type;\n objName = $attrs.objname;\n initializeNewValue = function() {\n return $scope.newValue = {\n \"tag\": \"\",\n \"color\": \"\"\n };\n };\n initializeTagsFilter = function() {\n return $scope.tagsFilter = {\n \"name\": \"\"\n };\n };\n initializeMixingTags = function() {\n return $scope.mixingTags = {\n \"toTag\": null,\n \"fromTags\": []\n };\n };\n initializeTextTranslations = function() {\n return $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_TAGS.ACTION_ADD\");\n };\n initializeNewValue();\n initializeTagsFilter();\n initializeMixingTags();\n initializeTextTranslations();\n $rootscope.$on(\"$translateChangeEnd\", function() {\n return $scope.$evalAsync(initializeTextTranslations);\n });\n goToBottomList = (function(_this) {\n return function(focus) {\n var table;\n if (focus == null) {\n focus = false;\n }\n table = $el.find(\".table-main\");\n $(document.body).scrollTop(table.offset().top + table.height());\n if (focus) {\n return $el.find(\".new-value input:visible\").first().focus();\n }\n };\n })(this);\n saveValue = (function(_this) {\n return function(target) {\n var form, formEl, originalTag, promise, tag;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n tag = formEl.scope().tag;\n originalTag = tag.clone();\n originalTag.revert();\n $scope.loadingEdit = true;\n promise = $ctrl.editTag(originalTag.name, tag.name, tag.color);\n promise.then(function() {\n return $ctrl.loadTags().then(function() {\n var row;\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n $scope.loadingEdit = false;\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n });\n return promise.then(null, function(response) {\n $scope.loadingEdit = false;\n return form.setErrors(response.data);\n });\n };\n })(this);\n saveNewValue = (function(_this) {\n return function(target) {\n var form, formEl, promise;\n formEl = target.parents(\"form\");\n formEl = target;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.loadingCreate = true;\n promise = $ctrl.createTag($scope.newValue.tag, $scope.newValue.color);\n promise.then(function(data) {\n return $ctrl.loadTags().then(function() {\n $scope.loadingCreate = false;\n target.addClass(\"hidden\");\n return initializeNewValue();\n });\n });\n return promise.then(null, function(response) {\n $scope.loadingCreate = false;\n return form.setErrors(response.data);\n });\n };\n })(this);\n cancel = function(target) {\n var formEl, row, tag;\n row = target.parents(\".row.table-main\");\n formEl = target.parents(\"form\");\n tag = formEl.scope().tag;\n return $scope.$apply(function() {\n row.addClass(\"hidden\");\n tag.revert();\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n };\n $scope.$watch(\"tagsFilter.name\", function(tagsFilter) {\n return $ctrl.filterAndSortTags();\n });\n $window.on(\"keyup\", function(event) {\n if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return initializeMixingTags();\n });\n }\n });\n $el.on(\"click\", \".show-add-new\", function(event) {\n event.preventDefault();\n return $el.find(\".new-value\").removeClass('hidden');\n });\n $el.on(\"click\", \".add-new\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n }));\n $el.on(\"click\", \".delete-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n });\n $el.on(\"click\", \".mix-tags\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n return $ctrl.startMixingTags(target.parents('form').scope().tag);\n });\n });\n $el.on(\"click\", \".mixing-row\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n return $ctrl.toggleMixingFromTags(target.parents('form').scope().tag);\n });\n });\n $el.on(\"click\", \".mixing-confirm\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $scope.$apply(function() {\n return $ctrl.confirmMixingTags();\n });\n });\n $el.on(\"click\", \".mixing-cancel\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $scope.$apply(function() {\n return $ctrl.cancelMixingTags();\n });\n });\n $el.on(\"click\", \".edit-value\", function(event) {\n var editionRow, row, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n editionRow = row.siblings(\".edition\");\n editionRow.removeClass('hidden');\n return editionRow.find('input:visible').first().focus().select();\n });\n $el.on(\"keyup\", \".new-value input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n } else if (event.keyCode === 27) {\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n }\n });\n $el.on(\"keyup\", \".status-name input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === 13) {\n return saveValue(target);\n } else if (event.keyCode === 27) {\n return cancel(target);\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return saveValue(target);\n });\n $el.on(\"click\", \".cancel\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return cancel(target);\n });\n $el.on(\"click\", \".delete-tag\", function(event) {\n var formEl, tag, target, title;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.parents(\"form\");\n tag = formEl.scope().tag;\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_TAG\");\n return $confirm.askOnDelete(title, tag.name).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadTags()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $ctrl.deleteTag(tag.name).then(onSucces, onError);\n });\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return $window.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectTags\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", ProjectTagsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/memberships.coffee\n */\n\n(function() {\n var EditRoleDirective, NewRoleDirective, RolePermissionsDirective, RolesController, RolesDirective, bindMethods, bindOnce, debounce, mixOf, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaAdmin\");\n\n RolesController = (function(superClass) {\n extend(RolesController, superClass);\n\n RolesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgModel\", \"tgAppMetaService\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function RolesController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, model, appMetaService, translate, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.model = model;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this._disableComputable = bind(this._disableComputable, this);\n this._enableComputable = bind(this._enableComputable, this);\n bindMethods(this);\n this.scope.sectionName = \"ADMIN.MENU.PERMISSIONS\";\n this.scope.project = {};\n this.scope.anyComputableRole = true;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.ROLES.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n RolesController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n project = this.model.make_model(\"projects\", project);\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.anyComputableRole = _.some(_.map(project.roles, function(point) {\n return point.computable;\n }));\n return project;\n };\n\n RolesController.prototype.loadRoles = function() {\n return this.rs.roles.list(this.scope.projectId).then((function(_this) {\n return function(roles) {\n var public_permission;\n roles = roles.map(function(role) {\n role.external_user = false;\n return role;\n });\n public_permission = {\n \"name\": _this.translate.instant(\"ADMIN.ROLES.EXTERNAL_USER\"),\n \"permissions\": _this.scope.project.public_permissions,\n \"external_user\": true\n };\n roles.push(public_permission);\n _this.scope.roles = roles;\n _this.scope.role = _this.scope.roles[0];\n return roles;\n };\n })(this));\n };\n\n RolesController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadRoles();\n };\n\n RolesController.prototype.forceLoadProject = function() {\n return this.projectService.fetchProject((function(_this) {\n return function() {\n return _this.loadProject();\n };\n })(this));\n };\n\n RolesController.prototype.setRole = function(role) {\n this.scope.role = role;\n return this.scope.$broadcast(\"role:changed\", this.scope.role);\n };\n\n RolesController.prototype[\"delete\"] = function() {\n var choices, i, len, ref, replacement, role, subtitle, title, warning;\n choices = {};\n ref = this.scope.roles;\n for (i = 0, len = ref.length; i < len; i++) {\n role = ref[i];\n if (role.id !== this.scope.role.id) {\n choices[role.id] = role.name;\n }\n }\n if (_.keys(choices).length === 0) {\n return this.confirm.error(this.translate.instant(\"ADMIN.ROLES.ERROR_DELETE_ALL\"));\n }\n title = this.translate.instant(\"ADMIN.ROLES.TITLE_DELETE_ROLE\");\n subtitle = this.scope.role.name;\n replacement = this.translate.instant(\"ADMIN.ROLES.REPLACEMENT_ROLE\");\n warning = this.translate.instant(\"ADMIN.ROLES.WARNING_DELETE_ROLE\");\n return this.confirm.askChoice(title, subtitle, choices, replacement, warning).then((function(_this) {\n return function(response) {\n var onError, onSuccess;\n onSuccess = function() {\n _this.forceLoadProject();\n return _this.loadRoles()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return _this.confirm.notify('error');\n };\n return _this.repo.remove(_this.scope.role, {\n moveTo: response.selected\n }).then(onSuccess, onError);\n };\n })(this));\n };\n\n RolesController.prototype._enableComputable = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.confirm.notify(\"success\");\n return _this.forceLoadProject();\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.scope.role.revert();\n };\n })(this);\n return this.repo.save(this.scope.role).then(onSuccess, onError);\n };\n\n RolesController.prototype._disableComputable = function() {\n var askOnError, askOnSuccess, subtitle, title;\n askOnSuccess = (function(_this) {\n return function(response) {\n var onError, onSuccess;\n onSuccess = function() {\n response.finish();\n _this.confirm.notify(\"success\");\n return _this.forceLoadProject();\n };\n onError = function() {\n response.finish();\n _this.confirm.notify(\"error\");\n return _this.scope.role.revert();\n };\n return _this.repo.save(_this.scope.role).then(onSuccess, onError);\n };\n })(this);\n askOnError = (function(_this) {\n return function(response) {\n return _this.scope.role.revert();\n };\n })(this);\n title = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_TITLE\");\n subtitle = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_SUBTITLE\", {\n roleName: this.scope.role.name\n });\n return this.confirm.ask(title, subtitle, \"\").then(askOnSuccess, askOnError);\n };\n\n RolesController.prototype.toggleComputable = debounce(2000, function() {\n if (!this.scope.role.computable) {\n return this._disableComputable();\n } else {\n return this._enableComputable();\n }\n });\n\n return RolesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"RolesController\", RolesController);\n\n EditRoleDirective = function($repo, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit, toggleView;\n toggleView = function() {\n $el.find('.total').toggle();\n return $el.find('.edit-role').toggle();\n };\n submit = function() {\n var promise;\n $scope.role.name = $el.find(\"input\").val();\n promise = $repo.save($scope.role);\n promise.then(function() {\n return $confirm.notify(\"success\");\n });\n promise.then(null, function(data) {\n return $confirm.notify(\"error\");\n });\n return toggleView();\n };\n $el.on(\"click\", \".edit-value\", function() {\n toggleView();\n $el.find(\"input\").focus();\n return $el.find(\"input\").val($scope.role.name);\n });\n $el.on(\"click\", \"a.save\", submit);\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return submit();\n } else if (event.keyCode === 27) {\n return toggleView();\n }\n });\n $scope.$on(\"role:changed\", function() {\n if ($el.find('.edit-role').is(\":visible\")) {\n return toggleView();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgEditRole\", [\"$tgRepo\", \"$tgConfirm\", EditRoleDirective]);\n\n RolesDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRoles\", RolesDirective);\n\n NewRoleDirective = function($tgrepo, $confirm) {\n var DEFAULT_PERMISSIONS, link;\n DEFAULT_PERMISSIONS = [\"view_project\", \"view_milestones\", \"view_us\", \"view_tasks\", \"view_issues\"];\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $el.on(\"click\", \"a.add-button\", function(event) {\n event.preventDefault();\n $el.find(\".new\").removeClass(\"hidden\");\n $el.find(\".new\").focus();\n return $el.find(\".add-button\").hide();\n });\n return $el.on(\"keyup\", \".new\", function(event) {\n var newRole, onError, onSuccess, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newRole = {\n project: $scope.projectId,\n name: target.val(),\n permissions: DEFAULT_PERMISSIONS,\n order: _.maxBy($scope.roles, function(r) {\n return r.order;\n }).order + 1,\n computable: false\n };\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new\").val('');\n onSuccess = function(role) {\n var insertPosition;\n insertPosition = $scope.roles.length - 1;\n $scope.roles.splice(insertPosition, 0, role);\n $ctrl.setRole(role);\n $el.find(\".add-button\").show();\n return $ctrl.forceLoadProject();\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $tgrepo.create(\"roles\", newRole).then(onSuccess, onError);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new\").val('');\n return $el.find(\".add-button\").show();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNewRole\", [\"$tgRepo\", \"$tgConfirm\", NewRoleDirective]);\n\n RolePermissionsDirective = function($rootscope, $repo, $confirm, $compile) {\n var baseTemplate, categoryTemplate, link, resumeTemplate;\n resumeTemplate = _.template(\"
    \\\">
    \\n
    \\n
    <%- category.activePermissions %>/<%- category.permissions.length %>
    \\n <% _.each(category.permissions, function(permission) { %>\\n
    active<% } %>\\\"\\n title=\\\"{{ '<%- permission.name %>' | translate }}\\\">
    \\n <% }) %>\\n
    \\n\");\n categoryTemplate = _.template(\"
    \\\">\\n
    \\n
    \\n
    \\n
    \\n <% _.each(category.permissions, function(permission) { %>\\n
    \\\">\\n \\\">\\n
    \\n disabled=\\\"disabled\\\" <% } %>\\n <% if(permission.active) { %> checked=\\\"checked\\\" <% } %>/>\\n
    \\n \\n \\n
    \\n
    \\n <% }) %>\\n
    \\n
    \\n
    \");\n baseTemplate = _.template(\"
    \");\n link = function($scope, $el, $attrs) {\n var $ctrl, generateCategoriesFromRole, renderCategory, renderPermissions, renderResume;\n $ctrl = $el.controller();\n generateCategoriesFromRole = function(role) {\n var categories, epicPermissions, isPermissionEditable, issuePermissions, milestonePermissions, setActivePermissions, setActivePermissionsPerCategory, taskPermissions, userStoryPermissions, wikiPermissions;\n setActivePermissions = function(permissions) {\n return _.map(permissions, function(x) {\n var ref;\n return _.extend({}, x, {\n active: (ref = x[\"key\"], indexOf.call(role.permissions, ref) >= 0)\n });\n });\n };\n isPermissionEditable = function(permission, role, project) {\n if (role.external_user && !project.is_private && permission.key.indexOf(\"view_\") === 0) {\n return false;\n } else {\n return true;\n }\n };\n setActivePermissionsPerCategory = function(category) {\n return _.map(category, function(cat) {\n cat.permissions = cat.permissions.map(function(permission) {\n permission.editable = isPermissionEditable(permission, role, $scope.project);\n return permission;\n });\n return _.extend({}, cat, {\n activePermissions: _.filter(cat[\"permissions\"], \"active\").length\n });\n });\n };\n categories = [];\n epicPermissions = [\n {\n key: \"view_epics\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.VIEW_EPICS\"\n }, {\n key: \"add_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.ADD_EPICS\"\n }, {\n key: \"modify_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.MODIFY_EPICS\"\n }, {\n key: \"comment_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.COMMENT_EPICS\"\n }, {\n key: \"delete_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.DELETE_EPICS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.NAME\",\n permissions: setActivePermissions(epicPermissions)\n });\n milestonePermissions = [\n {\n key: \"view_milestones\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS\"\n }, {\n key: \"add_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS\"\n }, {\n key: \"modify_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS\"\n }, {\n key: \"delete_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME\",\n permissions: setActivePermissions(milestonePermissions)\n });\n userStoryPermissions = [\n {\n key: \"view_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES\"\n }, {\n key: \"add_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES\"\n }, {\n key: \"modify_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES\"\n }, {\n key: \"comment_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.COMMENT_USER_STORIES\"\n }, {\n key: \"delete_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME\",\n permissions: setActivePermissions(userStoryPermissions)\n });\n taskPermissions = [\n {\n key: \"view_tasks\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS\"\n }, {\n key: \"add_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS\"\n }, {\n key: \"modify_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS\"\n }, {\n key: \"comment_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.COMMENT_TASKS\"\n }, {\n key: \"delete_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME\",\n permissions: setActivePermissions(taskPermissions)\n });\n issuePermissions = [\n {\n key: \"view_issues\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES\"\n }, {\n key: \"add_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES\"\n }, {\n key: \"modify_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES\"\n }, {\n key: \"comment_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.COMMENT_ISSUES\"\n }, {\n key: \"delete_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME\",\n permissions: setActivePermissions(issuePermissions)\n });\n wikiPermissions = [\n {\n key: \"view_wiki_pages\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES\"\n }, {\n key: \"add_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES\"\n }, {\n key: \"modify_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES\"\n }, {\n key: \"delete_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES\"\n }, {\n key: \"view_wiki_links\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS\"\n }, {\n key: \"add_wiki_link\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS\"\n }, {\n key: \"delete_wiki_link\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME\",\n permissions: setActivePermissions(wikiPermissions)\n });\n return setActivePermissionsPerCategory(categories);\n };\n renderResume = function(element, category) {\n return element.find(\".resume\").html($compile(resumeTemplate({\n category: category\n }))($scope));\n };\n renderCategory = function(category, index) {\n var html;\n html = categoryTemplate({\n category: category,\n index: index\n });\n html = angular.element(html);\n renderResume(html, category);\n return $compile(html)($scope);\n };\n renderPermissions = function() {\n var html;\n $el.off();\n html = baseTemplate();\n _.each(generateCategoriesFromRole($scope.role), function(category, index) {\n return html = angular.element(html).append(renderCategory(category, index));\n });\n $el.html(html);\n $el.on(\"click\", \".resume\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.toggleClass(\"open-drawer\");\n return target.next().toggleClass(\"open\");\n });\n return $el.on(\"change\", \".category-item input\", function(event) {\n var getActivePermissions, onError, onSuccess, target;\n getActivePermissions = function() {\n var activePermissions;\n activePermissions = _.filter($el.find(\".category-item input\"), function(t) {\n return angular.element(t).is(\":checked\");\n });\n activePermissions = _.sortBy(_.map(activePermissions, function(t) {\n var permission;\n return permission = angular.element(t).parents(\".category-item\").data(\"id\");\n }));\n if (activePermissions.length) {\n activePermissions.push(\"view_project\");\n }\n return activePermissions;\n };\n target = angular.element(event.currentTarget);\n $scope.role.permissions = getActivePermissions();\n onSuccess = function() {\n var categories, categoryId;\n categories = generateCategoriesFromRole($scope.role);\n categoryId = target.parents(\".category-config\").data(\"id\");\n renderResume(target.parents(\".category-config\"), categories[categoryId]);\n $rootscope.$broadcast(\"projects:reload\");\n $confirm.notify(\"success\");\n return $ctrl.forceLoadProject();\n };\n onError = function() {\n $confirm.notify(\"error\");\n target.prop(\"checked\", !target.prop(\"checked\"));\n return $scope.role.permissions = getActivePermissions();\n };\n if ($scope.role.external_user) {\n $scope.project.public_permissions = $scope.role.permissions;\n $scope.project.anon_permissions = $scope.role.permissions.filter(function(permission) {\n return permission.indexOf(\"view_\") === 0;\n });\n return $repo.save($scope.project).then(onSuccess, onError);\n } else {\n return $repo.save($scope.role).then(onSuccess, onError);\n }\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $scope.$on(\"role:changed\", function() {\n return renderPermissions();\n });\n return bindOnce($scope, $attrs.ngModel, renderPermissions);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRolePermissions\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\", RolePermissionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/third-parties.coffee\n */\n\n(function() {\n var BitbucketController, BitbucketWebhooksDirective, GithubController, GithubWebhooksDirective, GitlabController, GitlabWebhooksDirective, GogsController, GogsWebhooksDirective, NewWebhookDirective, SelectInputText, ValidOriginIpsDirective, WebhookDirective, WebhooksController, bindMethods, debounce, mixOf, module, taiga, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindMethods = this.taiga.bindMethods;\n\n debounce = this.taiga.debounce;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaAdmin\");\n\n WebhooksController = (function(superClass) {\n extend(WebhooksController, superClass);\n\n WebhooksController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WebhooksController(scope, repo, rs, params, location, navUrls, appMetaService, translate, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = \"ADMIN.WEBHOOKS.SECTION_NAME\";\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.WEBHOOKS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"webhooks:reload\", this.loadWebhooks);\n }\n\n WebhooksController.prototype.loadWebhooks = function() {\n return this.rs.webhooks.list(this.scope.projectId).then((function(_this) {\n return function(webhooks) {\n return _this.scope.webhooks = webhooks;\n };\n })(this));\n };\n\n WebhooksController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WebhooksController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadWebhooks();\n };\n\n return WebhooksController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"WebhooksController\", WebhooksController);\n\n WebhookDirective = function($rs, $repo, $confirm, $loading, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var cancel, openHistory, save, showEditMode, showVisualizationMode, updateLogs, updateShowHideHistoryText, webhook;\n webhook = $scope.$eval($attrs.tgWebhook);\n updateLogs = function() {\n var prettyDate;\n prettyDate = $translate.instant(\"ADMIN.WEBHOOKS.DATE\");\n return $rs.webhooklogs.list(webhook.id).then((function(_this) {\n return function(webhooklogs) {\n var i, len, log, ref;\n for (i = 0, len = webhooklogs.length; i < len; i++) {\n log = webhooklogs[i];\n log.validStatus = (200 <= (ref = log.status) && ref < 300);\n log.prettySentHeaders = _.map(_.toPairs(log.request_headers), function(arg) {\n var header, value;\n header = arg[0], value = arg[1];\n return header + \": \" + value;\n }).join(\"\\n\");\n log.prettySentData = JSON.stringify(log.request_data);\n log.prettyDate = moment(log.created).format(prettyDate);\n }\n webhook.logs_counter = webhooklogs.length;\n webhook.logs = webhooklogs;\n return updateShowHideHistoryText();\n };\n })(this));\n };\n updateShowHideHistoryText = function() {\n var historyElement, text, textElement, title;\n textElement = $el.find(\".toggle-history\");\n historyElement = textElement.parents(\".single-webhook-wrapper\").find(\".webhooks-history\");\n if (historyElement.hasClass(\"open\")) {\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY\");\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY_TITLE\");\n } else {\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY\");\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY_TITLE\");\n }\n textElement.text(text);\n return textElement.prop(\"title\", title);\n };\n showVisualizationMode = function() {\n $el.find(\".edition-mode\").addClass(\"hidden\");\n return $el.find(\".visualization-mode\").removeClass(\"hidden\");\n };\n showEditMode = function() {\n $el.find(\".visualization-mode\").addClass(\"hidden\");\n return $el.find(\".edition-mode\").removeClass(\"hidden\");\n };\n openHistory = function() {\n return $el.find(\".webhooks-history\").addClass(\"open\");\n };\n cancel = function() {\n showVisualizationMode();\n return $scope.$apply(function() {\n return webhook.revert();\n });\n };\n save = debounce(2000, function(target) {\n var form, promise;\n form = target.parents(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n promise = $repo.save(webhook);\n promise.then((function(_this) {\n return function() {\n return showVisualizationMode();\n };\n })(this));\n return promise.then(null, function(data) {\n $confirm.notify(\"error\");\n return form.setErrors(data);\n });\n });\n $el.on(\"click\", \".test-webhook\", function() {\n openHistory();\n return $rs.webhooks.test(webhook.id).then((function(_this) {\n return function() {\n return updateLogs();\n };\n })(this));\n });\n $el.on(\"click\", \".edit-webhook\", function() {\n return showEditMode();\n });\n $el.on(\"click\", \".cancel-existing\", function() {\n return cancel();\n });\n $el.on(\"click\", \".edit-existing\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return save(target);\n });\n $el.on(\"keyup\", \".edition-mode input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n return save(target);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n return cancel(target);\n }\n });\n $el.on(\"click\", \".delete-webhook\", function() {\n var message, title;\n title = $translate.instant(\"ADMIN.WEBHOOKS.DELETE\");\n message = $translate.instant(\"ADMIN.WEBHOOKS.WEBHOOK_NAME\", {\n name: webhook.name\n });\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSucces;\n onSucces = function() {\n askResponse.finish();\n return $scope.$emit(\"webhooks:reload\");\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove(webhook).then(onSucces, onError);\n };\n })(this));\n });\n $el.on(\"click\", \".toggle-history\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if ((webhook.logs == null) || webhook.logs.length === 0) {\n return updateLogs().then(function() {\n return timeout(0, function() {\n $el.find(\".webhooks-history\").toggleClass(\"open\").slideToggle();\n return updateShowHideHistoryText();\n });\n });\n } else {\n $el.find(\".webhooks-history\").toggleClass(\"open\").slideToggle();\n return $scope.$apply(function() {\n return updateShowHideHistoryText();\n });\n }\n });\n $el.on(\"click\", \".history-single\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n target.toggleClass(\"history-single-open\");\n return target.siblings(\".history-single-response\").toggleClass(\"open\");\n });\n return $el.on(\"click\", \".resend-request\", function(event) {\n var log, target;\n target = angular.element(event.currentTarget);\n log = target.data(\"log\");\n return $rs.webhooklogs.resend(log).then((function(_this) {\n return function() {\n return updateLogs();\n };\n })(this));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", WebhookDirective]);\n\n NewWebhookDirective = function($rs, $repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var addWebhookDOMNode, formDOMNode, initializeNewValue, save, webhook;\n webhook = $scope.$eval($attrs.tgWebhook);\n formDOMNode = $el.find(\".new-webhook-form\");\n addWebhookDOMNode = $el.find(\".add-webhook\");\n initializeNewValue = function() {\n return $scope.newValue = {\n \"name\": \"\",\n \"url\": \"\",\n \"key\": \"\"\n };\n };\n initializeNewValue();\n $scope.$watch(\"webhooks\", function(webhooks) {\n if (webhooks != null) {\n if (webhooks.length === 0) {\n formDOMNode.removeClass(\"hidden\");\n addWebhookDOMNode.addClass(\"hidden\");\n return formDOMNode.find(\"input\")[0].focus();\n } else {\n formDOMNode.addClass(\"hidden\");\n return addWebhookDOMNode.removeClass(\"hidden\");\n }\n }\n });\n save = debounce(2000, function() {\n var form, promise;\n form = formDOMNode.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.newValue.project = $scope.project.id;\n promise = $repo.create(\"webhooks\", $scope.newValue);\n promise.then((function(_this) {\n return function() {\n $analytics.trackEvent(\"webhooks\", \"create\", \"Create new webhook\", 1);\n $scope.$emit(\"webhooks:reload\");\n return initializeNewValue();\n };\n })(this));\n return promise.then(null, function(data) {\n $confirm.notify(\"error\");\n return form.setErrors(data);\n });\n });\n formDOMNode.on(\"click\", \".add-new\", function(event) {\n event.preventDefault();\n return save();\n });\n formDOMNode.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return save();\n }\n });\n formDOMNode.on(\"click\", \".cancel-new\", function(event) {\n return $scope.$apply(function() {\n initializeNewValue();\n if ($scope.webhooks.length >= 1) {\n return formDOMNode.addClass(\"hidden\");\n }\n });\n });\n return addWebhookDOMNode.on(\"click\", function(event) {\n formDOMNode.removeClass(\"hidden\");\n return formDOMNode.find(\"input\")[0].focus();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNewWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", NewWebhookDirective]);\n\n GithubController = (function(superClass) {\n extend(GithubController, superClass);\n\n GithubController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GithubController(scope, repo, rs, params, appMetaService, translate, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GITHUB.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GITHUB.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n GithubController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"github\").then((function(_this) {\n return function(github) {\n return _this.scope.github = github;\n };\n })(this));\n };\n\n GithubController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GithubController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return this.loadModules();\n };\n\n return GithubController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"GithubController\", GithubController);\n\n GitlabController = (function(superClass) {\n extend(GitlabController, superClass);\n\n GitlabController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GitlabController(scope, repo, rs, params, appMetaService, translate, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GITLAB.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GITLAB.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:modules:reload\", (function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n }\n\n GitlabController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"gitlab\").then((function(_this) {\n return function(gitlab) {\n return _this.scope.gitlab = gitlab;\n };\n })(this));\n };\n\n GitlabController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GitlabController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\n };\n\n return GitlabController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"GitlabController\", GitlabController);\n\n BitbucketController = (function(superClass) {\n extend(BitbucketController, superClass);\n\n BitbucketController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function BitbucketController(scope, repo, rs, params, appMetaService, translate, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.BITBUCKET.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.BITBUCKET.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:modules:reload\", (function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n }\n\n BitbucketController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"bitbucket\").then((function(_this) {\n return function(bitbucket) {\n return _this.scope.bitbucket = bitbucket;\n };\n })(this));\n };\n\n BitbucketController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n BitbucketController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\n };\n\n return BitbucketController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"BitbucketController\", BitbucketController);\n\n SelectInputText = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", \".select-input-content\", function() {\n $el.find(\"input\").select();\n return $el.find(\".help-copy\").addClass(\"visible\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSelectInputText\", SelectInputText);\n\n GithubWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.github, \"github\");\n promise.then(function() {\n $analytics.trackEvent(\"github-webhook\", \"created-or-changed\", \"Create or changed github webhook\", 1);\n currentLoading.finish();\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgGithubWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", GithubWebhooksDirective]);\n\n GitlabWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.gitlab, \"gitlab\");\n promise.then(function() {\n $analytics.trackEvent(\"gitlab-webhook\", \"created-or-changed\", \"Create or changed gitlab webhook\", 1);\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgGitlabWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", GitlabWebhooksDirective]);\n\n BitbucketWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.bitbucket, \"bitbucket\");\n promise.then(function() {\n $analytics.trackEvent(\"bitbucket-webhook\", \"created-or-changed\", \"Create or changed bitbucket webhook\", 1);\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBitbucketWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", BitbucketWebhooksDirective]);\n\n ValidOriginIpsDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $ngModel) {\n return $ngModel.$parsers.push(function(value) {\n value = $.trim(value);\n if (value === \"\") {\n return [];\n }\n return value.split(\",\");\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgValidOriginIps\", ValidOriginIpsDirective);\n\n GogsController = (function(superClass) {\n extend(GogsController, superClass);\n\n GogsController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GogsController(scope, repo, rs, params, appMetaService, translate, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GOGS.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GOGS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n GogsController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"gogs\").then((function(_this) {\n return function(gogs) {\n return _this.scope.gogs = gogs;\n };\n })(this));\n };\n\n GogsController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GogsController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\n };\n\n return GogsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n GogsWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.gogs, \"gogs\");\n promise.then(function() {\n $analytics.trackEvent(\"gogs-webhook\", \"create-or-change\", \"Create or change gogs webhook\", 1);\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $el.on(\"click\", \".submit-button\", submit);\n };\n return {\n link: link\n };\n };\n\n module.controller(\"GogsController\", GogsController);\n\n module.directive(\"tgGogsWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", GogsWebhooksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/attachments.coffee\n */\n\n(function() {\n var DeleteProjectDirective, bindOnce, debounce, module, taiga, timeout;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n timeout = this.taiga.timeout;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaProject\");\n\n DeleteProjectDirective = function($repo, $rootscope, $auth, $location, $navUrls, $confirm, lightboxService, tgLoader, currentUserService, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var projectToDelete, submit;\n projectToDelete = null;\n $scope.$on(\"deletelightbox:new\", function(ctx, project) {\n lightboxService.open($el);\n return projectToDelete = project;\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n submit = function() {\n var promise;\n tgLoader.start();\n lightboxService.close($el);\n promise = $repo.remove(projectToDelete);\n promise.then(function(data) {\n $analytics.trackEvent(\"projects\", \"delete\", \"Delete project\", 1);\n tgLoader.pageLoaded();\n $rootscope.$broadcast(\"projects:reload\");\n $location.path($navUrls.resolve(\"home\"));\n $confirm.notify(\"success\");\n return currentUserService.loadProjects();\n });\n return promise.then(null, function() {\n $confirm.notify(\"error\");\n return lightboxService.close($el);\n });\n };\n $el.on(\"click\", \".button-red\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return submit();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbDeleteProject\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfirm\", \"lightboxService\", \"tgLoader\", \"tgCurrentUserService\", \"$tgAnalytics\", DeleteProjectDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/bind.coffee\n */\n\n(function() {\n var BindHtmlDirective, BindOnceAltDirective, BindOnceBindDirective, BindOnceHrefDirective, BindOnceHtmlDirective, BindOnceRefDirective, BindOnceSrcDirective, BindOnceTitleDirective, BindTitleDirective, bindOnce, module;\n\n bindOnce = this.taiga.bindOnce;\n\n BindOnceBindDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoBind, function(val) {\n return $el.text(val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceHtmlDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoHtml, function(val) {\n return $el.html(val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceRefDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoRef, function(val) {\n return $el.html(\"#\" + val + \" \");\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceSrcDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoSrc, function(val) {\n return $el.attr(\"src\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceHrefDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoHref, function(val) {\n return $el.attr(\"href\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceAltDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoAlt, function(val) {\n return $el.attr(\"alt\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceTitleDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoTitle, function(val) {\n return $el.attr(\"title\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindTitleDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$watch($attrs.tgTitleHtml, function(val) {\n if (val != null) {\n return $el.attr(\"title\", val);\n }\n });\n };\n return {\n link: link\n };\n };\n\n BindHtmlDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$watch($attrs.tgBindHtml, function(val) {\n if (val != null) {\n return $el.html(val);\n }\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaBase\");\n\n module.directive(\"tgBoBind\", BindOnceBindDirective);\n\n module.directive(\"tgBoHtml\", BindOnceHtmlDirective);\n\n module.directive(\"tgBoRef\", BindOnceRefDirective);\n\n module.directive(\"tgBoSrc\", BindOnceSrcDirective);\n\n module.directive(\"tgBoHref\", BindOnceHrefDirective);\n\n module.directive(\"tgBoAlt\", BindOnceAltDirective);\n\n module.directive(\"tgBoTitle\", BindOnceTitleDirective);\n\n module.directive(\"tgBindTitle\", BindTitleDirective);\n\n module.directive(\"tgBindHtml\", BindHtmlDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/conf.coffee\n */\n\n(function() {\n var ConfigurationService, module;\n\n ConfigurationService = (function() {\n function ConfigurationService() {\n this.config = window.taigaConfig;\n }\n\n ConfigurationService.prototype.get = function(key, defaultValue) {\n if (defaultValue == null) {\n defaultValue = null;\n }\n if (_.has(this.config, key)) {\n return this.config[key];\n }\n return defaultValue;\n };\n\n return ConfigurationService;\n\n })();\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgConfig\", ConfigurationService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/contrib.coffee\n */\n\n(function() {\n var ContribController, ContribUserSettingsController, module,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n module = angular.module(\"taigaBase\");\n\n ContribController = (function(superClass) {\n extend(ContribController, superClass);\n\n ContribController.$inject = [\"$rootScope\", \"$scope\", \"$routeParams\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"tgProjectService\"];\n\n function ContribController(rootScope, scope, params, repo, rs, confirm, projectService) {\n this.rootScope = rootScope;\n this.scope = scope;\n this.params = params;\n this.repo = repo;\n this.rs = rs;\n this.confirm = confirm;\n this.projectService = projectService;\n this.scope.currentPlugin = _.head(_.filter(this.rootScope.adminPlugins, {\n \"slug\": this.params.plugin\n }));\n this.scope.projectSlug = this.params.pslug;\n this.loadInitialData();\n }\n\n ContribController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.$broadcast('project:loaded', project);\n return project;\n };\n\n ContribController.prototype.loadInitialData = function() {\n return this.loadProject();\n };\n\n return ContribController;\n\n })(taiga.Controller);\n\n module.controller(\"ContribController\", ContribController);\n\n ContribUserSettingsController = (function(superClass) {\n extend(ContribUserSettingsController, superClass);\n\n ContribUserSettingsController.$inject = [\"$rootScope\", \"$scope\", \"$routeParams\"];\n\n function ContribUserSettingsController(rootScope, scope, params) {\n this.rootScope = rootScope;\n this.scope = scope;\n this.params = params;\n this.scope.currentPlugin = _.head(_.filter(this.rootScope.userSettingsPlugins, {\n \"slug\": this.params.plugin\n }));\n }\n\n return ContribUserSettingsController;\n\n })(taiga.Controller);\n\n module.controller(\"ContribUserSettingsController\", ContribUserSettingsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/filters.coffee\n */\n\n(function() {\n var FiltersStorageService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n FiltersStorageService = (function(superClass) {\n extend(FiltersStorageService, superClass);\n\n FiltersStorageService.$inject = [\"$tgStorage\", \"$routeParams\"];\n\n function FiltersStorageService(storage, params) {\n this.storage = storage;\n this.params = params;\n }\n\n FiltersStorageService.prototype.generateHash = function(components) {\n if (components == null) {\n components = [];\n }\n components = _.map(components, function(x) {\n return JSON.stringify(x);\n });\n return hex_sha1(components.join(\":\"));\n };\n\n return FiltersStorageService;\n\n })(taiga.Service);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/http.coffee\n */\n\n(function() {\n var HttpService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n HttpService = (function(superClass) {\n extend(HttpService, superClass);\n\n HttpService.$inject = [\"$http\", \"$q\", \"$tgStorage\", \"$rootScope\", \"$cacheFactory\", \"$translate\"];\n\n function HttpService(http, q, storage, rootScope, cacheFactory, translate) {\n this.http = http;\n this.q = q;\n this.storage = storage;\n this.rootScope = rootScope;\n this.cacheFactory = cacheFactory;\n this.translate = translate;\n HttpService.__super__.constructor.call(this);\n this.cache = this.cacheFactory(\"httpget\");\n }\n\n HttpService.prototype.headers = function() {\n var headers, lang, token;\n headers = {};\n token = this.storage.get('token');\n if (token) {\n headers[\"Authorization\"] = \"Bearer \" + token;\n }\n lang = this.translate.preferredLanguage();\n if (lang) {\n headers[\"Accept-Language\"] = lang;\n }\n return headers;\n };\n\n HttpService.prototype.request = function(options) {\n options.headers = _.assign({}, options.headers || {}, this.headers());\n return this.http(options);\n };\n\n HttpService.prototype.get = function(url, params, options) {\n options = _.assign({\n method: \"GET\",\n url: url\n }, options);\n if (params) {\n options.params = params;\n }\n options.cache = this.cache;\n return this.request(options)[\"finally\"]((function(_this) {\n return function(data) {\n return _this.cache.removeAll();\n };\n })(this));\n };\n\n HttpService.prototype.post = function(url, data, params, options) {\n options = _.assign({\n method: \"POST\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype.put = function(url, data, params, options) {\n options = _.assign({\n method: \"PUT\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype.patch = function(url, data, params, options) {\n options = _.assign({\n method: \"PATCH\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype[\"delete\"] = function(url, data, params, options) {\n options = _.assign({\n method: \"DELETE\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n return HttpService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgHttp\", HttpService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/location.coffee\n */\n\n(function() {\n var locationFactory, module;\n\n locationFactory = function($location, $route, $rootscope) {\n $location.noreload = function(scope) {\n var lastRoute, un;\n lastRoute = $route.current;\n un = scope.$on(\"$locationChangeSuccess\", function() {\n $route.current = lastRoute;\n return un();\n });\n return $location;\n };\n $location.isInCurrentRouteParams = function(name, value) {\n var params;\n params = $location.search() || {};\n return params[name] === value;\n };\n return $location;\n };\n\n module = angular.module(\"taigaBase\");\n\n module.factory(\"$tgLocation\", [\"$location\", \"$route\", \"$rootScope\", locationFactory]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/model.coffee\n */\n\n(function() {\n var Model, ModelService, module, provider, taiga,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n Model = (function() {\n function Model(name, data, dataTypes) {\n this._attrs = data;\n this._name = name;\n this._dataTypes = dataTypes;\n this.setAttrs(data);\n this.initialize();\n }\n\n Model.prototype.realClone = function() {\n var attrs, instance;\n attrs = _.cloneDeep(this._attrs);\n instance = new Model(this._name, attrs, this._dataTypes);\n instance._modifiedAttrs = _.cloneDeep(this._modifiedAttrs);\n instance._isModified = _.cloneDeep(this._isModified);\n return instance;\n };\n\n Model.prototype.clone = function() {\n var instance;\n instance = new Model(this._name, this._attrs, this._dataTypes);\n instance._modifiedAttrs = this._modifiedAttrs;\n instance._isModified = this._isModified;\n return instance;\n };\n\n Model.prototype.applyCasts = function() {\n var attrName, castMethod, castName, ref, results;\n ref = this._dataTypes;\n results = [];\n for (attrName in ref) {\n castName = ref[attrName];\n castMethod = service.casts[castName];\n if (!castMethod) {\n continue;\n }\n results.push(this._attrs[attrName] = castMethod(this._attrs[attrName]));\n }\n return results;\n };\n\n Model.prototype.getIdAttrName = function() {\n return \"id\";\n };\n\n Model.prototype.getName = function() {\n return this._name;\n };\n\n Model.prototype.getAttrs = function(patch) {\n if (patch == null) {\n patch = false;\n }\n if (this._attrs.version != null) {\n this._modifiedAttrs.version = this._attrs.version;\n }\n if (patch) {\n return _.extend({}, this._modifiedAttrs);\n }\n return _.extend({}, this._attrs, this._modifiedAttrs);\n };\n\n Model.prototype.setAttrs = function(attrs) {\n this._attrs = attrs;\n this._modifiedAttrs = {};\n this.applyCasts();\n return this._isModified = false;\n };\n\n Model.prototype.setAttr = function(name, value) {\n this._modifiedAttrs[name] = value;\n return this._isModified = true;\n };\n\n Model.prototype.initialize = function() {\n var getter, self, setter;\n self = this;\n getter = function(name) {\n return function() {\n if (typeof name === 'string' && name.substr(0, 2) === \"__\") {\n return self[name];\n }\n if (indexOf.call(_.keys(self._modifiedAttrs), name) < 0) {\n return self._attrs[name];\n }\n return self._modifiedAttrs[name];\n };\n };\n setter = function(name) {\n return function(value) {\n if (typeof name === 'string' && name.substr(0, 2) === \"__\") {\n self[name] = value;\n return;\n }\n if (self._attrs[name] !== value) {\n self._modifiedAttrs[name] = value;\n self._isModified = true;\n } else {\n delete self._modifiedAttrs[name];\n }\n };\n };\n return _.each(this._attrs, function(value, name) {\n var options;\n options = {\n get: getter(name),\n set: setter(name),\n enumerable: true,\n configurable: true\n };\n return Object.defineProperty(self, name, options);\n });\n };\n\n Model.prototype.serialize = function() {\n var data;\n data = {\n \"data\": _.clone(this._attrs),\n \"name\": this._name\n };\n return JSON.stringify(data);\n };\n\n Model.prototype.isModified = function() {\n return this._isModified;\n };\n\n Model.prototype.isAttributeModified = function(attribute) {\n return this._modifiedAttrs[attribute] != null;\n };\n\n Model.prototype.markSaved = function() {\n this._isModified = false;\n this._attrs = this.getAttrs();\n return this._modifiedAttrs = {};\n };\n\n Model.prototype.revert = function() {\n this._modifiedAttrs = {};\n return this._isModified = false;\n };\n\n Model.desSerialize = function(sdata) {\n var ddata, model;\n ddata = JSON.parse(sdata);\n model = new Model(ddata.url, ddata.data);\n return model;\n };\n\n return Model;\n\n })();\n\n taiga = this.taiga;\n\n ModelService = (function(superClass) {\n extend(ModelService, superClass);\n\n ModelService.$inject = [\"$q\", \"$tgUrls\", \"$tgStorage\", \"$tgHttp\"];\n\n function ModelService(q, urls, storage, http) {\n this.q = q;\n this.urls = urls;\n this.storage = storage;\n this.http = http;\n ModelService.__super__.constructor.call(this);\n }\n\n return ModelService;\n\n })(taiga.Service);\n\n provider = function($q, $http, $gmUrls, $gmStorage) {\n var service;\n service = {};\n service.make_model = function(name, data, cls, dataTypes) {\n if (cls == null) {\n cls = Model;\n }\n if (dataTypes == null) {\n dataTypes = {};\n }\n return new cls(name, data, dataTypes);\n };\n service.cls = Model;\n service.casts = {\n int: function(value) {\n return parseInt(value, 10);\n },\n float: function(value) {\n return parseFloat(value, 10);\n }\n };\n return service;\n };\n\n module = angular.module(\"taigaBase\");\n\n module.factory(\"$tgModel\", [\"$q\", \"$http\", \"$tgUrls\", \"$tgStorage\", provider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/navurl.coffee\n */\n\n(function() {\n var NavigationUrlsDirective, NavigationUrlsService, bindOnce, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBase\");\n\n NavigationUrlsService = (function(superClass) {\n extend(NavigationUrlsService, superClass);\n\n function NavigationUrlsService() {\n this.urls = {};\n }\n\n NavigationUrlsService.prototype.update = function(urls) {\n return this.urls = _.merge({}, this.urls, urls || {});\n };\n\n NavigationUrlsService.prototype.formatUrl = function(url, ctx) {\n var replacer;\n if (ctx == null) {\n ctx = {};\n }\n replacer = function(match) {\n match = trim(match, \":\");\n return ctx[match] || \"undefined\";\n };\n return url.replace(/(:\\w+)/g, replacer);\n };\n\n NavigationUrlsService.prototype.resolve = function(name, ctx) {\n var url;\n url = this.urls[name];\n if (!url) {\n return \"\";\n }\n if (ctx) {\n return this.formatUrl(url, ctx);\n }\n return url;\n };\n\n return NavigationUrlsService;\n\n })(taiga.Service);\n\n module.service(\"$tgNavUrls\", NavigationUrlsService);\n\n NavigationUrlsDirective = function($navurls, $auth, $q, $location, lightboxService) {\n var bindOnceP, link, parseNav;\n bindOnceP = function($scope, attr) {\n var defered;\n defered = $q.defer();\n bindOnce($scope, attr, function(v) {\n return defered.resolve(v);\n });\n return defered.promise;\n };\n parseNav = function(data, $scope) {\n var index, name, obj, params, promises, ref, result, values;\n ref = _.map(data.split(\":\"), trim), name = ref[0], params = ref[1];\n if (params) {\n result = params.split(/(\\w+)=/);\n result = _.filter(result, function(str) {\n return str.length;\n });\n result = _.map(result, function(str) {\n return trim(str.replace(/,$/g, ''));\n });\n params = [];\n index = 0;\n while (index < result.length) {\n obj = {};\n obj[result[index]] = result[index + 1];\n params.push(obj);\n index = index + 2;\n }\n } else {\n params = [];\n }\n values = _.map(params, function(param) {\n return _.values(param)[0];\n });\n promises = _.map(values, function(x) {\n return bindOnceP($scope, x);\n });\n return $q.all(promises).then(function() {\n var i, key, len, options, param, value;\n options = {};\n for (i = 0, len = params.length; i < len; i++) {\n param = params[i];\n key = Object.keys(param)[0];\n value = param[key];\n options[key] = $scope.$eval(value);\n }\n return [name, options];\n });\n };\n link = function($scope, $el, $attrs) {\n if ($el.is(\"a\")) {\n $el.attr(\"href\", \"#\");\n }\n $el.on(\"mouseenter\", function(event) {\n var target;\n target = $(event.currentTarget);\n if (!target.data(\"fullUrl\") || $attrs.tgNavGetParams !== target.data(\"params\")) {\n return parseNav($attrs.tgNav, $scope).then(function(result) {\n var fullUrl, getURLParams, getURLParamsStr, name, options, url, user;\n name = result[0], options = result[1];\n user = $auth.getUser();\n if (user) {\n options.user = user.username;\n }\n url = $navurls.resolve(name);\n fullUrl = $navurls.formatUrl(url, options);\n if ($attrs.tgNavGetParams) {\n getURLParams = JSON.parse($attrs.tgNavGetParams);\n getURLParamsStr = $.param(getURLParams);\n fullUrl = fullUrl + \"?\" + getURLParamsStr;\n target.data(\"params\", $attrs.tgNavGetParams);\n }\n target.data(\"fullUrl\", fullUrl);\n if (target.is(\"a\")) {\n target.attr(\"href\", fullUrl);\n }\n return $el.on(\"click\", function(event) {\n if (event.metaKey || event.ctrlKey) {\n return;\n }\n event.preventDefault();\n target = $(event.currentTarget);\n if (target.hasClass('noclick')) {\n return;\n }\n fullUrl = target.data(\"fullUrl\");\n switch (event.which) {\n case 1:\n $location.url(fullUrl);\n $scope.$apply();\n break;\n case 2:\n window.open(fullUrl);\n }\n return lightboxService.closeAll();\n });\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNav\", [\"$tgNavUrls\", \"$tgAuth\", \"$q\", \"$tgLocation\", \"lightboxService\", NavigationUrlsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/repository.coffee\n */\n\n(function() {\n var RepositoryService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n RepositoryService = (function(superClass) {\n extend(RepositoryService, superClass);\n\n RepositoryService.$inject = [\"$q\", \"$tgModel\", \"$tgStorage\", \"$tgHttp\", \"$tgUrls\"];\n\n function RepositoryService(q, model1, storage, http, urls) {\n this.q = q;\n this.model = model1;\n this.storage = storage;\n this.http = http;\n this.urls = urls;\n RepositoryService.__super__.constructor.call(this);\n }\n\n RepositoryService.prototype.resolveUrlForModel = function(model) {\n var idAttrName;\n idAttrName = model.getIdAttrName();\n return (this.urls.resolve(model.getName())) + \"/\" + model[idAttrName];\n };\n\n RepositoryService.prototype.resolveUrlForAttributeModel = function(model) {\n return this.urls.resolve(model.getName(), model.parent);\n };\n\n RepositoryService.prototype.create = function(name, data, dataTypes, extraParams) {\n var defered, promise, url;\n if (dataTypes == null) {\n dataTypes = {};\n }\n if (extraParams == null) {\n extraParams = {};\n }\n defered = this.q.defer();\n url = this.urls.resolve(name);\n promise = this.http.post(url, JSON.stringify(data), extraParams);\n promise.success((function(_this) {\n return function(_data, _status) {\n return defered.resolve(_this.model.make_model(name, _data, null, dataTypes));\n };\n })(this));\n promise.error((function(_this) {\n return function(data, status) {\n return defered.reject(data);\n };\n })(this));\n return defered.promise;\n };\n\n RepositoryService.prototype.remove = function(model, params) {\n var defered, promise, url;\n if (params == null) {\n params = {};\n }\n defered = this.q.defer();\n url = this.resolveUrlForModel(model);\n promise = this.http[\"delete\"](url, {}, params);\n promise.success(function(data, status) {\n return defered.resolve(model);\n });\n promise.error(function(data, status) {\n return defered.reject(model);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.saveAll = function(models, patch) {\n var promises;\n if (patch == null) {\n patch = true;\n }\n promises = _.map(models, (function(_this) {\n return function(x) {\n return _this.save(x, true);\n };\n })(this));\n return this.q.all(promises);\n };\n\n RepositoryService.prototype.save = function(model, patch, params, options, returnHeaders) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n if (params == null) {\n params = {};\n }\n if (returnHeaders == null) {\n returnHeaders = false;\n }\n defered = this.q.defer();\n if (!model.isModified() && patch) {\n defered.resolve(model);\n return defered.promise;\n }\n url = this.resolveUrlForModel(model);\n data = JSON.stringify(model.getAttrs(patch));\n if (patch) {\n promise = this.http.patch(url, data, params, options);\n } else {\n promise = this.http.put(url, data, params, options);\n }\n promise.success((function(_this) {\n return function(data, status, headers, response) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n if (returnHeaders) {\n return defered.resolve([model, headers()]);\n } else {\n return defered.resolve(model);\n }\n };\n })(this));\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.saveAttribute = function(model, attribute, patch) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n defered = this.q.defer();\n if (!model.isModified() && patch) {\n defered.resolve(model);\n return defered.promise;\n }\n url = this.resolveUrlForAttributeModel(model);\n data = {};\n data[attribute] = model.getAttrs();\n if (patch) {\n promise = this.http.patch(url, data);\n } else {\n promise = this.http.put(url, data);\n }\n promise.success((function(_this) {\n return function(data, status) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n return defered.resolve(model);\n };\n })(this));\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.refresh = function(model) {\n var defered, promise, url;\n defered = this.q.defer();\n url = this.resolveUrlForModel(model);\n promise = this.http.get(url);\n promise.success(function(data, status) {\n model._modifiedAttrs = {};\n model._attrs = data;\n model._isModified = false;\n model.applyCasts();\n return defered.resolve(model);\n });\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.queryMany = function(name, params, options, headers) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n if (headers == null) {\n headers = false;\n }\n url = this.urls.resolve(name);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var result;\n result = _.map(data.data, function(x) {\n return _this.model.make_model(name, x);\n });\n if (headers) {\n return [result, data.headers];\n }\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOneAttribute = function(name, id, attribute, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name, id);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var model;\n model = _this.model.make_model(name, data.data[attribute]);\n model.parent = id;\n return model;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOne = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n return _this.model.make_model(name, data.data);\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOneRaw = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = _.merge({\n headers: {}\n }, options);\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryPaginated = function(name, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n httpOptions = _.merge({\n headers: {}\n }, options);\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var headers, result;\n headers = data.headers();\n result = {};\n result.models = _.map(data.data, function(x) {\n return _this.model.make_model(name, x);\n });\n result.count = parseInt(headers[\"x-pagination-count\"], 10);\n result.current = parseInt(headers[\"x-pagination-current\"] || 1, 10);\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10);\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOnePaginatedRaw = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = _.merge({\n headers: {}\n }, options);\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var headers, result;\n headers = data.headers();\n result = {};\n result.data = data.data;\n result.count = parseInt(headers[\"x-pagination-count\"], 10);\n result.current = parseInt(headers[\"x-pagination-current\"] || 1, 10);\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10);\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.resolve = function(options) {\n var cache, params;\n params = {};\n if (options.pslug != null) {\n params.project = options.pslug;\n }\n if (options.usref != null) {\n params.us = options.usref;\n }\n if (options.taskref != null) {\n params.task = options.taskref;\n }\n if (options.issueref != null) {\n params.issue = options.issueref;\n }\n if (options.sslug != null) {\n params.milestone = options.sslug;\n }\n if (options.wikipage != null) {\n params.wikipage = options.wikipage;\n }\n if (options.ref != null) {\n params.ref = options.ref;\n }\n cache = !(options.wikipage || options.sslug);\n return this.queryOneRaw(\"resolver\", null, params, {\n cache: cache\n });\n };\n\n return RepositoryService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgRepo\", RepositoryService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/storage.coffee\n */\n\n(function() {\n var StorageService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n StorageService = (function(superClass) {\n extend(StorageService, superClass);\n\n StorageService.$inject = [\"$rootScope\"];\n\n function StorageService($rootScope) {\n StorageService.__super__.constructor.call(this);\n }\n\n StorageService.prototype.get = function(key, _default) {\n var serializedValue;\n serializedValue = localStorage.getItem(key);\n if (serializedValue === null) {\n return _default || null;\n }\n return JSON.parse(serializedValue);\n };\n\n StorageService.prototype.set = function(key, val) {\n if (_.isObject(key)) {\n return _.each(key, (function(_this) {\n return function(val, key) {\n return _this.set(key, val);\n };\n })(this));\n } else {\n return localStorage.setItem(key, JSON.stringify(val));\n }\n };\n\n StorageService.prototype.contains = function(key) {\n var value;\n value = this.get(key);\n return value !== null;\n };\n\n StorageService.prototype.remove = function(key) {\n return localStorage.removeItem(key);\n };\n\n StorageService.prototype.clear = function() {\n return localStorage.clear();\n };\n\n return StorageService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgStorage\", StorageService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/http.coffee\n */\n\n(function() {\n var UrlsService, format, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n format = function(fmt, obj) {\n obj = _.clone(obj);\n return fmt.replace(/%s/g, function(match) {\n return String(obj.shift());\n });\n };\n\n taiga = this.taiga;\n\n UrlsService = (function(superClass) {\n extend(UrlsService, superClass);\n\n UrlsService.$inject = [\"$tgConfig\"];\n\n function UrlsService(config) {\n this.config = config;\n this.urls = {};\n this.mainUrl = this.config.get(\"api\");\n }\n\n UrlsService.prototype.update = function(urls) {\n return this.urls = _.merge(this.urls, urls);\n };\n\n UrlsService.prototype.resolve = function() {\n var args, name, url;\n args = _.toArray(arguments);\n if (args.length === 0) {\n throw Error(\"wrong arguments to setUrls\");\n }\n name = args.slice(0, 1)[0];\n url = format(this.urls[name], args.slice(1));\n return format(\"%s/%s\", [_.trimEnd(this.mainUrl, \"/\"), _.trimStart(url, \"/\")]);\n };\n\n UrlsService.prototype.resolveAbsolute = function() {\n var url;\n url = this.resolve.apply(this, arguments);\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n if (/^\\//.test(url)) {\n return window.location.protocol + \"//\" + window.location.host + url;\n }\n return window.location.protocol + \"//\" + window.location.host + \"/\" + url;\n };\n\n return UrlsService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service('$tgUrls', UrlsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/custom-field-values.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo) {\n var _get, service;\n _get = function(objectId, resource) {\n return $repo.queryOne(resource, objectId);\n };\n service = {\n epic: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/epic\");\n }\n },\n userstory: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/userstory\");\n }\n },\n task: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/task\");\n }\n },\n issue: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/issue\");\n }\n }\n };\n return function(instance) {\n return instance.customAttributesValues = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgCustomAttributesValuesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($repo) {\n var _list, service;\n _list = function(projectId, resource) {\n return $repo.queryMany(resource, {\n project: projectId\n });\n };\n service = {\n epic: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/epic\");\n }\n },\n userstory: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/userstory\");\n }\n },\n task: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/task\");\n }\n },\n issue: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/issue\");\n }\n }\n };\n return function(instance) {\n return instance.customAttributes = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgCustomAttributesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/epics.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"epics-queryparams\";\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"epics\", \"by_ref\", params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.upvote = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-upvote\", epicId);\n return $http.post(url);\n };\n service.downvote = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-downvote\", epicId);\n return $http.post(url);\n };\n service.watch = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-watch\", epicId);\n return $http.post(url);\n };\n service.unwatch = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-unwatch\", epicId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.epics = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgEpicsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/history.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(type, objectId) {\n return $repo.queryOneRaw(\"history/\" + type, objectId);\n };\n service.editComment = function(type, objectId, activityId, comment) {\n var commentData, params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/edit_comment\";\n params = {\n id: activityId\n };\n commentData = {\n comment: comment\n };\n return $http.post(url, commentData, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.getCommentHistory = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/comment_versions\";\n params = {\n id: activityId\n };\n return $http.get(url, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.deleteComment = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/delete_comment\";\n params = {\n id: activityId\n };\n return $http.post(url, null, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.undeleteComment = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/undelete_comment\";\n params = {\n id: activityId\n };\n return $http.post(url, null, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n return function(instance) {\n return instance.history = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgHistoryResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo) {\n var service;\n service = {};\n service.get = function(token) {\n return $repo.queryOne(\"invitations\", token);\n };\n return function(instance) {\n return instance.invitations = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgInvitationsResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/issues.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage, $q) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"issues-queryparams\";\n service.get = function(projectId, issueId) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n return $repo.queryOne(\"issues\", issueId, params);\n };\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"issues\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"issues\", filters);\n };\n service.list = function(projectId, filters, options) {\n var params;\n params = {\n project: projectId\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryPaginated(\"issues\", params, options);\n };\n service.bulkCreate = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-create-issues\");\n params = {\n project_id: projectId,\n bulk_issues: data\n };\n return $http.post(url, params);\n };\n service.upvote = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-upvote\", issueId);\n return $http.post(url);\n };\n service.downvote = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-downvote\", issueId);\n return $http.post(url);\n };\n service.watch = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-watch\", issueId);\n return $http.post(url);\n };\n service.unwatch = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-unwatch\", issueId);\n return $http.post(url);\n };\n service.stats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/issues_stats\");\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"issues-filters\", null, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.issues = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgIssuesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/kanban.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($storage) {\n var hashSuffixStatusColumnModes, hashSuffixStatusViewModes, service;\n service = {};\n hashSuffixStatusViewModes = \"kanban-statusviewmodels\";\n hashSuffixStatusColumnModes = \"kanban-statuscolumnmodels\";\n service.storeStatusColumnModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusColumnModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.kanban = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgKanbanResourcesProvider\", [\"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/locales.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($repo) {\n var service;\n service = {\n list: function() {\n return $repo.queryMany(\"locales\");\n }\n };\n return function(instance) {\n return instance.locales = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgLocalesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/mdrender.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.render = function(projectId, content) {\n var params, url;\n if ((content == null) || content === \"\") {\n content = ' ';\n }\n params = {\n project_id: projectId,\n content: content\n };\n url = $urls.resolve(\"wiki\");\n return $http.post(url + \"/render\", params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n return function(instance) {\n return instance.mdrender = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgMdRenderResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"memberships\", id);\n };\n service.list = function(projectId, filters, enablePagination) {\n var options, params;\n if (enablePagination == null) {\n enablePagination = true;\n }\n params = {\n project: projectId\n };\n params = _.extend({}, params, filters || {});\n if (enablePagination) {\n return $repo.queryPaginated(\"memberships\", params);\n }\n return $repo.queryMany(\"memberships\", params, options = {\n enablePagination: enablePagination\n });\n };\n service.listByUser = function(userId, filters) {\n var params;\n params = {\n user: userId\n };\n params = _.extend({}, params, filters || {});\n return $repo.queryPaginated(\"memberships\", params);\n };\n service.resendInvitation = function(id) {\n var url;\n url = $urls.resolve(\"memberships\");\n return $http.post(url + \"/\" + id + \"/resend_invitation\", {});\n };\n service.bulkCreateMemberships = function(projectId, data, invitation_extra_text) {\n var params, url;\n url = $urls.resolve(\"bulk-create-memberships\");\n params = {\n project_id: projectId,\n bulk_memberships: data,\n invitation_extra_text: invitation_extra_text\n };\n return $http.post(url, params);\n };\n return function(instance) {\n return instance.memberships = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgMembershipsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo) {\n var service;\n service = {};\n service.list = function(projectId, module) {\n return $repo.queryOneAttribute(\"project-modules\", projectId, module);\n };\n return function(instance) {\n return instance.modules = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgModulesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"notify-policies\", id);\n };\n service.list = function(filters) {\n var params;\n params = _.extend({}, params, filters || {});\n return $repo.queryMany(\"notify-policies\", params);\n };\n return function(instance) {\n return instance.notifyPolicies = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgNotifyPoliciesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($config, $repo, $http, $urls, $auth, $q, $translate) {\n var service;\n service = {};\n service.get = function(projectId) {\n return $repo.queryOne(\"projects\", projectId);\n };\n service.getBySlug = function(projectSlug) {\n return $repo.queryOne(\"projects\", \"by_slug?slug=\" + projectSlug);\n };\n service.list = function() {\n return $repo.queryMany(\"projects\");\n };\n service.listByMember = function(memberId) {\n var params;\n params = {\n \"member\": memberId,\n \"order_by\": \"user_order\"\n };\n return $repo.queryMany(\"projects\", params);\n };\n service.templates = function() {\n return $repo.queryMany(\"project-templates\");\n };\n service.usersList = function(projectId) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(\"users\", params);\n };\n service.rolesList = function(projectId) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(\"roles\", params);\n };\n service.stats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/stats\");\n };\n service.bulkUpdateOrder = function(bulkData) {\n var url;\n url = $urls.resolve(\"bulk-update-projects-order\");\n return $http.post(url, bulkData);\n };\n service.regenerate_epics_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_epics_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_userstories_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_userstories_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_tasks_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_tasks_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_issues_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_issues_csv_uuid\";\n return $http.post(url);\n };\n service.leave = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/leave\";\n return $http.post(url);\n };\n service.memberStats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/member_stats\");\n };\n service.tagsColors = function(projectId) {\n return $repo.queryOne(\"projects\", projectId + \"/tags_colors\");\n };\n service.deleteTag = function(projectId, tag) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/delete_tag\";\n return $http.post(url, {\n tag: tag\n });\n };\n service.createTag = function(projectId, tag, color) {\n var data, url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/create_tag\";\n data = {};\n data.tag = tag;\n data.color = null;\n if (color) {\n data.color = color;\n }\n return $http.post(url, data);\n };\n service.editTag = function(projectId, from_tag, to_tag, color) {\n var data, url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/edit_tag\";\n data = {};\n data.from_tag = from_tag;\n if (to_tag) {\n data.to_tag = to_tag;\n }\n data.color = null;\n if (color) {\n data.color = color;\n }\n return $http.post(url, data);\n };\n service.mixTags = function(projectId, to_tag, from_tags) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/mix_tags\";\n return $http.post(url, {\n to_tag: to_tag,\n from_tags: from_tags\n });\n };\n service[\"export\"] = function(projectId) {\n var url;\n url = ($urls.resolve(\"exporter\")) + \"/\" + projectId;\n return $http.get(url);\n };\n service[\"import\"] = function(file, statusUpdater) {\n var complete, data, defered, errorMsg, failed, maxFileSize, response, uploadComplete, uploadFailed, uploadProgress, xhr;\n defered = $q.defer();\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name,\n fileSize: sizeFormat(file.size),\n maxFileSize: sizeFormat(maxFileSize)\n });\n response = {\n status: 413,\n data: {\n _error_message: errorMsg\n }\n };\n defered.reject(response);\n return defered.promise;\n }\n uploadProgress = (function(_this) {\n return function(evt) {\n var message, percent;\n percent = Math.round((evt.loaded / evt.total) * 100);\n message = $translate.instant(\"PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE\", {\n uploadedSize: sizeFormat(evt.loaded),\n totalSize: sizeFormat(evt.total)\n });\n return statusUpdater(\"in-progress\", null, message, percent);\n };\n })(this);\n uploadComplete = (function(_this) {\n return function(evt) {\n return statusUpdater(\"done\", $translate.instant(\"PROJECT.IMPORT.TITLE\"), $translate.instant(\"PROJECT.IMPORT.DESCRIPTION\"));\n };\n })(this);\n uploadFailed = (function(_this) {\n return function(evt) {\n return statusUpdater(\"error\");\n };\n })(this);\n complete = (function(_this) {\n return function(evt) {\n var ref;\n response = {};\n try {\n response.data = JSON.parse(evt.target.responseText);\n } catch (error) {\n response.data = {};\n }\n response.status = evt.target.status;\n if (evt.target.getResponseHeader('Taiga-Info-Project-Is-Private')) {\n response.headers = {\n isPrivate: evt.target.getResponseHeader('Taiga-Info-Project-Is-Private') === 'True',\n memberships: parseInt(evt.target.getResponseHeader('Taiga-Info-Project-Memberships'))\n };\n }\n if ((ref = response.status) === 201 || ref === 202) {\n defered.resolve(response);\n }\n return defered.reject(response);\n };\n })(this);\n failed = (function(_this) {\n return function(evt) {\n return defered.reject(\"fail\");\n };\n })(this);\n data = new FormData();\n data.append('dump', file);\n xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.upload.addEventListener(\"load\", uploadComplete, false);\n xhr.upload.addEventListener(\"error\", uploadFailed, false);\n xhr.upload.addEventListener(\"abort\", uploadFailed, false);\n xhr.addEventListener(\"load\", complete, false);\n xhr.addEventListener(\"error\", failed, false);\n xhr.open(\"POST\", $urls.resolve(\"importer\"));\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + ($auth.getToken()));\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send(data);\n return defered.promise;\n };\n service.changeLogo = function(projectId, file) {\n var data, defered, maxFileSize, options, response, url;\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered = $q.defer();\n defered.reject(response);\n return defered.promise;\n }\n data = new FormData();\n data.append('logo', file);\n options = {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': void 0\n }\n };\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/change_logo\";\n return $http.post(url, data, {}, options);\n };\n service.removeLogo = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/remove_logo\";\n return $http.post(url);\n };\n return function(instance) {\n return instance.projects = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgProjectsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgAuth\", \"$q\", \"$translate\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"roles\", id);\n };\n service.list = function(projectId) {\n return $repo.queryMany(\"roles\", {\n project: projectId\n });\n };\n return function(instance) {\n return instance.roles = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgRolesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/search.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $urls, $http, $q) {\n var service;\n service = {};\n service[\"do\"] = function(projectId, term) {\n var deferredAbort, params, request, url;\n deferredAbort = $q.defer();\n url = $urls.resolve(\"search\");\n params = {\n url: url,\n method: \"GET\",\n timeout: deferredAbort.promise,\n cancelable: true,\n params: {\n project: projectId,\n text: term,\n get_all: false\n }\n };\n request = $http.request(params).then(function(data) {\n return data.data;\n });\n request.abort = function() {\n return deferredAbort.resolve();\n };\n request[\"finally\"] = function() {\n request.abort = angular.noop;\n return deferredAbort = request = null;\n };\n return request;\n };\n return function(instance) {\n return instance.search = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgSearchResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/sprints.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $model, $storage) {\n var service;\n service = {};\n service.get = function(projectId, sprintId) {\n return $repo.queryOne(\"milestones\", sprintId).then(function(sprint) {\n var uses;\n uses = sprint.user_stories;\n uses = _.map(uses, function(u) {\n return $model.make_model(\"userstories\", u);\n });\n sprint._attrs.user_stories = uses;\n return sprint;\n });\n };\n service.stats = function(projectId, sprintId) {\n return $repo.queryOneRaw(\"milestones\", sprintId + \"/stats\");\n };\n service.list = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId\n };\n params = _.extend({}, params, filters || {});\n return $repo.queryMany(\"milestones\", params, {}, true).then((function(_this) {\n return function(result) {\n var headers, i, len, m, milestones, uses;\n milestones = result[0];\n headers = result[1];\n for (i = 0, len = milestones.length; i < len; i++) {\n m = milestones[i];\n uses = m.user_stories;\n uses = _.map(uses, function(u) {\n return $model.make_model(\"userstories\", u);\n });\n m._attrs.user_stories = uses;\n }\n return {\n milestones: milestones,\n closed: parseInt(headers(\"Taiga-Info-Total-Closed-Milestones\"), 10),\n open: parseInt(headers(\"Taiga-Info-Total-Opened-Milestones\"), 10)\n };\n };\n })(this));\n };\n return function(instance) {\n return instance.sprints = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgSprintsResourcesProvider\", [\"$tgRepo\", \"$tgModel\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/tasks.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage) {\n var hashSuffix, hashSuffixStatusColumnModes, hashSuffixUsRowModes, service;\n service = {};\n hashSuffix = \"tasks-queryparams\";\n hashSuffixStatusColumnModes = \"tasks-statuscolumnmodels\";\n hashSuffixUsRowModes = \"tasks-usrowmodels\";\n service.get = function(projectId, taskId, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"tasks\", taskId, params);\n };\n service.getByRef = function(projectId, ref, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"tasks\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"tasks\", filters);\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"task-filters\", null, params);\n };\n service.list = function(projectId, sprintId, userStoryId, params) {\n if (sprintId == null) {\n sprintId = null;\n }\n if (userStoryId == null) {\n userStoryId = null;\n }\n params = _.merge(params, {\n project: projectId\n });\n if (sprintId) {\n params.milestone = sprintId;\n }\n if (userStoryId) {\n params.user_story = userStoryId;\n }\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"tasks\", params);\n };\n service.bulkCreate = function(projectId, sprintId, usId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-create-tasks\");\n params = {\n project_id: projectId,\n milestone_id: sprintId,\n us_id: usId,\n bulk_tasks: data\n };\n return $http.post(url, params).then(function(result) {\n return result.data;\n });\n };\n service.upvote = function(taskId) {\n var url;\n url = $urls.resolve(\"task-upvote\", taskId);\n return $http.post(url);\n };\n service.downvote = function(taskId) {\n var url;\n url = $urls.resolve(\"task-downvote\", taskId);\n return $http.post(url);\n };\n service.watch = function(taskId) {\n var url;\n url = $urls.resolve(\"task-watch\", taskId);\n return $http.post(url);\n };\n service.unwatch = function(taskId) {\n var url;\n url = $urls.resolve(\"task-unwatch\", taskId);\n return $http.post(url);\n };\n service.bulkUpdateTaskTaskboardOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-task-taskboard-order\");\n params = {\n project_id: projectId,\n bulk_tasks: data\n };\n return $http.post(url, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeStatusColumnModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusColumnModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeUsRowModes = function(projectId, sprintId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixUsRowModes;\n hash = generateHash([projectId, sprintId, ns]);\n return $storage.set(hash, params);\n };\n service.getUsRowModes = function(projectId, sprintId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixUsRowModes;\n hash = generateHash([projectId, sprintId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.tasks = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgTasksResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($config, $repo, $http, $urls, $q) {\n var service;\n service = {};\n service.changeAvatar = function(file) {\n var data, defered, maxFileSize, options, response, url;\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered = $q.defer();\n defered.reject(response);\n return defered.promise;\n }\n data = new FormData();\n data.append('avatar', file);\n options = {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': void 0\n }\n };\n url = ($urls.resolve(\"users\")) + \"/change_avatar\";\n return $http.post(url, data, {}, options);\n };\n service.removeAvatar = function() {\n var url;\n url = ($urls.resolve(\"users\")) + \"/remove_avatar\";\n return $http.post(url);\n };\n service.changePassword = function(currentPassword, newPassword) {\n var data, url;\n url = ($urls.resolve(\"users\")) + \"/change_password\";\n data = {\n current_password: currentPassword,\n password: newPassword\n };\n return $http.post(url, data);\n };\n return function(instance) {\n return instance.userSettings = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUserSettingsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/user.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($http, $urls) {\n var service;\n service = {};\n service.contacts = function(userId, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = $urls.resolve(\"user-contacts\", userId);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return $http.get(url, {}, httpOptions).then(function(result) {\n return result.data;\n });\n };\n return function(instance) {\n return instance.users = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUsersResourcesProvider\", [\"$tgHttp\", \"$tgUrls\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/userstories.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage, $q) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"userstories-queryparams\";\n service.get = function(projectId, usId, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"userstories\", usId, params);\n };\n service.getByRef = function(projectId, ref, extraParams) {\n var params;\n if (extraParams == null) {\n extraParams = {};\n }\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"userstories\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"userstories\", filters);\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"userstories-filters\", null, params);\n };\n service.listUnassigned = function(projectId, filters, pageSize) {\n var params;\n params = {\n \"project\": projectId,\n \"milestone\": \"null\"\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"userstories\", _.extend(params, {\n page_size: pageSize\n }), {\n enablePagination: true\n }, true);\n };\n service.listAll = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"userstories\", params);\n };\n service.bulkCreate = function(projectId, status, bulk) {\n var data, url;\n data = {\n project_id: projectId,\n status_id: status,\n bulk_stories: bulk\n };\n url = $urls.resolve(\"bulk-create-us\");\n return $http.post(url, data);\n };\n service.upvote = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-upvote\", userStoryId);\n return $http.post(url);\n };\n service.downvote = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-downvote\", userStoryId);\n return $http.post(url);\n };\n service.watch = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-watch\", userStoryId);\n return $http.post(url);\n };\n service.unwatch = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-unwatch\", userStoryId);\n return $http.post(url);\n };\n service.bulkUpdateBacklogOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-backlog-order\");\n params = {\n project_id: projectId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateMilestone = function(projectId, milestoneId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-milestone\");\n params = {\n project_id: projectId,\n milestone_id: milestoneId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateKanbanOrder = function(projectId, statusId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-kanban-order\");\n params = {\n project_id: projectId,\n status_id: statusId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeShowTags = function(projectId, showTags) {\n var hash;\n hash = generateHash([projectId, 'showTags']);\n return $storage.set(hash, showTags);\n };\n service.getShowTags = function(projectId) {\n var hash;\n hash = generateHash([projectId, 'showTags']);\n return $storage.get(hash) || null;\n };\n return function(instance) {\n return instance.userstories = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUserstoriesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: webhooklogs.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.list = function(webhookId) {\n var params;\n params = {\n webhook: webhookId\n };\n return $repo.queryMany(\"webhooklogs\", params);\n };\n service.resend = function(webhooklogId) {\n var url;\n url = $urls.resolve(\"webhooklogs-resend\", webhooklogId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.webhooklogs = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWebhookLogsResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: webhooks.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.list = function(projectId) {\n var params;\n params = {\n project: projectId\n };\n return $repo.queryMany(\"webhooks\", params);\n };\n service.test = function(webhookId) {\n var url;\n url = $urls.resolve(\"webhooks-test\", webhookId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.webhooks = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWebhooksResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/wikis.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(wikiId) {\n return $repo.queryOne(\"wiki\", wikiId);\n };\n service.getBySlug = function(projectId, slug) {\n return $repo.queryOne(\"wiki\", \"by_slug?project=\" + projectId + \"&slug=\" + slug);\n };\n service.list = function(projectId) {\n return $repo.queryMany(\"wiki\", {\n project: projectId\n });\n };\n service.listLinks = function(projectId) {\n return $repo.queryMany(\"wiki-links\", {\n project: projectId\n });\n };\n return function(instance) {\n return instance.wiki = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWikiResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/main.coffee\n */\n\n(function() {\n var UserChangePasswordController, UserChangePasswordDirective, debounce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserChangePasswordController = (function(superClass) {\n extend(UserChangePasswordController, superClass);\n\n UserChangePasswordController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"$translate\"];\n\n function UserChangePasswordController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, translate) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.translate = translate;\n this.scope.sectionName = this.translate.instant(\"CHANGE_PASSWORD.SECTION_NAME\");\n this.scope.user = this.auth.getUser();\n }\n\n return UserChangePasswordController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserChangePasswordController\", UserChangePasswordController);\n\n UserChangePasswordDirective = function($rs, $confirm, $loading, $translate) {\n var link;\n link = function($scope, $el, $attrs, ctrl) {\n var form, submit, submitButton;\n form = new checksley.Form($el.find(\"form\"));\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n if ($scope.newPassword1 !== $scope.newPassword2) {\n $confirm.notify('error', $translate.instant(\"CHANGE_PASSWORD.ERROR_PASSWORD_MATCH\"));\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $rs.userSettings.changePassword($scope.currentPassword, $scope.newPassword1);\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify('success');\n });\n return promise.then(null, function(response) {\n currentLoading.finish();\n return $confirm.notify('error', response.data._error_message);\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserChangePassword\", [\"$tgResources\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", UserChangePasswordDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/lightboxes.coffee\n */\n\n(function() {\n var DeleteUserDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaUserSettings\");\n\n DeleteUserDirective = function($repo, $rootscope, $auth, $location, $navUrls, lightboxService, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit, submitButton;\n $scope.$on(\"deletelightbox:new\", function(ctx, user) {\n return lightboxService.open($el);\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n submit = function() {\n var currentLoading, promise;\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.remove($scope.user);\n promise.then(function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n $auth.logout();\n return $location.path($navUrls.resolve(\"login\"));\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return console.log(\"FAIL\");\n });\n };\n $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n $el.on(\"click\", \".button-red\", debounce(2000, function(event) {\n event.preventDefault();\n return submit();\n }));\n return submitButton = $el.find(\".button-red\");\n };\n return {\n link: link,\n templateUrl: \"user/lightbox/lightbox-delete-account.html\"\n };\n };\n\n module.directive(\"tgLbDeleteUser\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\", \"lightboxService\", \"$tgLoading\", DeleteUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/live-notifications.coffee\n */\n\n(function() {\n var UserLiveNotificationsController, UserLiveNotificationsDirective, UserLiveNotificationsListDirective, bindOnce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserLiveNotificationsController = (function(superClass) {\n extend(UserLiveNotificationsController, superClass);\n\n UserLiveNotificationsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"tgErrorHandlingService\"];\n\n function UserLiveNotificationsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, errorHandlingService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.errorHandlingService = errorHandlingService;\n this.scope.sectionName = \"USER_SETTINGS.NOTIFICATIONS.LIVE_SECTION_NAME\";\n this.scope.user = this.auth.getUser();\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserLiveNotificationsController.prototype.loadInitialData = function() {\n return this.rs.notifyPolicies.list().then((function(_this) {\n return function(notifyPolicies) {\n _this.scope.notifyPolicies = notifyPolicies;\n return notifyPolicies;\n };\n })(this));\n };\n\n return UserLiveNotificationsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserLiveNotificationsController\", UserLiveNotificationsController);\n\n UserLiveNotificationsDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserLiveNotifications\", UserLiveNotificationsDirective);\n\n UserLiveNotificationsListDirective = function($repo, $confirm, $compile) {\n var link, template;\n template = _.template(\"<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\\n
    \\\">\\n
    <%- notifyPolicy.project_name %>
    \\n
    \\n
    \\n \\\" id=\\\"policy-all-<%- notifyPolicy.id %>\\\"\\n value=\\\"2\\\" <% if (notifyPolicy.live_notify_level == 2) { %>checked=\\\"checked\\\"<% } %>/>\\n \\n
    \\n
    \\n
    \\n
    \\n \\\" id=\\\"policy-involved-<%- notifyPolicy.id %>\\\"\\n value=\\\"1\\\" <% if (notifyPolicy.live_notify_level == 1) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
    \\n
    \\n
    \\n
    \\n \\\" id=\\\"policy-none-<%- notifyPolicy.id %>\\\"\\n value=\\\"3\\\" <% if (notifyPolicy.live_notify_level == 3) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
    \\n
    \\n
    \\n<% }) %>\");\n link = function($scope, $el, $attrs) {\n var render;\n render = function() {\n var ctx, html;\n $el.off();\n ctx = {\n notifyPolicies: $scope.notifyPolicies\n };\n html = template(ctx);\n $el.html($compile(html)($scope));\n return $el.on(\"change\", \"input[type=radio]\", function(event) {\n var onError, onSuccess, policy, policyIndex, prev_level, target;\n target = angular.element(event.currentTarget);\n policyIndex = target.parents(\".policy-table-row\").data('index');\n policy = $scope.notifyPolicies[policyIndex];\n prev_level = policy.live_notify_level;\n policy.live_notify_level = parseInt(target.val(), 10);\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n return target.parents(\".policy-table-row\").find(\"input[value=\" + prev_level + \"]\").prop(\"checked\", true);\n };\n return $repo.save(policy).then(onSuccess, onError);\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return bindOnce($scope, $attrs.ngModel, render);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserLiveNotificationsList\", [\"$tgRepo\", \"$tgConfirm\", \"$compile\", UserLiveNotificationsListDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/main.coffee\n */\n\n(function() {\n var TaigaAvatarModelDirective, UserAvatarDirective, UserProfileDirective, UserSettingsController, debounce, mixOf, module, sizeFormat, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n sizeFormat = this.taiga.sizeFormat;\n\n module = angular.module(\"taigaUserSettings\");\n\n debounce = this.taiga.debounce;\n\n UserSettingsController = (function(superClass) {\n extend(UserSettingsController, superClass);\n\n UserSettingsController.$inject = [\"$scope\", \"$rootScope\", \"$tgConfig\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"$translate\", \"tgErrorHandlingService\", \"$window\"];\n\n function UserSettingsController(scope, rootscope, config, repo, confirm, rs, params, q, location, navUrls, auth, translate, errorHandlingService, window) {\n var maxFileSize, promise, text;\n this.scope = scope;\n this.rootscope = rootscope;\n this.config = config;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.window = window;\n this.scope.sectionName = \"USER_SETTINGS.MENU.SECTION_TITLE\";\n this.scope.project = {};\n this.scope.user = this.auth.getUser();\n if (!this.scope.user) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.lang = this.getLan();\n this.scope.theme = this.getTheme();\n maxFileSize = this.config.get(\"maxUploadFileSize\", null);\n if (maxFileSize) {\n text = this.translate.instant(\"USER_SETTINGS.AVATAR_MAX_SIZE\", {\n \"maxFileSize\": sizeFormat(maxFileSize)\n });\n this.scope.maxFileSizeMsg = text;\n }\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserSettingsController.prototype.loadInitialData = function() {\n this.scope.availableThemes = this.config.get(\"themes\", []);\n return this.rs.locales.list().then((function(_this) {\n return function(locales) {\n _this.scope.locales = locales;\n return locales;\n };\n })(this));\n };\n\n UserSettingsController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.user);\n };\n\n UserSettingsController.prototype.getLan = function() {\n return this.scope.user.lang || this.translate.preferredLanguage();\n };\n\n UserSettingsController.prototype.getTheme = function() {\n return this.scope.user.theme || this.config.get(\"defaultTheme\") || \"taiga\";\n };\n\n UserSettingsController.prototype.exportProfile = function() {\n var onError, onSuccess;\n onSuccess = function(result) {\n var dumpUrl;\n dumpUrl = result.data.url;\n return this.window.open(dumpUrl, \"_blank\");\n };\n onError = (function(_this) {\n return function(response) {\n var ref;\n if ((ref = response.data) != null ? ref._error_message : void 0) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this);\n return this.auth.exportProfile().then(onSuccess, onError);\n };\n\n return UserSettingsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserSettingsController\", UserSettingsController);\n\n UserProfileDirective = function($confirm, $auth, $repo, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var changeEmail, form, onError, onSuccess;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n changeEmail = $scope.user.isAttributeModified(\"email\");\n $scope.user.lang = $scope.lang;\n $scope.user.theme = $scope.theme;\n onSuccess = function(data) {\n var text;\n $auth.setUser(data);\n if (changeEmail) {\n text = $translate.instant(\"USER_PROFILE.CHANGE_EMAIL_SUCCESS\");\n return $confirm.success(text);\n } else {\n return $confirm.notify('success');\n }\n };\n onError = function(data) {\n form.setErrors(data);\n return $confirm.notify('error', data._error_message);\n };\n return $repo.save($scope.user).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserProfile\", [\"$tgConfirm\", \"$tgAuth\", \"$tgRepo\", \"$translate\", UserProfileDirective]);\n\n UserAvatarDirective = function($auth, $model, $rs, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var onError, onSuccess, showSizeInfo;\n showSizeInfo = function() {\n return $el.find(\".size-info\").removeClass(\"hidden\");\n };\n onSuccess = function(response) {\n var user;\n user = $model.make_model(\"users\", response.data);\n $auth.setUser(user);\n $scope.user = user;\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('success');\n };\n onError = function(response) {\n if (response.status === 413) {\n showSizeInfo();\n }\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('error', response.data._error_message);\n };\n $el.on(\"click\", \".js-change-avatar\", function() {\n return $el.find(\"#avatar-field\").click();\n });\n $el.on(\"change\", \"#avatar-field\", function(event) {\n if ($scope.avatarAttachment) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.userSettings.changeAvatar($scope.avatarAttachment).then(onSuccess, onError);\n }\n });\n $el.on(\"click\", \"a.js-use-gravatar\", function(event) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.userSettings.removeAvatar().then(onSuccess, onError);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserAvatar\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", UserAvatarDirective]);\n\n TaigaAvatarModelDirective = function($parse) {\n var link;\n link = function($scope, $el, $attrs) {\n var model, modelSetter;\n model = $parse($attrs.tgAvatarModel);\n modelSetter = model.assign;\n return $el.bind('change', function() {\n return $scope.$apply(function() {\n return modelSetter($scope, $el[0].files[0]);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive('tgAvatarModel', ['$parse', TaigaAvatarModelDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/nav.coffee\n */\n\n(function() {\n var UserSettingsNavigationDirective, module;\n\n UserSettingsNavigationDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var section;\n section = $attrs.tgUserSettingsNavigation;\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\"#usersettingsmenu-\" + section + \" a\").addClass(\"active\");\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaUserSettings\");\n\n module.directive(\"tgUserSettingsNavigation\", UserSettingsNavigationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/notifications.coffee\n */\n\n(function() {\n var UserNotificationsController, UserNotificationsDirective, UserNotificationsListDirective, bindOnce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserNotificationsController = (function(superClass) {\n extend(UserNotificationsController, superClass);\n\n UserNotificationsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"tgErrorHandlingService\"];\n\n function UserNotificationsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, errorHandlingService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.errorHandlingService = errorHandlingService;\n this.scope.sectionName = \"USER_SETTINGS.NOTIFICATIONS.SECTION_NAME\";\n this.scope.user = this.auth.getUser();\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserNotificationsController.prototype.loadInitialData = function() {\n return this.rs.notifyPolicies.list().then((function(_this) {\n return function(notifyPolicies) {\n _this.scope.notifyPolicies = notifyPolicies;\n return notifyPolicies;\n };\n })(this));\n };\n\n return UserNotificationsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserNotificationsController\", UserNotificationsController);\n\n UserNotificationsDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserNotifications\", UserNotificationsDirective);\n\n UserNotificationsListDirective = function($repo, $confirm, $compile) {\n var link, template;\n template = _.template(\"<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\\n
    \\\">\\n
    <%- notifyPolicy.project_name %>
    \\n
    \\n
    \\n \\\" id=\\\"policy-all-<%- notifyPolicy.id %>\\\"\\n value=\\\"2\\\" <% if (notifyPolicy.notify_level == 2) { %>checked=\\\"checked\\\"<% } %>/>\\n \\n
    \\n
    \\n
    \\n
    \\n \\\" id=\\\"policy-involved-<%- notifyPolicy.id %>\\\"\\n value=\\\"1\\\" <% if (notifyPolicy.notify_level == 1) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
    \\n
    \\n
    \\n
    \\n \\\" id=\\\"policy-none-<%- notifyPolicy.id %>\\\"\\n value=\\\"3\\\" <% if (notifyPolicy.notify_level == 3) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
    \\n
    \\n
    \\n<% }) %>\");\n link = function($scope, $el, $attrs) {\n var render;\n render = function() {\n var ctx, html;\n $el.off();\n ctx = {\n notifyPolicies: $scope.notifyPolicies\n };\n html = template(ctx);\n $el.html($compile(html)($scope));\n return $el.on(\"change\", \"input[type=radio]\", function(event) {\n var onError, onSuccess, policy, policyIndex, prev_level, target;\n target = angular.element(event.currentTarget);\n policyIndex = target.parents(\".policy-table-row\").data('index');\n policy = $scope.notifyPolicies[policyIndex];\n prev_level = policy.notify_level;\n policy.notify_level = parseInt(target.val(), 10);\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n return target.parents(\".policy-table-row\").find(\"input[value=\" + prev_level + \"]\").prop(\"checked\", true);\n };\n return $repo.save(policy).then(onSuccess, onError);\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return bindOnce($scope, $attrs.ngModel, render);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserNotificationsList\", [\"$tgRepo\", \"$tgConfirm\", \"$compile\", UserNotificationsListDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: components.module.coffee\n */\n\n(function() {\n angular.module(\"taigaComponents\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaDiscover\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-apps.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaExternalApps\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.module.coffee\n */\n\n(function() {\n angular.module(\"taigaHistory\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaHome\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.module.coffee\n */\n\n(function() {\n angular.module(\"taigaNavigationBar\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaProfile\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects.module.coffee\n */\n\n(function() {\n angular.module(\"taigaProjects\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: resources.module.coffee\n */\n\n(function() {\n angular.module(\"taigaResources2\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.module.coffee\n */\n\n(function() {\n angular.module(\"taigaUserTimeline\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: utils.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUtils\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.module.coffee\n */\n\n(function() {\n angular.module(\"taigaWikiHistory\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to-selector.directive.coffee\n */\n\n(function() {\n var AssignedItemDirective;\n\n AssignedItemDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n templateUrl: \"components/assigned-to/assigned-item/assigned-item.html\",\n scope: {\n member: \"=\"\n },\n link: link\n };\n };\n\n AssignedItemDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedItem\", AssignedItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to-selector.controller.coffee\n */\n\n(function() {\n var AssignedToSelectorController;\n\n AssignedToSelectorController = (function() {\n AssignedToSelectorController.$inject = [];\n\n function AssignedToSelectorController() {\n if (this.assigned) {\n this._getAssignedMember();\n }\n this._filterAssignedMember();\n }\n\n AssignedToSelectorController.prototype._getAssignedMember = function() {\n return this.assignedMember = _.filter(this.project.members, (function(_this) {\n return function(member) {\n return member.id === _this.assigned.get('id');\n };\n })(this));\n };\n\n AssignedToSelectorController.prototype._filterAssignedMember = function() {\n if (this.assigned) {\n return this.nonAssignedMembers = _.filter(this.project.members, (function(_this) {\n return function(member) {\n return member.id !== _this.assigned.get('id');\n };\n })(this));\n } else {\n return this.nonAssignedMembers = this.project.members;\n }\n };\n\n return AssignedToSelectorController;\n\n })();\n\n angular.module('taigaComponents').controller('AssignedToSelectorCtrl', AssignedToSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to-selector.directive.coffee\n */\n\n(function() {\n var AssignedToSelectorDirective;\n\n AssignedToSelectorDirective = function() {\n return {\n controller: \"AssignedToSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/assigned-to/assigned-to-selector/assigned-to-selector.html\",\n scope: {\n assigned: \"=\",\n project: \"=\",\n onRemoveAssigned: \"&\",\n onAssignTo: \"&\"\n }\n };\n };\n\n AssignedToSelectorDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedToSelector\", AssignedToSelectorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to.controller.coffee\n */\n\n(function() {\n var AssignedToController;\n\n AssignedToController = (function() {\n AssignedToController.$inject = [\"tgLightboxFactory\", \"lightboxService\"];\n\n function AssignedToController(lightboxFactory, lightboxService) {\n this.lightboxFactory = lightboxFactory;\n this.lightboxService = lightboxService;\n this.has_permissions = _.includes(this.project.my_permissions, 'modify_epic');\n }\n\n AssignedToController.prototype._closeAndRemoveAssigned = function() {\n this.lightboxService.closeAll();\n return this.onRemoveAssigned();\n };\n\n AssignedToController.prototype._closeAndAssign = function(member) {\n this.lightboxService.closeAll();\n return this.onAssignTo({\n 'member': member\n });\n };\n\n AssignedToController.prototype.onSelectAssignedTo = function(assigned, project) {\n return this.lightboxFactory.create('tg-assigned-to-selector', {\n \"class\": \"lightbox lightbox-assigned-to-selector open\",\n \"assigned\": \"assigned\",\n \"project\": \"project\",\n \"on-remove-assigned\": \"onRemoveAssigned()\",\n \"on-assign-to\": \"assignTo(member)\"\n }, {\n \"assigned\": this.assignedTo,\n \"project\": this.project,\n \"onRemoveAssigned\": this._closeAndRemoveAssigned.bind(this),\n \"assignTo\": this._closeAndAssign.bind(this)\n });\n };\n\n return AssignedToController;\n\n })();\n\n angular.module('taigaComponents').controller('AssignedToCtrl', AssignedToController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to.directive.coffee\n */\n\n(function() {\n var AssignedToDirective;\n\n AssignedToDirective = function() {\n return {\n controller: \"AssignedToCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/assigned-to/assigned-to.html\",\n scope: {\n assignedTo: \"=\",\n project: \"=\",\n onRemoveAssigned: \"&\",\n onAssignTo: \"&\"\n }\n };\n };\n\n AssignedToDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedToComponent\", AssignedToDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment-link.directive.coffee\n */\n\n(function() {\n var AttachmentLinkDirective;\n\n AttachmentLinkDirective = function($parse, attachmentsPreviewService, lightboxService) {\n var link;\n link = function(scope, el, attrs) {\n var attachment;\n attachment = $parse(attrs.tgAttachmentLink)(scope);\n el.on(\"click\", function(event) {\n if (taiga.isImage(attachment.getIn(['file', 'name']))) {\n event.preventDefault();\n return scope.$apply(function() {\n lightboxService.open($('tg-attachments-preview'));\n return attachmentsPreviewService.fileId = attachment.getIn(['file', 'id']);\n });\n } else if (taiga.isPdf(attachment.getIn(['file', 'name']))) {\n event.preventDefault();\n return window.open(attachment.getIn(['file', 'url']));\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentLinkDirective.$inject = [\"$parse\", \"tgAttachmentsPreviewService\", \"lightboxService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentLink\", AttachmentLinkDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment-gallery.directive.coffee\n */\n\n(function() {\n var AttachmentGalleryDirective;\n\n AttachmentGalleryDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachment: \"=\",\n onDelete: \"&\",\n onUpdate: \"&\",\n type: \"=\"\n },\n controller: \"Attachment\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachment/attachment-gallery.html\",\n link: link\n };\n };\n\n AttachmentGalleryDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentGallery\", AttachmentGalleryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchment.controller.coffee\n */\n\n(function() {\n var AttachmentController;\n\n AttachmentController = (function() {\n AttachmentController.$inject = ['tgAttachmentsService', '$translate'];\n\n function AttachmentController(attachmentsService, translate) {\n this.attachmentsService = attachmentsService;\n this.translate = translate;\n this.form = {};\n this.form.description = this.attachment.getIn(['file', 'description']);\n this.form.is_deprecated = this.attachment.get(['file', 'is_deprecated']);\n this.title = this.translate.instant(\"ATTACHMENT.TITLE\", {\n fileName: this.attachment.get('name'),\n date: moment(this.attachment.get('created_date')).format(this.translate.instant(\"ATTACHMENT.DATE\"))\n });\n }\n\n AttachmentController.prototype.editMode = function(mode) {\n var attachment;\n attachment = this.attachment.set('editable', mode);\n return this.onUpdate({\n attachment: attachment\n });\n };\n\n AttachmentController.prototype[\"delete\"] = function() {\n return this.onDelete({\n attachment: this.attachment\n });\n };\n\n AttachmentController.prototype.save = function() {\n var attachment;\n attachment = this.attachment.set('loading', true);\n this.onUpdate({\n attachment: attachment\n });\n attachment = this.attachment.merge({\n editable: false,\n loading: false\n });\n attachment = attachment.mergeIn(['file'], {\n description: this.form.description,\n is_deprecated: !!this.form.is_deprecated\n });\n return this.onUpdate({\n attachment: attachment\n });\n };\n\n return AttachmentController;\n\n })();\n\n angular.module('taigaComponents').controller('Attachment', AttachmentController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment.directive.coffee\n */\n\n(function() {\n var AttachmentDirective;\n\n AttachmentDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachment: \"=\",\n onDelete: \"&\",\n onUpdate: \"&\",\n type: \"=\"\n },\n controller: \"Attachment\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachment/attachment.html\",\n link: link\n };\n };\n\n AttachmentDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachment\", AttachmentDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-drop.directive.coffee\n */\n\n(function() {\n var AttachmentsDropDirective;\n\n AttachmentsDropDirective = function($parse) {\n var link;\n link = function(scope, el, attrs) {\n var eventAttr;\n eventAttr = $parse(attrs.tgAttachmentsDrop);\n el.on('dragover', function(e) {\n e.preventDefault();\n return false;\n });\n el.on('drop', function(e) {\n var dataTransfer;\n e.stopPropagation();\n e.preventDefault();\n dataTransfer = e.dataTransfer || (e.originalEvent && e.originalEvent.dataTransfer);\n return scope.$apply(function() {\n return eventAttr(scope, {\n files: dataTransfer.files\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentsDropDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsDrop\", AttachmentsDropDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-full.controller.coffee\n */\n\n(function() {\n var AttachmentsFullController, sizeFormat;\n\n sizeFormat = this.taiga.sizeFormat;\n\n AttachmentsFullController = (function() {\n AttachmentsFullController.$inject = [\"$translate\", \"$tgConfirm\", \"$tgConfig\", \"$tgStorage\", \"tgAttachmentsFullService\", \"tgProjectService\", \"tgAttachmentsPreviewService\"];\n\n function AttachmentsFullController(translate, confirm, config, storage, attachmentsFullService, projectService, attachmentsPreviewService) {\n this.translate = translate;\n this.confirm = confirm;\n this.config = config;\n this.storage = storage;\n this.attachmentsFullService = attachmentsFullService;\n this.projectService = projectService;\n this.attachmentsPreviewService = attachmentsPreviewService;\n this.mode = this.storage.get('attachment-mode', 'list');\n this.maxFileSize = this.config.get(\"maxUploadFileSize\", null);\n if (this.maxFileSize) {\n this.maxFileSize = sizeFormat(this.maxFileSize);\n }\n this.maxFileSizeMsg = this.maxFileSize ? this.translate.instant(\"ATTACHMENT.MAX_UPLOAD_SIZE\", {\n maxFileSize: this.maxFileSize\n }) : \"\";\n taiga.defineImmutableProperty(this, 'attachments', (function(_this) {\n return function() {\n return _this.attachmentsFullService.attachments;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsCount', (function(_this) {\n return function() {\n return _this.attachmentsFullService.deprecatedsCount;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'attachmentsVisible', (function(_this) {\n return function() {\n return _this.attachmentsFullService.attachmentsVisible;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsVisible', (function(_this) {\n return function() {\n return _this.attachmentsFullService.deprecatedsVisible;\n };\n })(this));\n }\n\n AttachmentsFullController.prototype.uploadingAttachments = function() {\n return this.attachmentsFullService.uploadingAttachments;\n };\n\n AttachmentsFullController.prototype.addAttachment = function(file) {\n var editable;\n editable = this.mode === 'list';\n return this.attachmentsFullService.addAttachment(this.projectId, this.objId, this.type, file, editable);\n };\n\n AttachmentsFullController.prototype.setMode = function(mode) {\n this.mode = mode;\n return this.storage.set('attachment-mode', mode);\n };\n\n AttachmentsFullController.prototype.toggleDeprecatedsVisible = function() {\n return this.attachmentsFullService.toggleDeprecatedsVisible();\n };\n\n AttachmentsFullController.prototype.addAttachments = function(files) {\n return _.forEach(files, (function(_this) {\n return function(file) {\n return _this.addAttachment(file);\n };\n })(this));\n };\n\n AttachmentsFullController.prototype.loadAttachments = function() {\n return this.attachmentsFullService.loadAttachments(this.type, this.objId, this.projectId);\n };\n\n AttachmentsFullController.prototype.deleteAttachment = function(toDeleteAttachment) {\n var message, title;\n this.attachmentsPreviewService.fileId = null;\n title = this.translate.instant(\"ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT\");\n message = this.translate.instant(\"ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT\", {\n fileName: toDeleteAttachment.getIn(['file', 'name'])\n });\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onError = function() {\n message = _this.translate.instant(\"ATTACHMENT.ERROR_DELETE_ATTACHMENT\", {\n errorMessage: message\n });\n _this.confirm.notify(\"error\", null, message);\n return askResponse.finish(false);\n };\n onSuccess = function() {\n return askResponse.finish();\n };\n return _this.attachmentsFullService.deleteAttachment(toDeleteAttachment, _this.type).then(onSuccess, onError);\n };\n })(this));\n };\n\n AttachmentsFullController.prototype.reorderAttachment = function(attachment, newIndex) {\n return this.attachmentsFullService.reorderAttachment(this.type, attachment, newIndex);\n };\n\n AttachmentsFullController.prototype.updateAttachment = function(toUpdateAttachment) {\n return this.attachmentsFullService.updateAttachment(toUpdateAttachment, this.type);\n };\n\n AttachmentsFullController.prototype._isEditable = function() {\n if (this.projectService.project) {\n return this.projectService.hasPermission(this.editPermission);\n }\n return false;\n };\n\n AttachmentsFullController.prototype.showAttachments = function() {\n return this._isEditable() || this.attachmentsFullService.attachments.size;\n };\n\n return AttachmentsFullController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"AttachmentsFull\", AttachmentsFullController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-full.directive.coffee\n */\n\n(function() {\n var AttachmentsFullDirective, bindOnce;\n\n bindOnce = this.taiga.bindOnce;\n\n AttachmentsFullDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return bindOnce(scope, 'vm.objId', function(value) {\n return ctrl.loadAttachments();\n });\n };\n return {\n scope: {},\n bindToController: {\n type: \"@\",\n objId: \"=\",\n projectId: \"=\",\n editPermission: \"@\"\n },\n controller: \"AttachmentsFull\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachments-full/attachments-full.html\",\n link: link\n };\n };\n\n AttachmentsFullDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsFull\", AttachmentsFullDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-full.service.coffee\n */\n\n(function() {\n var AttachmentsFullService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n AttachmentsFullService = (function(superClass) {\n extend(AttachmentsFullService, superClass);\n\n AttachmentsFullService.$inject = [\"tgAttachmentsService\", \"$rootScope\"];\n\n function AttachmentsFullService(attachmentsService, rootScope) {\n this.attachmentsService = attachmentsService;\n this.rootScope = rootScope;\n this._attachments = Immutable.List();\n this._deprecatedsCount = 0;\n this._attachmentsVisible = Immutable.List();\n this._deprecatedsVisible = false;\n this.uploadingAttachments = [];\n taiga.defineImmutableProperty(this, 'attachments', (function(_this) {\n return function() {\n return _this._attachments;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsCount', (function(_this) {\n return function() {\n return _this._deprecatedsCount;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'attachmentsVisible', (function(_this) {\n return function() {\n return _this._attachmentsVisible;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsVisible', (function(_this) {\n return function() {\n return _this._deprecatedsVisible;\n };\n })(this));\n }\n\n AttachmentsFullService.prototype.toggleDeprecatedsVisible = function() {\n this._deprecatedsVisible = !this._deprecatedsVisible;\n return this.regenerate();\n };\n\n AttachmentsFullService.prototype.regenerate = function() {\n this._deprecatedsCount = this._attachments.count(function(it) {\n return it.getIn(['file', 'is_deprecated']);\n });\n if (this._deprecatedsVisible) {\n return this._attachmentsVisible = this._attachments;\n } else {\n return this._attachmentsVisible = this._attachments.filter(function(it) {\n return !it.getIn(['file', 'is_deprecated']);\n });\n }\n };\n\n AttachmentsFullService.prototype.addAttachment = function(projectId, objId, type, file, editable, comment) {\n if (editable == null) {\n editable = true;\n }\n if (comment == null) {\n comment = false;\n }\n return new Promise((function(_this) {\n return function(resolve, reject) {\n var promise;\n if (_this.attachmentsService.validate(file)) {\n _this.uploadingAttachments.push(file);\n promise = _this.attachmentsService.upload(file, objId, projectId, type, comment);\n return promise.then(function(file) {\n var attachment;\n _this.uploadingAttachments = _this.uploadingAttachments.filter(function(uploading) {\n return uploading.name !== file.get('name');\n });\n attachment = Immutable.Map();\n attachment = attachment.merge({\n file: file,\n editable: editable,\n loading: false,\n from_comment: comment\n });\n _this._attachments = _this._attachments.push(attachment);\n _this.regenerate();\n _this.rootScope.$broadcast(\"attachment:create\");\n return resolve(attachment);\n });\n } else {\n return reject(new Error(file));\n }\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.loadAttachments = function(type, objId, projectId) {\n return this.attachmentsService.list(type, objId, projectId).then((function(_this) {\n return function(files) {\n _this._attachments = files.map(function(file) {\n var attachment;\n attachment = Immutable.Map();\n return attachment.merge({\n loading: false,\n editable: false,\n file: file\n });\n });\n return _this.regenerate();\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.deleteAttachment = function(toDeleteAttachment, type) {\n var onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this._attachments = _this._attachments.filter(function(attachment) {\n return attachment !== toDeleteAttachment;\n });\n return _this.regenerate();\n };\n })(this);\n return this.attachmentsService[\"delete\"](type, toDeleteAttachment.getIn(['file', 'id'])).then(onSuccess);\n };\n\n AttachmentsFullService.prototype.reorderAttachment = function(type, attachment, newIndex) {\n var attachments, oldIndex, promises;\n oldIndex = this.attachments.findIndex(function(it) {\n return it === attachment;\n });\n if (oldIndex === newIndex) {\n return;\n }\n attachments = this.attachments.remove(oldIndex);\n attachments = attachments.splice(newIndex, 0, attachment);\n attachments = attachments.map(function(x, i) {\n return x.setIn(['file', 'order'], i + 1);\n });\n promises = [];\n attachments.forEach((function(_this) {\n return function(attachment) {\n var patch;\n patch = {\n order: attachment.getIn(['file', 'order'])\n };\n return promises.push(_this.attachmentsService.patch(attachment.getIn(['file', 'id']), type, patch));\n };\n })(this));\n return Promise.all(promises).then((function(_this) {\n return function() {\n _this._attachments = attachments;\n return _this.regenerate();\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.updateAttachment = function(toUpdateAttachment, type) {\n var index, oldAttachment, patch;\n index = this._attachments.findIndex(function(attachment) {\n return attachment.getIn(['file', 'id']) === toUpdateAttachment.getIn(['file', 'id']);\n });\n oldAttachment = this._attachments.get(index);\n patch = taiga.patch(oldAttachment.get('file'), toUpdateAttachment.get('file'));\n if (toUpdateAttachment.get('loading')) {\n this._attachments = this._attachments.set(index, toUpdateAttachment);\n return this.regenerate();\n } else {\n return this.attachmentsService.patch(toUpdateAttachment.getIn(['file', 'id']), type, patch).then((function(_this) {\n return function() {\n _this._attachments = _this._attachments.set(index, toUpdateAttachment);\n return _this.regenerate();\n };\n })(this));\n }\n };\n\n return AttachmentsFullService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgAttachmentsFullService\", AttachmentsFullService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-preview.controller.coffee\n */\n\n(function() {\n var AttachmentsPreviewController;\n\n AttachmentsPreviewController = (function() {\n AttachmentsPreviewController.$inject = [\"tgAttachmentsPreviewService\"];\n\n function AttachmentsPreviewController(attachmentsPreviewService) {\n this.attachmentsPreviewService = attachmentsPreviewService;\n taiga.defineImmutableProperty(this, \"current\", (function(_this) {\n return function() {\n if (!_this.attachmentsPreviewService.fileId) {\n return null;\n }\n return _this.getCurrent();\n };\n })(this));\n }\n\n AttachmentsPreviewController.prototype.hasPagination = function() {\n var images;\n images = this.attachments.filter((function(_this) {\n return function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n };\n })(this));\n return images.size > 1;\n };\n\n AttachmentsPreviewController.prototype.getCurrent = function() {\n var attachment, file;\n attachment = this.attachments.find((function(_this) {\n return function(attachment) {\n return _this.attachmentsPreviewService.fileId === attachment.getIn(['file', 'id']);\n };\n })(this));\n file = attachment.get('file');\n return file;\n };\n\n AttachmentsPreviewController.prototype.getIndex = function() {\n return this.attachments.findIndex((function(_this) {\n return function(attachment) {\n return _this.attachmentsPreviewService.fileId === attachment.getIn(['file', 'id']);\n };\n })(this));\n };\n\n AttachmentsPreviewController.prototype.next = function() {\n var attachmentIndex, image;\n attachmentIndex = this.getIndex();\n image = this.attachments.slice(attachmentIndex + 1).find(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n if (!image) {\n image = this.attachments.find(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n }\n return this.attachmentsPreviewService.fileId = image.getIn(['file', 'id']);\n };\n\n AttachmentsPreviewController.prototype.previous = function() {\n var attachmentIndex, image;\n attachmentIndex = this.getIndex();\n image = this.attachments.slice(0, attachmentIndex).findLast(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n if (!image) {\n image = this.attachments.findLast(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n }\n return this.attachmentsPreviewService.fileId = image.getIn(['file', 'id']);\n };\n\n return AttachmentsPreviewController;\n\n })();\n\n angular.module('taigaComponents').controller('AttachmentsPreview', AttachmentsPreviewController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-preview.directive.coffee\n */\n\n(function() {\n var AttachmentPreviewLightboxDirective;\n\n AttachmentPreviewLightboxDirective = function(lightboxService, attachmentsPreviewService) {\n var link;\n link = function($scope, el, attrs, ctrl) {\n $(document.body).on(\"keydown.image-preview\", function(e) {\n if (attachmentsPreviewService.fileId) {\n if (e.keyCode === 39) {\n ctrl.next();\n } else if (e.keyCode === 37) {\n ctrl.previous();\n }\n }\n return $scope.$digest();\n });\n return $scope.$on('$destroy', function() {\n return $(document.body).off('.image-preview');\n });\n };\n return {\n scope: {},\n controller: 'AttachmentsPreview',\n templateUrl: 'components/attachments-preview/attachments-preview.html',\n link: link,\n controllerAs: \"vm\",\n bindToController: {\n attachments: \"=\"\n }\n };\n };\n\n angular.module('taigaComponents').directive(\"tgAttachmentsPreview\", [\"lightboxService\", \"tgAttachmentsPreviewService\", AttachmentPreviewLightboxDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-preview.service.coffee\n */\n\n(function() {\n var AttachmentsPreviewService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n AttachmentsPreviewService = (function(superClass) {\n extend(AttachmentsPreviewService, superClass);\n\n AttachmentsPreviewService.$inject = [];\n\n function AttachmentsPreviewService() {}\n\n return AttachmentsPreviewService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgAttachmentsPreviewService\", AttachmentsPreviewService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-simple.controller.coffee\n */\n\n(function() {\n var AttachmentsSimpleController;\n\n AttachmentsSimpleController = (function() {\n AttachmentsSimpleController.$inject = [\"tgAttachmentsService\"];\n\n function AttachmentsSimpleController(attachmentsService) {\n this.attachmentsService = attachmentsService;\n }\n\n AttachmentsSimpleController.prototype.addAttachment = function(file) {\n var attachment;\n attachment = Immutable.fromJS({\n file: file,\n name: file.name,\n size: file.size\n });\n if (this.attachmentsService.validate(file)) {\n this.attachments = this.attachments.push(attachment);\n if (this.onAdd) {\n return this.onAdd({\n attachment: attachment\n });\n }\n }\n };\n\n AttachmentsSimpleController.prototype.addAttachments = function(files) {\n return _.forEach(files, this.addAttachment.bind(this));\n };\n\n AttachmentsSimpleController.prototype.deleteAttachment = function(toDeleteAttachment) {\n this.attachments = this.attachments.filter(function(attachment) {\n return attachment !== toDeleteAttachment;\n });\n if (this.onDelete) {\n return this.onDelete({\n attachment: toDeleteAttachment\n });\n }\n };\n\n return AttachmentsSimpleController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"AttachmentsSimple\", AttachmentsSimpleController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-simple.directive.coffee\n */\n\n(function() {\n var AttachmentsSimpleDirective;\n\n AttachmentsSimpleDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachments: \"=\",\n onAdd: \"&\",\n onDelete: \"&\"\n },\n controller: \"AttachmentsSimple\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachments-simple/attachments-simple.html\",\n link: link\n };\n };\n\n AttachmentsSimpleDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsSimple\", AttachmentsSimpleDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-sortable.directive.coffee\n */\n\n(function() {\n var AttachmentSortableDirective;\n\n AttachmentSortableDirective = function($parse) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n callback = $parse(attrs.tgAttachmentsSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var attachment, newIndex;\n item = $(item);\n attachment = item.scope().attachment;\n newIndex = item.index();\n return scope.$apply(function() {\n return callback(scope, {\n attachment: attachment,\n index: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentSortableDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsSortable\", AttachmentSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: auto-select.directive.coffee\n */\n\n(function() {\n var AutoSelectDirective;\n\n AutoSelectDirective = function($timeout) {\n return {\n link: function(scope, elm) {\n return $timeout(function() {\n return elm[0].select();\n });\n }\n };\n };\n\n AutoSelectDirective.$inject = ['$timeout'];\n\n angular.module(\"taigaComponents\").directive(\"tgAutoSelect\", AutoSelectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: avatar.directive.coffee\n */\n\n(function() {\n var AvatarDirective;\n\n AvatarDirective = function(avatarService) {\n var link;\n link = function(scope, el, attrs) {\n var attributeName;\n if (attrs.tgAvatarBig) {\n attributeName = 'avatarBig';\n } else {\n attributeName = 'avatar';\n }\n return scope.$watch(attributeName, function(user) {\n var avatar;\n avatar = avatarService.getAvatar(user, attributeName);\n el.attr('src', avatar.url);\n return el.css('background', avatar.bg || \"\");\n });\n };\n return {\n link: link,\n scope: {\n avatar: \"=tgAvatar\",\n avatarBig: \"=tgAvatarBig\"\n }\n };\n };\n\n AvatarDirective.$inject = ['tgAvatarService'];\n\n angular.module(\"taigaComponents\").directive(\"tgAvatar\", AvatarDirective);\n\n angular.module(\"taigaComponents\").directive(\"tgAvatarBig\", AvatarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: belong-to-epics.directive.coffee\n */\n\n(function() {\n var BelongToEpicsDirective, module;\n\n module = angular.module('taigaEpics');\n\n BelongToEpicsDirective = function() {\n var link, templateUrl;\n link = function(scope, el, attrs) {\n return scope.$watch('epics', function(epics) {\n if (epics && !epics.isIterable) {\n return scope.immutable_epics = Immutable.fromJS(epics);\n }\n });\n };\n templateUrl = function(el, attrs) {\n if (attrs.format) {\n return \"components/belong-to-epics/belong-to-epics-\" + attrs.format + \".html\";\n }\n return \"components/belong-to-epics/belong-to-epics-pill.html\";\n };\n return {\n link: link,\n scope: {\n epics: '='\n },\n templateUrl: templateUrl\n };\n };\n\n module.directive(\"tgBelongToEpics\", BelongToEpicsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/bind-code.directive.coffee\n */\n\n(function() {\n var BindCode;\n\n BindCode = function($sce, $parse, $compile, wysiwygService, wysiwygCodeHightlighterService) {\n return {\n restrict: 'A',\n compile: function(tElement, tAttrs) {\n var tgBindCodeGetter, tgBindCodeWatch;\n tgBindCodeGetter = $parse(tAttrs.tgBindCode);\n tgBindCodeWatch = $parse(tAttrs.tgBindCode, function(value) {\n return (value || '').toString();\n });\n $compile.$$addBindingClass(tElement);\n return function(scope, element, attr) {\n $compile.$$addBindingInfo(element, attr.tgBindCode);\n return scope.$watch(tgBindCodeWatch, function() {\n var html;\n html = wysiwygService.getHTML(tgBindCodeGetter(scope));\n element.html($sce.getTrustedHtml(html) || '');\n return wysiwygCodeHightlighterService.addHightlighter(element);\n });\n };\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgBindCode\", [\"$sce\", \"$parse\", \"$compile\", \"tgWysiwygService\", \"tgWysiwygCodeHightlighterService\", BindCode]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: board-zoom.directive.coffee\n */\n\n(function() {\n var BoardZoomDirective;\n\n BoardZoomDirective = function() {\n return {\n scope: {\n levels: \"=\",\n value: \"=\"\n },\n templateUrl: 'components/board-zoom/board-zoom.html'\n };\n };\n\n angular.module('taigaComponents').directive(\"tgBoardZoom\", [BoardZoomDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: card-slideshow.controller.coffee\n */\n\n(function() {\n var CardSlideshowController;\n\n CardSlideshowController = (function() {\n CardSlideshowController.$inject = [];\n\n function CardSlideshowController() {\n this.index = 0;\n }\n\n CardSlideshowController.prototype.next = function() {\n this.index++;\n if (this.index >= this.images.size) {\n return this.index = 0;\n }\n };\n\n CardSlideshowController.prototype.previous = function() {\n this.index--;\n if (this.index < 0) {\n return this.index = this.images.size - 1;\n }\n };\n\n return CardSlideshowController;\n\n })();\n\n angular.module('taigaComponents').controller('CardSlideshow', CardSlideshowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: card.directive.coffee\n */\n\n(function() {\n var cardSlideshowDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n cardSlideshowDirective = function() {\n return {\n controller: \"CardSlideshow\",\n templateUrl: \"components/card-slideshow/card-slideshow.html\",\n bindToController: true,\n controllerAs: \"vm\",\n scope: {\n images: \"=\"\n }\n };\n };\n\n module.directive('tgCardSlideshow', cardSlideshowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: card.controller.coffee\n */\n\n(function() {\n var CardController;\n\n CardController = (function() {\n function CardController() {}\n\n CardController.$inject = [];\n\n CardController.prototype.visible = function(name) {\n return this.zoom.indexOf(name) !== -1;\n };\n\n CardController.prototype.hasTasks = function() {\n var tasks;\n tasks = this.item.getIn(['model', 'tasks']);\n return tasks && tasks.size > 0;\n };\n\n CardController.prototype.hasMultipleAssignedUsers = function() {\n var assignedUsers;\n assignedUsers = this.item.getIn(['model', 'assigned_users']);\n return assignedUsers && assignedUsers.size > 1;\n };\n\n CardController.prototype.hasVisibleAttachments = function() {\n return this.item.get('images').size > 0;\n };\n\n CardController.prototype.toggleFold = function() {\n return this.onToggleFold({\n id: this.item.get('id')\n });\n };\n\n CardController.prototype.getClosedTasks = function() {\n return this.item.getIn(['model', 'tasks']).filter(function(task) {\n return task.get('is_closed');\n });\n };\n\n CardController.prototype.closedTasksPercent = function() {\n return this.getClosedTasks().size * 100 / this.item.getIn(['model', 'tasks']).size;\n };\n\n CardController.prototype.getModifyPermisionKey = function() {\n if (this.type === 'task') {\n return 'modify_task';\n } else {\n return 'modify_us';\n }\n };\n\n CardController.prototype.getDeletePermisionKey = function() {\n if (this.type === 'task') {\n return 'delete_task';\n } else {\n return 'delete_us';\n }\n };\n\n CardController.prototype._setVisibility = function() {\n var visibility;\n visibility = {\n related: this.visible('related_tasks'),\n slides: this.visible('attachments')\n };\n if (!_.isUndefined(this.item.get('foldStatusChanged'))) {\n if (this.visible('related_tasks') && this.visible('attachments')) {\n visibility.related = !this.item.get('foldStatusChanged');\n visibility.slides = !this.item.get('foldStatusChanged');\n } else if (this.visible('attachments')) {\n visibility.related = this.item.get('foldStatusChanged');\n visibility.slides = this.item.get('foldStatusChanged');\n } else if (!this.visible('related_tasks') && !this.visible('attachments')) {\n visibility.related = this.item.get('foldStatusChanged');\n visibility.slides = this.item.get('foldStatusChanged');\n }\n }\n if (!this.item.getIn(['model', 'tasks']) || !this.item.getIn(['model', 'tasks']).size) {\n visibility.related = false;\n }\n if (!this.item.get('images') || !this.item.get('images').size) {\n visibility.slides = false;\n }\n return visibility;\n };\n\n CardController.prototype.isRelatedTasksVisible = function() {\n var visibility;\n visibility = this._setVisibility();\n return visibility.related;\n };\n\n CardController.prototype.isSlideshowVisible = function() {\n var visibility;\n visibility = this._setVisibility();\n return visibility.slides;\n };\n\n CardController.prototype.getNavKey = function() {\n if (this.type === 'task') {\n return 'project-tasks-detail';\n } else {\n return 'project-userstories-detail';\n }\n };\n\n return CardController;\n\n })();\n\n angular.module('taigaComponents').controller('Card', CardController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: card.directive.coffee\n */\n\n(function() {\n var cardDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n cardDirective = function() {\n return {\n link: function(scope) {},\n controller: \"Card\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/card/card.html\",\n scope: {\n onToggleFold: \"&\",\n onClickAssignedTo: \"&\",\n onClickEdit: \"&\",\n onClickDelete: \"&\",\n project: \"=\",\n item: \"=\",\n zoom: \"=\",\n zoomLevel: \"=\",\n archived: \"=\",\n type: \"@\"\n }\n };\n };\n\n module.directive('tgCard', cardDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/click-input-file.directive.coffee\n */\n\n(function() {\n var ClickInputFile;\n\n ClickInputFile = function() {\n return {\n link: function(scope, el) {\n el.on('click', function(e) {\n var inputFile;\n if (!$(e.target).is('input')) {\n e.preventDefault();\n inputFile = el.find('input[type=\"file\"]');\n inputFile.val('');\n return inputFile.trigger('click');\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgClickInputFile\", [ClickInputFile]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: color-selector.controller.coffee\n */\n\n(function() {\n var ColorSelectorController, getDefaulColorList, taiga;\n\n taiga = this.taiga;\n\n getDefaulColorList = taiga.getDefaulColorList;\n\n ColorSelectorController = (function() {\n ColorSelectorController.$inject = [\"tgProjectService\"];\n\n function ColorSelectorController(projectService) {\n this.projectService = projectService;\n this.colorList = getDefaulColorList();\n this.checkIsColorRequired();\n this.displayColorList = false;\n }\n\n ColorSelectorController.prototype.userCanChangeColor = function() {\n if (!this.requiredPerm) {\n return true;\n }\n return this.projectService.hasPermission(this.requiredPerm);\n };\n\n ColorSelectorController.prototype.checkIsColorRequired = function() {\n if (!this.isColorRequired) {\n return this.colorList = _.dropRight(this.colorList);\n }\n };\n\n ColorSelectorController.prototype.setColor = function(color) {\n this.color = color;\n return this.customColor = color;\n };\n\n ColorSelectorController.prototype.resetColor = function() {\n if (this.isColorRequired && !this.color) {\n return this.color = this.initColor;\n }\n };\n\n ColorSelectorController.prototype.toggleColorList = function() {\n this.displayColorList = !this.displayColorList;\n this.customColor = this.color;\n return this.resetColor();\n };\n\n ColorSelectorController.prototype.onSelectDropdownColor = function(color) {\n this.color = color;\n this.onSelectColor({\n color: color\n });\n return this.toggleColorList();\n };\n\n ColorSelectorController.prototype.onKeyDown = function(event) {\n if (event.which === 13) {\n if (this.customColor || !this.isColorRequired) {\n this.onSelectDropdownColor(this.customColor);\n }\n return event.preventDefault();\n }\n };\n\n return ColorSelectorController;\n\n })();\n\n angular.module('taigaComponents').controller(\"ColorSelectorCtrl\", ColorSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: color-selector.directive.coffee\n */\n\n(function() {\n var ColorSelectorDirective, bindOnce;\n\n bindOnce = this.taiga.bindOnce;\n\n ColorSelectorDirective = function($timeout) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var _timeout, cancel, close;\n _timeout = null;\n cancel = function() {\n $timeout.cancel(_timeout);\n return _timeout = null;\n };\n close = function() {\n if (_timeout) {\n return;\n }\n return _timeout = $timeout((function() {\n ctrl.displayColorList = false;\n return ctrl.resetColor();\n }), 400);\n };\n el.find('.color-selector').mouseenter(cancel).mouseleave(close);\n el.find('.color-selector-dropdown').mouseenter(cancel).mouseleave(close);\n return scope.$watch('vm.initColor', function(color) {\n return ctrl.setColor(color);\n });\n };\n return {\n link: link,\n templateUrl: \"components/color-selector/color-selector.html\",\n controller: \"ColorSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n isColorRequired: \"=\",\n onSelectColor: \"&\",\n initColor: \"=\",\n requiredPerm: \"@\"\n },\n scope: {}\n };\n };\n\n ColorSelectorDirective.$inject = [\"$timeout\"];\n\n angular.module('taigaComponents').directive(\"tgColorSelector\", ColorSelectorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: story-header.controller.coffee\n */\n\n(function() {\n var StoryHeaderController, module;\n\n module = angular.module(\"taigaUserStories\");\n\n StoryHeaderController = (function() {\n StoryHeaderController.$inject = [\"$rootScope\", \"$tgConfirm\", \"$tgQueueModelTransformation\", \"$tgNavUrls\", \"$window\"];\n\n function StoryHeaderController(rootScope, confirm, modelTransform, navUrls, window) {\n this.rootScope = rootScope;\n this.confirm = confirm;\n this.modelTransform = modelTransform;\n this.navUrls = navUrls;\n this.window = window;\n this.editMode = false;\n this.loadingSubject = false;\n this.originalSubject = this.item.subject;\n }\n\n StoryHeaderController.prototype._checkNav = function() {\n var ctx, ref, ref1;\n if (((ref = this.item.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: this.project.slug,\n ref: this.item.neighbors.previous.ref\n };\n this.previousUrl = this.navUrls.resolve(\"project-\" + this.item._name + \"-detail\", ctx);\n }\n if (((ref1 = this.item.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: this.project.slug,\n ref: this.item.neighbors.next.ref\n };\n return this.nextUrl = this.navUrls.resolve(\"project-\" + this.item._name + \"-detail\", ctx);\n }\n };\n\n StoryHeaderController.prototype._checkPermissions = function() {\n return this.permissions = {\n canEdit: _.includes(this.project.my_permissions, this.requiredPerm)\n };\n };\n\n StoryHeaderController.prototype.editSubject = function(value) {\n var selection;\n selection = this.window.getSelection();\n if (selection.type !== \"Range\") {\n if (value) {\n this.editMode = true;\n }\n if (!value) {\n return this.editMode = false;\n }\n }\n };\n\n StoryHeaderController.prototype.onKeyDown = function(event) {\n if (event.which === 13) {\n this.saveSubject();\n }\n if (event.which === 27) {\n this.item.subject = this.originalSubject;\n return this.editSubject(false);\n }\n };\n\n StoryHeaderController.prototype.saveSubject = function() {\n var item, onEditSubjectError, onEditSubjectSuccess, transform;\n onEditSubjectSuccess = (function(_this) {\n return function() {\n _this.loadingSubject = false;\n _this.rootScope.$broadcast(\"object:updated\");\n _this.confirm.notify('success');\n return _this.originalSubject = _this.item.subject;\n };\n })(this);\n onEditSubjectError = (function(_this) {\n return function() {\n _this.loadingSubject = false;\n return _this.confirm.notify('error');\n };\n })(this);\n this.editMode = false;\n this.loadingSubject = true;\n item = this.item;\n transform = this.modelTransform.save(function(item) {\n return item;\n });\n return transform.then(onEditSubjectSuccess, onEditSubjectError);\n };\n\n return StoryHeaderController;\n\n })();\n\n module.controller(\"StoryHeaderCtrl\", StoryHeaderController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: story-header.directive.coffee\n */\n\n(function() {\n var DetailHeaderDirective, module;\n\n module = angular.module('taigaUserStories');\n\n DetailHeaderDirective = function() {\n var link;\n this.$inject = [];\n link = function(scope, el, attrs, ctrl) {\n ctrl._checkPermissions();\n return ctrl._checkNav();\n };\n return {\n link: link,\n controller: \"StoryHeaderCtrl\",\n bindToController: true,\n scope: {\n item: \"=\",\n project: \"=\",\n requiredPerm: \"@\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/detail/header/detail-header.html\"\n };\n };\n\n module.directive(\"tgDetailHeader\", DetailHeaderDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2018 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: due-date-controller.coffee\n */\n\n(function() {\n var DueDateController;\n\n DueDateController = (function() {\n DueDateController.$inject = [\"$translate\", \"tgLightboxFactory\"];\n\n function DueDateController(translate, tgLightboxFactory) {\n this.translate = translate;\n this.tgLightboxFactory = tgLightboxFactory;\n }\n\n DueDateController.prototype.visible = function() {\n return this.format === 'button' || (this.dueDate != null);\n };\n\n DueDateController.prototype.disabled = function() {\n return this.isClosed;\n };\n\n DueDateController.prototype.color = function() {\n var colors;\n colors = {\n 'no_longer_applicable': 'closed',\n 'due_soon': 'due-soon',\n 'past_due': 'past-due',\n 'set': 'due-set'\n };\n return colors[this.dueDateStatus] || '';\n };\n\n DueDateController.prototype.title = function() {\n if (this.format === 'button') {\n if (this.dueDate) {\n return this._formatTitle();\n } else {\n return 'Edit due date';\n }\n }\n return this._formatTitle();\n };\n\n DueDateController.prototype._formatTitle = function() {\n var dueDateStatus, formatedDate, prettyDate, titles;\n dueDateStatus = 'closed';\n titles = {\n 'no_longer_applicable': 'COMMON.DUE_DATE.NO_LONGER_APPLICABLE',\n 'due_soon': 'COMMON.DUE_DATE.DUE_SOON',\n 'past_due': 'COMMON.DUE_DATE.PAST_DUE'\n };\n prettyDate = this.translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n formatedDate = moment(this.dueDate).format(prettyDate);\n if (!titles[this.dueDateStatus]) {\n return formatedDate;\n }\n return formatedDate + \" (\" + (this.translate.instant(titles[this.dueDateStatus])) + \")\";\n };\n\n DueDateController.prototype.setDueDate = function() {\n if (this.disabled()) {\n return;\n }\n return this.tgLightboxFactory.create(\"tg-lb-set-due-date\", {\n \"class\": \"lightbox lightbox-set-due-date\"\n }, {\n \"object\": this.item\n });\n };\n\n return DueDateController;\n\n })();\n\n angular.module('taigaComponents').controller('DueDate', DueDateController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2018 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: due-date.directive.coffee\n */\n\n(function() {\n var dueDateDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n dueDateDirective = function() {\n var templateUrl;\n templateUrl = function(el, attrs) {\n if (attrs.format) {\n return \"components/due-date/due-date-\" + attrs.format + \".html\";\n }\n return \"components/due-date/due-date-icon.html\";\n };\n return {\n link: function(scope) {},\n controller: \"DueDate\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: templateUrl,\n scope: {\n dueDate: '=',\n dueDateStatus: '=',\n isClosed: '=',\n item: '=',\n format: '@'\n }\n };\n };\n\n module.directive('tgDueDate', dueDateDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: file-change.directive.coffee\n */\n\n(function() {\n var FileChangeDirective;\n\n FileChangeDirective = function($parse) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var eventAttr;\n eventAttr = $parse(attrs.tgFileChange);\n el.on('change', function(event) {\n return scope.$apply(function() {\n return eventAttr(scope, {\n files: event.currentTarget.files\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n restrict: \"A\",\n link: link\n };\n };\n\n FileChangeDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgFileChange\", FileChangeDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: filter-utils.service.coffee\n */\n\n(function() {\n var FilterRemoteStorageService, generateHash,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n generateHash = taiga.generateHash;\n\n FilterRemoteStorageService = (function(superClass) {\n extend(FilterRemoteStorageService, superClass);\n\n FilterRemoteStorageService.$inject = [\"$q\", \"$tgUrls\", \"$tgHttp\"];\n\n function FilterRemoteStorageService(q, urls, http) {\n this.q = q;\n this.urls = urls;\n this.http = http;\n }\n\n FilterRemoteStorageService.prototype.storeFilters = function(projectId, myFilters, filtersHashSuffix) {\n var deferred, hash, ns, promise, url;\n deferred = this.q.defer();\n url = this.urls.resolve(\"user-storage\");\n ns = projectId + \":\" + filtersHashSuffix;\n hash = generateHash([projectId, ns]);\n if (_.isEmpty(myFilters)) {\n promise = this.http[\"delete\"](url + \"/\" + hash, {\n key: hash,\n value: myFilters\n });\n promise.then(function() {\n return deferred.resolve();\n });\n promise.then(null, function() {\n return deferred.reject();\n });\n } else {\n promise = this.http.put(url + \"/\" + hash, {\n key: hash,\n value: myFilters\n });\n promise.then(function(data) {\n return deferred.resolve();\n });\n promise.then(null, (function(_this) {\n return function(data) {\n var innerPromise;\n innerPromise = _this.http.post(\"\" + url, {\n key: hash,\n value: myFilters\n });\n innerPromise.then(function() {\n return deferred.resolve();\n });\n return innerPromise.then(null, function() {\n return deferred.reject();\n });\n };\n })(this));\n }\n return deferred.promise;\n };\n\n FilterRemoteStorageService.prototype.getFilters = function(projectId, filtersHashSuffix) {\n var deferred, hash, ns, promise, url;\n deferred = this.q.defer();\n url = this.urls.resolve(\"user-storage\");\n ns = projectId + \":\" + filtersHashSuffix;\n hash = generateHash([projectId, ns]);\n promise = this.http.get(url + \"/\" + hash);\n promise.then(function(data) {\n return deferred.resolve(data.data.value);\n });\n promise.then(null, function(data) {\n return deferred.resolve({});\n });\n return deferred.promise;\n };\n\n return FilterRemoteStorageService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgFilterRemoteStorageService\", FilterRemoteStorageService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: filter.-slide-down.controller.coffee\n */\n\n(function() {\n var FilterSlideDownDirective;\n\n FilterSlideDownDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var filter;\n filter = $('tg-filter');\n return scope.$watch(attrs.ngIf, function(value) {\n var contentHeight, wrapperHeight;\n if (value) {\n filter.find('.filter-list').hide();\n wrapperHeight = filter.height();\n contentHeight = 0;\n filter.children().each(function() {\n return contentHeight += $(this).outerHeight(true);\n });\n return $(el.context.nextSibling).css({\n \"max-height\": wrapperHeight - contentHeight,\n \"display\": \"block\"\n });\n }\n });\n };\n return {\n priority: 900,\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgFilterSlideDown\", [FilterSlideDownDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: filter.controller.coffee\n */\n\n(function() {\n var FilterController;\n\n FilterController = (function() {\n FilterController.$inject = [];\n\n function FilterController() {\n this.opened = null;\n this.customFilterForm = false;\n this.customFilterName = '';\n }\n\n FilterController.prototype.toggleFilterCategory = function(filterName) {\n if (this.opened === filterName) {\n return this.opened = null;\n } else {\n return this.opened = filterName;\n }\n };\n\n FilterController.prototype.isOpen = function(filterName) {\n return this.opened === filterName;\n };\n\n FilterController.prototype.saveCustomFilter = function() {\n this.onSaveCustomFilter({\n name: this.customFilterName\n });\n this.customFilterForm = false;\n this.opened = 'custom-filter';\n return this.customFilterName = '';\n };\n\n FilterController.prototype.changeQ = function() {\n return this.onChangeQ({\n q: this.q\n });\n };\n\n FilterController.prototype.unselectFilter = function(filter) {\n return this.onRemoveFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.unselectFilter = function(filter) {\n return this.onRemoveFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.selectFilter = function(filterCategory, filter) {\n filter = {\n category: filterCategory,\n filter: filter\n };\n return this.onAddFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.removeCustomFilter = function(filter) {\n return this.onRemoveCustomFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.selectCustomFilter = function(filter) {\n return this.onSelectCustomFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.isFilterSelected = function(filterCategory, filter) {\n return !!_.find(this.selectedFilters, function(it) {\n return filter.id === it.id && filterCategory.dataType === it.dataType;\n });\n };\n\n return FilterController;\n\n })();\n\n angular.module('taigaComponents').controller('Filter', FilterController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: filter.directive.coffee\n */\n\n(function() {\n var FilterDirective;\n\n FilterDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var unwatch;\n unwatch = scope.$watch(\"vm.defaultQ\", function(q) {\n if (q && !scope.vm.filtersForm.$dirty) {\n scope.vm.q = q;\n return unwatch();\n } else if (scope.vm.filtersForm.$dirty) {\n return unwatch();\n }\n });\n return attrs.$observe(\"open\", function(open) {\n open = scope.$eval(open);\n if (open) {\n return el.addClass('open');\n } else {\n return el.removeClass('open');\n }\n });\n };\n return {\n scope: {\n onChangeQ: \"&\",\n onAddFilter: \"&\",\n onSelectCustomFilter: \"&\",\n onRemoveFilter: \"&\",\n onRemoveCustomFilter: \"&\",\n onSaveCustomFilter: \"&\",\n customFilters: \"<\",\n defaultQ: \"=q\",\n filters: \"<\",\n customFilters: \"<\",\n selectedFilters: \"<\"\n },\n bindToController: true,\n controller: \"Filter\",\n controllerAs: \"vm\",\n templateUrl: 'components/filter/filter.html',\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgFilter\", [FilterDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: joy-ride.directive.coffee\n */\n\n(function() {\n var JoyRideDirective, taiga;\n\n taiga = this.taiga;\n\n JoyRideDirective = function($rootScope, currentUserService, joyRideService, $location, $translate) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var initJoyrRide, intro, unsuscribe;\n unsuscribe = null;\n intro = introJs();\n intro.oncomplete(function() {\n return $('html,body').scrollTop(0);\n });\n intro.onexit(function() {\n return currentUserService.disableJoyRide();\n });\n initJoyrRide = function(next, config) {\n if (!config[next.joyride]) {\n return;\n }\n intro.setOptions({\n exitOnEsc: false,\n exitOnOverlayClick: false,\n showStepNumbers: false,\n nextLabel: $translate.instant('JOYRIDE.NAV.NEXT') + ' →',\n prevLabel: '← ' + $translate.instant('JOYRIDE.NAV.BACK'),\n skipLabel: $translate.instant('JOYRIDE.NAV.SKIP'),\n doneLabel: $translate.instant('JOYRIDE.NAV.DONE'),\n disableInteraction: true\n });\n intro.setOption('steps', joyRideService.get(next.joyride));\n return intro.start();\n };\n return $rootScope.$on('$routeChangeSuccess', function(event, next) {\n if (!next.joyride || !currentUserService.isAuthenticated()) {\n intro.exit();\n if (unsuscribe) {\n unsuscribe();\n }\n return;\n }\n intro.oncomplete(function() {\n return currentUserService.disableJoyRide(next.joyride);\n });\n if (next.loader) {\n return unsuscribe = $rootScope.$on('loader:end', function() {\n currentUserService.loadJoyRideConfig().then(function(config) {\n return initJoyrRide(next, config);\n });\n return unsuscribe();\n });\n } else {\n return currentUserService.loadJoyRideConfig().then(function(config) {\n return initJoyrRide(next, config);\n });\n }\n });\n };\n return {\n scope: {},\n link: link\n };\n };\n\n JoyRideDirective.$inject = [\"$rootScope\", \"tgCurrentUserService\", \"tgJoyRideService\", \"$location\", \"$translate\"];\n\n angular.module(\"taigaComponents\").directive(\"tgJoyRide\", JoyRideDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: joy-ride.service.coffee\n */\n\n(function() {\n var JoyRideService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n JoyRideService = (function(superClass) {\n extend(JoyRideService, superClass);\n\n JoyRideService.$inject = ['$translate', 'tgCheckPermissionsService'];\n\n function JoyRideService(translate, checkPermissionsService) {\n this.translate = translate;\n this.checkPermissionsService = checkPermissionsService;\n }\n\n JoyRideService.prototype.getConfig = function() {\n return {\n dashboard: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.project-list > section:not(.ng-hide)',\n position: 'left',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP1.TITLE'),\n text: _this.translate.instant('JOYRIDE.DASHBOARD.STEP1.TEXT')\n }\n }, {\n element: '.working-on-container',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.DASHBOARD.STEP2.TEXT')\n }\n }, {\n element: '.watching-container',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TITLE'),\n text: [_this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT1'), _this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT2')]\n }\n }\n ];\n if (!$('.project-list .create-project-button').is(':hidden')) {\n steps.push({\n element: '.project-list .create-project-button',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TITLE'),\n text: [_this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT1'), _this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT2')]\n }\n });\n }\n return steps;\n };\n })(this),\n backlog: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.summary',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP1.TITLE'),\n text: [_this.translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT1'), _this.translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT2')]\n }\n }, {\n element: '.backlog-table-empty',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP2.TEXT')\n }\n }, {\n element: '.sprints',\n position: 'left',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP3.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP3.TEXT')\n }\n }\n ];\n if (_this.checkPermissionsService.check('add_us')) {\n steps.push({\n element: '.new-us',\n position: 'rigth',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP4.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP4.TEXT')\n }\n });\n }\n return steps;\n };\n })(this),\n kanban: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.kanban-table-inner',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP1.TITLE'),\n text: _this.translate.instant('JOYRIDE.KANBAN.STEP1.TEXT')\n }\n }, {\n element: '.card-placeholder',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.KANBAN.STEP2.TEXT')\n }\n }\n ];\n if (_this.checkPermissionsService.check('add_us')) {\n steps.push({\n element: '.add-action',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP3.TITLE'),\n text: [_this.translate.instant('JOYRIDE.KANBAN.STEP3.TEXT1'), _this.translate.instant('JOYRIDE.KANBAN.STEP3.TEXT2')]\n }\n });\n }\n return steps;\n };\n })(this)\n };\n };\n\n JoyRideService.prototype.get = function(name) {\n var joyRide, joyRides;\n joyRides = this.getConfig();\n joyRide = joyRides[name].call(this);\n return _.map(joyRide, function(item) {\n var html;\n html = \"\";\n if (item.joyride.title) {\n html += \"

    \" + item.joyride.title + \"

    \";\n }\n if (_.isArray(item.joyride.text)) {\n _.forEach(item.joyride.text, function(text) {\n return html += \"

    \" + text + \"

    \";\n });\n } else {\n html += \"

    \" + item.joyride.text + \"

    \";\n }\n item.intro = html;\n return item;\n });\n };\n\n return JoyRideService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgJoyRideService\", JoyRideService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: kanban-board-zoom.directive.coffee\n */\n\n(function() {\n var KanbanBoardZoomDirective;\n\n KanbanBoardZoomDirective = function(storage, projectService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var getZoomView, unwatch, zooms;\n scope.zoomIndex = storage.get(\"kanban_zoom\") || 2;\n scope.levels = 5;\n zooms = [[\"ref\"], [\"subject\"], [\"owner\", \"tags\", \"extra_info\", \"unfold\"], [\"attachments\"], [\"related_tasks\", \"empty_extra_info\"]];\n getZoomView = function(zoomIndex) {\n if (zoomIndex == null) {\n zoomIndex = 0;\n }\n if (storage.get(\"kanban_zoom\") !== zoomIndex) {\n storage.set(\"kanban_zoom\", zoomIndex);\n }\n return _.reduce(zooms, function(result, value, key) {\n if (key <= zoomIndex) {\n result = result.concat(value);\n }\n return result;\n });\n };\n scope.$watch('zoomIndex', function(zoomLevel) {\n var zoom;\n zoom = getZoomView(zoomLevel);\n return scope.onZoomChange({\n zoomLevel: zoomLevel,\n zoom: zoom\n });\n });\n return unwatch = scope.$watch(function() {\n return projectService.project;\n }, function(project) {\n if (project) {\n if (project.get('my_permissions').indexOf(\"view_tasks\") === -1) {\n scope.levels = 4;\n }\n return unwatch();\n }\n });\n };\n return {\n scope: {\n onZoomChange: \"&\"\n },\n template: \"\",\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgKanbanBoardZoom\", [\"$tgStorage\", \"tgProjectService\", KanbanBoardZoomDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Andrey Antukh \n * Copyright (C) 2014-2015 Jesús Espino Garcia \n * Copyright (C) 2014-2015 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: live-announcement.directive.coffee\n */\n\n(function() {\n var LiveAnnouncementDirective;\n\n LiveAnnouncementDirective = function(liveAnnouncementService) {\n var link;\n link = function(scope, el, attrs) {};\n return {\n restrict: \"AE\",\n scope: {},\n controllerAs: 'vm',\n controller: function() {\n this.close = function() {\n return liveAnnouncementService.open = false;\n };\n return Object.defineProperties(this, {\n open: {\n get: function() {\n return liveAnnouncementService.open;\n }\n },\n title: {\n get: function() {\n return liveAnnouncementService.title;\n }\n },\n desc: {\n get: function() {\n return liveAnnouncementService.desc;\n }\n }\n });\n },\n link: link,\n templateUrl: \"components/live-announcement/live-announcement.html\"\n };\n };\n\n LiveAnnouncementDirective.$inject = [\"tgLiveAnnouncementService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgLiveAnnouncement\", LiveAnnouncementDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: notification.service.coffee\n */\n\n(function() {\n var LiveAnnouncementService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n LiveAnnouncementService = (function(superClass) {\n extend(LiveAnnouncementService, superClass);\n\n function LiveAnnouncementService() {\n this.open = false;\n this.title = \"\";\n this.desc = \"\";\n }\n\n LiveAnnouncementService.prototype.show = function(title, desc) {\n this.open = true;\n this.title = title;\n return this.desc = desc;\n };\n\n return LiveAnnouncementService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgLiveAnnouncementService\", LiveAnnouncementService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-logo-big-src.directive.coffee\n */\n\n(function() {\n var ProjectLogoBigSrcDirective;\n\n ProjectLogoBigSrcDirective = function(projectLogoService) {\n var link;\n link = function(scope, el, attrs) {\n return scope.$watch('project', function(project) {\n var logo, projectLogo;\n project = Immutable.fromJS(project);\n if (!project) {\n return;\n }\n projectLogo = project.get('logo_big_url');\n if (projectLogo) {\n el.attr('src', projectLogo);\n return el.css('background', \"\");\n } else {\n logo = projectLogoService.getDefaultProjectLogo(project.get('slug'), project.get('id'));\n el.attr('src', logo.src);\n return el.css('background', logo.color);\n }\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoBigSrc\"\n }\n };\n };\n\n ProjectLogoBigSrcDirective.$inject = [\"tgProjectLogoService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoBigSrc\", ProjectLogoBigSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-logo-small-src.directive.coffee\n */\n\n(function() {\n var ProjectLogoSmallSrcDirective;\n\n ProjectLogoSmallSrcDirective = function(projectLogoService) {\n var link;\n link = function(scope, el, attrs) {\n return scope.$watch('project', function(project) {\n var logo, projectLogo;\n project = Immutable.fromJS(project);\n if (!project) {\n return;\n }\n projectLogo = project.get('logo_small_url');\n if (projectLogo) {\n el.attr('src', projectLogo);\n return el.css('background', \"\");\n } else {\n logo = projectLogoService.getDefaultProjectLogo(project.get('slug'), project.get('id'));\n el.attr('src', logo.src);\n return el.css('background', logo.color);\n }\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoSmallSrc\"\n }\n };\n };\n\n ProjectLogoSmallSrcDirective.$inject = [\"tgProjectLogoService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoSmallSrc\", ProjectLogoSmallSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-menu.controller.coffee\n */\n\n(function() {\n var ProjectMenuController;\n\n ProjectMenuController = (function() {\n ProjectMenuController.$inject = [\"tgProjectService\", \"tgLightboxFactory\"];\n\n function ProjectMenuController(projectService, lightboxFactory) {\n this.projectService = projectService;\n this.lightboxFactory = lightboxFactory;\n this.project = null;\n this.menu = Immutable.Map();\n }\n\n ProjectMenuController.prototype.show = function() {\n this.project = this.projectService.project;\n this.active = this._getActiveSection();\n this._setVideoConference();\n return this._setMenuPermissions();\n };\n\n ProjectMenuController.prototype.hide = function() {\n this.project = null;\n return this.menu = {};\n };\n\n ProjectMenuController.prototype.search = function() {\n return this.lightboxFactory.create(\"tg-search-box\", {\n \"class\": \"lightbox lightbox-search\"\n });\n };\n\n ProjectMenuController.prototype._setVideoConference = function() {\n var videoconferenceUrl;\n videoconferenceUrl = this._videoConferenceUrl();\n if (videoconferenceUrl) {\n return this.project = this.project.set(\"videoconferenceUrl\", videoconferenceUrl);\n }\n };\n\n ProjectMenuController.prototype._setMenuPermissions = function() {\n this.menu = Immutable.Map({\n epics: false,\n backlog: false,\n kanban: false,\n issues: false,\n wiki: false\n });\n if (this.project.get(\"is_epics_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_epics\") !== -1) {\n this.menu = this.menu.set(\"epics\", true);\n }\n if (this.project.get(\"is_backlog_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_us\") !== -1) {\n this.menu = this.menu.set(\"backlog\", true);\n }\n if (this.project.get(\"is_kanban_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_us\") !== -1) {\n this.menu = this.menu.set(\"kanban\", true);\n }\n if (this.project.get(\"is_issues_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_issues\") !== -1) {\n this.menu = this.menu.set(\"issues\", true);\n }\n if (this.project.get(\"is_wiki_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_wiki_pages\") !== -1) {\n return this.menu = this.menu.set(\"wiki\", true);\n }\n };\n\n ProjectMenuController.prototype._getActiveSection = function() {\n var indexBacklog, indexKanban, oldSectionName, sectionName, sectionsBreadcrumb;\n sectionName = this.projectService.section;\n sectionsBreadcrumb = this.projectService.sectionsBreadcrumb;\n indexBacklog = sectionsBreadcrumb.lastIndexOf(\"backlog\");\n indexKanban = sectionsBreadcrumb.lastIndexOf(\"kanban\");\n if (indexBacklog !== -1 || indexKanban !== -1) {\n if (indexKanban === -1 || indexBacklog > indexKanban) {\n oldSectionName = \"backlog\";\n } else {\n oldSectionName = \"kanban\";\n }\n }\n if (sectionName === \"backlog-kanban\") {\n if (oldSectionName === \"backlog\" || oldSectionName === \"kanban\") {\n sectionName = oldSectionName;\n } else if (this.project.get(\"is_backlog_activated\") && !this.project.get(\"is_kanban_activated\")) {\n sectionName = \"backlog\";\n } else if (!this.project.get(\"is_backlog_activated\") && this.project.get(\"is_kanban_activated\")) {\n sectionName = \"kanban\";\n }\n }\n return sectionName;\n };\n\n ProjectMenuController.prototype._videoConferenceUrl = function() {\n var baseUrl, url;\n if (this.project.get(\"videoconferences\") === \"appear-in\") {\n baseUrl = \"https://appear.in/\";\n } else if (this.project.get(\"videoconferences\") === \"talky\") {\n baseUrl = \"https://talky.io/\";\n } else if (this.project.get(\"videoconferences\") === \"jitsi\") {\n baseUrl = \"https://meet.jit.si/\";\n } else if (this.project.get(\"videoconferences\") === \"custom\") {\n return this.project.get(\"videoconferences_extra_data\");\n } else {\n return \"\";\n }\n if (this.project.get(\"videoconferences_extra_data\")) {\n url = this.project.get(\"slug\") + \"-\" + taiga.slugify(this.project.get(\"videoconferences_extra_data\"));\n } else {\n url = this.project.get(\"slug\");\n }\n if (this.project.get(\"videoconferences\") === \"jitsi\") {\n url = url.replace(/-/g, \"\");\n }\n return baseUrl + url;\n };\n\n return ProjectMenuController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"ProjectMenu\", ProjectMenuController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-menu.directive.coffee\n */\n\n(function() {\n var ProjectMenuDirective, taiga;\n\n taiga = this.taiga;\n\n ProjectMenuDirective = function(projectService, lightboxFactory) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var projectChange;\n projectChange = function() {\n if (projectService.project) {\n return ctrl.show();\n } else {\n return ctrl.hide();\n }\n };\n scope.$watch((function() {\n return projectService.project;\n }), projectChange);\n scope.vm.fixed = false;\n return $(window).on(\"scroll\", function() {\n var position;\n position = $(window).scrollTop();\n if (position > 100 && scope.vm.fixed === false) {\n scope.vm.fixed = true;\n return scope.$digest();\n } else if (position < 100 && scope.vm.fixed === true) {\n scope.vm.fixed = false;\n return scope.$digest();\n }\n });\n };\n return {\n scope: {},\n controller: \"ProjectMenu\",\n controllerAs: \"vm\",\n templateUrl: \"components/project-menu/project-menu.html\",\n link: link\n };\n };\n\n ProjectMenuDirective.$inject = [\"tgProjectService\", \"tgLightboxFactory\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectMenu\", ProjectMenuDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.directive.coffee\n */\n\n(function() {\n var TagOptionDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagOptionDirective = function() {\n var dispatch, link, select, stop;\n select = function(selected) {\n var containerHeight, diff, selectedPosition;\n selected.addClass('selected');\n selectedPosition = selected.position().top + selected.outerHeight();\n containerHeight = selected.parent().outerHeight();\n if (selectedPosition > containerHeight) {\n diff = selectedPosition - containerHeight;\n return selected.parent().scrollTop(selected.parent().scrollTop() + diff);\n } else if (selected.position().top < 0) {\n return selected.parent().scrollTop(selected.parent().scrollTop() + selected.position().top);\n }\n };\n dispatch = function(el, code, scope) {\n var activeElement, next, prev;\n activeElement = el.find(\".selected\");\n if (code === 40) {\n if (!activeElement.length) {\n return select(el.find('li:first'));\n } else {\n next = activeElement.next('li');\n if (next.length) {\n activeElement.removeClass('selected');\n return select(next);\n }\n }\n } else if (code === 38) {\n if (!activeElement.length) {\n return select(el.find('li:last'));\n } else {\n prev = activeElement.prev('li');\n if (prev.length) {\n activeElement.removeClass('selected');\n return select(prev);\n }\n }\n }\n };\n stop = function() {\n return $(document).off(\".tags-keyboard-navigation\");\n };\n link = function(scope, el) {\n stop();\n $(el).parent().on(\"keydown.tags-keyboard-navigation\", (function(_this) {\n return function(event) {\n var code;\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 40 || code === 38) {\n event.preventDefault();\n return dispatch(el, code, scope);\n }\n };\n })(this));\n return scope.$on(\"$destroy\", stop);\n };\n return {\n link: link,\n templateUrl: \"components/tags/tag-dropdown/tag-dropdown.html\",\n scope: {\n onSelectTag: \"&\",\n colorArray: \"=\",\n tag: \"=\"\n }\n };\n };\n\n module.directive(\"tgTagsDropdown\", TagOptionDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.controller.coffee\n */\n\n(function() {\n var TagLineCommonController, module, trim;\n\n trim = this.taiga.trim;\n\n module = angular.module('taigaCommon');\n\n TagLineCommonController = (function() {\n TagLineCommonController.$inject = [\"tgTagLineService\"];\n\n function TagLineCommonController(tagLineService) {\n this.tagLineService = tagLineService;\n this.disableColorSelection = false;\n this.newTag = {\n name: \"\",\n color: null\n };\n this.colorArray = [];\n this.addTag = false;\n }\n\n TagLineCommonController.prototype.checkPermissions = function() {\n return this.tagLineService.checkPermissions(this.project.my_permissions, this.permissions);\n };\n\n TagLineCommonController.prototype._createColorsArray = function(projectTagColors) {\n return this.colorArray = this.tagLineService.createColorsArray(projectTagColors);\n };\n\n TagLineCommonController.prototype.displayTagInput = function() {\n return this.addTag = true;\n };\n\n TagLineCommonController.prototype.addNewTag = function(name, color) {\n this.newTag.name = \"\";\n this.newTag.color = null;\n if (!name.length) {\n return;\n }\n if (this.disableColorSelection) {\n if (name.length) {\n return this.onAddTag({\n name: name,\n color: color\n });\n }\n } else {\n if (this.project.tags_colors[name]) {\n color = this.project.tags_colors[name];\n }\n return this.onAddTag({\n name: name,\n color: color\n });\n }\n };\n\n TagLineCommonController.prototype.selectColor = function(color) {\n return this.newTag.color = color;\n };\n\n return TagLineCommonController;\n\n })();\n\n module.controller(\"TagLineCommonCtrl\", TagLineCommonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.directive.coffee\n */\n\n(function() {\n var TagLineCommonDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagLineCommonDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n var unwatch;\n if (!_.isUndefined(attr.disableColorSelection)) {\n ctrl.disableColorSelection = true;\n }\n unwatch = scope.$watch(\"vm.project\", function(project) {\n if (!project || !Object.keys(project).length) {\n return;\n }\n unwatch();\n if (!ctrl.disableColorSelection) {\n return ctrl.colorArray = ctrl._createColorsArray(ctrl.project.tags_colors);\n }\n });\n return el.on(\"keydown\", \".tag-input\", function(event) {\n var tagName;\n if (event.keyCode === 27) {\n ctrl.addTag = false;\n ctrl.newTag.name = \"\";\n ctrl.newTag.color = \"\";\n event.stopPropagation();\n } else if (event.keyCode === 13) {\n event.preventDefault();\n if (el.find('.tags-dropdown .selected').length) {\n tagName = $('.tags-dropdown .selected .tags-dropdown-name').text();\n ctrl.addNewTag(tagName, null);\n } else {\n ctrl.addNewTag(ctrl.newTag.name, ctrl.newTag.color);\n }\n }\n return scope.$apply();\n });\n };\n return {\n link: link,\n scope: {\n permissions: \"@\",\n loadingAddTag: \"=\",\n loadingRemoveTag: \"=\",\n tags: \"=\",\n project: \"=\",\n onAddTag: \"&\",\n onDeleteTag: \"&\"\n },\n templateUrl: \"components/tags/tag-line-common/tag-line-common.html\",\n controller: \"TagLineCommonCtrl\",\n controllerAs: \"vm\",\n bindToController: true\n };\n };\n\n module.directive(\"tgTagLineCommon\", TagLineCommonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.controller.coffee\n */\n\n(function() {\n var TagLineController, module, trim;\n\n trim = this.taiga.trim;\n\n module = angular.module('taigaCommon');\n\n TagLineController = (function() {\n TagLineController.$inject = [\"$rootScope\", \"$tgConfirm\", \"$tgQueueModelTransformation\"];\n\n function TagLineController(rootScope, confirm, modelTransform) {\n this.rootScope = rootScope;\n this.confirm = confirm;\n this.modelTransform = modelTransform;\n this.loadingAddTag = false;\n }\n\n TagLineController.prototype.onDeleteTag = function(tag) {\n var onDeleteTagError, onDeleteTagSuccess, tagName, transform;\n this.loadingRemoveTag = tag[0];\n onDeleteTagSuccess = (function(_this) {\n return function(item) {\n _this.rootScope.$broadcast(\"object:updated\");\n _this.loadingRemoveTag = false;\n return item;\n };\n })(this);\n onDeleteTagError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.loadingRemoveTag = false;\n };\n })(this);\n tagName = trim(tag[0].toLowerCase());\n transform = this.modelTransform.save(function(item) {\n var itemtags;\n itemtags = _.clone(item.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === tagName;\n });\n item.tags = itemtags;\n return item;\n });\n return transform.then(onDeleteTagSuccess, onDeleteTagError);\n };\n\n TagLineController.prototype.onAddTag = function(tag, color) {\n var onAddTagError, onAddTagSuccess, transform;\n this.loadingAddTag = true;\n onAddTagSuccess = (function(_this) {\n return function(item) {\n _this.rootScope.$broadcast(\"object:updated\");\n _this.addTag = false;\n _this.loadingAddTag = false;\n return item;\n };\n })(this);\n onAddTagError = (function(_this) {\n return function() {\n _this.loadingAddTag = false;\n return _this.confirm.notify(\"error\");\n };\n })(this);\n transform = this.modelTransform.save((function(_this) {\n return function(item) {\n var itemtags, value;\n value = trim(tag.toLowerCase());\n itemtags = _.clone(item.tags);\n itemtags.push([tag, color]);\n item.tags = itemtags;\n return item;\n };\n })(this));\n return transform.then(onAddTagSuccess, onAddTagError);\n };\n\n return TagLineController;\n\n })();\n\n module.controller(\"TagLineCtrl\", TagLineController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.directive.coffee\n */\n\n(function() {\n var TagLineDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagLineDirective = function() {\n return {\n scope: {\n item: \"=\",\n permissions: \"@\",\n project: \"=\"\n },\n templateUrl: \"components/tags/tag-line-detail/tag-line-detail.html\",\n controller: \"TagLineCtrl\",\n controllerAs: \"vm\",\n bindToController: true\n };\n };\n\n module.directive(\"tgTagLine\", TagLineDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.service.coffee\n */\n\n(function() {\n var TagLineService, module,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n module = angular.module('taigaCommon');\n\n TagLineService = (function(superClass) {\n extend(TagLineService, superClass);\n\n TagLineService.$inject = [];\n\n function TagLineService() {}\n\n TagLineService.prototype.checkPermissions = function(myPermissions, projectPermissions) {\n return _.includes(myPermissions, projectPermissions);\n };\n\n TagLineService.prototype.createColorsArray = function(projectTagColors) {\n return _.map(projectTagColors, function(index, value) {\n return [value, index];\n });\n };\n\n return TagLineService;\n\n })(taiga.Service);\n\n module.service(\"tgTagLineService\", TagLineService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.directive.coffee\n */\n\n(function() {\n var TagDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagDirective = function() {\n return {\n templateUrl: \"components/tags/tag/tag.html\",\n scope: {\n tag: \"<\",\n loadingRemoveTag: \"<\",\n onDeleteTag: \"&\",\n hasPermissions: \"@\"\n }\n };\n };\n\n module.directive(\"tgTag\", TagDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: taskboard-zoom.directive.coffee\n */\n\n(function() {\n var TaskboardZoomDirective;\n\n TaskboardZoomDirective = function(storage) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var getZoomView, zooms;\n scope.zoomIndex = storage.get(\"taskboard_zoom\") || 2;\n scope.levels = 4;\n zooms = [[\"ref\"], [\"subject\"], [\"owner\", \"tags\", \"extra_info\", \"unfold\"], [\"attachments\", \"empty_extra_info\"], [\"related_tasks\"]];\n getZoomView = function(zoomIndex) {\n if (zoomIndex == null) {\n zoomIndex = 0;\n }\n if (storage.get(\"taskboard_zoom\") !== zoomIndex) {\n storage.set(\"taskboard_zoom\", zoomIndex);\n }\n return _.reduce(zooms, function(result, value, key) {\n if (key <= zoomIndex) {\n result = result.concat(value);\n }\n return result;\n });\n };\n return scope.$watch('zoomIndex', function(zoomLevel) {\n var zoom;\n zoom = getZoomView(zoomLevel);\n return scope.onZoomChange({\n zoomLevel: zoomLevel,\n zoom: zoom\n });\n });\n };\n return {\n scope: {\n onZoomChange: \"&\"\n },\n template: \"\",\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgTaskboardZoom\", [\"$tgStorage\", TaskboardZoomDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Andrey Antukh \n * Copyright (C) 2014-2015 Jesús Espino Garcia \n * Copyright (C) 2014-2015 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: terms-announcement.directive.coffee\n */\n\n(function() {\n var TermsAnnouncementDirective;\n\n TermsAnnouncementDirective = function(TermsAnnouncementService, $repo, $auth, $config, $model) {\n var link;\n link = function(scope, el, attrs) {\n scope.privacyPolicyUrl = $config.get(\"privacyPolicyUrl\");\n scope.termsOfServiceUrl = $config.get(\"termsOfServiceUrl\");\n return scope.GDPRUrl = $config.get(\"GDPRUrl\");\n };\n return {\n restrict: \"AE\",\n scope: {},\n controllerAs: 'vm',\n controller: function() {\n this.close = function() {\n var onSuccess, user, userData;\n TermsAnnouncementService.open = false;\n user = $auth.getUser();\n if (user.read_new_terms === void 0) {\n userData = user.getAttrs();\n userData.read_new_terms = false;\n user = $model.make_model(\"users\", userData);\n }\n user.read_new_terms = true;\n onSuccess = function(data) {\n return $auth.setUser(data);\n };\n return $repo.save(user).then(onSuccess);\n };\n return Object.defineProperties(this, {\n open: {\n get: function() {\n return TermsAnnouncementService.open;\n }\n }\n });\n },\n link: link,\n templateUrl: \"components/terms-announcement/terms-announcement.html\"\n };\n };\n\n TermsAnnouncementDirective.$inject = [\"tgTermsAnnouncementService\", \"$tgRepo\", \"$tgAuth\", \"$tgConfig\", \"$tgModel\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTermsAnnouncement\", TermsAnnouncementDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: terms-announcement.service.coffee\n */\n\n(function() {\n var TermsAnnouncementService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n TermsAnnouncementService = (function(superClass) {\n extend(TermsAnnouncementService, superClass);\n\n function TermsAnnouncementService() {\n this.open = false;\n }\n\n TermsAnnouncementService.prototype.show = function() {\n return this.open = true;\n };\n\n return TermsAnnouncementService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgTermsAnnouncementService\", TermsAnnouncementService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.directive.coffee\n */\n\n(function() {\n var TermsOfServiceAndPrivacyPolicyNoticeDirective;\n\n TermsOfServiceAndPrivacyPolicyNoticeDirective = function($config) {\n var link;\n link = function(scope, el, attrs) {\n scope.privacyPolicyUrl = $config.get(\"privacyPolicyUrl\");\n scope.termsOfServiceUrl = $config.get(\"termsOfServiceUrl\");\n scope.target = false;\n if (!scope.privacyPolicyUrl || !scope.termsOfServiceUrl) {\n scope.target = true;\n }\n return el.on(\"change\", \"input[name='accepted_terms']\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n scope.target = target.is(\":checked\");\n return scope.$apply();\n });\n };\n return {\n restrict: \"AE\",\n link: link,\n scope: {\n target: \"=\"\n },\n templateUrl: \"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgTermsOfServiceAndPrivacyPolicyNotice\", [\"$tgConfig\", TermsOfServiceAndPrivacyPolicyNoticeDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tribe-button.directive.coffee\n */\n\n(function() {\n var TribeButtonDirective;\n\n TribeButtonDirective = function(configService, locationService) {\n var link;\n link = function(scope, el, attrs) {\n scope.vm = {};\n scope.vm.tribeHost = configService.config.tribeHost;\n scope.vm.url = (locationService.protocol()) + \"://\" + (locationService.host());\n if (locationService.protocol() === \"http\" && locationService.port() !== 80) {\n return scope.vm.url = scope.vm.url + \":\" + (locationService.port());\n } else if (locationService.protocol() === \"https\" && locationService.port() !== 443) {\n return scope.vm.url = scope.vm.url + \":\" + (locationService.port());\n }\n };\n return {\n scope: {\n usId: \"=\",\n projectSlug: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/tribe-button/tribe-button.html\",\n link: link\n };\n };\n\n TribeButtonDirective.$inject = [\"$tgConfig\", \"$tgLocation\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTribeButton\", TribeButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tribe-linked.directive.coffee\n */\n\n(function() {\n var TribeLinkedDirective;\n\n TribeLinkedDirective = function(configService) {\n var directive, link;\n link = function(scope, el, attrs) {\n scope.vm = {};\n scope.vm.tribeHost = configService.config.tribeHost;\n scope.vm.show = function() {\n return scope.vm.open = true;\n };\n return scope.vm.hide = function(event) {\n return scope.vm.open = false;\n };\n };\n directive = {\n templateUrl: \"components/tribe-button/tribe-linked.html\",\n scope: {\n gigTitle: \"=\",\n gigId: \"=\"\n },\n link: link\n };\n return directive;\n };\n\n TribeLinkedDirective.$inject = [\"$tgConfig\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTribeLinked\", TribeLinkedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: vote-button.controller.coffee\n */\n\n(function() {\n var VoteButtonController;\n\n VoteButtonController = (function() {\n VoteButtonController.$inject = [\"tgCurrentUserService\"];\n\n function VoteButtonController(currentUserService) {\n this.currentUserService = currentUserService;\n this.user = this.currentUserService.getUser();\n this.isMouseOver = false;\n this.loading = false;\n }\n\n VoteButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n VoteButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n VoteButtonController.prototype.toggleVote = function() {\n var promise;\n this.loading = true;\n if (!this.item.is_voter) {\n promise = this._upvote();\n } else {\n promise = this._downvote();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n VoteButtonController.prototype._upvote = function() {\n return this.onUpvote().then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this));\n };\n\n VoteButtonController.prototype._downvote = function() {\n return this.onDownvote();\n };\n\n return VoteButtonController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"VoteButton\", VoteButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: vote-button.directive.coffee\n */\n\n(function() {\n var VoteButtonDirective;\n\n VoteButtonDirective = function() {\n return {\n scope: {},\n controller: \"VoteButton\",\n bindToController: {\n item: \"=\",\n onUpvote: \"=\",\n onDownvote: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/vote-button/vote-button.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgVoteButton\", VoteButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-button.controller.coffee\n */\n\n(function() {\n var WatchButtonController;\n\n WatchButtonController = (function() {\n WatchButtonController.$inject = [\"tgCurrentUserService\", \"$rootScope\"];\n\n function WatchButtonController(currentUserService, rootScope) {\n this.currentUserService = currentUserService;\n this.rootScope = rootScope;\n this.user = this.currentUserService.getUser();\n this.isMouseOver = false;\n this.loading = false;\n }\n\n WatchButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n WatchButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n WatchButtonController.prototype.openWatchers = function() {\n return this.rootScope.$broadcast(\"watcher:add\", this.item);\n };\n\n WatchButtonController.prototype.getPerms = function() {\n var name, perms;\n if (!this.item) {\n return \"\";\n }\n name = this.item._name;\n perms = {\n userstories: 'modify_us',\n issues: 'modify_issue',\n tasks: 'modify_task',\n epics: 'modify_epic'\n };\n return perms[name];\n };\n\n WatchButtonController.prototype.toggleWatch = function() {\n var promise;\n this.loading = true;\n if (!this.item.is_watcher) {\n promise = this._watch();\n } else {\n promise = this._unwatch();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n WatchButtonController.prototype._watch = function() {\n return this.onWatch().then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this));\n };\n\n WatchButtonController.prototype._unwatch = function() {\n return this.onUnwatch();\n };\n\n return WatchButtonController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"WatchButton\", WatchButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-button.directive.coffee\n */\n\n(function() {\n var WatchButtonDirective;\n\n WatchButtonDirective = function() {\n return {\n scope: {},\n controller: \"WatchButton\",\n bindToController: {\n item: \"=\",\n onWatch: \"=\",\n onUnwatch: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: function(item, attributes) {\n return \"components/watch-button/watch-button-\" + attributes.environment + \".html\";\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWatchButton\", WatchButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/comment-edit-wysiwyg.directive.coffee\n */\n\n(function() {\n var CommentEditWysiwyg;\n\n CommentEditWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n types = {\n epics: \"epic\",\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file, true, true).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n return $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCommentEditWysiwyg\", [\"tgAttachmentsFullService\", CommentEditWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/comment-wysiwyg.directive.coffee\n */\n\n(function() {\n var CommentWysiwyg;\n\n CommentWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n $scope.editableDescription = false;\n $scope.saveComment = function(description, cb) {\n $scope.content = '';\n $scope.vm.type.comment = description;\n return $scope.vm.onAddComment({\n callback: cb\n });\n };\n types = {\n epics: \"epic\",\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.type.id, types[$scope.vm.type._name], file, true, true).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.onChange = function(markdown) {\n return $scope.vm.type.comment = markdown;\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.content = '';\n return $scope.$watch(\"vm.type\", function(value) {\n if (!value) {\n return;\n }\n return $scope.storageKey = \"comment-\" + value.project + \"-\" + value.id + \"-\" + value._name;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCommentWysiwyg\", [\"tgAttachmentsFullService\", CommentWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/comment-edit-wysiwyg.directive.coffee\n */\n\n(function() {\n var CustomFieldEditWysiwyg;\n\n CustomFieldEditWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n types = {\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n return $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCustomFieldEditWysiwyg\", [\"tgAttachmentsFullService\", CustomFieldEditWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/item-wysiwyg.directive.coffee\n */\n\n(function() {\n var ItemWysiwyg;\n\n ItemWysiwyg = function($modelTransform, $rootscope, $confirm, attachmentsFullService, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var uploadFile;\n $scope.editableDescription = false;\n $scope.saveDescription = function(description, cb) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.description = description;\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](cb);\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, $attrs.type, file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.$watch($attrs.model, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n $scope.version = value.version;\n return $scope.storageKey = $scope.project.id + \"-\" + value.id + \"-\" + $attrs.type;\n });\n return $scope.$watch('project', function(project) {\n if (!project) {\n return;\n }\n return $scope.editableDescription = project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n\\n
    \\n\\n \\n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\\n
    \\n\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgItemWysiwyg\", [\"$tgQueueModelTransformation\", \"$rootScope\", \"$tgConfirm\", \"tgAttachmentsFullService\", \"$translate\", ItemWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg-code-hightlighter.service.coffee\n */\n\n(function() {\n var WysiwygCodeHightlighterService;\n\n WysiwygCodeHightlighterService = (function() {\n function WysiwygCodeHightlighterService() {\n Prism.plugins.customClass.prefix('prism-');\n Prism.plugins.customClass.map({});\n }\n\n WysiwygCodeHightlighterService.prototype.getLanguages = function() {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n if (_this.languages) {\n return resolve(_this.languages);\n } else if (_this.loadPromise) {\n return _this.loadPromise.then(function() {\n return resolve(_this.languages);\n });\n } else {\n return _this.loadPromise = $.getJSON(\"/\" + window._version + \"/prism/prism-languages.json\").then(function(_languages_) {\n _this.loadPromise = null;\n _this.languages = _.map(_languages_, function(it) {\n it.url = (\"/\" + window._version + \"/prism/\") + it.file;\n return it;\n });\n return resolve(_this.languages);\n });\n }\n };\n })(this));\n };\n\n WysiwygCodeHightlighterService.prototype.getLanguageInClassList = function(classes) {\n var lan;\n lan = _.find(this.languages, function(it) {\n return !!_.find(classes, function(className) {\n return 'language-' + it.name === className;\n });\n });\n if (lan) {\n return lan.name;\n } else {\n return null;\n }\n };\n\n WysiwygCodeHightlighterService.prototype.loadLanguage = function(lan) {\n return new Promise(function(resolve) {\n if (!Prism.languages[lan]) {\n return ljs.load(\"/\" + window._version + \"/prism/prism-\" + lan + \".min.js\", resolve);\n } else {\n return resolve();\n }\n });\n };\n\n WysiwygCodeHightlighterService.prototype.replaceCodeBrToNl = function(code) {\n return $(code).find('br').replaceWith('\\n');\n };\n\n WysiwygCodeHightlighterService.prototype.hightlightCode = function(code) {\n var lan;\n this.replaceCodeBrToNl(code);\n lan = this.getLanguageInClassList(code.classList);\n if (lan) {\n return this.loadLanguage(lan).then(function() {\n return Prism.highlightElement(code);\n });\n }\n };\n\n WysiwygCodeHightlighterService.prototype.addHightlighter = function(element) {\n var codes;\n codes = $(element).find('code');\n return codes.each((function(_this) {\n return function(index, code) {\n return _this.hightlightCode(code);\n };\n })(this));\n };\n\n return WysiwygCodeHightlighterService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygCodeHightlighterService\", WysiwygCodeHightlighterService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.directive.coffee\n */\n\n(function() {\n var WysiwygCodeLightbox;\n\n WysiwygCodeLightbox = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch('visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n scope.open = true;\n lightboxService.open(el, null, scope.onClose);\n return scope.$applyAsync(function() {\n var textarea;\n textarea = el[0].querySelector('textarea');\n if (textarea) {\n return textarea.select();\n }\n });\n } else if (!visible && el.hasClass('open')) {\n scope.open = false;\n return lightboxService.close(el);\n }\n });\n };\n return {\n scope: {\n languages: '<',\n codeLanguage: '<',\n code: '<',\n visible: '<',\n onClose: '&',\n onSave: '&'\n },\n link: link,\n templateUrl: \"components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWysiwygCodeLightbox\", [\"lightboxService\", WysiwygCodeLightbox]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg-mention.service.coffee\n */\n\n(function() {\n var WysiwygMentionService;\n\n WysiwygMentionService = (function() {\n WysiwygMentionService.$inject = [\"tgProjectService\", \"tgWysiwygService\", \"$tgNavUrls\", \"$tgResources\"];\n\n function WysiwygMentionService(projectService, wysiwygService, navurls, rs) {\n this.projectService = projectService;\n this.wysiwygService = wysiwygService;\n this.navurls = navurls;\n this.rs = rs;\n this.cancelablePromise = null;\n }\n\n WysiwygMentionService.prototype.searchEmoji = function(name, cb) {\n var filteredEmojis;\n filteredEmojis = this.wysiwygService.searchEmojiByName(name);\n filteredEmojis = filteredEmojis.slice(0, 10);\n return cb(filteredEmojis);\n };\n\n WysiwygMentionService.prototype.searchUser = function(term, cb) {\n var searchProps, users;\n searchProps = ['username', 'full_name', 'full_name_display'];\n users = this.projectService.project.toJS().members.filter((function(_this) {\n return function(user) {\n var i, len, prop;\n for (i = 0, len = searchProps.length; i < len; i++) {\n prop = searchProps[i];\n if (taiga.slugify(user[prop]).indexOf(term) >= 0) {\n return true;\n } else if (user[prop].indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n })(this));\n users = users.slice(0, 10).map((function(_this) {\n return function(it) {\n it.url = _this.navurls.resolve('user-profile', {\n project: _this.projectService.project.get('slug'),\n username: it.username\n });\n return it;\n };\n })(this));\n return cb(users);\n };\n\n WysiwygMentionService.prototype.searchItem = function(term) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n var filter, searchProps, searchTypes, urls;\n term = taiga.slugify(term);\n searchTypes = ['issues', 'tasks', 'userstories'];\n urls = {\n issues: \"project-issues-detail\",\n tasks: \"project-tasks-detail\",\n userstories: \"project-userstories-detail\"\n };\n searchProps = ['ref', 'subject'];\n filter = function(item) {\n var i, len, prop;\n for (i = 0, len = searchProps.length; i < len; i++) {\n prop = searchProps[i];\n if (taiga.slugify(item[prop]).indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n if (_this.cancelablePromise) {\n _this.cancelablePromise.abort();\n }\n _this.cancelablePromise = _this.rs.search[\"do\"](_this.projectService.project.get('id'), term);\n return _this.cancelablePromise.then(function(res) {\n var i, items, len, result, type;\n if (res.count < 1 || res.count === res.wikipages.length) {\n return resolve([]);\n } else {\n result = [];\n for (i = 0, len = searchTypes.length; i < len; i++) {\n type = searchTypes[i];\n if (res[type] && res[type].length > 0) {\n items = res[type].filter(filter);\n items = items.map(function(it) {\n it.url = _this.navurls.resolve(urls[type], {\n project: _this.projectService.project.get('slug'),\n ref: it.ref\n });\n return it;\n });\n result = result.concat(items);\n }\n }\n result = _.sortBy(result, [\"ref\"]);\n return resolve(result.slice(0, 10));\n }\n });\n };\n })(this));\n };\n\n WysiwygMentionService.prototype.search = function(mention) {\n return new Promise((function(_this) {\n return function(resolve) {\n if ('#'.indexOf(mention[0]) !== -1) {\n return _this.searchItem(mention.replace('#', '')).then(resolve);\n } else if ('@'.indexOf(mention[0]) !== -1) {\n return _this.searchUser(mention.replace('@', ''), resolve);\n } else if (':'.indexOf(mention[0]) !== -1) {\n return _this.searchEmoji(mention.replace(':', ''), resolve);\n }\n };\n })(this));\n };\n\n return WysiwygMentionService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygMentionService\", WysiwygMentionService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg.directive.coffee\n */\n\n(function() {\n var Medium, bindOnce, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n Medium = function($translate, $confirm, $storage, wysiwygService, animationFrame, tgLoader, wysiwygCodeHightlighterService, wysiwygMentionService, analytics, $location) {\n var AlignRightButton, CodeButton, CustomPasteHandler, addCodeBlockAndHightlight, getIcon, getRangeCodeBlock, isCodeBlockSelected, link, oldIsBlockContainer, refreshCodeBlocks, removeCodeBlockAndHightlight, removeSelections;\n removeSelections = function() {\n if (window.getSelection) {\n if (window.getSelection().empty) {\n return window.getSelection().empty();\n }\n } else if (window.getSelection().removeAllRanges) {\n return window.getSelection().removeAllRanges();\n } else if (document.selection) {\n return document.selection.empty();\n }\n };\n getRangeCodeBlock = function(range) {\n return $(range.endContainer).parentsUntil('.editor', 'code');\n };\n isCodeBlockSelected = function(range) {\n return !!getRangeCodeBlock(range).length;\n };\n removeCodeBlockAndHightlight = function(selection, mediumInstance) {\n var code, p, pre;\n if ($(selection).is('code')) {\n code = selection;\n } else {\n code = $(selection).closest('code')[0];\n }\n pre = code.parentNode;\n p = document.createElement('p');\n p.innerText = code.innerText;\n pre.parentNode.replaceChild(p, pre);\n return mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n };\n addCodeBlockAndHightlight = function(range, mediumInstance) {\n var code, extract, pre, start;\n pre = document.createElement('pre');\n code = document.createElement('code');\n if (!range.startContainer.parentNode.nextSibling) {\n $('
    ').insertAfter(range.startContainer.parentNode);\n }\n start = range.endContainer.parentNode.nextSibling;\n extract = range.extractContents();\n code.appendChild(extract);\n pre.appendChild(code);\n start.parentNode.insertBefore(pre, start);\n refreshCodeBlocks(mediumInstance);\n return mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n };\n refreshCodeBlocks = function(mediumInstance) {\n var i, j, len, len1, mainChildren, p, pre, preList, ref, results;\n if (!mediumInstance) {\n return;\n }\n ref = mediumInstance.elements[0].children;\n for (i = 0, len = ref.length; i < len; i++) {\n mainChildren = ref[i];\n if (mainChildren && mainChildren.tagName.toLowerCase() === 'p' && !mainChildren.innerHTML.trim().length) {\n mainChildren.parentNode.removeChild(mainChildren);\n }\n }\n preList = mediumInstance.elements[0].querySelectorAll('pre');\n results = [];\n for (j = 0, len1 = preList.length; j < len1; j++) {\n pre = preList[j];\n pre.setAttribute('contenteditable', false);\n pre.setAttribute('title', $translate.instant(\"COMMON.WYSIWYG.DB_CLICK\"));\n pre.addEventListener('mousedown', function(e) {\n return e.preventDefault();\n });\n if (pre.nextElementSibling && pre.nextElementSibling.nodeName.toLowerCase() === 'p' && !pre.nextElementSibling.children.length) {\n results.push(pre.nextElementSibling.appendChild(document.createElement('br')));\n } else if (!pre.nextElementSibling || ['p', 'ul', 'h1', 'h2', 'h3'].indexOf(pre.nextElementSibling.nodeName.toLowerCase()) === -1) {\n p = document.createElement('p');\n p.appendChild(document.createElement('br'));\n results.push(pre.parentNode.insertBefore(p, pre.nextSibling));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n AlignRightButton = MediumEditor.extensions.button.extend({\n name: 'rtl',\n init: function() {\n var option;\n option = _.find(this.base.options.toolbar.buttons, function(it) {\n return it.name === 'rtl';\n });\n this.button = this.document.createElement('button');\n this.button.classList.add('medium-editor-action');\n this.button.innerHTML = option.contentDefault || 'RTL';\n this.button.title = 'RTL';\n return this.on(this.button, 'click', this.handleClick.bind(this));\n },\n getButton: function() {\n return this.button;\n },\n handleClick: function(event) {\n var range;\n range = MediumEditor.selection.getSelectionRange(document);\n if (range.commonAncestorContainer.parentNode.style.textAlign === 'right') {\n return document.execCommand('justifyLeft', false);\n } else {\n return document.execCommand('justifyRight', false);\n }\n }\n });\n getIcon = function(icon) {\n return \"\\n \\n\";\n };\n CodeButton = MediumEditor.extensions.button.extend({\n name: 'code',\n init: function() {\n var option;\n option = _.find(this.base.options.toolbar.buttons, function(it) {\n return it.name === 'code';\n });\n this.button = this.document.createElement('button');\n this.button.classList.add('medium-editor-action');\n this.button.innerHTML = option.contentDefault || 'Code';\n this.button.title = 'Code';\n return this.on(this.button, 'click', this.handleClick.bind(this));\n },\n getButton: function() {\n return this.button;\n },\n tagNames: ['code'],\n handleClick: function(event) {\n var range, toolbar;\n range = MediumEditor.selection.getSelectionRange(self.document);\n if (isCodeBlockSelected(range, this.base)) {\n removeCodeBlockAndHightlight(range.endContainer, this.base);\n } else {\n addCodeBlockAndHightlight(range, this.base);\n removeSelections();\n }\n toolbar = this.base.getExtensionByName('toolbar');\n if (toolbar) {\n return toolbar.hideToolbar();\n }\n }\n });\n CustomPasteHandler = MediumEditor.extensions.paste.extend({\n doPaste: function(pastedHTML, pastedPlain, editable) {\n var html;\n html = MediumEditor.util.htmlEntities(pastedPlain);\n return MediumEditor.util.insertHTMLCommand(this.document, html);\n }\n });\n oldIsBlockContainer = MediumEditor.util.isBlockContainer;\n MediumEditor.util.isBlockContainer = function(element) {\n var tagName;\n if (!element) {\n return oldIsBlockContainer(element);\n }\n if (element.tagName) {\n tagName = element.tagName;\n } else {\n tagName = element.parentNode.tagName;\n }\n if (tagName.toLowerCase() === 'code') {\n return true;\n }\n return oldIsBlockContainer(element);\n };\n link = function($scope, $el, $attrs) {\n var cancelWithConfirmation, change, clean, codeBlockSelected, create, discardLocalStorage, editorMarkdown, editorMedium, getCurrentContent, isDraft, isEditOnly, isOutdated, localSave, mediumInstance, notPersist, replaceCodeBrToNl, saveEnd, setEditMode, setHtmlMedium, throttleChange, unwatch, updateMarkdownWithCurrentHtml, uploadEnd;\n mediumInstance = null;\n editorMedium = $el.find('.medium');\n editorMarkdown = $el.find('.markdown');\n codeBlockSelected = null;\n isEditOnly = !!$attrs.$attr.editonly;\n notPersist = !!$attrs.$attr.notPersist;\n $scope.required = !!$attrs.$attr.required;\n $scope.editMode = isEditOnly || false;\n $scope.mode = $storage.get('editor-mode', 'html');\n $scope.markdown = '';\n $scope.codeEditorVisible = false;\n $scope.codeLans = [];\n wysiwygCodeHightlighterService.getLanguages().then(function(codeLans) {\n return $scope.codeLans = codeLans;\n });\n setEditMode = function(editMode) {\n return $scope.editMode = editMode;\n };\n setHtmlMedium = function(markdown) {\n var html;\n html = wysiwygService.getHTML(markdown);\n editorMedium.html(html);\n wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]);\n if ($scope.editMode) {\n return refreshCodeBlocks(mediumInstance);\n }\n };\n $scope.saveSnippet = function(lan, code) {\n var codePre;\n $scope.codeEditorVisible = false;\n codeBlockSelected.innerText = code;\n codePre = codeBlockSelected.parentNode;\n if (lan === 'remove-formating') {\n codeBlockSelected.className = '';\n codePre.className = '';\n removeCodeBlockAndHightlight(codeBlockSelected, mediumInstance);\n } else if (_.trim(code).length) {\n if (lan) {\n codeBlockSelected.className = 'language-' + lan;\n codePre.className = 'language-' + lan;\n } else {\n codeBlockSelected.className = '';\n codePre.className = '';\n }\n wysiwygCodeHightlighterService.hightlightCode(codeBlockSelected);\n mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n } else {\n codeBlockSelected.parentNode.parentNode.removeChild(codeBlockSelected.parentNode);\n mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n }\n throttleChange();\n return null;\n };\n $scope.setMode = function(mode) {\n $storage.set('editor-mode', mode);\n if (mode === 'markdown') {\n updateMarkdownWithCurrentHtml();\n } else {\n setHtmlMedium($scope.markdown);\n }\n $scope.mode = mode;\n return mediumInstance.trigger('editableBlur', {}, editorMedium[0]);\n };\n $scope.save = function(e) {\n if (e) {\n e.preventDefault();\n }\n if ($scope.mode === 'html') {\n updateMarkdownWithCurrentHtml();\n }\n setHtmlMedium($scope.markdown);\n if ($scope.required && !$scope.markdown.length) {\n return;\n }\n $scope.saving = true;\n $scope.outdated = false;\n $scope.onSave({\n text: $scope.markdown,\n cb: saveEnd\n });\n };\n $scope.cancel = function(e) {\n if (e) {\n e.preventDefault();\n }\n if (!isEditOnly) {\n setEditMode(false);\n }\n if (notPersist) {\n clean();\n } else if ($scope.mode === 'html') {\n setHtmlMedium($scope.content || null);\n }\n $scope.markdown = $scope.content;\n discardLocalStorage();\n mediumInstance.trigger('blur', {}, editorMedium[0]);\n $scope.outdated = false;\n refreshCodeBlocks(mediumInstance);\n $scope.onCancel();\n };\n clean = function() {\n $scope.markdown = '';\n return editorMedium.html('');\n };\n saveEnd = function() {\n $scope.saving = false;\n if (!isEditOnly) {\n setEditMode(false);\n }\n if (notPersist) {\n clean();\n }\n discardLocalStorage();\n mediumInstance.trigger('blur', {}, editorMedium[0]);\n return analytics.trackEvent('develop', 'save wysiwyg', $scope.mode, 1);\n };\n uploadEnd = function(name, url) {\n if (taiga.isImage(name)) {\n return mediumInstance.pasteHTML(\"
    \");\n } else {\n name = $('
    ').text(name).html();\n return mediumInstance.pasteHTML(\"\" + name + \"
    \");\n }\n };\n isOutdated = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store && store.version && store.version !== $scope.version) {\n return true;\n }\n return false;\n };\n isDraft = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store) {\n return true;\n }\n return false;\n };\n getCurrentContent = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store) {\n return store.text;\n }\n return $scope.content;\n };\n discardLocalStorage = function() {\n return $storage.remove($scope.storageKey);\n };\n cancelWithConfirmation = function() {\n var message, title;\n if ($scope.content === $scope.markdown) {\n $scope.cancel();\n document.activeElement.blur();\n document.body.click();\n return null;\n }\n title = $translate.instant(\"COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE\");\n message = $translate.instant(\"COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE\");\n return $confirm.ask(title, null, message).then(function(askResponse) {\n $scope.cancel();\n return askResponse.finish();\n });\n };\n replaceCodeBrToNl = function() {\n var html;\n html = $('
    ').html(editorMedium.html());\n html.find('code br').replaceWith('\\n');\n return html.html();\n };\n updateMarkdownWithCurrentHtml = function() {\n var html;\n html = replaceCodeBrToNl();\n return $scope.markdown = wysiwygService.getMarkdown(html);\n };\n localSave = function(markdown) {\n var store;\n if ($scope.storageKey) {\n store = {};\n store.version = $scope.version || 0;\n store.text = markdown;\n return $storage.set($scope.storageKey, store);\n }\n };\n change = function() {\n if ($scope.mode === 'html') {\n updateMarkdownWithCurrentHtml();\n }\n localSave($scope.markdown);\n return $scope.onChange({\n markdown: $scope.markdown\n });\n };\n throttleChange = _.throttle(change, 200);\n create = function(text, editMode) {\n var html;\n if (editMode == null) {\n editMode = false;\n }\n if (text.length) {\n html = wysiwygService.getHTML(text);\n editorMedium.html(html);\n }\n mediumInstance = new MediumEditor(editorMedium[0], {\n imageDragging: false,\n placeholder: {\n text: $scope.placeholder\n },\n toolbar: {\n buttons: [\n {\n name: 'bold',\n contentDefault: getIcon('editor-bold')\n }, {\n name: 'italic',\n contentDefault: getIcon('editor-italic')\n }, {\n name: 'strikethrough',\n contentDefault: getIcon('editor-cross-out')\n }, {\n name: 'anchor',\n contentDefault: getIcon('editor-link')\n }, {\n name: 'image',\n contentDefault: getIcon('editor-image')\n }, {\n name: 'orderedlist',\n contentDefault: getIcon('editor-list-n')\n }, {\n name: 'unorderedlist',\n contentDefault: getIcon('editor-list-o')\n }, {\n name: 'h1',\n contentDefault: getIcon('editor-h1')\n }, {\n name: 'h2',\n contentDefault: getIcon('editor-h2')\n }, {\n name: 'h3',\n contentDefault: getIcon('editor-h3')\n }, {\n name: 'quote',\n contentDefault: getIcon('editor-quote')\n }, {\n name: 'removeFormat',\n contentDefault: getIcon('editor-no-format')\n }, {\n name: 'rtl',\n contentDefault: getIcon('editor-rtl')\n }, {\n name: 'code',\n contentDefault: getIcon('editor-code')\n }\n ]\n },\n extensions: {\n paste: new CustomPasteHandler(),\n code: new CodeButton(),\n autolist: new AutoList(),\n alignright: new AlignRightButton(),\n mediumMention: new MentionExtension({\n getItems: function(mention, mentionCb) {\n return wysiwygMentionService.search(mention).then(mentionCb);\n }\n })\n }\n });\n $scope.changeMarkdown = throttleChange;\n mediumInstance.subscribe('editableInput', function(e) {\n return $scope.$applyAsync(throttleChange);\n });\n mediumInstance.subscribe(\"editableClick\", function(e) {\n var r;\n r = new RegExp('^(?:[a-z]+:)?//', 'i');\n if (e.target.href) {\n if (r.test(e.target.getAttribute('href')) || e.target.getAttribute('target') === '_blank') {\n e.stopPropagation();\n return window.open(e.target.href);\n } else {\n return $location.url(e.target.href);\n }\n }\n });\n mediumInstance.subscribe('editableDrop', function(event) {\n return $scope.onUploadFile({\n files: event.dataTransfer.files,\n cb: uploadEnd\n });\n });\n mediumInstance.subscribe('editableKeydown', function(e) {\n var code, mention;\n code = e.keyCode ? e.keyCode : e.which;\n mention = $('.medium-mention');\n if ((code === 40 || code === 38) && mention.length) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n if ($scope.editMode && code === 27) {\n e.stopPropagation();\n return $scope.$applyAsync(cancelWithConfirmation);\n } else if (code === 27) {\n return editorMedium.blur();\n }\n });\n setEditMode(editMode);\n return $scope.$applyAsync(function() {\n wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]);\n return refreshCodeBlocks(mediumInstance);\n });\n };\n $(editorMedium[0]).on('mousedown', function(e) {\n if (e.target.href) {\n e.preventDefault();\n return e.stopPropagation();\n } else {\n return $scope.$applyAsync(function() {\n if (!$scope.editMode) {\n setEditMode(true);\n return refreshCodeBlocks(mediumInstance);\n }\n });\n }\n });\n $(editorMedium[0]).on('dblclick', 'pre', function(e) {\n return $scope.$applyAsync(function() {\n $scope.codeEditorVisible = true;\n codeBlockSelected = e.currentTarget.querySelector('code');\n $scope.currentCodeLanguage = wysiwygCodeHightlighterService.getLanguageInClassList(codeBlockSelected.classList);\n return $scope.code = codeBlockSelected.innerText;\n });\n });\n unwatch = $scope.$watch('content', function(content) {\n var unwatchLoader;\n if (!_.isUndefined(content)) {\n $scope.outdated = isOutdated();\n if (!mediumInstance && isDraft()) {\n setEditMode(true);\n }\n if (($scope.markdown.length || content.length) && $scope.markdown === content) {\n return;\n }\n content = getCurrentContent();\n $scope.markdown = content;\n if (mediumInstance) {\n mediumInstance.destroy();\n }\n if (tgLoader.open()) {\n unwatchLoader = tgLoader.onEnd(function() {\n create(content, $scope.editMode);\n return unwatchLoader();\n });\n } else {\n create(content, $scope.editMode);\n }\n return unwatch();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n if (mediumInstance) {\n if (editorMedium.length) {\n $(editorMedium[0]).off();\n }\n return mediumInstance.destroy();\n }\n });\n };\n return {\n templateUrl: \"common/components/wysiwyg-toolbar.html\",\n scope: {\n placeholder: '@',\n version: '<',\n storageKey: '<',\n content: '<',\n onCancel: '&',\n onSave: '&',\n onUploadFile: '&',\n onChange: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWysiwyg\", [\"$translate\", \"$tgConfirm\", \"$tgStorage\", \"tgWysiwygService\", \"animationFrame\", \"tgLoader\", \"tgWysiwygCodeHightlighterService\", \"tgWysiwygMentionService\", \"$tgAnalytics\", \"$location\", Medium]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg.service.coffee\n */\n\n(function() {\n var WysiwygService;\n\n WysiwygService = (function() {\n WysiwygService.$inject = [\"tgWysiwygCodeHightlighterService\", \"tgProjectService\", \"$tgNavUrls\", \"$tgEmojis\"];\n\n function WysiwygService(wysiwygCodeHightlighterService, projectService, navurls, emojis) {\n this.wysiwygCodeHightlighterService = wysiwygCodeHightlighterService;\n this.projectService = projectService;\n this.navurls = navurls;\n this.emojis = emojis;\n }\n\n WysiwygService.prototype.searchEmojiByName = function(name) {\n return this.emojis.searchByName(name);\n };\n\n WysiwygService.prototype.pipeLinks = function(text) {\n return text.replace(/\\[\\[(.*?)\\]\\]/g, function(match, p1, offset, str) {\n var link, linkParams, title;\n linkParams = p1.split('|');\n link = linkParams[0];\n title = linkParams[1] || linkParams[0];\n return '[' + title + '](' + link + ')';\n });\n };\n\n WysiwygService.prototype.replaceUrls = function(html) {\n var el, i, len, link, links;\n el = document.createElement('html');\n el.innerHTML = html;\n links = el.querySelectorAll('a');\n for (i = 0, len = links.length; i < len; i++) {\n link = links[i];\n if (link.getAttribute('href').indexOf('/profile/') !== -1) {\n link.parentNode.replaceChild(document.createTextNode(link.innerText), link);\n } else if (link.getAttribute('href').indexOf('/t/') !== -1) {\n link.parentNode.replaceChild(document.createTextNode(link.innerText), link);\n }\n }\n return el.innerHTML;\n };\n\n WysiwygService.prototype.searchWikiLinks = function(html) {\n var el, i, len, link, links, url;\n el = document.createElement('html');\n el.innerHTML = html;\n links = el.querySelectorAll('a');\n for (i = 0, len = links.length; i < len; i++) {\n link = links[i];\n if (link.getAttribute('href').indexOf('/') === -1) {\n url = this.navurls.resolve('project-wiki-page', {\n project: this.projectService.project.get('slug'),\n slug: link.getAttribute('href')\n });\n link.setAttribute('href', url);\n }\n }\n return el.innerHTML;\n };\n\n WysiwygService.prototype.removeTrailingListBr = function(text) {\n return text.replace(/
  • (.*?)
    <\\/li>/g, '
  • $1
  • ');\n };\n\n WysiwygService.prototype.getMarkdown = function(html) {\n var cleanIssueConverter, codeLanguageConverter, markdown;\n cleanIssueConverter = {\n filter: ['html', 'body', 'span', 'div'],\n replacement: function(innerHTML) {\n return innerHTML;\n }\n };\n codeLanguageConverter = {\n filter: (function(_this) {\n return function(node) {\n return node.nodeName === 'PRE' && node.firstChild && node.firstChild.nodeName === 'CODE';\n };\n })(this),\n replacement: (function(_this) {\n return function(content, node) {\n var lan;\n lan = _this.wysiwygCodeHightlighterService.getLanguageInClassList(node.firstChild.classList);\n if (!lan) {\n lan = '';\n }\n return '\\n\\n```' + lan + '\\n' + _.trim(node.firstChild.textContent) + '\\n```\\n\\n';\n };\n })(this)\n };\n html = html.replace(/ (<\\/.*>)/g, \"$1\");\n html = this.emojis.replaceImgsByEmojiName(html);\n html = this.replaceUrls(html);\n html = this.removeTrailingListBr(html);\n markdown = toMarkdown(html, {\n gfm: true,\n converters: [cleanIssueConverter, codeLanguageConverter]\n });\n return markdown;\n };\n\n WysiwygService.prototype.parseMentionMatches = function(text) {\n var m, matches, offset, prevChar, regex, serviceName, tagBuilder;\n serviceName = 'twitter';\n tagBuilder = this.tagBuilder;\n matches = [];\n regex = /@[^\\s]{1,50}[^.\\s]/g;\n m = regex.exec(text);\n while (m !== null) {\n offset = m.index;\n prevChar = text.charAt(offset - 1);\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n m.forEach(function(match, groupIndex) {\n return matches.push(new Autolinker.match.Mention({\n tagBuilder: tagBuilder,\n matchedText: match,\n offset: offset,\n serviceName: serviceName,\n mention: match.slice(1)\n }));\n });\n m = regex.exec(text);\n }\n return matches;\n };\n\n WysiwygService.prototype.autoLinkHTML = function(html) {\n var autolinker, matchRegexStr;\n matchRegexStr = String(Autolinker.matcher.Mention.prototype.matcherRegexes.twitter);\n if (matchRegexStr.indexOf('.') === -1) {\n matchRegexStr = '@[^\\s]{1,50}[^.\\s]';\n }\n autolinker = new Autolinker({\n mention: 'twitter',\n hashtag: 'twitter',\n replaceFn: (function(_this) {\n return function(match) {\n var profileUrl, url;\n if (match.getType() === 'mention') {\n profileUrl = _this.navurls.resolve('user-profile', {\n project: _this.projectService.project.get('slug'),\n username: match.getMention()\n });\n return '@' + match.getMention() + '';\n } else if (match.getType() === 'hashtag') {\n url = _this.navurls.resolve('project-detail-ref', {\n project: _this.projectService.project.get('slug'),\n ref: match.getHashtag()\n });\n return '#' + match.getHashtag() + '';\n }\n };\n })(this)\n });\n Autolinker.matcher.Mention.prototype.parseMatches = this.parseMentionMatches.bind(autolinker);\n return autolinker.link(html);\n };\n\n WysiwygService.prototype.getHTML = function(text) {\n var md, options, result;\n if (!text || !text.length) {\n return \"\";\n }\n options = {\n breaks: true\n };\n text = this.emojis.replaceEmojiNameByImgs(text);\n text = this.pipeLinks(text);\n md = window.markdownit({\n breaks: true\n });\n md.use(window.markdownitLazyHeaders);\n result = md.render(text);\n result = this.searchWikiLinks(result);\n result = this.autoLinkHTML(result);\n return result;\n };\n\n return WysiwygService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygService\", WysiwygService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home-order-by.controller.coffee\n */\n\n(function() {\n var DiscoverHomeOrderByController;\n\n DiscoverHomeOrderByController = (function() {\n DiscoverHomeOrderByController.$inject = ['$translate'];\n\n function DiscoverHomeOrderByController(translate) {\n this.translate = translate;\n this.is_open = false;\n this.texts = {\n week: this.translate.instant('DISCOVER.FILTERS.WEEK'),\n month: this.translate.instant('DISCOVER.FILTERS.MONTH'),\n year: this.translate.instant('DISCOVER.FILTERS.YEAR'),\n all: this.translate.instant('DISCOVER.FILTERS.ALL_TIME')\n };\n }\n\n DiscoverHomeOrderByController.prototype.currentText = function() {\n return this.texts[this.currentOrderBy];\n };\n\n DiscoverHomeOrderByController.prototype.open = function() {\n return this.is_open = true;\n };\n\n DiscoverHomeOrderByController.prototype.close = function() {\n return this.is_open = false;\n };\n\n DiscoverHomeOrderByController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n this.is_open = false;\n return this.onChange({\n orderBy: this.currentOrderBy\n });\n };\n\n return DiscoverHomeOrderByController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverHomeOrderBy\", DiscoverHomeOrderByController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home-order-by.directive.coffee\n */\n\n(function() {\n var DiscoverHomeOrderByDirective;\n\n DiscoverHomeOrderByDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"DiscoverHomeOrderBy\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"discover/components/discover-home-order-by/discover-home-order-by.html\",\n scope: {\n currentOrderBy: \"=orderBy\",\n onChange: \"&\"\n },\n link: link\n };\n };\n\n DiscoverHomeOrderByDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverHomeOrderBy\", DiscoverHomeOrderByDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-bar.controller.coffee\n */\n\n(function() {\n var DiscoverSearchBarController;\n\n DiscoverSearchBarController = (function() {\n DiscoverSearchBarController.$inject = ['tgDiscoverProjectsService'];\n\n function DiscoverSearchBarController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.discoverProjectsService.projectsCount;\n };\n })(this));\n this.discoverProjectsService.fetchStats();\n }\n\n DiscoverSearchBarController.prototype.selectFilter = function(filter) {\n return this.onChange({\n filter: filter,\n q: this.q\n });\n };\n\n DiscoverSearchBarController.prototype.submitFilter = function() {\n return this.onChange({\n filter: this.filter,\n q: this.q\n });\n };\n\n return DiscoverSearchBarController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearchBar\", DiscoverSearchBarController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.directive.coffee\n */\n\n(function() {\n var DiscoverSearchBarDirective;\n\n DiscoverSearchBarDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n controller: \"DiscoverSearchBar\",\n controllerAs: \"vm\",\n templateUrl: 'discover/components/discover-search-bar/discover-search-bar.html',\n bindToController: true,\n scope: {\n q: \"=\",\n filter: \"=\",\n onChange: \"&\"\n },\n compile: function(element, attrs) {\n if (!attrs.q) {\n return attrs.q = '';\n }\n },\n link: link\n };\n };\n\n DiscoverSearchBarDirective.$inject = [];\n\n angular.module('taigaDiscover').directive('tgDiscoverSearchBar', DiscoverSearchBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-list-header.controller.coffee\n */\n\n(function() {\n var DiscoverSearchListHeaderController;\n\n DiscoverSearchListHeaderController = (function() {\n DiscoverSearchListHeaderController.$inject = [];\n\n function DiscoverSearchListHeaderController() {\n this.like_is_open = this.orderBy.indexOf('-total_fans') === 0;\n this.activity_is_open = this.orderBy.indexOf('-total_activity') === 0;\n }\n\n DiscoverSearchListHeaderController.prototype.openLike = function() {\n this.like_is_open = true;\n this.activity_is_open = false;\n return this.setOrderBy('-total_fans_last_week');\n };\n\n DiscoverSearchListHeaderController.prototype.openActivity = function() {\n this.activity_is_open = true;\n this.like_is_open = false;\n return this.setOrderBy('-total_activity_last_week');\n };\n\n DiscoverSearchListHeaderController.prototype.setOrderBy = function(type) {\n if (type == null) {\n type = '';\n }\n if (!type) {\n this.like_is_open = false;\n this.activity_is_open = false;\n }\n return this.onChange({\n orderBy: type\n });\n };\n\n return DiscoverSearchListHeaderController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearchListHeader\", DiscoverSearchListHeaderController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-list-header.directive.coffee\n */\n\n(function() {\n var DiscoverSearchListHeaderDirective;\n\n DiscoverSearchListHeaderDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"DiscoverSearchListHeader\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"discover/components/discover-search-list-header/discover-search-list-header.html\",\n scope: {\n onChange: \"&\",\n orderBy: \"=\"\n },\n link: link\n };\n };\n\n DiscoverSearchListHeaderDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverSearchListHeader\", DiscoverSearchListHeaderDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: featured-projects.controller.coffee\n */\n\n(function() {\n var FeaturedProjectsController;\n\n FeaturedProjectsController = (function() {\n FeaturedProjectsController.$inject = [\"tgDiscoverProjectsService\"];\n\n function FeaturedProjectsController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"featured\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.featured;\n };\n })(this));\n this.discoverProjectsService.fetchFeatured();\n }\n\n return FeaturedProjectsController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"FeaturedProjects\", FeaturedProjectsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: featured-projects.directive.coffee\n */\n\n(function() {\n var FeaturedProjectsDirective;\n\n FeaturedProjectsDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"FeaturedProjects\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/featured-projects/featured-projects.html\",\n scope: {},\n link: link\n };\n };\n\n FeaturedProjectsDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgFeaturedProjects\", FeaturedProjectsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: highlighted.directive.coffee\n */\n\n(function() {\n var HighlightedDirective;\n\n HighlightedDirective = function() {\n return {\n templateUrl: \"discover/components/highlighted/highlighted.html\",\n scope: {\n loading: \"=\",\n highlighted: \"=\",\n orderBy: \"=\"\n }\n };\n };\n\n HighlightedDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgHighlighted\", HighlightedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-active.controller.coffee\n */\n\n(function() {\n var MostActiveController;\n\n MostActiveController = (function() {\n MostActiveController.$inject = [\"tgDiscoverProjectsService\"];\n\n function MostActiveController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"highlighted\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.mostActive;\n };\n })(this));\n this.currentOrderBy = 'week';\n this.order_by = this.getOrderBy();\n }\n\n MostActiveController.prototype.fetch = function() {\n this.loading = true;\n this.order_by = this.getOrderBy();\n return this.discoverProjectsService.fetchMostActive({\n order_by: this.order_by\n }).then((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n MostActiveController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n return this.fetch();\n };\n\n MostActiveController.prototype.getOrderBy = function(type) {\n if (this.currentOrderBy === 'all') {\n return '-total_activity';\n } else {\n return '-total_activity_last_' + this.currentOrderBy;\n }\n };\n\n return MostActiveController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"MostActive\", MostActiveController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-active.directive.coffee\n */\n\n(function() {\n var MostActiveDirective;\n\n MostActiveDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"MostActive\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/most-active/most-active.html\",\n scope: {},\n link: link\n };\n };\n\n MostActiveDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgMostActive\", MostActiveDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: msot-liked.controller.coffee\n */\n\n(function() {\n var MostLikedController;\n\n MostLikedController = (function() {\n MostLikedController.$inject = [\"tgDiscoverProjectsService\"];\n\n function MostLikedController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"highlighted\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.mostLiked;\n };\n })(this));\n this.currentOrderBy = 'week';\n this.order_by = this.getOrderBy();\n }\n\n MostLikedController.prototype.fetch = function() {\n this.loading = true;\n this.order_by = this.getOrderBy();\n return this.discoverProjectsService.fetchMostLiked({\n order_by: this.order_by\n }).then((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n MostLikedController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n return this.fetch();\n };\n\n MostLikedController.prototype.getOrderBy = function() {\n if (this.currentOrderBy === 'all') {\n return '-total_fans';\n } else {\n return '-total_fans_last_' + this.currentOrderBy;\n }\n };\n\n return MostLikedController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"MostLiked\", MostLikedController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-liked.directive.coffee\n */\n\n(function() {\n var MostLikedDirective;\n\n MostLikedDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"MostLiked\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/most-liked/most-liked.html\",\n scope: {},\n link: link\n };\n };\n\n MostLikedDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgMostLiked\", MostLikedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home.controller.coffee\n */\n\n(function() {\n var DiscoverHomeController;\n\n DiscoverHomeController = (function() {\n DiscoverHomeController.$inject = ['$tgLocation', '$tgNavUrls', 'tgAppMetaService', '$translate'];\n\n function DiscoverHomeController(location, navUrls, appMetaService, translate) {\n var description, title;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n title = this.translate.instant(\"DISCOVER.PAGE_TITLE\");\n description = this.translate.instant(\"DISCOVER.PAGE_DESCRIPTION\");\n this.appMetaService.setAll(title, description);\n }\n\n DiscoverHomeController.prototype.onSubmit = function(q) {\n var url;\n url = this.navUrls.resolve('discover-search');\n return this.location.search('text', q).path(url);\n };\n\n return DiscoverHomeController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverHome\", DiscoverHomeController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.controller.coffee\n */\n\n(function() {\n var DiscoverSearchController;\n\n DiscoverSearchController = (function() {\n DiscoverSearchController.$inject = ['$routeParams', 'tgDiscoverProjectsService', '$route', '$tgLocation', '$tgAnalytics', 'tgAppMetaService', '$translate'];\n\n function DiscoverSearchController(routeParams, discoverProjectsService, route, location, analytics, appMetaService, translate) {\n var description, title;\n this.routeParams = routeParams;\n this.discoverProjectsService = discoverProjectsService;\n this.route = route;\n this.location = location;\n this.analytics = analytics;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.page = 1;\n taiga.defineImmutableProperty(this, \"searchResult\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.searchResult;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"nextSearchPage\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.nextSearchPage;\n };\n })(this));\n this.q = this.routeParams.text;\n this.filter = this.routeParams.filter || 'all';\n this.orderBy = this.routeParams['order_by'] || '';\n this.loadingGlobal = false;\n this.loadingList = false;\n this.loadingPagination = false;\n title = this.translate.instant(\"DISCOVER.SEARCH.PAGE_TITLE\");\n description = this.translate.instant(\"DISCOVER.SEARCH.PAGE_DESCRIPTION\");\n this.appMetaService.setAll(title, description);\n this.analytics.trackPage(this.location.url(), \"Discover Search\");\n }\n\n DiscoverSearchController.prototype.fetch = function() {\n this.page = 1;\n this.discoverProjectsService.resetSearchList();\n return this.search();\n };\n\n DiscoverSearchController.prototype.fetchByGlobalSearch = function() {\n if (this.loadingGlobal) {\n return;\n }\n this.loadingGlobal = true;\n return this.fetch().then((function(_this) {\n return function() {\n return _this.loadingGlobal = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.fetchByOrderBy = function() {\n if (this.loadingList) {\n return;\n }\n this.loadingList = true;\n return this.fetch().then((function(_this) {\n return function() {\n return _this.loadingList = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.showMore = function() {\n if (this.loadingPagination) {\n return;\n }\n this.loadingPagination = true;\n this.page++;\n return this.search().then((function(_this) {\n return function() {\n return _this.loadingPagination = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.search = function() {\n var filter, params;\n filter = this.getFilter();\n params = {\n page: this.page,\n q: this.q,\n order_by: this.orderBy\n };\n _.assign(params, filter);\n return this.discoverProjectsService.fetchSearch(params);\n };\n\n DiscoverSearchController.prototype.getFilter = function() {\n if (this.filter === 'people') {\n return {\n is_looking_for_people: true\n };\n } else if (this.filter === 'scrum') {\n return {\n is_backlog_activated: true\n };\n } else if (this.filter === 'kanban') {\n return {\n is_kanban_activated: true\n };\n }\n return {};\n };\n\n DiscoverSearchController.prototype.onChangeFilter = function(filter, q) {\n this.filter = filter;\n this.q = q;\n this.route.updateParams({\n filter: this.filter,\n text: this.q\n });\n this.analytics.trackPage(this.location.url(), \"Discover Search\");\n return this.fetchByGlobalSearch();\n };\n\n DiscoverSearchController.prototype.onChangeOrder = function(orderBy) {\n this.orderBy = orderBy;\n this.route.updateParams({\n order_by: orderBy\n });\n this.analytics.trackPage(this.location.url(), \"Discover Search\");\n return this.fetchByOrderBy();\n };\n\n return DiscoverSearchController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearch\", DiscoverSearchController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.directive.coffee\n */\n\n(function() {\n var DiscoverSearchDirective;\n\n DiscoverSearchDirective = function() {\n var link;\n link = function(scope, element, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"DiscoverSearch\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n DiscoverSearchDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverSearch\", DiscoverSearchDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-projects.service.coffee\n */\n\n(function() {\n var DiscoverProjectsService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n DiscoverProjectsService = (function(superClass) {\n var _discoverParams;\n\n extend(DiscoverProjectsService, superClass);\n\n DiscoverProjectsService.$inject = [\"tgResources\", \"tgProjectsService\"];\n\n _discoverParams = {\n discover_mode: true\n };\n\n function DiscoverProjectsService(rs, projectsService) {\n this.rs = rs;\n this.projectsService = projectsService;\n this._mostLiked = Immutable.List();\n this._mostActive = Immutable.List();\n this._featured = Immutable.List();\n this._searchResult = Immutable.List();\n this._projectsCount = 0;\n this.decorate = this.projectsService._decorate.bind(this.projectsService);\n taiga.defineImmutableProperty(this, \"mostLiked\", (function(_this) {\n return function() {\n return _this._mostLiked;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"mostActive\", (function(_this) {\n return function() {\n return _this._mostActive;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"featured\", (function(_this) {\n return function() {\n return _this._featured;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"searchResult\", (function(_this) {\n return function() {\n return _this._searchResult;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"nextSearchPage\", (function(_this) {\n return function() {\n return _this._nextSearchPage;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"projectsCount\", (function(_this) {\n return function() {\n return _this._projectsCount;\n };\n })(this));\n }\n\n DiscoverProjectsService.prototype.fetchMostLiked = function(params) {\n var _params;\n _params = _.extend({}, _discoverParams, params);\n return this.rs.projects.getProjects(_params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 5);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._mostLiked = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchMostActive = function(params) {\n var _params;\n _params = _.extend({}, _discoverParams, params);\n return this.rs.projects.getProjects(_params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 5);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._mostActive = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchFeatured = function() {\n var _params;\n _params = _.extend({}, _discoverParams);\n _params.is_featured = true;\n return this.rs.projects.getProjects(_params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 4);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._featured = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.resetSearchList = function() {\n return this._searchResult = Immutable.List();\n };\n\n DiscoverProjectsService.prototype.fetchStats = function() {\n return this.rs.stats.discover().then((function(_this) {\n return function(discover) {\n return _this._projectsCount = discover.getIn(['projects', 'total']);\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchSearch = function(params) {\n var _params;\n _params = _.extend({}, _discoverParams, params);\n return this.rs.projects.getProjects(_params).then((function(_this) {\n return function(result) {\n var projects;\n _this._nextSearchPage = !!result.headers('X-Pagination-Next');\n projects = Immutable.fromJS(result.data);\n projects = projects.map(_this.decorate);\n return _this._searchResult = _this._searchResult.concat(projects);\n };\n })(this));\n };\n\n return DiscoverProjectsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaDiscover\").service(\"tgDiscoverProjectsService\", DiscoverProjectsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: create-epic.controller.coffee\n */\n\n(function() {\n var CreateEpicController, getRandomDefaultColor, taiga, trim;\n\n taiga = this.taiga;\n\n trim = taiga.trim;\n\n getRandomDefaultColor = taiga.getRandomDefaultColor;\n\n CreateEpicController = (function() {\n CreateEpicController.$inject = [\"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\", \"$tgAnalytics\"];\n\n function CreateEpicController(confirm, projectService, epicsService, analytics) {\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.analytics = analytics;\n this.project = this.projectService.project.toJS();\n this.newEpic = {\n color: getRandomDefaultColor(),\n status: this.project.default_epic_status,\n tags: []\n };\n this.attachments = Immutable.List();\n this.loading = false;\n }\n\n CreateEpicController.prototype.createEpic = function() {\n if (!this.validateForm()) {\n return;\n }\n this.loading = true;\n return this.epicsService.createEpic(this.newEpic, this.attachments).then((function(_this) {\n return function(response) {\n _this.analytics.trackEvent(\"epic\", \"create\", \"create epic\", 1);\n _this.onCreateEpic();\n return _this.loading = false;\n };\n })(this))[\"catch\"]((function(_this) {\n return function(response) {\n _this.loading = false;\n _this.setFormErrors(response.data);\n if (response.data._error_message) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this));\n };\n\n CreateEpicController.prototype.selectColor = function(color) {\n return this.newEpic.color = color;\n };\n\n CreateEpicController.prototype.addTag = function(name, color) {\n name = trim(name.toLowerCase());\n if (!_.find(this.newEpic.tags, function(it) {\n return it[0] === name;\n })) {\n return this.newEpic.tags.push([name, color]);\n }\n };\n\n CreateEpicController.prototype.deleteTag = function(tag) {\n return _.remove(this.newEpic.tags, function(it) {\n return it[0] === tag[0];\n });\n };\n\n CreateEpicController.prototype.addAttachment = function(attachment) {\n return this.attachments.push(attachment);\n };\n\n return CreateEpicController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"CreateEpicCtrl\", CreateEpicController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: create-epic.directive.coffee\n */\n\n(function() {\n var CreateEpicDirective;\n\n CreateEpicDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var form;\n form = el.find(\"form\").checksley();\n ctrl.validateForm = (function(_this) {\n return function() {\n return form.validate();\n };\n })(this);\n return ctrl.setFormErrors = (function(_this) {\n return function(errors) {\n return form.setErrors(errors);\n };\n })(this);\n };\n return {\n link: link,\n templateUrl: \"epics/create-epic/create-epic.html\",\n controller: \"CreateEpicCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n onCreateEpic: '&'\n },\n scope: {}\n };\n };\n\n angular.module('taigaEpics').directive(\"tgCreateEpic\", CreateEpicDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.controller.coffee\n */\n\n(function() {\n var EpicRowController;\n\n EpicRowController = (function() {\n EpicRowController.$inject = [\"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\"];\n\n function EpicRowController(confirm, projectService, epicsService) {\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.displayUserStories = false;\n this.displayAssignedTo = false;\n this.displayStatusList = false;\n this.loadingStatus = false;\n this.project = this.projectService.project.toJS();\n this._calculateProgressBar();\n }\n\n EpicRowController.prototype._calculateProgressBar = function() {\n var progress, total;\n if (this.epic.getIn(['status_extra_info', 'is_closed']) === true) {\n return this.percentage = \"100%\";\n } else {\n progress = this.epic.getIn(['user_stories_counts', 'progress']);\n total = this.epic.getIn(['user_stories_counts', 'total']);\n if (total === 0) {\n return this.percentage = \"0%\";\n } else {\n return this.percentage = (progress * 100 / total) + \"%\";\n }\n }\n };\n\n EpicRowController.prototype.canEditEpics = function() {\n return this.projectService.hasPermission(\"modify_epic\");\n };\n\n EpicRowController.prototype.toggleUserStoryList = function() {\n if (!this.displayUserStories) {\n return this.epicsService.listRelatedUserStories(this.epic).then((function(_this) {\n return function(userStories) {\n _this.epicStories = userStories;\n return _this.displayUserStories = true;\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this));\n } else {\n return this.displayUserStories = false;\n }\n };\n\n EpicRowController.prototype.updateStatus = function(statusId) {\n this.displayStatusList = false;\n this.loadingStatus = true;\n return this.epicsService.updateEpicStatus(this.epic, statusId)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loadingStatus = false;\n };\n })(this));\n };\n\n EpicRowController.prototype.updateAssignedTo = function(member) {\n this.assignLoader = true;\n return this.epicsService.updateEpicAssignedTo(this.epic, (member != null ? member.id : void 0) || null)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.assignLoader = false;\n };\n })(this));\n };\n\n return EpicRowController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicRowCtrl\", EpicRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.directive.coffee\n */\n\n(function() {\n var EpicRowDirective;\n\n EpicRowDirective = function() {\n return {\n templateUrl: \"epics/dashboard/epic-row/epic-row.html\",\n controller: \"EpicRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n epic: '=',\n column: '='\n }\n };\n };\n\n angular.module('taigaEpics').directive(\"tgEpicRow\", EpicRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics.dashboard.controller.coffee\n */\n\n(function() {\n var EpicsDashboardController, taiga;\n\n taiga = this.taiga;\n\n EpicsDashboardController = (function() {\n EpicsDashboardController.$inject = [\"$routeParams\", \"tgErrorHandlingService\", \"tgLightboxFactory\", \"lightboxService\", \"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\", \"tgAppMetaService\", \"$translate\"];\n\n function EpicsDashboardController(params, errorHandlingService, lightboxFactory, lightboxService, confirm, projectService, epicsService, appMetaService, translate) {\n this.params = params;\n this.errorHandlingService = errorHandlingService;\n this.lightboxFactory = lightboxFactory;\n this.lightboxService = lightboxService;\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.sectionName = \"EPICS.SECTION_NAME\";\n taiga.defineImmutableProperty(this, 'project', (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this.epicsService.epics;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n }\n\n EpicsDashboardController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\"),\n projectDescription: this.project.get(\"description\")\n };\n return {\n title: this.translate.instant(\"EPICS.PAGE_TITLE\", ctx),\n description: this.translate.instant(\"EPICS.PAGE_DESCRIPTION\", ctx)\n };\n };\n\n EpicsDashboardController.prototype.loadInitialData = function() {\n this.epicsService.clear();\n return this.projectService.setProjectBySlug(this.params.pslug).then((function(_this) {\n return function() {\n if (!_this.projectService.isEpicsDashboardEnabled()) {\n return _this.errorHandlingService.notFound();\n }\n if (!_this.projectService.hasPermission(\"view_epics\")) {\n return _this.errorHandlingService.permissionDenied();\n }\n return _this.epicsService.fetchEpics();\n };\n })(this));\n };\n\n EpicsDashboardController.prototype.canCreateEpics = function() {\n return this.projectService.hasPermission(\"add_epic\");\n };\n\n EpicsDashboardController.prototype.onCreateEpic = function() {\n var onCreateEpic;\n onCreateEpic = (function(_this) {\n return function() {\n _this.lightboxService.closeAll();\n _this.confirm.notify(\"success\");\n };\n })(this);\n return this.lightboxFactory.create('tg-create-epic', {\n \"class\": \"lightbox lightbox-create-epic open\",\n \"on-create-epic\": \"onCreateEpic()\"\n }, {\n \"onCreateEpic\": onCreateEpic.bind(this)\n });\n };\n\n return EpicsDashboardController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicsDashboardCtrl\", EpicsDashboardController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-sortable.directive.coffee\n */\n\n(function() {\n var EpicsSortableDirective;\n\n EpicsSortableDirective = function($parse, projectService) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n if (!projectService.hasPermission(\"modify_epic\")) {\n return;\n }\n callback = $parse(attrs.tgEpicsSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('div.epics-table-body-row');\n }\n });\n drake.on('dragend', function(item) {\n var epic, itemEl, newIndex;\n itemEl = $(item);\n epic = itemEl.scope().epic;\n newIndex = itemEl.index();\n return scope.$apply(function() {\n return callback(scope, {\n epic: epic,\n newIndex: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n EpicsSortableDirective.$inject = [\"$parse\", \"tgProjectService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgEpicsSortable\", EpicsSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.controller.coffee\n */\n\n(function() {\n var EpicsTableController, generateHash, taiga;\n\n taiga = this.taiga;\n\n generateHash = this.taiga.generateHash;\n\n EpicsTableController = (function() {\n EpicsTableController.$inject = [\"$tgConfirm\", \"tgEpicsService\", \"$timeout\", \"$tgStorage\", \"tgProjectService\"];\n\n function EpicsTableController(confirm, epicsService, timeout, storage, projectService) {\n this.confirm = confirm;\n this.epicsService = epicsService;\n this.timeout = timeout;\n this.storage = storage;\n this.projectService = projectService;\n this.hash = generateHash([this.projectService.project.get('id'), 'epics']);\n this.displayOptions = false;\n this.displayVotes = true;\n this.column = this.storage.get(this.hash, {\n votes: true,\n name: true,\n project: true,\n sprint: true,\n assigned: true,\n status: true,\n progress: true\n });\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this.epicsService.epics;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'disabledEpicsPagination', (function(_this) {\n return function() {\n return _this.epicsService._disablePagination;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'loadingEpics', (function(_this) {\n return function() {\n return _this.epicsService._loadingEpics;\n };\n })(this));\n }\n\n EpicsTableController.prototype.toggleEpicTableOptions = function() {\n return this.displayOptions = !this.displayOptions;\n };\n\n EpicsTableController.prototype.reorderEpic = function(epic, newIndex) {\n if (epic.get('epics_order') === newIndex) {\n return null;\n }\n return this.epicsService.reorderEpic(epic, newIndex).then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n EpicsTableController.prototype.nextPage = function() {\n return this.epicsService.nextPage();\n };\n\n EpicsTableController.prototype.hoverEpicTableOption = function() {\n if (this.timer) {\n return this.timeout.cancel(this.timer);\n }\n };\n\n EpicsTableController.prototype.hideEpicTableOption = function() {\n return this.timer = this.timeout(((function(_this) {\n return function() {\n return _this.displayOptions = false;\n };\n })(this)), 400);\n };\n\n EpicsTableController.prototype.updateViewOptions = function() {\n return this.storage.set(this.hash, this.column);\n };\n\n return EpicsTableController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicsTableCtrl\", EpicsTableController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.directive.coffee\n */\n\n(function() {\n var EpicsTableDirective;\n\n EpicsTableDirective = function() {\n return {\n templateUrl: \"epics/dashboard/epics-table/epics-table.html\",\n controller: \"EpicsTableCtrl\",\n controllerAs: \"vm\",\n scope: {}\n };\n };\n\n angular.module('taigaEpics').directive(\"tgEpicsTable\", EpicsTableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.controller.coffee\n */\n\n(function() {\n var StoryRowController, module;\n\n module = angular.module(\"taigaEpics\");\n\n StoryRowController = (function() {\n StoryRowController.$inject = [];\n\n function StoryRowController() {\n this._calculateProgressBar();\n }\n\n StoryRowController.prototype._calculateProgressBar = function() {\n var totalTasks, totalTasksCompleted;\n if (this.story.get('is_closed') === true) {\n return this.percentage = \"100%\";\n } else {\n totalTasks = this.story.get('tasks').size;\n totalTasksCompleted = this.story.get('tasks').filter(function(it) {\n return it.get(\"is_closed\");\n }).size;\n if (totalTasks === 0) {\n return this.percentage = \"0%\";\n } else {\n return this.percentage = (totalTasksCompleted * 100 / totalTasks) + \"%\";\n }\n }\n };\n\n return StoryRowController;\n\n })();\n\n module.controller(\"StoryRowCtrl\", StoryRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.directive.coffee\n */\n\n(function() {\n var StoryRowDirective, module;\n\n module = angular.module('taigaEpics');\n\n StoryRowDirective = function() {\n return {\n templateUrl: \"epics/dashboard/story-row/story-row.html\",\n controller: \"StoryRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n story: '=',\n column: '='\n }\n };\n };\n\n module.directive(\"tgStoryRow\", StoryRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics.service.coffee\n */\n\n(function() {\n var EpicsService, taiga;\n\n taiga = this.taiga;\n\n EpicsService = (function() {\n EpicsService.$inject = ['tgProjectService', 'tgAttachmentsService', 'tgResources', 'tgXhrErrorService'];\n\n function EpicsService(projectService, attachmentsService, resources, xhrError) {\n this.projectService = projectService;\n this.attachmentsService = attachmentsService;\n this.resources = resources;\n this.xhrError = xhrError;\n this.clear();\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this._epics;\n };\n })(this));\n }\n\n EpicsService.prototype.clear = function() {\n this._loadingEpics = false;\n this._disablePagination = false;\n this._page = 1;\n return this._epics = Immutable.List();\n };\n\n EpicsService.prototype.fetchEpics = function(reset) {\n if (reset == null) {\n reset = false;\n }\n this._loadingEpics = true;\n this._disablePagination = true;\n return this.resources.epics.list(this.projectService.project.get('id'), this._page).then((function(_this) {\n return function(result) {\n if (reset) {\n _this.clear();\n _this._epics = result.list;\n } else {\n _this._epics = _this._epics.concat(result.list);\n }\n _this._loadingEpics = false;\n return _this._disablePagination = !result.headers('x-pagination-next');\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n EpicsService.prototype.nextPage = function() {\n this._page++;\n return this.fetchEpics();\n };\n\n EpicsService.prototype.listRelatedUserStories = function(epic) {\n return this.resources.userstories.listInEpic(epic.get('id'));\n };\n\n EpicsService.prototype.createEpic = function(epicData, attachments) {\n epicData.project = this.projectService.project.get('id');\n return this.resources.epics.post(epicData).then((function(_this) {\n return function(epic) {\n var promises;\n promises = _.map(attachments.toJS(), function(attachment) {\n return _this.attachmentsService.upload(attachment.file, epic.get('id'), epic.get('project'), 'epic');\n });\n return Promise.all(promises).then(_this.fetchEpics.bind(_this, true));\n };\n })(this));\n };\n\n EpicsService.prototype.reorderEpic = function(epic, newIndex) {\n var afterDestination, beforeDestination, data, newOrder, orderList, previous, previousWithTheSameOrder, setOrders, withoutMoved;\n orderList = {};\n this._epics.forEach(function(it) {\n return orderList[it.get('id')] = it.get('epics_order');\n });\n withoutMoved = this.epics.filter((function(_this) {\n return function(it) {\n return it.get('id') !== epic.get('id');\n };\n })(this));\n beforeDestination = withoutMoved.slice(0, newIndex);\n afterDestination = withoutMoved.slice(newIndex);\n previous = beforeDestination.last();\n newOrder = !previous ? 0 : previous.get('epics_order') + 1;\n orderList[epic.get('id')] = newOrder;\n previousWithTheSameOrder = beforeDestination.filter((function(_this) {\n return function(it) {\n return it.get('epics_order') === previous.get('epics_order');\n };\n })(this));\n setOrders = _.fromPairs(previousWithTheSameOrder.map((function(_this) {\n return function(it) {\n return [it.get('id'), it.get('epics_order')];\n };\n })(this)).toJS());\n afterDestination.forEach(function(it) {\n return orderList[it.get('id')] = it.get('epics_order') + 1;\n });\n this._epics = this._epics.map(function(it) {\n return it.set('epics_order', orderList[it.get('id')]);\n });\n this._epics = this._epics.sortBy(function(it) {\n return it.get('epics_order');\n });\n data = {\n epics_order: newOrder,\n version: epic.get('version')\n };\n return this.resources.epics.reorder(epic.get('id'), data, setOrders).then((function(_this) {\n return function(newEpic) {\n return _this._epics = _this._epics.map(function(it) {\n if (it.get('id') === newEpic.get('id')) {\n return newEpic;\n }\n return it;\n });\n };\n })(this));\n };\n\n EpicsService.prototype.reorderRelatedUserstory = function(epic, epicUserstories, userstory, newIndex) {\n var beforeDestination, data, epicId, newOrder, previous, previousWithTheSameOrder, setOrders, userstoryId, withoutMoved;\n withoutMoved = epicUserstories.filter((function(_this) {\n return function(it) {\n return it.get('id') !== userstory.get('id');\n };\n })(this));\n beforeDestination = withoutMoved.slice(0, newIndex);\n previous = beforeDestination.last();\n newOrder = !previous ? 0 : previous.get('epic_order') + 1;\n previousWithTheSameOrder = beforeDestination.filter((function(_this) {\n return function(it) {\n return it.get('epic_order') === previous.get('epic_order');\n };\n })(this));\n setOrders = _.fromPairs(previousWithTheSameOrder.map((function(_this) {\n return function(it) {\n return [it.get('id'), it.get('epic_order')];\n };\n })(this)).toJS());\n data = {\n order: newOrder\n };\n epicId = epic.get('id');\n userstoryId = userstory.get('id');\n return this.resources.epics.reorderRelatedUserstory(epicId, userstoryId, data, setOrders).then((function(_this) {\n return function() {\n return _this.listRelatedUserStories(epic);\n };\n })(this));\n };\n\n EpicsService.prototype.replaceEpic = function(epic) {\n return this._epics = this._epics.map(function(it) {\n if (it.get('id') === epic.get('id')) {\n return epic;\n }\n return it;\n });\n };\n\n EpicsService.prototype.updateEpicStatus = function(epic, statusId) {\n var data;\n data = {\n status: statusId,\n version: epic.get('version')\n };\n return this.resources.epics.patch(epic.get('id'), data).then(this.replaceEpic.bind(this));\n };\n\n EpicsService.prototype.updateEpicAssignedTo = function(epic, userId) {\n var data;\n data = {\n assigned_to: userId,\n version: epic.get('version')\n };\n return this.resources.epics.patch(epic.get('id'), data).then(this.replaceEpic.bind(this));\n };\n\n return EpicsService;\n\n })();\n\n angular.module('taigaEpics').service('tgEpicsService', EpicsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstories.controller.coffee\n */\n\n(function() {\n var RelatedUserStoriesController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserStoriesController = (function() {\n RelatedUserStoriesController.$inject = [\"tgProjectService\", \"tgEpicsService\"];\n\n function RelatedUserStoriesController(projectService, epicsService) {\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.sectionName = \"Epics\";\n this.showCreateRelatedUserstoriesLightbox = false;\n }\n\n RelatedUserStoriesController.prototype.showRelatedUserStoriesSection = function() {\n var ref;\n return this.projectService.hasPermission(\"view_epics\") || ((ref = this.userstories) != null ? ref.length : void 0) > 0;\n };\n\n RelatedUserStoriesController.prototype.userCanSort = function() {\n return this.projectService.hasPermission(\"modify_epic\");\n };\n\n RelatedUserStoriesController.prototype.loadRelatedUserstories = function() {\n return this.epicsService.listRelatedUserStories(this.epic).then((function(_this) {\n return function(userstories) {\n return _this.userstories = userstories;\n };\n })(this));\n };\n\n RelatedUserStoriesController.prototype.reorderRelatedUserstory = function(us, newIndex) {\n return this.epicsService.reorderRelatedUserstory(this.epic, this.userstories, us, newIndex).then((function(_this) {\n return function(userstories) {\n return _this.userstories = userstories;\n };\n })(this));\n };\n\n return RelatedUserStoriesController;\n\n })();\n\n module.controller(\"RelatedUserStoriesCtrl\", RelatedUserStoriesController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstory-create.controller.coffee\n */\n\n(function() {\n var RelatedUserstoriesCreateController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserstoriesCreateController = (function() {\n RelatedUserstoriesCreateController.$inject = [\"tgCurrentUserService\", \"tgResources\", \"$tgConfirm\", \"$tgAnalytics\"];\n\n function RelatedUserstoriesCreateController(currentUserService, rs, confirm, analytics) {\n this.currentUserService = currentUserService;\n this.rs = rs;\n this.confirm = confirm;\n this.analytics = analytics;\n this.projects = null;\n this.projectUserstories = Immutable.List();\n this.loading = false;\n }\n\n RelatedUserstoriesCreateController.prototype.loadProjects = function() {\n if (this.projects === null) {\n return this.projects = this.currentUserService.projects.get(\"all\");\n }\n };\n\n RelatedUserstoriesCreateController.prototype.filterUss = function(selectedProjectId, filterText) {\n var promise;\n promise = this.rs.userstories.listInAllProjects({\n project: selectedProjectId,\n q: filterText\n }, true).then((function(_this) {\n return function(data) {\n var excludeIds, filteredData;\n excludeIds = _this.epicUserstories.map(function(us) {\n return us.get('id');\n });\n filteredData = data.filter(function(us) {\n return excludeIds.indexOf(us.get('id')) === -1;\n });\n return _this.projectUserstories = filteredData;\n };\n })(this));\n return promise;\n };\n\n RelatedUserstoriesCreateController.prototype.saveRelatedUserStory = function(selectedUserstoryId, onSavedRelatedUserstory) {\n var epicId, onError, onSuccess;\n if (!this.validateExistingUserstoryForm()) {\n return;\n }\n this.loading = true;\n onError = (function(_this) {\n return function(data) {\n _this.loading = false;\n _this.confirm.notify(\"error\");\n return _this.setExistingUserstoryFormErrors(data);\n };\n })(this);\n onSuccess = (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"epic related user story\", \"create\", \"create related user story on epic\", 1);\n _this.loading = false;\n if (onSavedRelatedUserstory) {\n onSavedRelatedUserstory();\n }\n return _this.loadRelatedUserstories();\n };\n })(this);\n epicId = this.epic.get('id');\n return this.rs.epics.addRelatedUserstory(epicId, selectedUserstoryId).then(onSuccess, onError);\n };\n\n RelatedUserstoriesCreateController.prototype.bulkCreateRelatedUserStories = function(selectedProjectId, userstoriesText, onCreatedRelatedUserstory) {\n var epicId, onError, onSuccess;\n if (!this.validateNewUserstoryForm()) {\n return;\n }\n this.loading = true;\n onError = (function(_this) {\n return function(data) {\n _this.loading = false;\n _this.confirm.notify(\"error\");\n return _this.setNewUserstoryFormErrors(data);\n };\n })(this);\n onSuccess = (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"epic related user story\", \"create\", \"create related user story on epic\", 1);\n _this.loading = false;\n if (onCreatedRelatedUserstory) {\n onCreatedRelatedUserstory();\n }\n return _this.loadRelatedUserstories();\n };\n })(this);\n epicId = this.epic.get('id');\n return this.rs.epics.bulkCreateRelatedUserStories(epicId, selectedProjectId, userstoriesText).then(onSuccess, onError);\n };\n\n return RelatedUserstoriesCreateController;\n\n })();\n\n module.controller(\"RelatedUserstoriesCreateCtrl\", RelatedUserstoriesCreateController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstory-create.directive.coffee\n */\n\n(function() {\n var RelatedUserstoriesCreateDirective, debounceLeading, module;\n\n module = angular.module('taigaEpics');\n\n debounceLeading = this.taiga.debounceLeading;\n\n RelatedUserstoriesCreateDirective = function(lightboxService1) {\n var link;\n this.lightboxService = lightboxService1;\n link = function(scope, el, attrs, ctrl) {\n var existingUserstoryForm, newUserstoryForm;\n newUserstoryForm = el.find(\".new-user-story-form\").checksley();\n existingUserstoryForm = el.find(\".existing-user-story-form\").checksley();\n ctrl.validateNewUserstoryForm = (function(_this) {\n return function() {\n return newUserstoryForm.validate();\n };\n })(this);\n ctrl.setNewUserstoryFormErrors = (function(_this) {\n return function(errors) {\n return newUserstoryForm.setErrors(errors);\n };\n })(this);\n ctrl.validateExistingUserstoryForm = (function(_this) {\n return function() {\n return existingUserstoryForm.validate();\n };\n })(this);\n ctrl.setExistingUserstoryFormErrors = (function(_this) {\n return function(errors) {\n return existingUserstoryForm.setErrors(errors);\n };\n })(this);\n scope.showLightbox = function(selectedProjectId) {\n ctrl.loadProjects();\n return scope.selectProject(selectedProjectId).then((function(_this) {\n return function() {\n return lightboxService.open(el.find(\".lightbox-create-related-user-stories\"));\n };\n })(this));\n };\n scope.closeLightbox = function() {\n scope.selectedUserstory = null;\n scope.searchUserstory = \"\";\n scope.relatedUserstoriesText = \"\";\n return lightboxService.close(el.find(\".lightbox-create-related-user-stories\"));\n };\n scope.$watch('vm.project', function(project) {\n if (project != null) {\n return scope.selectedProject = project.get('id');\n }\n });\n scope.selectProject = function(selectedProjectId) {\n scope.selectedUserstory = null;\n scope.searchUserstory = \"\";\n return ctrl.filterUss(selectedProjectId, scope.searchUserstory);\n };\n return scope.onUpdateSearchUserstory = debounceLeading(300, function() {\n scope.selectedUserstory = null;\n return ctrl.filterUss(scope.selectedProject, scope.searchUserstory);\n });\n };\n return {\n link: link,\n templateUrl: \"epics/related-userstories/related-userstories-create/related-userstories-create.html\",\n controller: \"RelatedUserstoriesCreateCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n showCreateRelatedUserstoriesLightbox: \"=\",\n project: \"=\",\n epic: \"=\",\n epicUserstories: \"=\",\n loadRelatedUserstories: \"&\"\n }\n };\n };\n\n RelatedUserstoriesCreateDirective.$inject = [\"lightboxService\"];\n\n module.directive(\"tgRelatedUserstoriesCreate\", RelatedUserstoriesCreateDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstories-sortable.directive.coffee\n */\n\n(function() {\n var RelatedUserstoriesSortableDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserstoriesSortableDirective = function($parse, projectService) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n if (!projectService.hasPermission(\"modify_epic\")) {\n return;\n }\n callback = $parse(attrs.tgRelatedUserstoriesSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('tg-related-userstory-row');\n }\n });\n drake.on('dragend', function(item) {\n var itemEl, newIndex, us;\n itemEl = $(item);\n us = itemEl.scope().us;\n newIndex = itemEl.index();\n return scope.$apply(function() {\n return callback(scope, {\n us: us,\n newIndex: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n RelatedUserstoriesSortableDirective.$inject = [\"$parse\", \"tgProjectService\"];\n\n module.directive(\"tgRelatedUserstoriesSortable\", RelatedUserstoriesSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstories.directive.coffee\n */\n\n(function() {\n var RelatedUserStoriesDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserStoriesDirective = function() {\n return {\n templateUrl: \"epics/related-userstories/related-userstories.html\",\n controller: \"RelatedUserStoriesCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n userstories: '=',\n project: '=',\n epic: '='\n }\n };\n };\n\n RelatedUserStoriesDirective.$inject = [];\n\n module.directive(\"tgRelatedUserstories\", RelatedUserStoriesDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: reñated-userstory-row.controller.coffee\n */\n\n(function() {\n var RelatedUserstoryRowController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserstoryRowController = (function() {\n RelatedUserstoryRowController.$inject = [\"tgAvatarService\", \"$translate\", \"$tgConfirm\", \"tgResources\"];\n\n function RelatedUserstoryRowController(avatarService, translate, confirm, rs) {\n this.avatarService = avatarService;\n this.translate = translate;\n this.confirm = confirm;\n this.rs = rs;\n }\n\n RelatedUserstoryRowController.prototype.setAvatarData = function() {\n var member;\n member = this.userstory.get('assigned_to_extra_info');\n return this.avatar = this.avatarService.getAvatar(member);\n };\n\n RelatedUserstoryRowController.prototype.getAssignedToFullNameDisplay = function() {\n if (this.userstory.get('assigned_to')) {\n return this.userstory.getIn(['assigned_to_extra_info', 'full_name_display']);\n }\n return this.translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\");\n };\n\n RelatedUserstoryRowController.prototype.onDeleteRelatedUserstory = function() {\n var message, title;\n title = this.translate.instant('EPIC.TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY');\n message = this.translate.instant('EPIC.MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY', {\n subject: this.userstory.get('subject')\n });\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var epicId, onError, onSuccess, userstoryId;\n onError = function() {\n message = _this.translate.instant('EPIC.ERROR_UNLINK_RELATED_USERSTORY', {\n errorMessage: message\n });\n _this.confirm.notify(\"error\", null, message);\n return askResponse.finish(false);\n };\n onSuccess = function() {\n _this.loadRelatedUserstories();\n return askResponse.finish();\n };\n epicId = _this.epic.get('id');\n userstoryId = _this.userstory.get('id');\n return _this.rs.epics.deleteRelatedUserstory(epicId, userstoryId).then(onSuccess, onError);\n };\n })(this));\n };\n\n return RelatedUserstoryRowController;\n\n })();\n\n module.controller(\"RelatedUserstoryRowCtrl\", RelatedUserstoryRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstory-row.directive.coffee\n */\n\n(function() {\n var RelatedUserstoryRowDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserstoryRowDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.setAvatarData();\n };\n return {\n link: link,\n templateUrl: \"epics/related-userstories/related-userstory-row/related-userstory-row.html\",\n controller: \"RelatedUserstoryRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n userstory: '=',\n epic: '=',\n project: '=',\n loadRelatedUserstories: \"&\"\n }\n };\n };\n\n RelatedUserstoryRowDirective.$inject = [];\n\n module.directive(\"tgRelatedUserstoryRow\", RelatedUserstoryRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-app.controller.coffee\n */\n\n(function() {\n var ExternalAppController, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ExternalAppController = (function(superClass) {\n extend(ExternalAppController, superClass);\n\n ExternalAppController.$inject = [\"$routeParams\", \"tgExternalAppsService\", \"$window\", \"tgCurrentUserService\", \"$location\", \"$tgNavUrls\", \"tgXhrErrorService\", \"tgLoader\"];\n\n function ExternalAppController(routeParams, externalAppsService, window, currentUserService, location, navUrls, xhrError, loader) {\n var loginUrl, nextUrl;\n this.routeParams = routeParams;\n this.externalAppsService = externalAppsService;\n this.window = window;\n this.currentUserService = currentUserService;\n this.location = location;\n this.navUrls = navUrls;\n this.xhrError = xhrError;\n this.loader = loader;\n this.createApplicationToken = bind(this.createApplicationToken, this);\n this._getApplicationToken = bind(this._getApplicationToken, this);\n this._redirect = bind(this._redirect, this);\n this.loader.start(false);\n this._applicationId = this.routeParams.application;\n this._state = this.routeParams.state;\n this._getApplicationToken();\n this._user = this.currentUserService.getUser();\n this._application = null;\n nextUrl = encodeURIComponent(this.location.url());\n loginUrl = this.navUrls.resolve(\"login\");\n this.loginWithAnotherUserUrl = loginUrl + \"?next=\" + nextUrl;\n taiga.defineImmutableProperty(this, \"user\", (function(_this) {\n return function() {\n return _this._user;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"application\", (function(_this) {\n return function() {\n return _this._application;\n };\n })(this));\n }\n\n ExternalAppController.prototype._redirect = function(applicationToken) {\n var nextUrl;\n nextUrl = applicationToken.get(\"next_url\");\n return this.window.open(nextUrl, \"_self\");\n };\n\n ExternalAppController.prototype._getApplicationToken = function() {\n return this.externalAppsService.getApplicationToken(this._applicationId, this._state).then((function(_this) {\n return function(data) {\n _this._application = data.get(\"application\");\n if (data.get(\"auth_code\")) {\n return _this._redirect(data);\n } else {\n return _this.loader.pageLoaded();\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n _this.loader.pageLoaded();\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n ExternalAppController.prototype.cancel = function() {\n return this.window.history.back();\n };\n\n ExternalAppController.prototype.createApplicationToken = function() {\n return this.externalAppsService.authorizeApplicationToken(this._applicationId, this._state).then((function(_this) {\n return function(data) {\n return _this._redirect(data);\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n return ExternalAppController;\n\n })(taiga.Controller);\n\n angular.module(\"taigaExternalApps\").controller(\"ExternalApp\", ExternalAppController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-app.service.coffee\n */\n\n(function() {\n var ExternalAppsService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n ExternalAppsService = (function(superClass) {\n extend(ExternalAppsService, superClass);\n\n ExternalAppsService.$inject = [\"tgResources\"];\n\n function ExternalAppsService(rs) {\n this.rs = rs;\n }\n\n ExternalAppsService.prototype.getApplicationToken = function(applicationId, state) {\n return this.rs.externalapps.getApplicationToken(applicationId, state);\n };\n\n ExternalAppsService.prototype.authorizeApplicationToken = function(applicationId, state) {\n return this.rs.externalapps.authorizeApplicationToken(applicationId, state);\n };\n\n return ExternalAppsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaExternalApps\").service(\"tgExternalAppsService\", ExternalAppsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: feedback.service.coffee\n */\n\n(function() {\n var FeedbackService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n FeedbackService = (function(superClass) {\n extend(FeedbackService, superClass);\n\n FeedbackService.$inject = [\"tgLightboxFactory\"];\n\n function FeedbackService(lightboxFactory) {\n this.lightboxFactory = lightboxFactory;\n }\n\n FeedbackService.prototype.sendFeedback = function() {\n return this.lightboxFactory.create(\"tg-lb-feedback\", {\n \"class\": \"lightbox lightbox-feedback lightbox-generic-form\"\n });\n };\n\n return FeedbackService;\n\n })(taiga.Service);\n\n angular.module(\"taigaFeedback\").service(\"tgFeedbackService\", FeedbackService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.controller.coffee\n */\n\n(function() {\n var CommentController, module;\n\n module = angular.module(\"taigaHistory\");\n\n CommentController = (function() {\n CommentController.$inject = [\"tgCurrentUserService\", \"tgCheckPermissionsService\", \"tgLightboxFactory\"];\n\n function CommentController(currentUserService, permissionService, lightboxFactory) {\n this.currentUserService = currentUserService;\n this.permissionService = permissionService;\n this.lightboxFactory = lightboxFactory;\n this.hiddenDeletedComment = true;\n }\n\n CommentController.prototype.showDeletedComment = function() {\n return this.hiddenDeletedComment = false;\n };\n\n CommentController.prototype.hideDeletedComment = function() {\n return this.hiddenDeletedComment = true;\n };\n\n CommentController.prototype.checkCancelComment = function(event) {\n if (event.keyCode === 27) {\n return this.onEditMode({\n commentId: this.comment.id\n });\n }\n };\n\n CommentController.prototype.canEditDeleteComment = function() {\n if (this.currentUserService.getUser()) {\n this.user = this.currentUserService.getUser();\n return this.user.get('id') === this.comment.user.pk || this.permissionService.check('modify_project');\n }\n };\n\n CommentController.prototype.saveComment = function(text, cb) {\n return this.onEditComment({\n commentId: this.comment.id,\n commentData: text,\n callback: cb\n });\n };\n\n CommentController.prototype.displayCommentHistory = function() {\n return this.lightboxFactory.create('tg-lb-display-historic', {\n \"class\": \"lightbox lightbox-display-historic\",\n \"comment\": \"comment\",\n \"name\": \"name\",\n \"object\": \"object\"\n }, {\n \"comment\": this.comment,\n \"name\": this.name,\n \"object\": this.object\n });\n };\n\n return CommentController;\n\n })();\n\n module.controller(\"CommentCtrl\", CommentController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comment.directive.coffee\n */\n\n(function() {\n var CommentDirective, module;\n\n module = angular.module('taigaHistory');\n\n CommentDirective = function() {\n return {\n scope: {\n name: \"@\",\n object: \"@\",\n comment: \"<\",\n type: \"<\",\n loading: \"<\",\n editing: \"<\",\n deleting: \"<\",\n objectId: \"<\",\n editMode: \"<\",\n onEditMode: \"&\",\n onDeleteComment: \"&\",\n onRestoreDeletedComment: \"&\",\n onEditComment: \"&\"\n },\n templateUrl: \"history/comments/comment.html\",\n bindToController: true,\n controller: 'CommentCtrl',\n controllerAs: \"vm\"\n };\n };\n\n module.directive(\"tgComment\", CommentDirective);\n\n}).call(this);\n\n\n/*\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comments.controller.coffee\n */\n\n(function() {\n var CommentsController, module;\n\n module = angular.module(\"taigaHistory\");\n\n CommentsController = (function() {\n CommentsController.$inject = [];\n\n function CommentsController() {}\n\n CommentsController.prototype.initializePermissions = function() {\n return this.canAddCommentPermission = 'comment_' + this.name;\n };\n\n return CommentsController;\n\n })();\n\n module.controller(\"CommentsCtrl\", CommentsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comments.directive.coffee\n */\n\n(function() {\n var CommentsDirective, module;\n\n module = angular.module('taigaHistory');\n\n CommentsDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.initializePermissions();\n };\n return {\n scope: {\n type: \"<\",\n name: \"@\",\n object: \"@\",\n comments: \"<\",\n onEditMode: \"&\",\n onDeleteComment: \"&\",\n onRestoreDeletedComment: \"&\",\n onAddComment: \"&\",\n onEditComment: \"&\",\n editMode: \"<\",\n loading: \"<\",\n deleting: \"<\",\n editing: \"<\",\n projectId: \"=\"\n },\n templateUrl: \"history/comments/comments.html\",\n bindToController: true,\n controller: 'CommentsCtrl',\n controllerAs: \"vm\",\n link: link\n };\n };\n\n module.directive(\"tgComments\", CommentsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.controller.coffee\n */\n\n(function() {\n var LightboxDisplayHistoricController, module;\n\n module = angular.module(\"taigaHistory\");\n\n LightboxDisplayHistoricController = (function() {\n LightboxDisplayHistoricController.$inject = [\"$tgResources\"];\n\n function LightboxDisplayHistoricController(rs) {\n this.rs = rs;\n }\n\n LightboxDisplayHistoricController.prototype._loadHistoric = function() {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.object;\n activityId = this.comment.id;\n return this.rs.history.getCommentHistory(type, objectId, activityId).then((function(_this) {\n return function(data) {\n return _this.commentHistoryEntries = data;\n };\n })(this));\n };\n\n return LightboxDisplayHistoricController;\n\n })();\n\n module.controller(\"LightboxDisplayHistoricCtrl\", LightboxDisplayHistoricController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comment.directive.coffee\n */\n\n(function() {\n var LightboxDisplayHistoricDirective;\n\n LightboxDisplayHistoricDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n ctrl._loadHistoric();\n return lightboxService.open(el);\n };\n return {\n scope: {},\n bindToController: {\n name: '=',\n object: '=',\n comment: '='\n },\n templateUrl: \"history/history-lightbox/comment-history-lightbox.html\",\n controller: \"LightboxDisplayHistoricCtrl\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n LightboxDisplayHistoricDirective.$inject = [\"lightboxService\"];\n\n angular.module('taigaHistory').directive(\"tgLbDisplayHistoric\", LightboxDisplayHistoricDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comment.directive.coffee\n */\n\n(function() {\n var HistoryEntryDirective;\n\n HistoryEntryDirective = function() {\n return {\n scope: {\n entry: \"<\"\n },\n templateUrl: \"history/history-lightbox/history-entry.html\"\n };\n };\n\n angular.module('taigaHistory').directive(\"tgHistoryEntry\", HistoryEntryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history-tabs.directive.coffee\n */\n\n(function() {\n var HistoryTabsDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryTabsDirective = function() {\n return {\n templateUrl: \"history/history-tabs/history-tabs.html\",\n scope: {\n showCommentTab: \"&\",\n showActivityTab: \"&\",\n onActiveComments: \"&\",\n onActiveActivities: \"&\",\n onOrderComments: \"&\",\n activeTab: \"<\",\n commentsNum: \"<\",\n activitiesNum: \"<\",\n onReverse: \"<\"\n }\n };\n };\n\n module.directive(\"tgHistoryTabs\", HistoryTabsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.controller.coffee\n */\n\n(function() {\n var HistorySectionController, module;\n\n module = angular.module(\"taigaHistory\");\n\n HistorySectionController = (function() {\n HistorySectionController.$inject = [\"$tgResources\", \"$tgRepo\", \"$tgStorage\", \"tgProjectService\"];\n\n function HistorySectionController(rs, repo, storage, projectService) {\n this.rs = rs;\n this.repo = repo;\n this.storage = storage;\n this.projectService = projectService;\n this.editing = null;\n this.deleting = null;\n this.editMode = {};\n this.viewComments = true;\n this.reverse = this.storage.get(\"orderComments\");\n this._loadHistory();\n }\n\n HistorySectionController.prototype._loadHistory = function() {\n return this.rs.history.get(this.name, this.id).then((function(_this) {\n return function(history) {\n _this._getComments(history);\n return _this._getActivities(history);\n };\n })(this));\n };\n\n HistorySectionController.prototype._getComments = function(comments) {\n this.comments = _.filter(comments, function(item) {\n return item.comment !== \"\";\n });\n if (this.reverse) {\n this.comments - _.reverse(this.comments);\n }\n return this.commentsNum = this.comments.length;\n };\n\n HistorySectionController.prototype._getActivities = function(activities) {\n this.activities = _.filter(activities, function(item) {\n return Object.keys(item.values_diff).length > 0;\n });\n return this.activitiesNum = this.activities.length;\n };\n\n HistorySectionController.prototype.showHistorySection = function() {\n return this.showCommentTab() || this.showActivityTab();\n };\n\n HistorySectionController.prototype.showCommentTab = function() {\n return this.commentsNum > 0 || this.projectService.hasPermission(\"comment_\" + this.name);\n };\n\n HistorySectionController.prototype.showActivityTab = function() {\n return this.activitiesNum > 0;\n };\n\n HistorySectionController.prototype.toggleEditMode = function(commentId) {\n return this.editMode[commentId] = !this.editMode[commentId];\n };\n\n HistorySectionController.prototype.onActiveHistoryTab = function(active) {\n return this.viewComments = active;\n };\n\n HistorySectionController.prototype.deleteComment = function(commentId) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.deleting = commentId;\n return this.rs.history.deleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n _this._loadHistory();\n return _this.deleting = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.editComment = function(commentId, comment) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.editing = commentId;\n return this.rs.history.editComment(type, objectId, activityId, comment).then((function(_this) {\n return function() {\n _this._loadHistory();\n _this.toggleEditMode(commentId);\n return _this.editing = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.restoreDeletedComment = function(commentId) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.editing = commentId;\n return this.rs.history.undeleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n _this._loadHistory();\n return _this.editing = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.addComment = function(cb) {\n return this.repo.save(this.type).then((function(_this) {\n return function() {\n _this._loadHistory();\n return cb();\n };\n })(this));\n };\n\n HistorySectionController.prototype.onOrderComments = function() {\n this.reverse = !this.reverse;\n this.storage.set(\"orderComments\", this.reverse);\n return this._loadHistory();\n };\n\n return HistorySectionController;\n\n })();\n\n module.controller(\"HistorySection\", HistorySectionController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.directive.coffee\n */\n\n(function() {\n var HistorySectionDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistorySectionDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n return scope.$on(\"object:updated\", function() {\n return ctrl._loadHistory(scope.type, scope.id);\n });\n };\n return {\n link: link,\n templateUrl: \"history/history.html\",\n controller: \"HistorySection\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n type: \"=\",\n name: \"@\",\n id: \"=\",\n projectId: \"=\"\n }\n };\n };\n\n HistorySectionDirective.$inject = [];\n\n module.directive(\"tgHistorySection\", HistorySectionDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.controller.coffee\n */\n\n(function() {\n var ActivitiesDiffController, module;\n\n module = angular.module(\"taigaHistory\");\n\n ActivitiesDiffController = (function() {\n ActivitiesDiffController.$inject = [];\n\n function ActivitiesDiffController() {}\n\n ActivitiesDiffController.prototype.diffTags = function() {\n if (this.type === 'tags') {\n this.diffRemoveTags = _.difference(this.diff[0], this.diff[1]).toString();\n return this.diffAddTags = _.difference(this.diff[1], this.diff[0]).toString();\n }\n };\n\n return ActivitiesDiffController;\n\n })();\n\n module.controller(\"ActivitiesDiffCtrl\", ActivitiesDiffController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.directive.coffee\n */\n\n(function() {\n var HistoryDiffDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryDiffDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.diffTags();\n };\n return {\n scope: {\n type: \"<\",\n diff: \"<\"\n },\n templateUrl: \"history/history/history-diff.html\",\n controller: \"ActivitiesDiffCtrl\",\n controllerAs: 'vm',\n bindToController: true,\n link: link\n };\n };\n\n module.directive(\"tgHistoryDiff\", HistoryDiffDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.directive.coffee\n */\n\n(function() {\n var HistoryDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n scope: {\n activities: \"<\"\n },\n templateUrl: \"history/history/history.html\",\n link: link\n };\n };\n\n module.directive(\"tgHistory\", HistoryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: duty.directive.coffee\n */\n\n(function() {\n var DutyDirective;\n\n DutyDirective = function(navurls, $translate) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.duty = scope.duty;\n scope.vm.type = scope.type;\n return scope.vm.getDutyType = function() {\n if (scope.vm.duty) {\n if (scope.vm.duty.get('_name') === \"epics\") {\n return $translate.instant(\"COMMON.EPIC\");\n }\n if (scope.vm.duty.get('_name') === \"userstories\") {\n return $translate.instant(\"COMMON.USER_STORY\");\n }\n if (scope.vm.duty.get('_name') === \"tasks\") {\n return $translate.instant(\"COMMON.TASK\");\n }\n if (scope.vm.duty.get('_name') === \"issues\") {\n return $translate.instant(\"COMMON.ISSUE\");\n }\n }\n };\n };\n return {\n templateUrl: \"home/duties/duty.html\",\n scope: {\n \"duty\": \"=tgDuty\",\n \"type\": \"@\"\n },\n link: link\n };\n };\n\n DutyDirective.$inject = [\"$tgNavUrls\", \"$translate\"];\n\n angular.module(\"taigaHome\").directive(\"tgDuty\", DutyDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.controller.coffee\n */\n\n(function() {\n var HomeController;\n\n HomeController = (function() {\n HomeController.$inject = [\"tgCurrentUserService\", \"$location\", \"$tgNavUrls\"];\n\n function HomeController(currentUserService, location, navUrls) {\n this.currentUserService = currentUserService;\n this.location = location;\n this.navUrls = navUrls;\n if (!this.currentUserService.getUser()) {\n this.location.path(this.navUrls.resolve(\"discover\"));\n }\n }\n\n return HomeController;\n\n })();\n\n angular.module(\"taigaHome\").controller(\"Home\", HomeController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.service.coffee\n */\n\n(function() {\n var HomeService, groupBy,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n groupBy = this.taiga.groupBy;\n\n HomeService = (function(superClass) {\n extend(HomeService, superClass);\n\n HomeService.$inject = [\"$tgNavUrls\", \"tgResources\", \"tgProjectsService\"];\n\n function HomeService(navurls, rs, projectsService) {\n this.navurls = navurls;\n this.rs = rs;\n this.projectsService = projectsService;\n }\n\n HomeService.prototype._attachProjectInfoToWorkInProgress = function(workInProgress, projectsById) {\n var _attachProjectInfoToDuty, _duties, _getValidDutiesAndAttachProjectInfo, assignedTo, watching;\n _attachProjectInfoToDuty = (function(_this) {\n return function(duty, objType) {\n var ctx, project, url;\n project = projectsById.get(String(duty.get('project')));\n ctx = {\n project: project.get('slug'),\n ref: duty.get('ref')\n };\n url = _this.navurls.resolve(\"project-\" + objType + \"-detail\", ctx);\n duty = duty.set('url', url);\n duty = duty.set('project', project);\n duty = duty.set(\"_name\", objType);\n return duty;\n };\n })(this);\n _getValidDutiesAndAttachProjectInfo = function(duties, dutyType) {\n duties = duties.filter(function(duty) {\n return projectsById.get(String(duty.get('project')));\n });\n duties = duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, dutyType);\n });\n return duties;\n };\n assignedTo = workInProgress.get(\"assignedTo\");\n if (assignedTo.get(\"epics\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"epics\"), \"epics\");\n assignedTo = assignedTo.set(\"epics\", _duties);\n }\n if (assignedTo.get(\"userStories\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"userStories\"), \"userstories\");\n assignedTo = assignedTo.set(\"userStories\", _duties);\n }\n if (assignedTo.get(\"tasks\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"tasks\"), \"tasks\");\n assignedTo = assignedTo.set(\"tasks\", _duties);\n }\n if (assignedTo.get(\"issues\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"issues\"), \"issues\");\n assignedTo = assignedTo.set(\"issues\", _duties);\n }\n watching = workInProgress.get(\"watching\");\n if (watching.get(\"epics\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"epics\"), \"epics\");\n watching = watching.set(\"epics\", _duties);\n }\n if (watching.get(\"userStories\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"userStories\"), \"userstories\");\n watching = watching.set(\"userStories\", _duties);\n }\n if (watching.get(\"tasks\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"tasks\"), \"tasks\");\n watching = watching.set(\"tasks\", _duties);\n }\n if (watching.get(\"issues\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"issues\"), \"issues\");\n watching = watching.set(\"issues\", _duties);\n }\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo);\n return workInProgress = workInProgress.set(\"watching\", watching);\n };\n\n HomeService.prototype.getWorkInProgress = function(userId) {\n var assignedEpicsPromise, assignedIssuesPromise, assignedTasksPromise, assignedTo, assignedUserStoriesPromise, params_epics, params_issues, params_tasks, params_uss, projectsById, projectsPromise, watching, watchingEpicsPromise, watchingIssuesPromise, watchingTasksPromise, watchingUserStoriesPromise, workInProgress;\n projectsById = Immutable.Map();\n projectsPromise = this.projectsService.getProjectsByUserId(userId).then(function(projects) {\n return projectsById = Immutable.fromJS(groupBy(projects.toJS(), function(p) {\n return p.id;\n }));\n });\n assignedTo = Immutable.Map();\n params_epics = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_uss = {\n is_closed: false,\n assigned_users: userId\n };\n params_tasks = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_issues = {\n status__is_closed: false,\n assigned_to: userId\n };\n assignedEpicsPromise = this.rs.epics.listInAllProjects(params_epics).then(function(epics) {\n return assignedTo = assignedTo.set(\"epics\", epics);\n });\n assignedUserStoriesPromise = this.rs.userstories.listInAllProjects(params_uss).then(function(userstories) {\n return assignedTo = assignedTo.set(\"userStories\", userstories);\n });\n assignedTasksPromise = this.rs.tasks.listInAllProjects(params_tasks).then(function(tasks) {\n return assignedTo = assignedTo.set(\"tasks\", tasks);\n });\n assignedIssuesPromise = this.rs.issues.listInAllProjects(params_issues).then(function(issues) {\n return assignedTo = assignedTo.set(\"issues\", issues);\n });\n params_epics = {\n status__is_closed: false,\n watchers: userId\n };\n params_uss = {\n is_closed: false,\n watchers: userId\n };\n params_tasks = {\n status__is_closed: false,\n watchers: userId\n };\n params_issues = {\n status__is_closed: false,\n watchers: userId\n };\n watching = Immutable.Map();\n watchingEpicsPromise = this.rs.epics.listInAllProjects(params_epics).then(function(epics) {\n return watching = watching.set(\"epics\", epics);\n });\n watchingUserStoriesPromise = this.rs.userstories.listInAllProjects(params_uss).then(function(userstories) {\n return watching = watching.set(\"userStories\", userstories);\n });\n watchingTasksPromise = this.rs.tasks.listInAllProjects(params_tasks).then(function(tasks) {\n return watching = watching.set(\"tasks\", tasks);\n });\n watchingIssuesPromise = this.rs.issues.listInAllProjects(params_issues).then(function(issues) {\n return watching = watching.set(\"issues\", issues);\n });\n workInProgress = Immutable.Map();\n return Promise.all([projectsPromise, assignedEpicsPromise, watchingEpicsPromise, assignedUserStoriesPromise, watchingUserStoriesPromise, assignedTasksPromise, watchingTasksPromise, assignedIssuesPromise, watchingIssuesPromise]).then((function(_this) {\n return function() {\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo);\n workInProgress = workInProgress.set(\"watching\", watching);\n workInProgress = _this._attachProjectInfoToWorkInProgress(workInProgress, projectsById);\n return workInProgress;\n };\n })(this));\n };\n\n return HomeService;\n\n })(taiga.Service);\n\n angular.module(\"taigaHome\").service(\"tgHomeService\", HomeService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home-project-list.directive.coffee\n */\n\n(function() {\n var HomeProjectListDirective;\n\n HomeProjectListDirective = function(currentUserService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n return taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n };\n directive = {\n templateUrl: \"home/projects/home-project-list.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n HomeProjectListDirective.$inject = [\"tgCurrentUserService\"];\n\n angular.module(\"taigaHome\").directive(\"tgHomeProjectList\", HomeProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: working-on.controller.coffee\n */\n\n(function() {\n var WorkingOnController;\n\n WorkingOnController = (function() {\n WorkingOnController.$inject = [\"tgHomeService\"];\n\n function WorkingOnController(homeService) {\n this.homeService = homeService;\n this.assignedTo = Immutable.Map();\n this.watching = Immutable.Map();\n }\n\n WorkingOnController.prototype._setAssignedTo = function(workInProgress) {\n var epics, issues, tasks, userStories;\n epics = workInProgress.get(\"assignedTo\").get(\"epics\");\n userStories = workInProgress.get(\"assignedTo\").get(\"userStories\");\n tasks = workInProgress.get(\"assignedTo\").get(\"tasks\");\n issues = workInProgress.get(\"assignedTo\").get(\"issues\");\n this.assignedTo = userStories.concat(tasks).concat(issues).concat(epics);\n if (this.assignedTo.size > 0) {\n return this.assignedTo = this.assignedTo.sortBy(function(elem) {\n return elem.get(\"modified_date\");\n }).reverse();\n }\n };\n\n WorkingOnController.prototype._setWatching = function(workInProgress) {\n var epics, issues, tasks, userStories;\n epics = workInProgress.get(\"watching\").get(\"epics\");\n userStories = workInProgress.get(\"watching\").get(\"userStories\");\n tasks = workInProgress.get(\"watching\").get(\"tasks\");\n issues = workInProgress.get(\"watching\").get(\"issues\");\n this.watching = userStories.concat(tasks).concat(issues).concat(epics);\n if (this.watching.size > 0) {\n return this.watching = this.watching.sortBy(function(elem) {\n return elem.get(\"modified_date\");\n }).reverse();\n }\n };\n\n WorkingOnController.prototype.getWorkInProgress = function(userId) {\n return this.homeService.getWorkInProgress(userId).then((function(_this) {\n return function(workInProgress) {\n _this._setAssignedTo(workInProgress);\n return _this._setWatching(workInProgress);\n };\n })(this));\n };\n\n return WorkingOnController;\n\n })();\n\n angular.module(\"taigaHome\").controller(\"WorkingOn\", WorkingOnController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: working-on.directive.coffee\n */\n\n(function() {\n var WorkingOnDirective;\n\n WorkingOnDirective = function(homeService, currentUserService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var user, userId;\n user = currentUserService.getUser();\n if (user) {\n userId = user.get(\"id\");\n return ctrl.getWorkInProgress(userId);\n }\n };\n return {\n controller: \"WorkingOn\",\n controllerAs: \"vm\",\n templateUrl: \"home/working-on/working-on.html\",\n scope: {},\n link: link\n };\n };\n\n WorkingOnDirective.$inject = [\"tgHomeService\", \"tgCurrentUserService\"];\n\n angular.module(\"taigaHome\").directive(\"tgWorkingOn\", WorkingOnDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: add-members.controller.coffee\n */\n\n(function() {\n var InviteMembersFormController, taiga;\n\n taiga = this.taiga;\n\n InviteMembersFormController = (function() {\n InviteMembersFormController.$inject = [\"tgProjectService\", \"$tgResources\", \"lightboxService\", \"$tgConfirm\", \"$rootScope\"];\n\n function InviteMembersFormController(projectService, rs, lightboxService, confirm, rootScope) {\n this.projectService = projectService;\n this.rs = rs;\n this.lightboxService = lightboxService;\n this.confirm = confirm;\n this.rootScope = rootScope;\n this.project = this.projectService.project;\n this.roles = this.projectService.project.get('roles');\n this.rolesValues = {};\n this.loading = false;\n this.defaultMaxInvites = 4;\n }\n\n InviteMembersFormController.prototype._areRolesValidated = function() {\n return Object.defineProperty(this, 'areRolesValidated', {\n get: (function(_this) {\n return function() {\n var roleIds;\n roleIds = _.filter(Object.values(_this.rolesValues), function(it) {\n return it;\n });\n return roleIds.length === _this.contactsToInvite.size + _this.emailsToInvite.size;\n };\n })(this)\n });\n };\n\n InviteMembersFormController.prototype._checkLimitMemberships = function() {\n var pendingMembersCount;\n if (this.project.get('max_memberships') === null) {\n this.membersLimit = this.defaultMaxInvites;\n } else {\n pendingMembersCount = Math.max(this.project.get('max_memberships') - this.project.get('total_memberships'), 0);\n this.membersLimit = Math.min(pendingMembersCount, this.defaultMaxInvites);\n }\n return this.showWarningMessage = this.membersLimit < this.defaultMaxInvites;\n };\n\n InviteMembersFormController.prototype.sendInvites = function() {\n this.setInvitedContacts = [];\n _.forEach(this.rolesValues, (function(_this) {\n return function(key, value) {\n return _this.setInvitedContacts.push({\n 'role_id': key,\n 'username': value\n });\n };\n })(this));\n this.loading = true;\n return this.rs.memberships.bulkCreateMemberships(this.project.get('id'), this.setInvitedContacts, this.inviteContactsMessage).then((function(_this) {\n return function(response) {\n return _this.projectService.fetchProject().then(function() {\n _this.loading = false;\n _this.lightboxService.closeAll();\n _this.rootScope.$broadcast(\"membersform:new:success\");\n return _this.confirm.notify('success');\n });\n };\n })(this))[\"catch\"]((function(_this) {\n return function(response) {\n _this.loading = false;\n if (response.data._error_message) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this));\n };\n\n return InviteMembersFormController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"InviteMembersFormCtrl\", InviteMembersFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: invite-members.directive.coffee\n */\n\n(function() {\n var InviteMembersFormDirective;\n\n InviteMembersFormDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n ctrl._areRolesValidated();\n return ctrl._checkLimitMemberships();\n };\n return {\n scope: {},\n templateUrl: \"invite-members/invite-members-form/invite-members-form.html\",\n controller: \"InviteMembersFormCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n contactsToInvite: '<',\n emailsToInvite: '=',\n onDisplayContactList: '&',\n onRemoveInvitedContact: '&',\n onRemoveInvitedEmail: '&',\n onSendInvites: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgInviteMembersForm\", InviteMembersFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: add-members.controller.coffee\n */\n\n(function() {\n var AddMembersController, taiga;\n\n taiga = this.taiga;\n\n AddMembersController = (function() {\n AddMembersController.$inject = [\"tgUserService\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function AddMembersController(userService, currentUserService, projectService) {\n this.userService = userService;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n this.contactsToInvite = Immutable.List();\n this.emailsToInvite = Immutable.List();\n this.displayContactList = false;\n }\n\n AddMembersController.prototype._getContacts = function() {\n var excludeProjectId, userId;\n userId = this.currentUserService.getUser().get(\"id\");\n excludeProjectId = this.projectService.project.get(\"id\");\n return this.userService.getContacts(userId, excludeProjectId).then((function(_this) {\n return function(contacts) {\n return _this.contacts = contacts;\n };\n })(this));\n };\n\n AddMembersController.prototype._filterContacts = function(invited) {\n return this.contacts = this.contacts.filter((function(_this) {\n return function(contact) {\n return contact.get('id') !== invited.get('id');\n };\n })(this));\n };\n\n AddMembersController.prototype.inviteSuggested = function(contact) {\n this.contactsToInvite = this.contactsToInvite.push(contact);\n this._filterContacts(contact);\n return this.displayContactList = true;\n };\n\n AddMembersController.prototype.removeContact = function(invited) {\n this.contactsToInvite = this.contactsToInvite.filter((function(_this) {\n return function(contact) {\n return contact.get('id') !== invited.id;\n };\n })(this));\n invited = Immutable.fromJS(invited);\n this.contacts = this.contacts.push(invited);\n return this.testEmptyContacts();\n };\n\n AddMembersController.prototype.inviteEmail = function(email) {\n var emailData;\n emailData = Immutable.Map({\n 'email': email\n });\n this.emailsToInvite = this.emailsToInvite.push(emailData);\n return this.displayContactList = true;\n };\n\n AddMembersController.prototype.removeEmail = function(invited) {\n this.emailsToInvite = this.emailsToInvite.filter((function(_this) {\n return function(email) {\n return email.get('email') !== invited.email;\n };\n })(this));\n return this.testEmptyContacts();\n };\n\n AddMembersController.prototype.testEmptyContacts = function() {\n if (this.emailsToInvite.size + this.contactsToInvite.size === 0) {\n return this.displayContactList = false;\n }\n };\n\n return AddMembersController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"AddMembersCtrl\", AddMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: add-member.directive.coffee\n */\n\n(function() {\n var LightboxAddMembersDirective;\n\n LightboxAddMembersDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n lightboxService.open(el);\n return ctrl._getContacts();\n };\n return {\n scope: {},\n templateUrl: \"invite-members/lightbox-add-members.html\",\n controller: \"AddMembersCtrl\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgLbAddMembers\", [\"lightboxService\", LightboxAddMembersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: suggest-add-members.controller.coffee\n */\n\n(function() {\n var SuggestAddMembersController, taiga;\n\n taiga = this.taiga;\n\n SuggestAddMembersController = (function() {\n SuggestAddMembersController.$inject = [];\n\n function SuggestAddMembersController() {\n this.contactQuery = \"\";\n }\n\n SuggestAddMembersController.prototype.isEmail = function() {\n return taiga.isEmail(this.contactQuery);\n };\n\n SuggestAddMembersController.prototype.filterContacts = function() {\n return this.filteredContacts = this.contacts.filter((function(_this) {\n return function(contact) {\n return contact.get('full_name_display').toLowerCase().includes(_this.contactQuery.toLowerCase()) || contact.get('username').toLowerCase().includes(_this.contactQuery.toLowerCase());\n };\n })(this)).slice(0, 12);\n };\n\n SuggestAddMembersController.prototype.setInvited = function(contact) {\n return this.onInviteSuggested({\n 'contact': contact\n });\n };\n\n return SuggestAddMembersController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"SuggestAddMembersCtrl\", SuggestAddMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: suggest-add-member.directive.coffee\n */\n\n(function() {\n var SuggestAddMembersDirective;\n\n SuggestAddMembersDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch(\"vm.contacts\", (function(_this) {\n return function(contacts) {\n if (contacts) {\n return ctrl.filterContacts();\n }\n };\n })(this));\n };\n return {\n scope: {},\n templateUrl: \"invite-members/suggest-add-members/suggest-add-members.html\",\n controller: \"SuggestAddMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n contacts: '=',\n onInviteSuggested: '&',\n onInviteEmail: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgSuggestAddMembers\", [\"lightboxService\", SuggestAddMembersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: dropdown-project-list.directive.coffee\n */\n\n(function() {\n var DropdownProjectListDirective;\n\n DropdownProjectListDirective = function(currentUserService, projectsService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n return scope.vm.newProject = function() {\n return projectsService.newProject();\n };\n };\n directive = {\n templateUrl: \"navigation-bar/dropdown-project-list/dropdown-project-list.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n DropdownProjectListDirective.$inject = [\"tgCurrentUserService\", \"tgProjectsService\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownProjectList\", DropdownProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: dropdown-user.directive.coffee\n */\n\n(function() {\n var DropdownUserDirective;\n\n DropdownUserDirective = function(authService, configService, locationService, navUrlsService, feedbackService, $rootScope) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.isFeedbackEnabled = configService.get(\"feedbackEnabled\");\n scope.vm.supportUrl = configService.get(\"supportUrl\");\n taiga.defineImmutableProperty(scope.vm, \"user\", function() {\n return authService.userData;\n });\n scope.vm.logout = function() {\n authService.logout();\n locationService.url(navUrlsService.resolve(\"discover\"));\n return locationService.search({});\n };\n scope.vm.sendFeedback = function() {\n return feedbackService.sendFeedback();\n };\n return scope.vm.userSettingsPlugins = _.filter($rootScope.userSettingsPlugins, {\n userMenu: true\n });\n };\n directive = {\n templateUrl: \"navigation-bar/dropdown-user/dropdown-user.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n DropdownUserDirective.$inject = [\"$tgAuth\", \"$tgConfig\", \"$tgLocation\", \"$tgNavUrls\", \"tgFeedbackService\", \"$rootScope\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownUser\", DropdownUserDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.directive.coffee\n */\n\n(function() {\n var NavigationBarDirective;\n\n NavigationBarDirective = function(currentUserService, navigationBarService, locationService, navUrlsService, config) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n taiga.defineImmutableProperty(scope.vm, \"isAuthenticated\", function() {\n return currentUserService.isAuthenticated();\n });\n taiga.defineImmutableProperty(scope.vm, \"isEnabledHeader\", function() {\n return navigationBarService.isEnabledHeader();\n });\n scope.vm.publicRegisterEnabled = config.get(\"publicRegisterEnabled\");\n scope.vm.supportUrl = config.get(\"supportUrl\");\n scope.vm.login = function() {\n var nextUrl;\n nextUrl = encodeURIComponent(locationService.url());\n locationService.url(navUrlsService.resolve(\"login\"));\n return locationService.search({\n next: nextUrl\n });\n };\n return scope.$on(\"$routeChangeSuccess\", function() {\n if (locationService.path() === \"/\") {\n return scope.vm.active = true;\n } else {\n return scope.vm.active = false;\n }\n });\n };\n directive = {\n templateUrl: \"navigation-bar/navigation-bar.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n NavigationBarDirective.$inject = [\"tgCurrentUserService\", \"tgNavigationBarService\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfig\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgNavigationBar\", NavigationBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.service.coffee\n */\n\n(function() {\n var NavigationBarService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n NavigationBarService = (function(superClass) {\n extend(NavigationBarService, superClass);\n\n function NavigationBarService() {\n this.disableHeader();\n }\n\n NavigationBarService.prototype.enableHeader = function() {\n return this.enabledHeader = true;\n };\n\n NavigationBarService.prototype.disableHeader = function() {\n return this.enabledHeader = false;\n };\n\n NavigationBarService.prototype.isEnabledHeader = function() {\n return this.enabledHeader;\n };\n\n return NavigationBarService;\n\n })(taiga.Service);\n\n angular.module(\"taigaNavigationBar\").service(\"tgNavigationBarService\", NavigationBarService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-bar.controller.coffee\n */\n\n(function() {\n var ProfileBarController;\n\n ProfileBarController = (function() {\n ProfileBarController.$inject = [\"tgUserService\"];\n\n function ProfileBarController(userService) {\n this.userService = userService;\n this.loadStats();\n }\n\n ProfileBarController.prototype.loadStats = function() {\n return this.userService.getStats(this.user.get(\"id\")).then((function(_this) {\n return function(stats) {\n return _this.stats = stats;\n };\n })(this));\n };\n\n return ProfileBarController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileBar\", ProfileBarController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-bar.directive.coffee\n */\n\n(function() {\n var ProfileBarDirective;\n\n ProfileBarDirective = function() {\n return {\n templateUrl: \"profile/profile-bar/profile-bar.html\",\n controller: \"ProfileBar\",\n controllerAs: \"vm\",\n scope: {\n user: \"=user\",\n isCurrentUser: \"=iscurrentuser\"\n },\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileBar\", ProfileBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-contacts.controller.coffee\n */\n\n(function() {\n var ProfileContactsController;\n\n ProfileContactsController = (function() {\n ProfileContactsController.$inject = [\"tgUserService\", \"tgCurrentUserService\"];\n\n function ProfileContactsController(userService, currentUserService) {\n this.userService = userService;\n this.currentUserService = currentUserService;\n this.currentUser = this.currentUserService.getUser();\n this.isCurrentUser = false;\n if (this.currentUser && this.currentUser.get(\"id\") === this.user.get(\"id\")) {\n this.isCurrentUser = true;\n }\n }\n\n ProfileContactsController.prototype.loadContacts = function() {\n return this.userService.getContacts(this.user.get(\"id\")).then((function(_this) {\n return function(contacts) {\n return _this.contacts = contacts;\n };\n })(this));\n };\n\n return ProfileContactsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileContacts\", ProfileContactsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-contacts.directive.coffee\n */\n\n(function() {\n var ProfileContactsDirective;\n\n ProfileContactsDirective = function() {\n var link;\n link = function(scope, elm, attrs, ctrl) {\n return ctrl.loadContacts();\n };\n return {\n templateUrl: \"profile/profile-contacts/profile-contacts.html\",\n scope: {\n user: \"=\"\n },\n controllerAs: \"vm\",\n controller: \"ProfileContacts\",\n link: link,\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileContacts\", ProfileContactsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: items.directive.coffee\n */\n\n(function() {\n var FavItemDirective;\n\n FavItemDirective = function() {\n var link, templateUrl;\n link = function(scope, el, attrs, ctrl) {\n return scope.vm = {\n item: scope.item\n };\n };\n templateUrl = function(el, attrs) {\n if (attrs.itemType === \"project\") {\n return \"profile/profile-favs/items/project.html\";\n } else {\n return \"profile/profile-favs/items/ticket.html\";\n }\n };\n return {\n scope: {\n \"item\": \"=tgFavItem\"\n },\n link: link,\n templateUrl: templateUrl\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgFavItem\", FavItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-favs.controller.coffee\n */\n\n(function() {\n var FavsBaseController, ProfileLikedController, ProfileVotedController, ProfileWatchedController, debounceLeading,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n debounceLeading = this.taiga.debounceLeading;\n\n FavsBaseController = (function() {\n function FavsBaseController() {\n this._init();\n }\n\n FavsBaseController.prototype._init = function() {\n this.enableFilterByAll = true;\n this.enableFilterByProjects = true;\n this.enableFilterByEpics = true;\n this.enableFilterByUserStories = true;\n this.enableFilterByTasks = true;\n this.enableFilterByIssues = true;\n this.enableFilterByTextQuery = true;\n this._resetList();\n this.q = null;\n return this.type = null;\n };\n\n FavsBaseController.prototype._resetList = function() {\n this.items = Immutable.List();\n this.scrollDisabled = false;\n return this._page = 1;\n };\n\n FavsBaseController.prototype._enableLoadingSpinner = function() {\n return this.isLoading = true;\n };\n\n FavsBaseController.prototype._disableLoadingSpinner = function() {\n return this.isLoading = false;\n };\n\n FavsBaseController.prototype._enableScroll = function() {\n return this.scrollDisabled = false;\n };\n\n FavsBaseController.prototype._disableScroll = function() {\n return this.scrollDisabled = true;\n };\n\n FavsBaseController.prototype._checkIfHasMorePages = function(hasNext) {\n if (hasNext) {\n this._page += 1;\n return this._enableScroll();\n } else {\n return this._disableScroll();\n }\n };\n\n FavsBaseController.prototype._checkIfHasNoResults = function() {\n return this.hasNoResults = this.items.size === 0;\n };\n\n FavsBaseController.prototype.loadItems = function() {\n this._enableLoadingSpinner();\n this._disableScroll();\n return this._getItems(this.user.get(\"id\"), this._page, this.type, this.q).then((function(_this) {\n return function(response) {\n _this.items = _this.items.concat(response.get(\"data\"));\n _this._checkIfHasMorePages(response.get(\"next\"));\n _this._checkIfHasNoResults();\n _this._disableLoadingSpinner();\n return _this.items;\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n _this._disableLoadingSpinner();\n return _this.items;\n };\n })(this));\n };\n\n FavsBaseController.prototype.filterByTextQuery = debounceLeading(500, function() {\n this._resetList();\n return this.loadItems();\n });\n\n FavsBaseController.prototype.showAll = function() {\n if (this.type !== null) {\n this.type = null;\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showProjectsOnly = function() {\n if (this.type !== \"project\") {\n this.type = \"project\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showEpicsOnly = function() {\n if (this.type !== \"epic\") {\n this.type = \"epic\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showUserStoriesOnly = function() {\n if (this.type !== \"userstory\") {\n this.type = \"userstory\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showTasksOnly = function() {\n if (this.type !== \"task\") {\n this.type = \"task\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showIssuesOnly = function() {\n if (this.type !== \"issue\") {\n this.type = \"issue\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n return FavsBaseController;\n\n })();\n\n ProfileLikedController = (function(superClass) {\n extend(ProfileLikedController, superClass);\n\n ProfileLikedController.$inject = [\"tgUserService\"];\n\n function ProfileLikedController(userService) {\n this.userService = userService;\n ProfileLikedController.__super__.constructor.call(this);\n this.tabName = 'likes';\n this.enableFilterByAll = false;\n this.enableFilterByProjects = false;\n this.enableFilterByEpics = false;\n this.enableFilterByUserStories = false;\n this.enableFilterByTasks = false;\n this.enableFilterByIssues = false;\n this.enableFilterByTextQuery = true;\n this._getItems = this.userService.getLiked;\n }\n\n return ProfileLikedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileLiked\", ProfileLikedController);\n\n ProfileVotedController = (function(superClass) {\n extend(ProfileVotedController, superClass);\n\n ProfileVotedController.$inject = [\"tgUserService\"];\n\n function ProfileVotedController(userService) {\n this.userService = userService;\n ProfileVotedController.__super__.constructor.call(this);\n this.tabName = 'upvotes';\n this.enableFilterByAll = true;\n this.enableFilterByProjects = false;\n this.enableFilterByEpics = true;\n this.enableFilterByUserStories = true;\n this.enableFilterByTasks = true;\n this.enableFilterByIssues = true;\n this.enableFilterByTextQuery = true;\n this._getItems = this.userService.getVoted;\n }\n\n return ProfileVotedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileVoted\", ProfileVotedController);\n\n ProfileWatchedController = (function(superClass) {\n extend(ProfileWatchedController, superClass);\n\n ProfileWatchedController.$inject = [\"tgUserService\"];\n\n function ProfileWatchedController(userService) {\n this.userService = userService;\n ProfileWatchedController.__super__.constructor.call(this);\n this.tabName = 'watchers';\n this._getItems = this.userService.getWatched;\n }\n\n return ProfileWatchedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileWatched\", ProfileWatchedController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-favs.directive.coffee\n */\n\n(function() {\n var ProfileLikedDirective, ProfileVotedDirective, ProfileWatchedDirective, base;\n\n base = {\n scope: {},\n bindToController: {\n user: \"=\",\n type: \"@\",\n q: \"@\",\n scrollDisabled: \"@\",\n isLoading: \"@\",\n hasNoResults: \"@\"\n },\n controller: null,\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-favs/profile-favs.html\"\n };\n\n ProfileLikedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileLiked\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileLiked\", ProfileLikedDirective);\n\n ProfileVotedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileVoted\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileVoted\", ProfileVotedDirective);\n\n ProfileWatchedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileWatched\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileWatched\", ProfileWatchedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-hints.controller.coffee\n */\n\n(function() {\n var ProfileHints;\n\n ProfileHints = (function() {\n ProfileHints.prototype.HINTS = [\n {\n url: \"https://tree.taiga.io/support/admin/import-export-projects/\"\n }, {\n url: \"https://tree.taiga.io/support/admin/custom-fields/\"\n }, {}, {}\n ];\n\n function ProfileHints(translate) {\n var hintKey;\n this.translate = translate;\n hintKey = Math.floor(Math.random() * this.HINTS.length) + 1;\n this.hint = this.HINTS[hintKey - 1];\n this.hint.linkText = this.hint.linkText || 'HINTS.LINK';\n this.hint.title = this.translate.instant(\"HINTS.HINT\" + hintKey + \"_TITLE\");\n this.hint.text = this.translate.instant(\"HINTS.HINT\" + hintKey + \"_TEXT\");\n }\n\n return ProfileHints;\n\n })();\n\n ProfileHints.$inject = [\"$translate\"];\n\n angular.module(\"taigaProfile\").controller(\"ProfileHints\", ProfileHints);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-hints.directive.coffee\n */\n\n(function() {\n var ProfileHints;\n\n ProfileHints = function($translate) {\n return {\n scope: {},\n controller: \"ProfileHints\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-hints/profile-hints.html\"\n };\n };\n\n ProfileHints.$inject = [\"$translate\"];\n\n angular.module(\"taigaProfile\").directive(\"tgProfileHints\", ProfileHints);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-projects.controller.coffee\n */\n\n(function() {\n var ProfileProjectsController;\n\n ProfileProjectsController = (function() {\n ProfileProjectsController.$inject = [\"tgProjectsService\", \"tgUserService\"];\n\n function ProfileProjectsController(projectsService, userService) {\n this.projectsService = projectsService;\n this.userService = userService;\n }\n\n ProfileProjectsController.prototype.loadProjects = function() {\n return this.projectsService.getProjectsByUserId(this.user.get(\"id\")).then((function(_this) {\n return function(projects) {\n return _this.userService.attachUserContactsToProjects(_this.user.get(\"id\"), projects);\n };\n })(this)).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n return ProfileProjectsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileProjects\", ProfileProjectsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-projects.directive.coffee\n */\n\n(function() {\n var ProfileProjectsDirective;\n\n ProfileProjectsDirective = function() {\n var link;\n link = function(scope, elm, attr, ctrl) {\n return ctrl.loadProjects();\n };\n return {\n templateUrl: \"profile/profile-projects/profile-projects.html\",\n scope: {\n user: \"=\"\n },\n link: link,\n bindToController: true,\n controllerAs: \"vm\",\n controller: \"ProfileProjects\"\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileProjects\", ProfileProjectsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tab.directive.coffee\n */\n\n(function() {\n var ProfileTabDirective;\n\n ProfileTabDirective = function() {\n var link;\n link = function(scope, element, attrs, ctrl, transclude) {\n scope.tab = {};\n attrs.$observe(\"tgProfileTab\", function(name) {\n return scope.tab.name = name;\n });\n attrs.$observe(\"tabTitle\", function(title) {\n return scope.tab.title = title;\n });\n scope.tab.icon = attrs.tabIcon;\n scope.tab.active = !!attrs.tabActive;\n if (scope.$eval(attrs.tabDisabled) !== true) {\n return ctrl.addTab(scope.tab);\n }\n };\n return {\n templateUrl: \"profile/profile-tab/profile-tab.html\",\n scope: {},\n require: \"^tgProfileTabs\",\n link: link,\n transclude: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileTab\", ProfileTabDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tabs.controller.coffee\n */\n\n(function() {\n var ProfileTabsController;\n\n ProfileTabsController = (function() {\n function ProfileTabsController() {\n this.tabs = [];\n }\n\n ProfileTabsController.prototype.addTab = function(tab) {\n return this.tabs.push(tab);\n };\n\n ProfileTabsController.prototype.toggleTab = function(tab) {\n _.map(this.tabs, function(tab) {\n return tab.active = false;\n });\n return tab.active = true;\n };\n\n return ProfileTabsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileTabs\", ProfileTabsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tabs.directive.coffee\n */\n\n(function() {\n var ProfileTabsDirective;\n\n ProfileTabsDirective = function() {\n return {\n scope: {},\n controller: \"ProfileTabs\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-tabs/profile-tabs.html\",\n transclude: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileTabs\", ProfileTabsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile.controller.coffee\n */\n\n(function() {\n var ProfileController;\n\n ProfileController = (function() {\n ProfileController.$inject = [\"tgAppMetaService\", \"tgCurrentUserService\", \"$routeParams\", \"tgUserService\", \"tgXhrErrorService\", \"$translate\"];\n\n function ProfileController(appMetaService, currentUserService, routeParams, userService, xhrError, translate) {\n this.appMetaService = appMetaService;\n this.currentUserService = currentUserService;\n this.routeParams = routeParams;\n this.userService = userService;\n this.xhrError = xhrError;\n this.translate = translate;\n this.isCurrentUser = false;\n if (this.routeParams.slug) {\n this.userService.getUserByUserName(this.routeParams.slug).then((function(_this) {\n return function(user) {\n if (!user.get('is_active')) {\n return _this.xhrError.notFound();\n } else {\n _this.user = user;\n _this.isCurrentUser = false;\n _this._setMeta(_this.user);\n return user;\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n } else {\n this.user = this.currentUserService.getUser();\n this.isCurrentUser = true;\n this._setMeta(this.user);\n }\n }\n\n ProfileController.prototype._setMeta = function(user) {\n var ctx, description, title;\n ctx = {\n userFullName: user.get(\"full_name_display\"),\n userUsername: user.get(\"username\")\n };\n title = this.translate.instant(\"USER.PROFILE.PAGE_TITLE\", ctx);\n description = user.get(\"bio\");\n return this.appMetaService.setAll(title, description);\n };\n\n return ProfileController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"Profile\", ProfileController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: blocked-project-explanation.directive.coffee\n */\n\n(function() {\n var BlockedProjectExplanationDirective;\n\n BlockedProjectExplanationDirective = function() {\n return {\n templateUrl: \"projects/project/blocked-project-explanation.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgBlockedProjectExplanation\", BlockedProjectExplanationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.controller.coffee\n */\n\n(function() {\n var ContactProjectButtonController;\n\n ContactProjectButtonController = (function() {\n ContactProjectButtonController.$inject = ['tgLightboxFactory'];\n\n function ContactProjectButtonController(lightboxFactory) {\n this.lightboxFactory = lightboxFactory;\n }\n\n ContactProjectButtonController.prototype.launchContactForm = function() {\n return this.lightboxFactory.create('tg-lb-contact-project', {\n \"class\": \"lightbox lightbox-contact-project e2e-lightbox-contact-project\",\n \"project\": \"project\"\n }, {\n \"project\": this.project\n });\n };\n\n return ContactProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ContactProjectButtonCtrl\", ContactProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: contact-project-button.directive.coffee\n */\n\n(function() {\n var ContactProjectButtonDirective;\n\n ContactProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"ContactProjectButtonCtrl\",\n bindToController: {\n project: '=',\n layout: '@'\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/contact-project-button/contact-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgContactProjectButton\", ContactProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: lb-contact-team.controller.coffee\n */\n\n(function() {\n var ContactProjectLbController;\n\n ContactProjectLbController = (function() {\n ContactProjectLbController.$inject = [\"lightboxService\", \"tgResources\", \"$tgConfirm\"];\n\n function ContactProjectLbController(lightboxService, rs, confirm) {\n this.lightboxService = lightboxService;\n this.rs = rs;\n this.confirm = confirm;\n this.contact = {};\n }\n\n ContactProjectLbController.prototype.contactProject = function() {\n var message, project, promise;\n project = this.project.get('id');\n message = this.contact.message;\n promise = this.rs.projects.contactProject(project, message);\n this.sendingFeedback = true;\n return promise.then((function(_this) {\n return function() {\n _this.lightboxService.closeAll();\n _this.sendingFeedback = false;\n return _this.confirm.notify(\"success\");\n };\n })(this));\n };\n\n return ContactProjectLbController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ContactProjectLbCtrl\", ContactProjectLbController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: lb-contact-team.directive.coffee\n */\n\n(function() {\n var ContactProjectLbDirective;\n\n ContactProjectLbDirective = function(lightboxService) {\n var link;\n this.inject = ['lightboxService'];\n link = function(scope, el) {\n return lightboxService.open(el);\n };\n return {\n controller: \"ContactProjectLbCtrl\",\n bindToController: {\n project: '='\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/lb-contact-project/lb-contact-project.html\",\n link: link\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgLbContactProject\", [\"lightboxService\", ContactProjectLbDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.controller.coffee\n */\n\n(function() {\n var LikeProjectButtonController;\n\n LikeProjectButtonController = (function() {\n LikeProjectButtonController.$inject = [\"$tgConfirm\", \"tgLikeProjectButtonService\"];\n\n function LikeProjectButtonController(confirm, likeButtonService) {\n this.confirm = confirm;\n this.likeButtonService = likeButtonService;\n this.isMouseOver = false;\n this.loading = false;\n }\n\n LikeProjectButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n LikeProjectButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n LikeProjectButtonController.prototype.toggleLike = function() {\n var promise;\n this.loading = true;\n if (!this.project.get(\"is_fan\")) {\n promise = this._like();\n } else {\n promise = this._unlike();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n LikeProjectButtonController.prototype._like = function() {\n return this.likeButtonService.like(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n LikeProjectButtonController.prototype._unlike = function() {\n return this.likeButtonService.unlike(this.project.get('id'))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n return LikeProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"LikeProjectButton\", LikeProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.directive.coffee\n */\n\n(function() {\n var LikeProjectButtonDirective;\n\n LikeProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"LikeProjectButton\",\n bindToController: {\n project: '='\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/like-project-button/like-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgLikeProjectButton\", LikeProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.service.coffee\n */\n\n(function() {\n var LikeProjectButtonService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n LikeProjectButtonService = (function(superClass) {\n extend(LikeProjectButtonService, superClass);\n\n LikeProjectButtonService.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function LikeProjectButtonService(rs, currentUserService, projectService) {\n this.rs = rs;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n }\n\n LikeProjectButtonService.prototype._getProjectIndex = function(projectId) {\n return this.currentUserService.projects.get('all').findIndex(function(project) {\n return project.get('id') === projectId;\n });\n };\n\n LikeProjectButtonService.prototype._updateProjects = function(projectId, isFan) {\n var projectIndex, projects;\n projectIndex = this._getProjectIndex(projectId);\n if (projectIndex === -1) {\n return;\n }\n projects = this.currentUserService.projects.get('all').update(projectIndex, function(project) {\n var totalFans;\n totalFans = project.get(\"total_fans\");\n if (isFan) {\n totalFans++;\n } else {\n totalFans--;\n }\n return project.merge({\n is_fan: isFan,\n total_fans: totalFans\n });\n });\n return this.currentUserService.setProjects(projects);\n };\n\n LikeProjectButtonService.prototype._updateCurrentProject = function(isFan) {\n var project, totalFans;\n totalFans = this.projectService.project.get(\"total_fans\");\n if (isFan) {\n totalFans++;\n } else {\n totalFans--;\n }\n project = this.projectService.project.merge({\n is_fan: isFan,\n total_fans: totalFans\n });\n return this.projectService.setProject(project);\n };\n\n LikeProjectButtonService.prototype.like = function(projectId) {\n return this.rs.projects.likeProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, true);\n return _this._updateCurrentProject(true);\n };\n })(this));\n };\n\n LikeProjectButtonService.prototype.unlike = function(projectId) {\n return this.rs.projects.unlikeProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, false);\n return _this._updateCurrentProject(false);\n };\n })(this));\n };\n\n return LikeProjectButtonService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgLikeProjectButtonService\", LikeProjectButtonService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: sort-projects.directive.coffee\n */\n\n(function() {\n var SortProjectsDirective;\n\n SortProjectsDirective = function(currentUserService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n var drake, itemEl, scroll;\n itemEl = null;\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).hasClass('list-itemtype-project');\n }\n });\n drake.on('dragend', function(item) {\n var i, index, len, project, sortData, sorted_project_ids, value;\n itemEl = $(item);\n project = itemEl.scope().project;\n index = itemEl.index();\n sorted_project_ids = _.map(scope.projects.toJS(), function(p) {\n return p.id;\n });\n sorted_project_ids = _.without(sorted_project_ids, project.get(\"id\"));\n sorted_project_ids.splice(index, 0, project.get('id'));\n sortData = [];\n for (index = i = 0, len = sorted_project_ids.length; i < len; index = ++i) {\n value = sorted_project_ids[index];\n sortData.push({\n \"project_id\": value,\n \"order\": index\n });\n }\n return currentUserService.bulkUpdateProjectsOrder(sortData);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n directive = {\n scope: {\n projects: \"=tgSortProjects\"\n },\n link: link\n };\n return directive;\n };\n\n angular.module(\"taigaProjects\").directive(\"tgSortProjects\", [\"tgCurrentUserService\", SortProjectsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.controller.coffee\n */\n\n(function() {\n var WatchProjectButtonController;\n\n WatchProjectButtonController = (function() {\n WatchProjectButtonController.$inject = [\"$tgConfirm\", \"tgWatchProjectButtonService\"];\n\n function WatchProjectButtonController(confirm, watchButtonService) {\n this.confirm = confirm;\n this.watchButtonService = watchButtonService;\n this.showWatchOptions = false;\n this.loading = false;\n }\n\n WatchProjectButtonController.prototype.toggleWatcherOptions = function() {\n return this.showWatchOptions = !this.showWatchOptions;\n };\n\n WatchProjectButtonController.prototype.closeWatcherOptions = function() {\n return this.showWatchOptions = false;\n };\n\n WatchProjectButtonController.prototype.watch = function(notifyLevel) {\n if (notifyLevel === this.project.get('notify_level')) {\n return;\n }\n this.loading = true;\n this.closeWatcherOptions();\n return this.watchButtonService.watch(this.project.get('id'), notifyLevel)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n WatchProjectButtonController.prototype.unwatch = function() {\n this.loading = true;\n this.closeWatcherOptions();\n return this.watchButtonService.unwatch(this.project.get('id'))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n return WatchProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"WatchProjectButton\", WatchProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.directive.coffee\n */\n\n(function() {\n var WatchProjectButtonDirective;\n\n WatchProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"WatchProjectButton\",\n bindToController: {\n project: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/watch-project-button/watch-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgWatchProjectButton\", WatchProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.service.coffee\n */\n\n(function() {\n var WatchProjectButtonService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n WatchProjectButtonService = (function(superClass) {\n extend(WatchProjectButtonService, superClass);\n\n WatchProjectButtonService.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function WatchProjectButtonService(rs, currentUserService, projectService) {\n this.rs = rs;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n }\n\n WatchProjectButtonService.prototype._getProjectIndex = function(projectId) {\n return this.currentUserService.projects.get('all').findIndex(function(project) {\n return project.get('id') === projectId;\n });\n };\n\n WatchProjectButtonService.prototype._updateProjects = function(projectId, notifyLevel, isWatcher) {\n var projectIndex, projects;\n projectIndex = this._getProjectIndex(projectId);\n if (projectIndex === -1) {\n return;\n }\n projects = this.currentUserService.projects.get('all').update(projectIndex, (function(_this) {\n return function(project) {\n var totalWatchers;\n totalWatchers = project.get('total_watchers');\n if (!_this.projectService.project.get('is_watcher') && isWatcher) {\n totalWatchers++;\n } else if (_this.projectService.project.get('is_watcher') && !isWatcher) {\n totalWatchers--;\n }\n return project.merge({\n is_watcher: isWatcher,\n total_watchers: totalWatchers,\n notify_level: notifyLevel\n });\n };\n })(this));\n return this.currentUserService.setProjects(projects);\n };\n\n WatchProjectButtonService.prototype._updateCurrentProject = function(notifyLevel, isWatcher) {\n var project, totalWatchers;\n totalWatchers = this.projectService.project.get(\"total_watchers\");\n if (!this.projectService.project.get('is_watcher') && isWatcher) {\n totalWatchers++;\n } else if (this.projectService.project.get('is_watcher') && !isWatcher) {\n totalWatchers--;\n }\n project = this.projectService.project.merge({\n is_watcher: isWatcher,\n notify_level: notifyLevel,\n total_watchers: totalWatchers\n });\n return this.projectService.setProject(project);\n };\n\n WatchProjectButtonService.prototype.watch = function(projectId, notifyLevel) {\n return this.rs.projects.watchProject(projectId, notifyLevel).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, notifyLevel, true);\n return _this._updateCurrentProject(notifyLevel, true);\n };\n })(this));\n };\n\n WatchProjectButtonService.prototype.unwatch = function(projectId) {\n return this.rs.projects.unwatchProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, null, false);\n return _this._updateCurrentProject(null, false);\n };\n })(this));\n };\n\n return WatchProjectButtonService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgWatchProjectButtonService\", WatchProjectButtonService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import-project-form.controller.coffee\n */\n\n(function() {\n var AsanaImportProjectFormController;\n\n AsanaImportProjectFormController = (function() {\n AsanaImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function AsanaImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Asana\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n this.projectForm.project_type = \"scrum\";\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n AsanaImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n AsanaImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n AsanaImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n AsanaImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return AsanaImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('AsanaImportProjectFormCtrl', AsanaImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import-project-form.directive.coffee\n */\n\n(function() {\n var AsanaImportProjectFormDirective;\n\n AsanaImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/asana-import/asana-import-project-form/asana-import-project-form.html\",\n controller: \"AsanaImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n AsanaImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgAsanaImportProjectForm\", AsanaImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import.controller.coffee\n */\n\n(function() {\n var AsanaImportController;\n\n AsanaImportController = (function() {\n AsanaImportController.$inject = ['tgAsanaImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function AsanaImportController(asanaImportService, confirm, translate, importProjectService) {\n this.asanaImportService = asanaImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-asana';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.asanaImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.asanaImportService.projectUsers;\n };\n })(this));\n }\n\n AsanaImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-asana';\n return this.asanaImportService.fetchProjects();\n };\n\n AsanaImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-asana';\n this.project = project;\n this.fetchingUsers = true;\n return this.asanaImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n AsanaImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-asana';\n };\n\n AsanaImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-asana';\n };\n\n AsanaImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.asanaImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), this.project.get('project_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n AsanaImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return AsanaImportController;\n\n })();\n\n angular.module('taigaProjects').controller('AsanaImportCtrl', AsanaImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import.directive.coffee\n */\n\n(function() {\n var AsanaImportDirective;\n\n AsanaImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/asana-import/asana-import.html\",\n controller: \"AsanaImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n AsanaImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgAsanaImport\", AsanaImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import.service.coffee\n */\n\n(function() {\n var AsanaImportService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n AsanaImportService = (function(superClass) {\n extend(AsanaImportService, superClass);\n\n AsanaImportService.$inject = ['tgResources', '$location'];\n\n function AsanaImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n this.token = null;\n }\n\n AsanaImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n AsanaImportService.prototype.fetchProjects = function() {\n return this.resources.asanaImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n AsanaImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.asanaImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n AsanaImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n return this.resources.asanaImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType);\n };\n\n AsanaImportService.prototype.getAuthUrl = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.asanaImporter.getAuthUrl().then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n AsanaImportService.prototype.authorize = function(code) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.asanaImporter.authorize(code).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return AsanaImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgAsanaImportService\", AsanaImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: create-project-form.controller.coffee\n */\n\n(function() {\n var CreatetProjectFormController;\n\n CreatetProjectFormController = (function() {\n CreatetProjectFormController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\", \"$projectUrl\", \"$location\", \"$tgNavUrls\", \"$tgAnalytics\"];\n\n function CreatetProjectFormController(currentUserService, projectsService, projectUrl, location, navUrls, analytics) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n this.projectUrl = projectUrl;\n this.location = location;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.projectForm = {\n is_private: false\n };\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n if (this.type === 'scrum') {\n this.projectForm.creation_template = 1;\n } else {\n this.projectForm.creation_template = 2;\n }\n }\n\n CreatetProjectFormController.prototype.submit = function() {\n this.formSubmitLoading = true;\n return this.projectsService.create(this.projectForm).then((function(_this) {\n return function(project) {\n _this.analytics.trackEvent(\"project\", \"create\", \"project creation\", {\n slug: project.get('slug'),\n id: project.get('id')\n });\n return _this.location.url(_this.projectUrl.get(project));\n };\n })(this));\n };\n\n CreatetProjectFormController.prototype.onCancelForm = function() {\n return this.location.path(this.navUrls.resolve(\"create-project\"));\n };\n\n CreatetProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n CreatetProjectFormController.prototype.isDisabled = function() {\n return this.formSubmitLoading || !this.canCreateProject();\n };\n\n return CreatetProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('CreateProjectFormCtrl', CreatetProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: create-project-form.directive.coffee\n */\n\n(function() {\n var CreateProjectFormDirective;\n\n CreateProjectFormDirective = function() {\n return {\n templateUrl: \"projects/create/create-project-form/create-project-form.html\",\n controller: \"CreateProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n type: '@'\n }\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgCreateProjectForm\", CreateProjectFormDirective);\n\n}).call(this);\n\n(function() {\n var createProjectMembersRestrictionsDirective, module;\n\n module = angular.module(\"taigaProject\");\n\n createProjectMembersRestrictionsDirective = function() {\n return {\n scope: {\n isPrivate: '=',\n limitMembersPrivateProject: '=',\n limitMembersPublicProject: '='\n },\n templateUrl: \"projects/create/create-project-members-restrictions/create-project-members-restrictions.html\"\n };\n };\n\n module.directive('tgCreateProjectMembersRestrictions', [createProjectMembersRestrictionsDirective]);\n\n}).call(this);\n\n(function() {\n var createProjectRestrictionsDirective, module;\n\n module = angular.module(\"taigaProject\");\n\n createProjectRestrictionsDirective = function() {\n return {\n scope: {\n isPrivate: '=',\n canCreatePrivateProjects: '=',\n canCreatePublicProjects: '='\n },\n templateUrl: \"projects/create/create-project-restrictions/create-project-restrictions.html\"\n };\n };\n\n module.directive('tgCreateProjectRestrictions', [createProjectRestrictionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.controller.coffee\n */\n\n(function() {\n var CreateProjectController;\n\n CreateProjectController = (function() {\n CreateProjectController.$inject = [\"tgAppMetaService\", \"$translate\", \"tgProjectService\", \"$location\", \"$tgAuth\"];\n\n function CreateProjectController(appMetaService, translate, projectService, location, authService) {\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n this.location = location;\n this.authService = authService;\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n this.authService.refresh();\n this.displayScrumDesc = false;\n this.displayKanbanDesc = false;\n }\n\n CreateProjectController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\")\n };\n return {\n title: this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx),\n description: this.project.get(\"description\")\n };\n };\n\n CreateProjectController.prototype.displayHelp = function(type, $event) {\n $event.stopPropagation();\n $event.preventDefault();\n if (type === 'scrum') {\n this.displayScrumDesc = !this.displayScrumDesc;\n }\n if (type === 'kanban') {\n return this.displayKanbanDesc = !this.displayKanbanDesc;\n }\n };\n\n return CreateProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"CreateProjectCtrl\", CreateProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.controller.coffee\n */\n\n(function() {\n var DuplicateProjectController;\n\n DuplicateProjectController = (function() {\n DuplicateProjectController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\", \"$tgLocation\", \"$tgNavUrls\"];\n\n function DuplicateProjectController(currentUserService, projectsService, location, navUrls) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n this.location = location;\n this.navUrls = navUrls;\n this.user = this.currentUserService.getUser();\n this.members = Immutable.List();\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\n this.projectForm = {\n is_private: false\n };\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n DuplicateProjectController.prototype.refreshReferenceProject = function(slug) {\n return this.projectsService.getProjectBySlug(slug).then((function(_this) {\n return function(project) {\n _this.referenceProject = project;\n _this.members = project.get('members').filter(function(it) {\n return it.get('id') !== _this.user.get('id');\n });\n _this.invitedMembers = _this.members.map(function(it) {\n return it.get('id');\n });\n return _this.checkUsersLimit();\n };\n })(this));\n };\n\n DuplicateProjectController.prototype.toggleInvitedMember = function(member) {\n if (this.invitedMembers.includes(member)) {\n this.invitedMembers = this.invitedMembers.filter(function(it) {\n return it !== member;\n });\n } else {\n this.invitedMembers = this.invitedMembers.push(member);\n }\n return this.checkUsersLimit();\n };\n\n DuplicateProjectController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.invitedMembers.size + 1);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.invitedMembers.size + 1);\n };\n\n DuplicateProjectController.prototype.submit = function() {\n var data, projectId;\n projectId = this.referenceProject.get('id');\n data = this.projectForm;\n data.users = this.invitedMembers;\n this.formSubmitLoading = true;\n return this.projectsService.duplicate(projectId, data).then((function(_this) {\n return function(newProject) {\n _this.formSubmitLoading = false;\n _this.location.path(_this.navUrls.resolve(\"project\", {\n project: newProject.data.slug\n }));\n return _this.currentUserService.loadProjects();\n };\n })(this));\n };\n\n DuplicateProjectController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid && this.limitMembersPrivateProject.valid;\n } else {\n return this.canCreatePublicProjects.valid && this.limitMembersPublicProject.valid;\n }\n };\n\n DuplicateProjectController.prototype.isDisabled = function() {\n return this.formSubmitLoading || !this.canCreateProject();\n };\n\n DuplicateProjectController.prototype.onCancelForm = function() {\n return this.location.path(this.navUrls.resolve(\"create-project\"));\n };\n\n return DuplicateProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"DuplicateProjectCtrl\", DuplicateProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: duplicate-project.directive.coffee\n */\n\n(function() {\n var DuplicateProjectDirective;\n\n DuplicateProjectDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {};\n return {\n link: link,\n templateUrl: \"projects/create/duplicate/duplicate-project.html\",\n controller: \"DuplicateProjectCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {}\n };\n };\n\n DuplicateProjectDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgDuplicateProject\", DuplicateProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import-project-form.controller.coffee\n */\n\n(function() {\n var GithubImportProjectFormController;\n\n GithubImportProjectFormController = (function() {\n GithubImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function GithubImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Github\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n this.projectForm.project_type = \"kanban\";\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n GithubImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n GithubImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n GithubImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n GithubImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return GithubImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('GithubImportProjectFormCtrl', GithubImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import-project-form.directive.coffee\n */\n\n(function() {\n var GithubImportProjectFormDirective;\n\n GithubImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/github-import/github-import-project-form/github-import-project-form.html\",\n controller: \"GithubImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n GithubImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgGithubImportProjectForm\", GithubImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import.controller.coffee\n */\n\n(function() {\n var GithubImportController;\n\n GithubImportController = (function() {\n GithubImportController.$inject = ['tgGithubImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function GithubImportController(githubImportService, confirm, translate, importProjectService) {\n this.githubImportService = githubImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-github';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.githubImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.githubImportService.projectUsers;\n };\n })(this));\n }\n\n GithubImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-github';\n return this.githubImportService.fetchProjects();\n };\n\n GithubImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-github';\n this.project = project;\n this.fetchingUsers = true;\n return this.githubImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n GithubImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-github';\n };\n\n GithubImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-github';\n };\n\n GithubImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.githubImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), this.project.get('project_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n GithubImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return GithubImportController;\n\n })();\n\n angular.module('taigaProjects').controller('GithubImportCtrl', GithubImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import.directive.coffee\n */\n\n(function() {\n var GithubImportDirective;\n\n GithubImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/github-import/github-import.html\",\n controller: \"GithubImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n GithubImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgGithubImport\", GithubImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import.service.coffee\n */\n\n(function() {\n var GithubImportService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n GithubImportService = (function(superClass) {\n extend(GithubImportService, superClass);\n\n GithubImportService.$inject = ['tgResources'];\n\n function GithubImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n }\n\n GithubImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n GithubImportService.prototype.fetchProjects = function() {\n return this.resources.githubImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n GithubImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.githubImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n GithubImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n return this.resources.githubImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType);\n };\n\n GithubImportService.prototype.getAuthUrl = function(callbackUri) {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.githubImporter.getAuthUrl(callbackUri).then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n GithubImportService.prototype.authorize = function(code) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.githubImporter.authorize(code).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return GithubImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgGithubImportService\", GithubImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project-members.controller.coffee\n */\n\n(function() {\n var ImportProjectMembersController;\n\n ImportProjectMembersController = (function() {\n ImportProjectMembersController.$inject = ['tgCurrentUserService', 'tgUserService'];\n\n function ImportProjectMembersController(currentUserService, userService) {\n this.currentUserService = currentUserService;\n this.userService = userService;\n this.selectImportUserLightbox = false;\n this.warningImportUsers = false;\n this.displayEmailSelector = true;\n this.cancelledUsers = Immutable.List();\n this.selectedUsers = Immutable.List();\n this.selectableUsers = Immutable.List();\n this.userContacts = Immutable.List();\n }\n\n ImportProjectMembersController.prototype.fetchUser = function() {\n this.currentUser = this.currentUserService.getUser();\n return this.userService.getContacts(this.currentUser.get('id')).then((function(_this) {\n return function(userContacts) {\n _this.userContacts = userContacts;\n return _this.refreshSelectableUsers();\n };\n })(this));\n };\n\n ImportProjectMembersController.prototype.searchUser = function(user) {\n this.selectImportUserLightbox = true;\n return this.searchingUser = user;\n };\n\n ImportProjectMembersController.prototype.beforeSubmitUsers = function() {\n if (this.selectedUsers.size !== this.members.size) {\n return this.warningImportUsers = true;\n } else {\n return this.submit();\n }\n };\n\n ImportProjectMembersController.prototype.confirmUser = function(externalUser, taigaUser) {\n var user;\n this.selectImportUserLightbox = false;\n user = Immutable.Map();\n user = user.set('user', externalUser);\n user = user.set('taigaUser', taigaUser);\n this.selectedUsers = this.selectedUsers.push(user);\n this.discardSuggestedUser(externalUser);\n return this.refreshSelectableUsers();\n };\n\n ImportProjectMembersController.prototype.unselectUser = function(user) {\n var index;\n index = this.selectedUsers.findIndex(function(it) {\n return it.getIn(['user', 'id']) === user.get('id');\n });\n this.selectedUsers = this.selectedUsers[\"delete\"](index);\n return this.refreshSelectableUsers();\n };\n\n ImportProjectMembersController.prototype.discardSuggestedUser = function(member) {\n return this.cancelledUsers = this.cancelledUsers.push(member.get('id'));\n };\n\n ImportProjectMembersController.prototype.getSelectedMember = function(member) {\n return this.selectedUsers.find(function(it) {\n return it.getIn(['user', 'id']) === member.get('id');\n });\n };\n\n ImportProjectMembersController.prototype.isMemberSelected = function(member) {\n return !!this.getSelectedMember(member);\n };\n\n ImportProjectMembersController.prototype.getUser = function(user) {\n var userSelected;\n userSelected = this.getSelectedMember(user);\n if (userSelected) {\n return userSelected.get('taigaUser');\n } else {\n return null;\n }\n };\n\n ImportProjectMembersController.prototype.submit = function() {\n var users;\n this.warningImportUsers = false;\n users = Immutable.Map();\n this.selectedUsers.map(function(it) {\n var id;\n id = '';\n if (_.isString(it.get('taigaUser'))) {\n id = it.get('taigaUser');\n } else {\n id = it.getIn(['taigaUser', 'id']);\n }\n return users = users.set(it.getIn(['user', 'id']), id);\n });\n return this.onSubmit({\n users: users\n });\n };\n\n ImportProjectMembersController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size + 1);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size + 1);\n };\n\n ImportProjectMembersController.prototype.showSuggestedMatch = function(member) {\n return member.get('user') && this.cancelledUsers.indexOf(member.get('id')) === -1 && !this.isMemberSelected(member);\n };\n\n ImportProjectMembersController.prototype.getDistinctSelectedTaigaUsers = function() {\n var ids, users;\n ids = [];\n users = this.selectedUsers.filter(function(it) {\n var id;\n id = it.getIn(['taigaUser', 'id']);\n if (ids.indexOf(id) === -1) {\n ids.push(id);\n return true;\n }\n return false;\n });\n return users.filter((function(_this) {\n return function(it) {\n return it.getIn(['taigaUser', 'id']) !== _this.currentUser.get('id');\n };\n })(this));\n };\n\n ImportProjectMembersController.prototype.refreshSelectableUsers = function() {\n var users;\n this.importMoreUsersDisabled = this.isImportMoreUsersDisabled();\n if (this.importMoreUsersDisabled) {\n users = this.getDistinctSelectedTaigaUsers();\n this.selectableUsers = users.map(function(it) {\n return it.get('taigaUser');\n });\n this.displayEmailSelector = false;\n } else {\n this.selectableUsers = this.userContacts;\n this.displayEmailSelector = true;\n }\n return this.selectableUsers = this.selectableUsers.push(this.currentUser);\n };\n\n ImportProjectMembersController.prototype.isImportMoreUsersDisabled = function() {\n var total, users;\n users = this.getDistinctSelectedTaigaUsers();\n total = users.size + 2;\n if (this.project.get('is_private')) {\n return !this.currentUserService.canAddMembersPrivateProject(total).valid;\n } else {\n return !this.currentUserService.canAddMembersPublicProject(total).valid;\n }\n };\n\n return ImportProjectMembersController;\n\n })();\n\n angular.module('taigaProjects').controller('ImportProjectMembersCtrl', ImportProjectMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project-form.directive.coffee\n */\n\n(function() {\n var ImportProjectMembersDirective;\n\n ImportProjectMembersDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n ctrl.fetchUser();\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/import-project-members/import-project-members.html\",\n controller: \"ImportProjectMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSubmit: '&',\n platform: '@',\n logo: '@',\n onCancel: '&'\n }\n };\n };\n\n ImportProjectMembersDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgImportProjectMembers\", ImportProjectMembersDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project-selector.controller.coffee\n */\n\n(function() {\n var ImportProjectSelectorController;\n\n ImportProjectSelectorController = (function() {\n function ImportProjectSelectorController() {}\n\n ImportProjectSelectorController.prototype.selectProject = function(project) {\n return this.onSelectProject({\n project: Immutable.fromJS(project)\n });\n };\n\n return ImportProjectSelectorController;\n\n })();\n\n angular.module('taigaProjects').controller('ImportProjectSelectorCtrl', ImportProjectSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project-selector.directive.coffee\n */\n\n(function() {\n var ImportProjectSelectorDirective;\n\n ImportProjectSelectorDirective = function() {\n return {\n templateUrl: \"projects/create/import-project-selector/import-project-selector.html\",\n controller: \"ImportProjectSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n projects: '<',\n onCancel: '&',\n onSelectProject: '&',\n logo: '@',\n noProjectsMsg: '@',\n search: '@'\n }\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgImportProjectSelector\", ImportProjectSelectorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project.controller.coffee\n */\n\n(function() {\n var ImportTaigaController;\n\n ImportTaigaController = (function() {\n ImportTaigaController.$inject = ['$tgConfirm', '$tgResources', 'tgImportProjectService', '$translate', '$tgAnalytics'];\n\n function ImportTaigaController(confirm, rs, importProjectService, translate, analytics) {\n this.confirm = confirm;\n this.rs = rs;\n this.importProjectService = importProjectService;\n this.translate = translate;\n this.analytics = analytics;\n }\n\n ImportTaigaController.prototype.importTaiga = function(files) {\n var file, loader, promise;\n this.analytics.trackEvent(\"import\", \"taiga\", \"Start import from taiga\", 1);\n file = files[0];\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.rs.projects[\"import\"](file, loader.update);\n this.importProjectService.importPromise(promise)[\"finally\"]((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n return ImportTaigaController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ImportTaigaCtrl\", ImportTaigaController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-taiga.directive.coffee\n */\n\n(function() {\n var ImportTaigaDirective;\n\n ImportTaigaDirective = function() {\n return {\n templateUrl: \"projects/create/import-taiga/import-taiga.html\",\n controller: \"ImportTaigaCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {}\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgImportTaiga\", ImportTaigaDirective);\n\n}).call(this);\n\n(function() {\n var LbImportErrorDirective;\n\n LbImportErrorDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs) {\n lightboxService.open(el);\n return scope.close = function() {\n lightboxService.close(el);\n };\n };\n return {\n templateUrl: \"projects/create/import/import-project-error-lb.html\",\n link: link\n };\n };\n\n LbImportErrorDirective.$inject = [\"lightboxService\"];\n\n angular.module(\"taigaProjects\").directive(\"tgLbImportError\", LbImportErrorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project.controller.coffee\n */\n\n(function() {\n var ImportProjectController;\n\n ImportProjectController = (function() {\n ImportProjectController.$inject = ['tgTrelloImportService', 'tgJiraImportService', 'tgGithubImportService', 'tgAsanaImportService', '$location', '$window', '$routeParams', '$tgNavUrls', '$tgConfig', '$tgConfirm', '$tgAnalytics'];\n\n function ImportProjectController(trelloService, jiraService, githubService, asanaService, location, window, routeParams, tgNavUrls, config, confirm, analytics) {\n this.trelloService = trelloService;\n this.jiraService = jiraService;\n this.githubService = githubService;\n this.asanaService = asanaService;\n this.location = location;\n this.window = window;\n this.routeParams = routeParams;\n this.tgNavUrls = tgNavUrls;\n this.config = config;\n this.confirm = confirm;\n this.analytics = analytics;\n }\n\n ImportProjectController.prototype.start = function() {\n var asanaOauthToken, githubOauthToken, jiraOauthToken, jiraOauthVerifier, locationSearch, trelloOauthToken;\n this.token = null;\n this.from = this.routeParams.platform;\n locationSearch = this.location.search();\n if (this.from) {\n this.analytics.trackEvent(\"import\", this.from, \"Start import from \" + this.from, 1);\n }\n if (this.from === \"asana\") {\n asanaOauthToken = locationSearch.code;\n if (locationSearch.code) {\n asanaOauthToken = locationSearch.code;\n return this.asanaService.authorize(asanaOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: encodeURIComponent(JSON.stringify(token))\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else {\n this.token = JSON.parse(decodeURIComponent(locationSearch.token));\n this.asanaService.setToken(this.token);\n }\n }\n if (this.from === 'trello') {\n if (locationSearch.oauth_verifier) {\n trelloOauthToken = locationSearch.oauth_verifier;\n return this.trelloService.authorize(trelloOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: token\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else if (locationSearch.token) {\n this.token = locationSearch.token;\n this.trelloService.setToken(locationSearch.token);\n }\n }\n if (this.from === \"github\") {\n if (locationSearch.code) {\n githubOauthToken = locationSearch.code;\n return this.githubService.authorize(githubOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: token\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else if (locationSearch.token) {\n this.token = locationSearch.token;\n this.githubService.setToken(locationSearch.token);\n }\n }\n if (this.from === \"jira\") {\n jiraOauthToken = locationSearch.oauth_token;\n if (jiraOauthToken) {\n jiraOauthVerifier = locationSearch.oauth_verifier;\n return this.jiraService.authorize(jiraOauthVerifier).then(((function(_this) {\n return function(data) {\n return _this.location.search({\n token: data.token,\n url: data.url\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else {\n this.token = locationSearch.token;\n return this.jiraService.setToken(locationSearch.token, locationSearch.url);\n }\n }\n };\n\n ImportProjectController.prototype.select = function(from) {\n var callbackUri;\n if (from === \"trello\") {\n return this.trelloService.getAuthUrl().then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else if (from === \"jira\") {\n return this.jiraService.getAuthUrl(this.jiraUrl).then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this), (function(_this) {\n return function(err) {\n return _this.confirm.notify('error', err);\n };\n })(this));\n } else if (from === \"github\") {\n callbackUri = this.location.absUrl() + \"/github\";\n return this.githubService.getAuthUrl(callbackUri).then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else if (from === \"asana\") {\n return this.asanaService.getAuthUrl().then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else {\n return this.from = from;\n }\n };\n\n ImportProjectController.prototype.unfoldOptions = function(options) {\n return this.unfoldedOptions = options;\n };\n\n ImportProjectController.prototype.isActiveImporter = function(importer) {\n if (this.config.get('importers').indexOf(importer) === -1) {\n return false;\n }\n return true;\n };\n\n ImportProjectController.prototype.cancelCurrentImport = function() {\n return this.location.url(this.tgNavUrls.resolve('create-project-import'));\n };\n\n ImportProjectController.prototype.backToCreate = function() {\n return this.location.url(this.tgNavUrls.resolve('create-project'));\n };\n\n return ImportProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ImportProjectCtrl\", ImportProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project.directive.coffee\n */\n\n(function() {\n var ImportProjectDirective;\n\n ImportProjectDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n return ctrl.start();\n };\n return {\n link: link,\n templateUrl: \"projects/create/import/import-project.html\",\n controller: \"ImportProjectCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancelImport: '&'\n }\n };\n };\n\n ImportProjectDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgImportProject\", ImportProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project.service.coffee\n */\n\n(function() {\n var ImportProjectService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n ImportProjectService = (function(superClass) {\n extend(ImportProjectService, superClass);\n\n ImportProjectService.$inject = ['tgCurrentUserService', '$tgAuth', 'tgLightboxFactory', '$translate', '$tgConfirm', '$location', '$tgNavUrls'];\n\n function ImportProjectService(currentUserService, tgAuth, lightboxFactory, translate, confirm, location, tgNavUrls) {\n this.currentUserService = currentUserService;\n this.tgAuth = tgAuth;\n this.lightboxFactory = lightboxFactory;\n this.translate = translate;\n this.confirm = confirm;\n this.location = location;\n this.tgNavUrls = tgNavUrls;\n }\n\n ImportProjectService.prototype.importPromise = function(promise) {\n return promise.then(this.importSuccess.bind(this), this.importError.bind(this));\n };\n\n ImportProjectService.prototype.importSuccess = function(result) {\n var promise;\n promise = this.currentUserService.loadProjects();\n promise.then((function(_this) {\n return function() {\n var ctx, message, msg, title;\n if (result.status === 202) {\n title = _this.translate.instant('PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE');\n message = _this.translate.instant('PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE');\n _this.location.path(_this.tgNavUrls.resolve('home'));\n return _this.confirm.success(title, message);\n } else {\n ctx = {\n project: result.data.slug\n };\n _this.location.path(_this.tgNavUrls.resolve('project-admin-project-profile-details', ctx));\n msg = _this.translate.instant('PROJECT.IMPORT.SYNC_SUCCESS');\n return _this.confirm.notify('success', msg);\n }\n };\n })(this));\n return promise;\n };\n\n ImportProjectService.prototype.importError = function(result) {\n var promise;\n promise = this.tgAuth.refresh();\n promise.then((function(_this) {\n return function() {\n var errorMsg, ref, restrictionError;\n restrictionError = _this.getRestrictionError(result);\n if (restrictionError) {\n return _this.lightboxFactory.create('tg-lb-import-error', {\n \"class\": 'lightbox lightbox-import-error'\n }, restrictionError);\n } else {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR_MESSAGE\", {\n error_message: result.data._error_message\n });\n }\n return _this.confirm.notify(\"error\", errorMsg);\n }\n };\n })(this));\n return promise;\n };\n\n ImportProjectService.prototype.getRestrictionError = function(result) {\n var errorKey, maxMemberships, membersError, privateError, publicError, user;\n if (result.headers) {\n errorKey = '';\n user = this.currentUserService.getUser();\n maxMemberships = null;\n if (result.headers.isPrivate) {\n privateError = !this.currentUserService.canCreatePrivateProjects().valid;\n if (user.get('max_memberships_private_projects') !== null && result.headers.memberships >= user.get('max_memberships_private_projects')) {\n membersError = true;\n } else {\n membersError = false;\n }\n if (privateError && membersError) {\n errorKey = 'private-space-members';\n maxMemberships = user.get('max_memberships_private_projects');\n } else if (privateError) {\n errorKey = 'private-space';\n } else if (membersError) {\n errorKey = 'private-members';\n maxMemberships = user.get('max_memberships_private_projects');\n }\n } else {\n publicError = !this.currentUserService.canCreatePublicProjects().valid;\n if (user.get('max_memberships_public_projects') !== null && result.headers.memberships >= user.get('max_memberships_public_projects')) {\n membersError = true;\n } else {\n membersError = false;\n }\n if (publicError && membersError) {\n errorKey = 'public-space-members';\n maxMemberships = user.get('max_memberships_public_projects');\n } else if (publicError) {\n errorKey = 'public-space';\n } else if (membersError) {\n errorKey = 'public-members';\n maxMemberships = user.get('max_memberships_public_projects');\n }\n }\n if (!errorKey) {\n return false;\n }\n return {\n key: errorKey,\n values: {\n max_memberships: maxMemberships,\n members: result.headers.memberships\n }\n };\n } else {\n return false;\n }\n };\n\n return ImportProjectService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgImportProjectService\", ImportProjectService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: invite-members.controller.coffee\n */\n\n(function() {\n var InviteMembersController;\n\n InviteMembersController = (function() {\n function InviteMembersController() {}\n\n InviteMembersController.$inject = [];\n\n InviteMembersController.prototype.isDisabled = function(id) {\n return this.invitedMembers.indexOf(id) === -1;\n };\n\n return InviteMembersController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"InviteMembersCtrl\", InviteMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: invite-members.directive.coffee\n */\n\n(function() {\n var InviteMembersDirective;\n\n InviteMembersDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {};\n return {\n link: link,\n templateUrl: \"projects/create/invite-members/invite-members.html\",\n controller: \"InviteMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n invitedMembers: '<',\n members: '<',\n onToggleInvitedMember: '&'\n }\n };\n };\n\n InviteMembersDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgInviteMembers\", InviteMembersDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: single-member.directive.coffee\n */\n\n(function() {\n var SingleMemberDirective;\n\n SingleMemberDirective = function() {\n return {\n templateUrl: \"projects/create/invite-members/single-member/single-member.html\",\n scope: {\n disabled: \"<\",\n avatar: \"=\"\n }\n };\n };\n\n SingleMemberDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgSingleMember\", SingleMemberDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import-project-form.controller.coffee\n */\n\n(function() {\n var JiraImportProjectFormController;\n\n JiraImportProjectFormController = (function() {\n JiraImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function JiraImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n if (this.projectForm.importer_type === \"agile\") {\n this.projectForm.project_type = null;\n } else {\n this.projectForm.project_type = \"scrum\";\n }\n this.projectForm.create_subissues = true;\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n JiraImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n JiraImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n JiraImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n JiraImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return JiraImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('JiraImportProjectFormCtrl', JiraImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import-project-form.directive.coffee\n */\n\n(function() {\n var JiraImportProjectFormDirective;\n\n JiraImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/jira-import/jira-import-project-form/jira-import-project-form.html\",\n controller: \"JiraImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n JiraImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgJiraImportProjectForm\", JiraImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import.controller.coffee\n */\n\n(function() {\n var JiraImportController;\n\n JiraImportController = (function() {\n JiraImportController.$inject = ['tgJiraImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function JiraImportController(jiraImportService, confirm, translate, importProjectService) {\n this.jiraImportService = jiraImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-jira';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.jiraImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.jiraImportService.projectUsers;\n };\n })(this));\n }\n\n JiraImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-jira';\n return this.jiraImportService.fetchProjects();\n };\n\n JiraImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-jira';\n this.project = project;\n this.fetchingUsers = true;\n return this.jiraImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n JiraImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-jira';\n };\n\n JiraImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-jira';\n };\n\n JiraImportController.prototype.startImport = function(users) {\n var loader, projectType, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n projectType = this.project.get('project_type');\n if (projectType === \"issues\" && this.project.get('create_subissues')) {\n projectType = \"issues-with-subissues\";\n }\n promise = this.jiraImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), projectType, this.project.get('importer_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n JiraImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return JiraImportController;\n\n })();\n\n angular.module('taigaProjects').controller('JiraImportCtrl', JiraImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import.directive.coffee\n */\n\n(function() {\n var JiraImportDirective;\n\n JiraImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/jira-import/jira-import.html\",\n controller: \"JiraImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n JiraImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgJiraImport\", JiraImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import.service.coffee\n */\n\n(function() {\n var JiraImportService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n JiraImportService = (function(superClass) {\n extend(JiraImportService, superClass);\n\n JiraImportService.$inject = ['tgResources', '$location'];\n\n function JiraImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n }\n\n JiraImportService.prototype.setToken = function(token, url) {\n this.token = token;\n return this.url = url;\n };\n\n JiraImportService.prototype.fetchProjects = function() {\n return this.resources.jiraImporter.listProjects(this.url, this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n JiraImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.jiraImporter.listUsers(this.url, this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n JiraImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType) {\n return this.resources.jiraImporter.importProject(this.url, this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType);\n };\n\n JiraImportService.prototype.getAuthUrl = function(url) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.jiraImporter.getAuthUrl(url).then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n }, function(err) {\n return reject(err.data._error_message);\n });\n };\n })(this));\n };\n\n JiraImportService.prototype.authorize = function(oauth_verifier) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.jiraImporter.authorize(oauth_verifier).then((function(response) {\n _this.token = response.data.token;\n _this.url = response.data.url;\n return resolve(response.data);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return JiraImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgJiraImportService\", JiraImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import-project-members.controller.coffee\n */\n\n(function() {\n var SelectImportUserLightboxCtrl;\n\n SelectImportUserLightboxCtrl = (function() {\n SelectImportUserLightboxCtrl.$inject = [];\n\n function SelectImportUserLightboxCtrl() {}\n\n SelectImportUserLightboxCtrl.prototype.start = function() {\n this.mode = 'search';\n return this.invalid = false;\n };\n\n SelectImportUserLightboxCtrl.prototype.assignUser = function() {\n return this.onSelectUser({\n user: this.user,\n taigaUser: this.userEmail\n });\n };\n\n SelectImportUserLightboxCtrl.prototype.selectUser = function(taigaUser) {\n return this.onSelectUser({\n user: this.user,\n taigaUser: Immutable.fromJS(taigaUser)\n });\n };\n\n return SelectImportUserLightboxCtrl;\n\n })();\n\n angular.module('taigaProjects').controller('SelectImportUserLightboxCtrl', SelectImportUserLightboxCtrl);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: select-import-user-lightbox.directive.coffee\n */\n\n(function() {\n var SelectImportUserLightboxDirective;\n\n SelectImportUserLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch('vm.visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n ctrl.start();\n return lightboxService.open(el, null, scope.vm.onClose).then(function() {\n el.find('input').focus();\n return lightboxKeyboardNavigationService.init(el);\n });\n } else if (!visible && el.hasClass('open')) {\n return lightboxService.close(el).then(function() {\n ctrl.userEmail = '';\n return ctrl.usersSearch = '';\n });\n }\n });\n };\n return {\n controller: \"SelectImportUserLightboxCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n user: '<',\n visible: '<',\n onClose: '&',\n onSelectUser: '&',\n selectableUsers: '<',\n isPrivate: '<',\n limitMembersPrivateProject: '<',\n limitMembersPublicProject: '<',\n displayEmailSelector: '<'\n },\n templateUrl: 'projects/create/select-import-user-lightbox/select-import-user-lightbox.html',\n link: link\n };\n };\n\n SelectImportUserLightboxDirective.$inject = ['lightboxService', 'lightboxKeyboardNavigationService'];\n\n angular.module(\"taigaProjects\").directive(\"tgSelectImportUserLightbox\", SelectImportUserLightboxDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import-project-form.controller.coffee\n */\n\n(function() {\n var TrelloImportProjectFormController;\n\n TrelloImportProjectFormController = (function() {\n TrelloImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function TrelloImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Trello\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n TrelloImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n TrelloImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n TrelloImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n TrelloImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return TrelloImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('TrelloImportProjectFormCtrl', TrelloImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import-project-form.directive.coffee\n */\n\n(function() {\n var TrelloImportProjectFormDirective;\n\n TrelloImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/trello-import/trello-import-project-form/trello-import-project-form.html\",\n controller: \"TrelloImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n TrelloImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgTrelloImportProjectForm\", TrelloImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import.controller.coffee\n */\n\n(function() {\n var TrelloImportController;\n\n TrelloImportController = (function() {\n TrelloImportController.$inject = ['tgTrelloImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function TrelloImportController(trelloImportService, confirm, translate, importProjectService) {\n this.trelloImportService = trelloImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.trelloImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.trelloImportService.projectUsers;\n };\n })(this));\n }\n\n TrelloImportController.prototype.startProjectSelector = function() {\n return this.trelloImportService.fetchProjects().then((function(_this) {\n return function() {\n return _this.step = 'project-select-trello';\n };\n })(this));\n };\n\n TrelloImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-trello';\n this.project = project;\n this.fetchingUsers = true;\n return this.trelloImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n TrelloImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-trello';\n };\n\n TrelloImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-trello';\n };\n\n TrelloImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.trelloImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n TrelloImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return TrelloImportController;\n\n })();\n\n angular.module('taigaProjects').controller('TrelloImportCtrl', TrelloImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import.directive.coffee\n */\n\n(function() {\n var TrelloImportDirective;\n\n TrelloImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/trello-import/trello-import.html\",\n controller: \"TrelloImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n TrelloImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgTrelloImport\", TrelloImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import.service.coffee\n */\n\n(function() {\n var TrelloImportService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n TrelloImportService = (function(superClass) {\n extend(TrelloImportService, superClass);\n\n TrelloImportService.$inject = ['tgResources'];\n\n function TrelloImportService(resources) {\n this.resources = resources;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n this.token = null;\n }\n\n TrelloImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n TrelloImportService.prototype.fetchProjects = function() {\n return this.resources.trelloImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n TrelloImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.trelloImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n TrelloImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate) {\n return this.resources.trelloImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate);\n };\n\n TrelloImportService.prototype.getAuthUrl = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.trelloImporter.getAuthUrl().then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n TrelloImportService.prototype.authorize = function(verifyCode) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.trelloImporter.authorize(verifyCode).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return TrelloImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgTrelloImportService\", TrelloImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: warning-user-import.directive.coffee\n */\n\n(function() {\n var WarningUserImportDirective;\n\n WarningUserImportDirective = function(lightboxService, lightboxKeyboardNavigationService) {\n return {\n link: function(scope, el, attr) {\n return scope.$watch('visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n return lightboxService.open(el, scope.onClose).then(function() {\n el.find('input').focus();\n return lightboxKeyboardNavigationService.init(el);\n });\n } else if (!visible && el.hasClass('open')) {\n return lightboxService.close(el);\n }\n });\n },\n templateUrl: \"projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html\",\n scope: {\n visible: '<',\n onClose: '&',\n onConfirm: '&'\n }\n };\n };\n\n WarningUserImportDirective.$inject = ['lightboxService', 'lightboxKeyboardNavigationService'];\n\n angular.module(\"taigaProjects\").directive(\"tgWarningUserImportLightbox\", WarningUserImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects-listing.controller.coffee\n */\n\n(function() {\n var ProjectsListingController;\n\n ProjectsListingController = (function() {\n ProjectsListingController.$inject = [\"tgCurrentUserService\"];\n\n function ProjectsListingController(currentUserService) {\n this.currentUserService = currentUserService;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\n }\n\n return ProjectsListingController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ProjectsListing\", ProjectsListingController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.controller.coffee\n */\n\n(function() {\n var ProjectController;\n\n ProjectController = (function() {\n ProjectController.$inject = [\"$routeParams\", \"tgAppMetaService\", \"$tgAuth\", \"$translate\", \"tgProjectService\"];\n\n function ProjectController(routeParams, appMetaService, auth, translate, projectService) {\n this.routeParams = routeParams;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\n this.user = this.auth.userData;\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"members\", (function(_this) {\n return function() {\n return _this.projectService.activeMembers;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n }\n\n ProjectController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\")\n };\n return {\n title: this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx),\n description: this.project.get(\"description\")\n };\n };\n\n return ProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"Project\", ProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects.service.coffee\n */\n\n(function() {\n var ProjectsService, groupBy, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n ProjectsService = (function(superClass) {\n extend(ProjectsService, superClass);\n\n ProjectsService.$inject = [\"tgResources\", \"$projectUrl\"];\n\n function ProjectsService(rs, projectUrl) {\n this.rs = rs;\n this.projectUrl = projectUrl;\n }\n\n ProjectsService.prototype.create = function(data) {\n return this.rs.projects.create(data);\n };\n\n ProjectsService.prototype.duplicate = function(projectId, data) {\n return this.rs.projects.duplicate(projectId, data);\n };\n\n ProjectsService.prototype.getProjectBySlug = function(projectSlug) {\n return this.rs.projects.getProjectBySlug(projectSlug).then((function(_this) {\n return function(project) {\n return _this._decorate(project);\n };\n })(this));\n };\n\n ProjectsService.prototype.getProjectStats = function(projectId) {\n return this.rs.projects.getProjectStats(projectId);\n };\n\n ProjectsService.prototype.getProjectsByUserId = function(userId, paginate) {\n return this.rs.projects.getProjectsByUserId(userId, paginate).then((function(_this) {\n return function(projects) {\n return projects.map(_this._decorate.bind(_this));\n };\n })(this));\n };\n\n ProjectsService.prototype._decorate = function(project) {\n var url;\n url = this.projectUrl.get(project.toJS());\n project = project.set(\"url\", url);\n return project;\n };\n\n ProjectsService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.rs.projects.bulkUpdateOrder(sortData);\n };\n\n ProjectsService.prototype.transferValidateToken = function(projectId, token) {\n return this.rs.projects.transferValidateToken(projectId, token);\n };\n\n ProjectsService.prototype.transferAccept = function(projectId, token, reason) {\n return this.rs.projects.transferAccept(projectId, token, reason);\n };\n\n ProjectsService.prototype.transferReject = function(projectId, token, reason) {\n return this.rs.projects.transferReject(projectId, token, reason);\n };\n\n return ProjectsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgProjectsService\", ProjectsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: cant-own-project-explanation.directive.coffee\n */\n\n(function() {\n var CantOwnProjectExplanationDirective;\n\n CantOwnProjectExplanationDirective = function() {\n return {\n templateUrl: \"projects/transfer/cant-own-project-explanation.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgCantOwnProjectExplanation\", CantOwnProjectExplanationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: transfer-project.directive.coffee\n */\n\n(function() {\n var TransferProject, module;\n\n module = angular.module('taigaProjects');\n\n TransferProject = (function() {\n TransferProject.$inject = [\"$routeParams\", \"tgProjectsService\", \"$location\", \"$tgAuth\", \"tgCurrentUserService\", \"$tgNavUrls\", \"$translate\", \"$tgConfirm\", \"tgErrorHandlingService\"];\n\n function TransferProject(routeParams, projectService, location, authService, currentUserService, navUrls, translate, confirmService, errorHandlingService) {\n this.routeParams = routeParams;\n this.projectService = projectService;\n this.location = location;\n this.authService = authService;\n this.currentUserService = currentUserService;\n this.navUrls = navUrls;\n this.translate = translate;\n this.confirmService = confirmService;\n this.errorHandlingService = errorHandlingService;\n }\n\n TransferProject.prototype.initialize = function() {\n this.projectId = this.project.get(\"id\");\n this.token = this.routeParams.token;\n this.showAddComment = false;\n return this._refreshUserData();\n };\n\n TransferProject.prototype._validateToken = function() {\n return this.projectService.transferValidateToken(this.projectId, this.token).then(null, (function(_this) {\n return function(data, status) {\n return _this.errorHandlingService.notfound();\n };\n })(this));\n };\n\n TransferProject.prototype._refreshUserData = function() {\n return this.authService.refresh().then((function(_this) {\n return function() {\n _this._validateToken();\n _this._setProjectData();\n return _this._checkOwnerData();\n };\n })(this));\n };\n\n TransferProject.prototype._setProjectData = function() {\n return this.canBeOwnedByUser = this.currentUserService.canOwnProject(this.project);\n };\n\n TransferProject.prototype._checkOwnerData = function() {\n var currentUser, maxMemberships;\n currentUser = this.currentUserService.getUser();\n if (this.project.get('is_private')) {\n this.ownerMessage = 'ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PRIVATE';\n this.maxProjects = currentUser.get('max_private_projects');\n if (this.maxProjects === null) {\n this.maxProjects = this.translate.instant('ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS');\n }\n this.currentProjects = currentUser.get('total_private_projects');\n maxMemberships = currentUser.get('max_memberships_private_projects');\n } else {\n this.ownerMessage = 'ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PUBLIC';\n this.maxProjects = currentUser.get('max_public_projects');\n if (this.maxProjects === null) {\n this.maxProjects = this.translate.instant('ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS');\n }\n this.currentProjects = currentUser.get('total_public_projects');\n maxMemberships = currentUser.get('max_memberships_public_projects');\n }\n return this.validNumberOfMemberships = maxMemberships === null || this.project.get('total_memberships') <= maxMemberships;\n };\n\n TransferProject.prototype.transferAccept = function(token, reason) {\n this.loadingAccept = true;\n return this.projectService.transferAccept(this.project.get(\"id\"), token, reason).then((function(_this) {\n return function() {\n var newUrl;\n newUrl = _this.navUrls.resolve(\"project-admin-project-profile-details\", {\n project: _this.project.get(\"slug\")\n });\n _this.loadingAccept = false;\n _this.location.path(newUrl);\n _this.confirmService.notify(\"success\", _this.translate.instant(\"ADMIN.PROJECT_TRANSFER.ACCEPTED_PROJECT_OWNERNSHIP\"), '', 5000);\n };\n })(this));\n };\n\n TransferProject.prototype.transferReject = function(token, reason) {\n this.loadingReject = true;\n return this.projectService.transferReject(this.project.get(\"id\"), token, reason).then((function(_this) {\n return function() {\n var newUrl;\n newUrl = _this.navUrls.resolve(\"home\", {\n project: _this.project.get(\"slug\")\n });\n _this.loadingReject = false;\n _this.location.path(newUrl);\n _this.confirmService.notify(\"success\", _this.translate.instant(\"ADMIN.PROJECT_TRANSFER.REJECTED_PROJECT_OWNERNSHIP\"), '', 5000);\n };\n })(this));\n };\n\n TransferProject.prototype.addComment = function() {\n return this.showAddComment = true;\n };\n\n TransferProject.prototype.hideComment = function() {\n this.showAddComment = false;\n return this.reason = '';\n };\n\n return TransferProject;\n\n })();\n\n module.controller(\"TransferProjectController\", TransferProject);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: transfer-project.directive.coffee\n */\n\n(function() {\n var TransferProjectDirective, module;\n\n module = angular.module('taigaProjects');\n\n TransferProjectDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.initialize();\n };\n return {\n link: link,\n scope: {},\n bindToController: {\n project: \"=\"\n },\n templateUrl: \"projects/transfer/transfer-project.html\",\n controller: 'TransferProjectController',\n controllerAs: 'vm'\n };\n };\n\n module.directive('tgTransferProject', TransferProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-resource.service.coffee\n */\n\n(function() {\n var Resource, module, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n Resource = function(urlsService, http, config, $rootScope, $q, storage) {\n var service;\n service = {};\n service.list = function(type, objectId, projectId) {\n var httpOptions, params, url, urlname;\n urlname = \"attachments/\" + type;\n params = {\n object_id: objectId,\n project: projectId\n };\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n url = urlsService.resolve(urlname);\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service[\"delete\"] = function(type, id) {\n var url, urlname;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname) + (\"/\" + id);\n return http[\"delete\"](url);\n };\n service.patch = function(type, id, patch) {\n var url, urlname;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname) + (\"/\" + id);\n return http.patch(url, patch);\n };\n service.create = function(type, projectId, objectId, file, from_comment) {\n var data, defered, maxFileSize, response, token, uploadComplete, uploadFailed, uploadProgress, url, urlname, xhr;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname);\n defered = $q.defer();\n if (file === void 0) {\n defered.reject(null);\n return defered.promise;\n }\n maxFileSize = config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered.reject(response);\n return defered.promise;\n }\n uploadProgress = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n file.status = \"in-progress\";\n file.size = sizeFormat(evt.total);\n file.progressMessage = \"upload \" + (sizeFormat(evt.loaded)) + \" of \" + (sizeFormat(evt.total));\n return file.progressPercent = (Math.round((evt.loaded / evt.total) * 100)) + \"%\";\n });\n };\n })(this);\n uploadComplete = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n var attachment, ref, status;\n file.status = \"done\";\n status = evt.target.status;\n try {\n attachment = JSON.parse(evt.target.responseText);\n } catch (error) {\n attachment = {};\n }\n if (status >= 200 && status < 400) {\n attachment = Immutable.fromJS(attachment);\n return defered.resolve(attachment);\n } else {\n response = {\n status: status,\n data: {\n _error_message: (ref = data['attached_file']) != null ? ref[0] : void 0\n }\n };\n return defered.reject(response);\n }\n });\n };\n })(this);\n uploadFailed = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n file.status = \"error\";\n return defered.reject(\"fail\");\n });\n };\n })(this);\n data = new FormData();\n data.append(\"project\", projectId);\n data.append(\"object_id\", objectId);\n data.append(\"attached_file\", file);\n data.append(\"from_comment\", from_comment);\n xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.addEventListener(\"load\", uploadComplete, false);\n xhr.addEventListener(\"error\", uploadFailed, false);\n token = storage.get('token');\n xhr.open(\"POST\", url);\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + token);\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send(data);\n return defered.promise;\n };\n return function() {\n return {\n \"attachments\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"$tgConfig\", \"$rootScope\", \"$q\", \"$tgStorage\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgAttachmentsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"epics\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.list = function(projectId, page) {\n var params, url;\n if (page == null) {\n page = 0;\n }\n url = urlsService.resolve(\"epics\");\n params = {\n project: projectId,\n page: page\n };\n return http.get(url, params).then(function(result) {\n return {\n list: Immutable.fromJS(result.data),\n headers: result.headers\n };\n });\n };\n service.patch = function(id, patch) {\n var url;\n url = urlsService.resolve(\"epics\") + (\"/\" + id);\n return http.patch(url, patch).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.post = function(params) {\n var url;\n url = urlsService.resolve(\"epics\");\n return http.post(url, params).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.reorder = function(id, data, setOrders) {\n var options, url;\n url = urlsService.resolve(\"epics\") + (\"/\" + id);\n options = {\n \"headers\": {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n return http.patch(url, data, null, options).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.addRelatedUserstory = function(epicId, userstoryId) {\n var params, url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId);\n params = {\n user_story: userstoryId,\n epic: epicId\n };\n return http.post(url, params);\n };\n service.reorderRelatedUserstory = function(epicId, userstoryId, data, setOrders) {\n var options, url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId) + (\"/\" + userstoryId);\n options = {\n \"headers\": {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n return http.patch(url, data, null, options);\n };\n service.bulkCreateRelatedUserStories = function(epicId, projectId, bulk_userstories) {\n var params, url;\n url = urlsService.resolve(\"epic-related-userstories-bulk-create\", epicId);\n params = {\n bulk_userstories: bulk_userstories,\n project_id: projectId\n };\n return http.post(url, params);\n };\n service.deleteRelatedUserstory = function(epicId, userstoryId) {\n var url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId) + (\"/\" + userstoryId);\n return http[\"delete\"](url);\n };\n return function() {\n return {\n \"epics\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgEpicsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-apps-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.getApplicationToken = function(applicationId, state) {\n var url;\n url = urlsService.resolve(\"applications\");\n url = url + \"/\" + applicationId + \"/token?state=\" + state;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.authorizeApplicationToken = function(applicationId, state) {\n var data, url;\n url = urlsService.resolve(\"application-tokens\");\n url = url + \"/authorize\";\n data = {\n \"state\": state,\n \"application\": applicationId\n };\n return http.post(url, data).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"externalapps\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgExternalAppsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/importers.coffee\n */\n\n(function() {\n var AsanaResource, GithubResource, JiraResource, TrelloResource, module, taiga;\n\n taiga = this.taiga;\n\n TrelloResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(url) {\n url = urlsService.resolve(\"importers-trello-auth-url\");\n return http.get(url);\n };\n service.authorize = function(verifyCode) {\n var url;\n url = urlsService.resolve(\"importers-trello-authorize\");\n return http.post(url, {\n code: verifyCode\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-trello-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-trello-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate) {\n var data, url;\n url = urlsService.resolve(\"importers-trello-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: \"kanban\"\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"trelloImporter\": service\n };\n };\n };\n\n TrelloResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n JiraResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(jira_url) {\n var url;\n url = urlsService.resolve(\"importers-jira-auth-url\") + \"?url=\" + jira_url;\n return http.get(url);\n };\n service.authorize = function(oauth_verifier) {\n var url;\n url = urlsService.resolve(\"importers-jira-authorize\");\n return http.post(url, {\n oauth_verifier: oauth_verifier\n });\n };\n service.listProjects = function(jira_url, token) {\n var url;\n url = urlsService.resolve(\"importers-jira-list-projects\");\n return http.post(url, {\n url: jira_url,\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(jira_url, token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-jira-list-users\");\n return http.post(url, {\n url: jira_url,\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(jira_url, token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType) {\n var data, projectTemplate, url;\n url = urlsService.resolve(\"importers-jira-import-project\");\n projectTemplate = \"kanban\";\n if (projectType !== \"kanban\") {\n projectTemplate = \"scrum\";\n }\n data = {\n url: jira_url,\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n project_type: projectType,\n importer_type: importerType,\n template: projectTemplate\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"jiraImporter\": service\n };\n };\n };\n\n JiraResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n GithubResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(callbackUri) {\n var url;\n url = urlsService.resolve(\"importers-github-auth-url\") + \"?uri=\" + callbackUri;\n return http.get(url);\n };\n service.authorize = function(code) {\n var url;\n url = urlsService.resolve(\"importers-github-authorize\");\n return http.post(url, {\n code: code\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-github-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-github-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n var data, url;\n url = urlsService.resolve(\"importers-github-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: projectType\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"githubImporter\": service\n };\n };\n };\n\n GithubResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n AsanaResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function() {\n var url;\n url = urlsService.resolve(\"importers-asana-auth-url\");\n return http.get(url);\n };\n service.authorize = function(code) {\n var url;\n url = urlsService.resolve(\"importers-asana-authorize\");\n return http.post(url, {\n code: code\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-asana-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-asana-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n var data, url;\n url = urlsService.resolve(\"importers-asana-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: projectType\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"asanaImporter\": service\n };\n };\n };\n\n AsanaResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgTrelloImportResource\", TrelloResource);\n\n module.factory(\"tgJiraImportResource\", JiraResource);\n\n module.factory(\"tgGithubImportResource\", GithubResource);\n\n module.factory(\"tgAsanaImportResource\", AsanaResource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: issues-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"issues\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"issues\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgIssuesResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects-resource.service.coffee\n */\n\n(function() {\n var Resource, module, pagination;\n\n pagination = function() {};\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.create = function(data) {\n var url;\n url = urlsService.resolve('projects');\n return http.post(url, JSON.stringify(data)).then((function(_this) {\n return function(result) {\n return Immutable.fromJS(result.data);\n };\n })(this));\n };\n service.duplicate = function(projectId, data) {\n var members, params, url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/\" + projectId + \"/duplicate\";\n members = data.users.map((function(_this) {\n return function(member) {\n return {\n \"id\": member\n };\n };\n })(this));\n params = {\n \"name\": data.name,\n \"description\": data.description,\n \"is_private\": data.is_private,\n \"users\": members\n };\n return http.post(url, params);\n };\n service.getProjects = function(params, pagination) {\n var httpOptions, url;\n if (params == null) {\n params = {};\n }\n if (pagination == null) {\n pagination = true;\n }\n url = urlsService.resolve(\"projects\");\n httpOptions = {};\n if (!pagination) {\n httpOptions = {\n headers: {\n \"x-lazy-pagination\": true\n }\n };\n }\n return http.get(url, params, httpOptions);\n };\n service.getProjectBySlug = function(projectSlug) {\n var url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/by_slug?slug=\" + projectSlug;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getProjectsByUserId = function(userId, paginate) {\n var httpOptions, params, url;\n if (paginate == null) {\n paginate = false;\n }\n url = urlsService.resolve(\"projects\");\n httpOptions = {};\n if (!paginate) {\n httpOptions.headers = {\n \"x-disable-pagination\": \"1\"\n };\n }\n params = {\n \"member\": userId,\n \"order_by\": \"user_order\"\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getProjectStats = function(projectId) {\n var url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/\" + projectId;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.bulkUpdateOrder = function(bulkData) {\n var url;\n url = urlsService.resolve(\"bulk-update-projects-order\");\n return http.post(url, bulkData);\n };\n service.getTimeline = function(projectId, page) {\n var params, url;\n params = {\n page: page,\n only_relevant: true\n };\n url = urlsService.resolve(\"timeline-project\");\n url = url + \"/\" + projectId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.likeProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-like\", projectId);\n return http.post(url);\n };\n service.unlikeProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-unlike\", projectId);\n return http.post(url);\n };\n service.watchProject = function(projectId, notifyLevel) {\n var data, url;\n data = {\n notify_level: notifyLevel,\n live_notify_level: notifyLevel\n };\n url = urlsService.resolve(\"project-watch\", projectId);\n return http.post(url, data);\n };\n service.unwatchProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-unwatch\", projectId);\n return http.post(url);\n };\n service.contactProject = function(projectId, message) {\n var params, url;\n params = {\n project: projectId,\n comment: message\n };\n url = urlsService.resolve(\"project-contact\");\n return http.post(url, params);\n };\n service.transferValidateToken = function(projectId, token) {\n var data, url;\n data = {\n token: token\n };\n url = urlsService.resolve(\"project-transfer-validate-token\", projectId);\n return http.post(url, data);\n };\n service.transferAccept = function(projectId, token, reason) {\n var data, url;\n data = {\n token: token,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-accept\", projectId);\n return http.post(url, data);\n };\n service.transferReject = function(projectId, token, reason) {\n var data, url;\n data = {\n token: token,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-reject\", projectId);\n return http.post(url, data);\n };\n service.transferRequest = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-transfer-request\", projectId);\n return http.post(url);\n };\n service.transferStart = function(projectId, userId, reason) {\n var data, url;\n data = {\n user: userId,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-start\", projectId);\n return http.post(url, data);\n };\n return function() {\n return {\n \"projects\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgProjectsResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: resources.coffee\n */\n\n(function() {\n var Resources, services;\n\n services = [\"tgProjectsResources\", \"tgUserResources\", \"tgUsersResources\", \"tgUserstoriesResource\", \"tgTasksResource\", \"tgIssuesResource\", \"tgExternalAppsResource\", \"tgAttachmentsResource\", \"tgStatsResource\", \"tgWikiHistory\", \"tgEpicsResource\", \"tgTrelloImportResource\", \"tgJiraImportResource\", \"tgGithubImportResource\", \"tgAsanaImportResource\"];\n\n Resources = function($injector) {\n var i, j, len, len1, ref, service, serviceFn, serviceName, serviceProperty;\n for (i = 0, len = services.length; i < len; i++) {\n serviceName = services[i];\n serviceFn = $injector.get(serviceName);\n service = $injector.invoke(serviceFn);\n ref = Object.keys(service);\n for (j = 0, len1 = ref.length; j < len1; j++) {\n serviceProperty = ref[j];\n if (this[serviceProperty]) {\n console.warn(\"repeated resource \" + serviceProperty);\n }\n this[serviceProperty] = service[serviceProperty];\n }\n }\n return this;\n };\n\n Resources.$inject = [\"$injector\"];\n\n angular.module(\"taigaResources2\").service(\"tgResources\", Resources);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: stats-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.discover = function(applicationId, state) {\n var url;\n url = urlsService.resolve(\"stats-discover\");\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"stats\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgStatsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tasks-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"tasks\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"tasks\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgTasksResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getUserStorage = function(key) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-storage\");\n if (key) {\n url += '/' + key;\n }\n httpOptions = {};\n return http.get(url, {}).then(function(response) {\n return response.data.value;\n });\n };\n service.setUserStorage = function(key, value) {\n var params, url;\n url = urlsService.resolve(\"user-storage\") + '/' + key;\n params = {\n key: key,\n value: value\n };\n return http.put(url, params);\n };\n service.createUserStorage = function(key, value) {\n var params, url;\n url = urlsService.resolve(\"user-storage\");\n params = {\n key: key,\n value: value\n };\n return http.post(url, params);\n };\n return function() {\n return {\n \"user\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUserResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: users-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getUserByUsername = function(username) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"by_username\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n username: username\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getStats = function(userId) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-stats\", userId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, {}, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getContacts = function(userId, excludeProjectId) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"user-contacts\", userId);\n params = {};\n if (excludeProjectId != null) {\n params.exclude_project = excludeProjectId;\n }\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getLiked = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-liked\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n params.only_relevant = true;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getVoted = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-voted\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getWatched = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-watched\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getProfileTimeline = function(userId, page) {\n var params, url;\n params = {\n page: page\n };\n url = urlsService.resolve(\"timeline-profile\");\n url = url + \"/\" + userId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getUserTimeline = function(userId, page) {\n var params, url;\n params = {\n page: page,\n only_relevant: true\n };\n url = urlsService.resolve(\"timeline-user\");\n url = url + \"/\" + userId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n return function() {\n return {\n \"users\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUsersResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: userstories-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params, pagination) {\n var httpOptions, url;\n if (pagination == null) {\n pagination = false;\n }\n url = urlsService.resolve(\"userstories\");\n if (!pagination) {\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n }\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.listAllInProject = function(projectId) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n project: projectId\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.listInEpic = function(epicIid) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n epic: epicIid,\n order_by: 'epic_order',\n include_tasks: true\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"userstories\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUserstoriesResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.getWikiHistory = function(wikiId) {\n var httpOptions, url;\n url = urlsService.resolve(\"history/wiki\", wikiId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, null, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"wikiHistory\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgWikiHistory\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: app-meta.service.coffee\n */\n\n(function() {\n var AppMetaService, taiga, truncate;\n\n taiga = this.taiga;\n\n truncate = taiga.truncate;\n\n AppMetaService = (function() {\n AppMetaService.$inject = [\"$rootScope\"];\n\n function AppMetaService(rootScope) {\n this.rootScope = rootScope;\n }\n\n AppMetaService.prototype._set = function(key, value) {\n var meta;\n if (!key) {\n return;\n }\n if (key === \"title\") {\n meta = $(\"head title\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.text(value || \"\");\n } else if (key.indexOf(\"og:\") === 0) {\n meta = $(\"head meta[property='\" + key + \"']\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.attr(\"content\", value || \"\");\n } else {\n meta = $(\"head meta[name='\" + key + \"']\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.attr(\"content\", value || \"\");\n }\n };\n\n AppMetaService.prototype.setTitle = function(title) {\n return this._set('title', title);\n };\n\n AppMetaService.prototype.setDescription = function(description) {\n return this._set(\"description\", truncate(description, 250));\n };\n\n AppMetaService.prototype.setTwitterMetas = function(title, description) {\n this._set(\"twitter:card\", \"summary\");\n this._set(\"twitter:site\", \"@taigaio\");\n this._set(\"twitter:title\", title);\n this._set(\"twitter:description\", truncate(description, 300));\n return this._set(\"twitter:image\", window.location.origin + \"/\" + window._version + \"/images/logo-color.png\");\n };\n\n AppMetaService.prototype.setOpenGraphMetas = function(title, description) {\n this._set(\"og:type\", \"object\");\n this._set(\"og:site_name\", \"Taiga - Love your projects\");\n this._set(\"og:title\", title);\n this._set(\"og:description\", truncate(description, 300));\n this._set(\"og:image\", window.location.origin + \"/\" + window._version + \"/images/logo-color.png\");\n return this._set(\"og:url\", window.location.href);\n };\n\n AppMetaService.prototype.setAll = function(title, description) {\n this.setTitle(title);\n this.setDescription(description);\n this.setTwitterMetas(title, description);\n return this.setOpenGraphMetas(title, description);\n };\n\n AppMetaService.prototype.addMobileViewport = function() {\n return $(\"head\").append(\"\");\n };\n\n AppMetaService.prototype.removeMobileViewport = function() {\n return $(\"head meta[name=\\\"viewport\\\"]\").remove();\n };\n\n AppMetaService.prototype.setfn = function(fn) {\n if (this.listener) {\n this._listener();\n }\n return this._listener = this.rootScope.$watchCollection(fn, (function(_this) {\n return function(metas) {\n if (metas) {\n _this.setAll(metas.title, metas.description);\n return _this._listener();\n }\n };\n })(this));\n };\n\n return AppMetaService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAppMetaService\", AppMetaService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments.service.coffee\n */\n\n(function() {\n var AttachmentsService, sizeFormat;\n\n sizeFormat = this.taiga.sizeFormat;\n\n AttachmentsService = (function() {\n AttachmentsService.$inject = [\"$tgConfirm\", \"$tgConfig\", \"$translate\", \"tgResources\"];\n\n function AttachmentsService(confirm, config, translate, rs) {\n this.confirm = confirm;\n this.config = config;\n this.translate = translate;\n this.rs = rs;\n this.maxFileSize = this.getMaxFileSize();\n if (this.maxFileSize) {\n this.maxFileSizeFormated = sizeFormat(this.maxFileSize);\n }\n }\n\n AttachmentsService.prototype.sizeError = function(file) {\n var message;\n message = this.translate.instant(\"ATTACHMENT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name,\n fileSize: sizeFormat(file.size),\n maxFileSize: this.maxFileSizeFormated\n });\n return this.confirm.notify(\"error\", message);\n };\n\n AttachmentsService.prototype.validate = function(file) {\n if (this.maxFileSize && file.size > this.maxFileSize) {\n this.sizeError(file);\n return false;\n }\n return true;\n };\n\n AttachmentsService.prototype.getMaxFileSize = function() {\n return this.config.get(\"maxUploadFileSize\", null);\n };\n\n AttachmentsService.prototype.list = function(type, objId, projectId) {\n return this.rs.attachments.list(type, objId, projectId).then((function(_this) {\n return function(attachments) {\n return attachments.sortBy(function(attachment) {\n return attachment.get('order');\n });\n };\n })(this));\n };\n\n AttachmentsService.prototype[\"delete\"] = function(type, id) {\n return this.rs.attachments[\"delete\"](type, id);\n };\n\n AttachmentsService.prototype.saveError = function(file, data) {\n var message;\n message = \"\";\n if (file) {\n message = this.translate.instant(\"ATTACHMENT.ERROR_UPLOAD_ATTACHMENT\", {\n fileName: file.name,\n errorMessage: data.data._error_message\n });\n }\n return this.confirm.notify(\"error\", message);\n };\n\n AttachmentsService.prototype.upload = function(file, objId, projectId, type, from_comment) {\n var promise;\n if (from_comment == null) {\n from_comment = false;\n }\n promise = this.rs.attachments.create(type, projectId, objId, file, from_comment);\n promise.then(null, this.saveError.bind(this, file));\n return promise;\n };\n\n AttachmentsService.prototype.patch = function(id, type, patch) {\n var promise;\n promise = this.rs.attachments.patch(type, id, patch);\n promise.then(null, this.saveError.bind(this, null));\n return promise;\n };\n\n return AttachmentsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAttachmentsService\", AttachmentsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: avatar.service.coffee\n */\n\n(function() {\n var AvatarService,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n AvatarService = (function() {\n function AvatarService(config) {\n var COLORS, IMAGES;\n this.config = config;\n IMAGES = [\"/\" + window._version + \"/images/user-avatars/user-avatar-01.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-02.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-03.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-04.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-05.png\"];\n COLORS = [\"rgba( 178, 176, 204, 1 )\", \"rgba( 183, 203, 131, 1 )\", \"rgba( 210, 198, 139, 1 )\", \"rgba( 214, 161, 212, 1 )\", \"rgba( 247, 154, 154, 1 )\"];\n this.logos = _.cartesianProduct(IMAGES, COLORS);\n }\n\n AvatarService.prototype.getDefault = function(key) {\n var idx, logo;\n idx = modulo(murmurhash3_32_gc(key, 42), this.logos.length);\n logo = this.logos[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n\n AvatarService.prototype.getUnnamed = function() {\n return {\n url: \"/\" + window._version + \"/images/unnamed.png\"\n };\n };\n\n AvatarService.prototype.getAvatar = function(user, type) {\n var avatarParamName, gravatar, logo, logoUrl, photo, root;\n if (!user) {\n return this.getUnnamed();\n }\n avatarParamName = 'photo';\n if (type === 'avatarBig') {\n avatarParamName = 'big_photo';\n }\n photo = null;\n if (user instanceof Immutable.Map) {\n gravatar = user.get('gravatar_id');\n photo = user.get(avatarParamName);\n } else {\n gravatar = user.gravatar_id;\n photo = user[avatarParamName];\n }\n if (!gravatar) {\n return this.getUnnamed();\n }\n if (photo) {\n return {\n url: photo\n };\n } else if (location.host.indexOf('localhost') !== -1 || !this.config.get(\"gravatar\", true)) {\n root = location.protocol + '//' + location.host;\n logo = this.getDefault(gravatar);\n return {\n url: root + logo.src,\n bg: logo.color\n };\n } else {\n root = location.protocol + '//' + location.host;\n logo = this.getDefault(gravatar);\n logoUrl = encodeURIComponent(root + logo.src);\n return {\n url: 'https://www.gravatar.com/avatar/' + gravatar + \"?s=200&d=\" + logoUrl,\n bg: logo.color\n };\n }\n };\n\n return AvatarService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAvatarService\", [\"$tgConfig\", AvatarService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: check-permissions.service.coffee\n */\n\n(function() {\n var CheckPermissionsService, taiga;\n\n taiga = this.taiga;\n\n CheckPermissionsService = (function() {\n CheckPermissionsService.$inject = [\"tgProjectService\"];\n\n function CheckPermissionsService(projectService) {\n this.projectService = projectService;\n }\n\n CheckPermissionsService.prototype.check = function(permission) {\n if (!this.projectService.project) {\n return false;\n }\n return this.projectService.project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n return CheckPermissionsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCheckPermissionsService\", CheckPermissionsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: current-user.service.coffee\n */\n\n(function() {\n var CurrentUserService, groupBy, taiga;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n CurrentUserService = (function() {\n CurrentUserService.$inject = [\"tgProjectsService\", \"$tgStorage\", \"tgResources\"];\n\n function CurrentUserService(projectsService, storageService, rs) {\n this.projectsService = projectsService;\n this.storageService = storageService;\n this.rs = rs;\n this._user = null;\n this._projects = Immutable.Map();\n this._projectsById = Immutable.Map();\n this._joyride = null;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this._projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"projectsById\", (function(_this) {\n return function() {\n return _this._projectsById;\n };\n })(this));\n }\n\n CurrentUserService.prototype.isAuthenticated = function() {\n if (this.getUser() !== null) {\n return true;\n }\n return false;\n };\n\n CurrentUserService.prototype.getUser = function() {\n var userData;\n if (!this._user) {\n userData = this.storageService.get(\"userInfo\");\n if (userData) {\n userData = Immutable.fromJS(userData);\n this.setUser(userData);\n }\n }\n return this._user;\n };\n\n CurrentUserService.prototype.removeUser = function() {\n this._user = null;\n this._projects = Immutable.Map();\n this._projectsById = Immutable.Map();\n return this._joyride = null;\n };\n\n CurrentUserService.prototype.setUser = function(user) {\n this._user = user;\n return this._loadUserInfo();\n };\n\n CurrentUserService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.projectsService.bulkUpdateProjectsOrder(sortData).then((function(_this) {\n return function() {\n return _this.loadProjects();\n };\n })(this));\n };\n\n CurrentUserService.prototype.loadProjects = function() {\n return this.projectsService.getProjectsByUserId(this._user.get(\"id\")).then((function(_this) {\n return function(projects) {\n return _this.setProjects(projects);\n };\n })(this));\n };\n\n CurrentUserService.prototype.disableJoyRide = function(section) {\n if (!this.isAuthenticated()) {\n return;\n }\n if (section) {\n this._joyride[section] = false;\n } else {\n this._joyride = {\n backlog: false,\n kanban: false,\n dashboard: false\n };\n }\n return this.rs.user.setUserStorage('joyride', this._joyride);\n };\n\n CurrentUserService.prototype.loadJoyRideConfig = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n if (_this._joyride !== null) {\n resolve(_this._joyride);\n return;\n }\n return _this.rs.user.getUserStorage('joyride').then(function(config) {\n _this._joyride = config;\n return resolve(_this._joyride);\n })[\"catch\"](function() {\n _this._joyride = {\n backlog: true,\n kanban: true,\n dashboard: true\n };\n _this.rs.user.createUserStorage('joyride', _this._joyride);\n return resolve(_this._joyride);\n });\n };\n })(this));\n };\n\n CurrentUserService.prototype._loadUserInfo = function() {\n return Promise.all([this.loadProjects()]);\n };\n\n CurrentUserService.prototype.setProjects = function(projects) {\n this._projects = this._projects.set(\"all\", projects);\n this._projects = this._projects.set(\"recents\", projects.slice(0, 10));\n this._projectsById = Immutable.fromJS(groupBy(projects.toJS(), function(p) {\n return p.id;\n }));\n return this.projects;\n };\n\n CurrentUserService.prototype.canCreatePrivateProjects = function() {\n var user;\n user = this.getUser();\n if (user.get('max_private_projects') !== null && user.get('total_private_projects') >= user.get('max_private_projects')) {\n return {\n valid: false,\n reason: 'max_private_projects',\n type: 'private_project',\n current: user.get('total_private_projects'),\n max: user.get('max_private_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canCreatePublicProjects = function() {\n var user;\n user = this.getUser();\n if (user.get('max_public_projects') !== null && user.get('total_public_projects') >= user.get('max_public_projects')) {\n return {\n valid: false,\n reason: 'max_public_projects',\n type: 'public_project',\n current: user.get('total_public_projects'),\n max: user.get('max_public_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canAddMembersPublicProject = function(totalMembers) {\n var user;\n user = this.getUser();\n if (user.get('max_memberships_public_projects') !== null && totalMembers > user.get('max_memberships_public_projects')) {\n return {\n valid: false,\n reason: 'max_members_public_projects',\n type: 'public_project',\n current: totalMembers,\n max: user.get('max_memberships_public_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canAddMembersPrivateProject = function(totalMembers) {\n var user;\n user = this.getUser();\n if (user.get('max_memberships_private_projects') !== null && totalMembers > user.get('max_memberships_private_projects')) {\n return {\n valid: false,\n reason: 'max_members_private_projects',\n type: 'private_project',\n current: totalMembers,\n max: user.get('max_memberships_private_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canOwnProject = function(project) {\n var membersResult, result, user;\n user = this.getUser();\n if (project.get('is_private')) {\n result = this.canCreatePrivateProjects();\n if (!result.valid) {\n return result;\n }\n membersResult = this.canAddMembersPrivateProject(project.get('total_memberships'));\n if (!membersResult.valid) {\n return membersResult;\n }\n } else {\n result = this.canCreatePublicProjects();\n if (!result.valid) {\n return result;\n }\n membersResult = this.canAddMembersPublicProject(project.get('total_memberships'));\n if (!membersResult.valid) {\n return membersResult;\n }\n }\n return {\n valid: true\n };\n };\n\n return CurrentUserService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCurrentUserService\", CurrentUserService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: error-handling.service.coffee\n */\n\n(function() {\n var ErrorHandlingService, taiga;\n\n taiga = this.taiga;\n\n ErrorHandlingService = (function() {\n ErrorHandlingService.$inject = [\"$rootScope\"];\n\n function ErrorHandlingService(rootScope) {\n this.rootScope = rootScope;\n }\n\n ErrorHandlingService.prototype.init = function() {\n return this.rootScope.errorHandling = {};\n };\n\n ErrorHandlingService.prototype.notfound = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.notfound = true;\n };\n\n ErrorHandlingService.prototype.error = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.error = true;\n };\n\n ErrorHandlingService.prototype.permissionDenied = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.permissionDenied = true;\n };\n\n ErrorHandlingService.prototype.block = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.blocked = true;\n };\n\n return ErrorHandlingService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgErrorHandlingService\", ErrorHandlingService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: lightbox-factory.service.coffee\n */\n\n(function() {\n var LightboxFactory;\n\n LightboxFactory = (function() {\n LightboxFactory.$inject = [\"$rootScope\", \"$compile\"];\n\n function LightboxFactory(rootScope, compile) {\n this.rootScope = rootScope;\n this.compile = compile;\n }\n\n LightboxFactory.prototype.create = function(name, attrs, scopeAttrs) {\n var elm, html, scope;\n scope = this.rootScope.$new();\n scope = _.merge(scope, scopeAttrs);\n elm = $(\"
    \").attr(name, true).attr(\"tg-bind-scope\", true);\n if (attrs) {\n elm.attr(attrs);\n }\n elm.addClass(\"remove-on-close\");\n html = this.compile(elm)(scope);\n $(document.body).append(html);\n };\n\n return LightboxFactory;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgLightboxFactory\", LightboxFactory);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: paginate-response.service.coffee\n */\n\n(function() {\n var PaginateResponse;\n\n PaginateResponse = function() {\n return function(result) {\n var paginateResponse;\n paginateResponse = Immutable.Map({\n \"data\": result.get(\"data\"),\n \"next\": !!result.get(\"headers\")(\"x-pagination-next\"),\n \"prev\": !!result.get(\"headers\")(\"x-pagination-prev\"),\n \"current\": result.get(\"headers\")(\"x-pagination-current\"),\n \"count\": result.get(\"headers\")(\"x-pagination-count\")\n });\n return paginateResponse;\n };\n };\n\n angular.module(\"taigaCommon\").factory(\"tgPaginateResponseService\", PaginateResponse);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-logo.service.coffee\n */\n\n(function() {\n var ProjectLogoService,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n ProjectLogoService = (function() {\n function ProjectLogoService() {\n var COLORS, IMAGES;\n IMAGES = [\"/\" + window._version + \"/images/project-logos/project-logo-01.png\", \"/\" + window._version + \"/images/project-logos/project-logo-02.png\", \"/\" + window._version + \"/images/project-logos/project-logo-03.png\", \"/\" + window._version + \"/images/project-logos/project-logo-04.png\", \"/\" + window._version + \"/images/project-logos/project-logo-05.png\"];\n COLORS = [\"rgba( 153, 214, 220, 1 )\", \"rgba( 213, 156, 156, 1 )\", \"rgba( 214, 161, 212, 1 )\", \"rgba( 164, 162, 219, 1 )\", \"rgba( 152, 224, 168, 1 )\"];\n this.logos = _.cartesianProduct(IMAGES, COLORS);\n }\n\n ProjectLogoService.prototype.getDefaultProjectLogo = function(slug, id) {\n var idx, key, logo;\n key = slug + \"-\" + id;\n idx = modulo(murmurhash3_32_gc(key, 42), this.logos.length);\n logo = this.logos[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n\n return ProjectLogoService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgProjectLogoService\", ProjectLogoService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.service.coffee\n */\n\n(function() {\n var ProjectService, taiga;\n\n taiga = this.taiga;\n\n ProjectService = (function() {\n ProjectService.$inject = [\"tgProjectsService\", \"tgXhrErrorService\", \"tgUserActivityService\", \"$interval\"];\n\n function ProjectService(projectsService, xhrError, userActivityService, interval) {\n this.projectsService = projectsService;\n this.xhrError = xhrError;\n this.userActivityService = userActivityService;\n this.interval = interval;\n this._project = null;\n this._section = null;\n this._sectionsBreadcrumb = Immutable.List();\n this._activeMembers = Immutable.List();\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this._project;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"section\", (function(_this) {\n return function() {\n return _this._section;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"sectionsBreadcrumb\", (function(_this) {\n return function() {\n return _this._sectionsBreadcrumb;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"activeMembers\", (function(_this) {\n return function() {\n return _this._activeMembers;\n };\n })(this));\n if (!window.localStorage.e2e) {\n this.autoRefresh();\n }\n }\n\n ProjectService.prototype.cleanProject = function() {\n this._project = null;\n this._activeMembers = Immutable.List();\n this._section = null;\n return this._sectionsBreadcrumb = Immutable.List();\n };\n\n ProjectService.prototype.autoRefresh = function() {\n var intervalId;\n intervalId = this.interval((function(_this) {\n return function() {\n return _this.fetchProject();\n };\n })(this), 60 * 10 * 1000);\n this.userActivityService.onInactive((function(_this) {\n return function() {\n return _this.interval.cancel(intervalId);\n };\n })(this));\n return this.userActivityService.onActive((function(_this) {\n return function() {\n _this.fetchProject();\n return _this.autoRefresh();\n };\n })(this));\n };\n\n ProjectService.prototype.setSection = function(section) {\n this._section = section;\n if (section) {\n return this._sectionsBreadcrumb = this._sectionsBreadcrumb.push(this._section);\n } else {\n return this._sectionsBreadcrumb = Immutable.List();\n }\n };\n\n ProjectService.prototype.setProject = function(project) {\n this._project = project;\n return this._activeMembers = this._project.get('members').filter(function(member) {\n return member.get('is_active');\n });\n };\n\n ProjectService.prototype.setProjectBySlug = function(pslug) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n if (!_this.project || _this.project.get('slug') !== pslug) {\n return _this.projectsService.getProjectBySlug(pslug).then(function(project) {\n _this.setProject(project);\n return resolve();\n })[\"catch\"](function(xhr) {\n return _this.xhrError.response(xhr);\n });\n } else {\n return resolve();\n }\n };\n })(this));\n };\n\n ProjectService.prototype.fetchProject = function() {\n var pslug;\n if (!this.project) {\n return;\n }\n pslug = this.project.get('slug');\n return this.projectsService.getProjectBySlug(pslug).then((function(_this) {\n return function(project) {\n return _this.setProject(project);\n };\n })(this));\n };\n\n ProjectService.prototype.hasPermission = function(permission) {\n return this._project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n ProjectService.prototype.isEpicsDashboardEnabled = function() {\n return this._project.get(\"is_epics_activated\");\n };\n\n return ProjectService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgProjectService\", ProjectService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: theme.service.coffee\n */\n\n(function() {\n var ThemeService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ThemeService = (function(superClass) {\n extend(ThemeService, superClass);\n\n function ThemeService() {\n return ThemeService.__super__.constructor.apply(this, arguments);\n }\n\n return ThemeService;\n\n })(taiga.Service = function() {\n return {\n use: function(themeName) {\n var stylesheetEl;\n stylesheetEl = $(\"link[rel='stylesheet']:first\");\n if (stylesheetEl.length === 0) {\n stylesheetEl = $(\"\");\n $(\"head\").append(stylesheetEl);\n }\n return stylesheetEl.attr(\"href\", \"/\" + window._version + \"/styles/theme-\" + themeName + \".css\");\n }\n };\n });\n\n angular.module(\"taigaCommon\").service(\"tgThemeService\", ThemeService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-activity.service.coffee\n */\n\n(function() {\n var UserActivityService, groupBy, taiga;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n UserActivityService = (function() {\n UserActivityService.$inject = ['$timeout'];\n\n UserActivityService.prototype.idleTimeout = 60 * 5 * 1000;\n\n function UserActivityService(timeout) {\n this.timeout = timeout;\n if (window.localStorage.e2e) {\n return null;\n }\n window.addEventListener('mousemove', this.resetTimer.bind(this), false);\n window.addEventListener('mousedown', this.resetTimer.bind(this), false);\n window.addEventListener('keypress', this.resetTimer.bind(this), false);\n window.addEventListener('mousewheel', this.resetTimer.bind(this), false);\n window.addEventListener('touchmove', this.resetTimer.bind(this), false);\n this.subscriptionsActive = [];\n this.subscriptionsInactive = [];\n this.isActive = true;\n this.startTimer();\n }\n\n UserActivityService.prototype.startTimer = function() {\n return this.timerId = this.timeout(this._fireInactive.bind(this), this.idleTimeout);\n };\n\n UserActivityService.prototype.resetTimer = function() {\n if (!this.isActive) {\n this._fireActive();\n }\n this.timeout.cancel(this.timerId);\n this.startTimer();\n return this.isActive = true;\n };\n\n UserActivityService.prototype.onActive = function(cb) {\n this.subscriptionsActive.push(cb);\n return this._unSubscriptionsActive.bind(this, cb);\n };\n\n UserActivityService.prototype.onInactive = function(cb) {\n this.subscriptionsInactive.push(cb);\n return this._unSubscriptionsInactive.bind(this, cb);\n };\n\n UserActivityService.prototype._fireActive = function() {\n return this.subscriptionsActive.forEach(function(it) {\n return it();\n });\n };\n\n UserActivityService.prototype._fireInactive = function() {\n this.isActive = false;\n return this.subscriptionsInactive.forEach(function(it) {\n return it();\n });\n };\n\n UserActivityService.prototype._unSubscriptionsActive = function(cb) {\n return this.subscriptionsActive = this.subscriptionsActive.filter(function(fn) {\n return fn !== cb;\n });\n };\n\n UserActivityService.prototype._unSubscriptionsInactive = function(cb) {\n return this.subscriptionsInactive = this.subscriptionsInactive.filter(function(fn) {\n return fn !== cb;\n });\n };\n\n return UserActivityService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgUserActivityService\", UserActivityService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user.service.coffee\n */\n\n(function() {\n var UserService, bindMethods, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n bindMethods = taiga.bindMethods;\n\n UserService = (function(superClass) {\n extend(UserService, superClass);\n\n UserService.$inject = [\"tgResources\"];\n\n function UserService(rs) {\n this.rs = rs;\n bindMethods(this);\n }\n\n UserService.prototype.getUserByUserName = function(username) {\n return this.rs.users.getUserByUsername(username);\n };\n\n UserService.prototype.getContacts = function(userId, excludeProjectId) {\n return this.rs.users.getContacts(userId, excludeProjectId);\n };\n\n UserService.prototype.getLiked = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getLiked(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getVoted = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getVoted(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getWatched = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getWatched(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getStats = function(userId) {\n return this.rs.users.getStats(userId);\n };\n\n UserService.prototype.attachUserContactsToProjects = function(userId, projects) {\n return this.getContacts(userId).then(function(contacts) {\n projects = projects.map(function(project) {\n var contactsFiltered;\n contactsFiltered = contacts.filter(function(contact) {\n var contactId;\n contactId = contact.get(\"id\");\n return project.get('members').indexOf(contactId) !== -1;\n });\n project = project.set(\"contacts\", contactsFiltered);\n return project;\n });\n return projects;\n });\n };\n\n return UserService;\n\n })(taiga.Service);\n\n angular.module(\"taigaCommon\").service(\"tgUserService\", UserService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: xhrError.service.coffee\n */\n\n(function() {\n var xhrError,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n xhrError = (function(superClass) {\n extend(xhrError, superClass);\n\n xhrError.$inject = [\"$q\", \"tgErrorHandlingService\"];\n\n function xhrError(q, errorHandlingService) {\n this.q = q;\n this.errorHandlingService = errorHandlingService;\n }\n\n xhrError.prototype.notFound = function() {\n return this.errorHandlingService.notfound();\n };\n\n xhrError.prototype.permissionDenied = function() {\n return this.errorHandlingService.permissionDenied();\n };\n\n xhrError.prototype.response = function(xhr) {\n if (xhr) {\n if (xhr.status === 404) {\n this.notFound();\n } else if (xhr.status === 403) {\n this.permissionDenied();\n }\n }\n return this.q.reject(xhr);\n };\n\n return xhrError;\n\n })(taiga.Service);\n\n angular.module(\"taigaCommon\").service(\"tgXhrErrorService\", xhrError);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-attachment.directive.coffee\n */\n\n(function() {\n var UserTimelineAttachmentDirective;\n\n UserTimelineAttachmentDirective = function(template, $compile) {\n var isImage, link, validFileExtensions;\n validFileExtensions = [\".jpg\", \".jpeg\", \".bmp\", \".gif\", \".png\"];\n isImage = function(url) {\n url = url.toLowerCase();\n return _.some(validFileExtensions, function(extension) {\n return url.indexOf(extension, url - extension.length) !== -1;\n });\n };\n link = function(scope, el) {\n var is_image, templateHtml;\n is_image = isImage(scope.attachment.get('url'));\n if (is_image) {\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment-image.html\");\n } else {\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment.html\");\n }\n el.html(templateHtml);\n $compile(el.contents())(scope);\n return el.find(\"img\").error(function() {\n return this.remove();\n });\n };\n return {\n link: link,\n scope: {\n attachment: \"=tgUserTimelineAttachment\"\n }\n };\n };\n\n UserTimelineAttachmentDirective.$inject = [\"$tgTemplate\", \"$compile\"];\n\n angular.module(\"taigaUserTimeline\").directive(\"tgUserTimelineAttachment\", UserTimelineAttachmentDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item-title.service.coffee\n */\n\n(function() {\n var UserTimelineItemTitle, unslugify;\n\n unslugify = this.taiga.unslugify;\n\n UserTimelineItemTitle = (function() {\n UserTimelineItemTitle.$inject = [\"$translate\", \"$sce\"];\n\n UserTimelineItemTitle.prototype._fieldTranslationKey = {\n 'status': 'COMMON.FIELDS.STATUS',\n 'subject': 'COMMON.FIELDS.SUBJECT',\n 'description_diff': 'COMMON.FIELDS.DESCRIPTION',\n 'points': 'COMMON.FIELDS.POINTS',\n 'assigned_to': 'COMMON.FIELDS.ASSIGNED_TO',\n 'assigned_users': 'COMMON.FIELDS.ASSIGNED_USERS',\n 'severity': 'ISSUES.FIELDS.SEVERITY',\n 'priority': 'ISSUES.FIELDS.PRIORITY',\n 'type': 'ISSUES.FIELDS.TYPE',\n 'is_iocaine': 'TASK.FIELDS.IS_IOCAINE',\n 'is_blocked': 'COMMON.FIELDS.IS_BLOCKED',\n 'color': 'COMMON.FIELDS.COLOR',\n 'due_date': 'COMMON.FIELDS.DUE_DATE',\n 'due_date_reason': 'COMMON.FIELDS.DUE_DATE_REASON'\n };\n\n UserTimelineItemTitle.prototype._params = {\n username: function(timeline, event) {\n var title_attr, url, user;\n user = timeline.getIn(['data', 'user']);\n if (user.get('is_profile_visible')) {\n title_attr = this.translate.instant('COMMON.SEE_USER_PROFILE', {\n username: user.get('username')\n });\n url = \"user-profile:username=timeline.getIn(['data', 'user', 'username'])\";\n return this._getLink(url, user.get('name'), title_attr);\n } else {\n return this._getUsernameSpan(user.get('name'));\n }\n },\n field_name: function(timeline, event) {\n var field_name;\n field_name = timeline.getIn(['data', 'value_diff', 'key']);\n return this.translate.instant(this._fieldTranslationKey[field_name]);\n },\n project_name: function(timeline, event) {\n var url;\n url = \"project:project=timeline.getIn(['data', 'project', 'slug'])\";\n return this._getLink(url, timeline.getIn([\"data\", \"project\", \"name\"]));\n },\n new_value: function(timeline, event) {\n var new_value, prettyDate, value;\n if (_.isArray(timeline.getIn([\"data\", \"value_diff\", \"value\"]).toJS())) {\n value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).get(1);\n if (value === null && timeline.getIn([\"data\", \"value_diff\", \"key\"]) === 'assigned_to') {\n value = this.translate.instant('ACTIVITY.VALUES.UNASSIGNED');\n }\n if (value === null && timeline.getIn([\"data\", \"value_diff\", \"key\"]) === 'assigned_users') {\n value = this.translate.instant('ACTIVITY.VALUES.UNASSIGNED');\n } else if (timeline.getIn([\"data\", \"value_diff\", \"key\"]) === 'due_date') {\n if (value) {\n prettyDate = this.translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n value = moment(value, \"YYYY-MM-DD\").format(prettyDate);\n } else {\n value = this.translate.instant('ACTIVITY.VALUES.NOT_SET');\n }\n }\n new_value = value;\n } else {\n new_value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).first().get(1);\n }\n return _.escape(new_value);\n },\n sprint_name: function(timeline, event) {\n var url;\n url = \"project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])\";\n return this._getLink(url, timeline.getIn(['data', 'milestone', 'name']));\n },\n us_name: function(timeline, event) {\n var event_us, obj, text, url;\n obj = this._getTimelineObj(timeline, event).get('userstory');\n event_us = {\n obj: 'parent_userstory'\n };\n url = this._getDetailObjUrl(event_us);\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n related_us_name: function(timeline, event) {\n var obj, text, url;\n obj = timeline.getIn([\"data\", \"userstory\"]);\n url = \"project-userstories-detail:project=timeline.getIn(['data', 'userstory', 'project', 'slug']),ref=timeline.getIn(['data', 'userstory', 'ref'])\";\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n epic_name: function(timeline, event) {\n var obj, text, url;\n obj = timeline.getIn([\"data\", \"epic\"]);\n url = \"project-epics-detail:project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['data', 'epic', 'ref'])\";\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n obj_name: function(timeline, event) {\n var obj, text, url;\n obj = this._getTimelineObj(timeline, event);\n url = this._getDetailObjUrl(event);\n if (event.obj === 'wikipage') {\n text = unslugify(obj.get('slug'));\n } else if (event.obj === 'milestone') {\n text = obj.get('name');\n } else {\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n }\n return this._getLink(url, text);\n },\n role_name: function(timeline, event) {\n return _.escape(timeline.getIn(['data', 'value_diff', 'value']).keySeq().first());\n }\n };\n\n function UserTimelineItemTitle(translate, sce) {\n this.translate = translate;\n this.sce = sce;\n }\n\n UserTimelineItemTitle.prototype._translateTitleParams = function(param, timeline, event) {\n return this._params[param].call(this, timeline, event);\n };\n\n UserTimelineItemTitle.prototype._getTimelineObj = function(timeline, event) {\n return timeline.getIn(['data', event.obj]);\n };\n\n UserTimelineItemTitle.prototype._getDetailObjUrl = function(event) {\n var url;\n url = {\n \"issue\": [\"project-issues-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"wikipage\": [\"project-wiki-page\", \":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])\"],\n \"task\": [\"project-tasks-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"parent_userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])\"],\n \"milestone\": [\"project-taskboard\", \":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])\"],\n \"epic\": [\"project-epics-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"]\n };\n return url[event.obj][0] + url[event.obj][1];\n };\n\n UserTimelineItemTitle.prototype._getLink = function(url, text, title) {\n var span;\n title = title || text;\n span = $('').attr('ng-non-bindable', true).text(text);\n return $('').attr('tg-nav', url).attr('title', title).append(span).prop('outerHTML');\n };\n\n UserTimelineItemTitle.prototype._getUsernameSpan = function(text) {\n var title;\n title = title || text;\n return $('').addClass('username').text(text).prop('outerHTML');\n };\n\n UserTimelineItemTitle.prototype._getParams = function(timeline, event, timeline_type) {\n var params;\n params = {};\n timeline_type.translate_params.forEach((function(_this) {\n return function(param) {\n return params[param] = _this._translateTitleParams(param, timeline, event);\n };\n })(this));\n return params;\n };\n\n UserTimelineItemTitle.prototype.getTitle = function(timeline, event, type) {\n var params, paramsKeys, translation;\n params = this._getParams(timeline, event, type);\n paramsKeys = {};\n Object.keys(params).forEach(function(key) {\n return paramsKeys[key] = '{{' + key + '}}';\n });\n translation = this.translate.instant(type.key, paramsKeys);\n Object.keys(params).forEach(function(key) {\n var find;\n find = '{{' + key + '}}';\n return translation = translation.replace(new RegExp(find, 'g'), params[key]);\n });\n return translation;\n };\n\n return UserTimelineItemTitle;\n\n })();\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineItemTitle\", UserTimelineItemTitle);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item-type.service.coffee\n */\n\n(function() {\n var UserTimelineType, timelineType;\n\n timelineType = function(timeline, event) {\n var types;\n types = [\n {\n check: function(timeline, event) {\n return event.obj === 'membership';\n },\n key: 'TIMELINE.NEW_MEMBER',\n translate_params: ['project_name'],\n member: function(timeline) {\n return Immutable.Map({\n user: timeline.getIn(['data', 'user']),\n role: timeline.getIn(['data', 'role'])\n });\n }\n }, {\n check: function(timeline, event) {\n return event.obj === 'project' && event.type === 'create';\n },\n key: 'TIMELINE.NEW_PROJECT',\n translate_params: ['username', 'project_name'],\n description: function(timeline) {\n return timeline.getIn(['data', 'project', 'description']);\n }\n }, {\n check: function(timeline, event) {\n return event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'attachments';\n },\n key: 'TIMELINE.UPLOAD_ATTACHMENT',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'create';\n },\n key: 'TIMELINE.US_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'create';\n },\n key: 'TIMELINE.ISSUE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'wikipage' && event.type === 'create';\n },\n key: 'TIMELINE.WIKI_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'create' && !timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'create' && timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_CREATED_WITH_US',\n translate_params: ['username', 'project_name', 'obj_name', 'us_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'milestone' && event.type === 'create';\n },\n key: 'TIMELINE.MILESTONE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'create';\n },\n key: 'TIMELINE.EPIC_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'relateduserstory' && event.type === 'create';\n },\n key: 'TIMELINE.EPIC_RELATED_USERSTORY_CREATED',\n translate_params: ['username', 'project_name', 'related_us_name', 'epic_name']\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'userstory';\n },\n key: 'TIMELINE.NEW_COMMENT_US',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'issue';\n },\n key: 'TIMELINE.NEW_COMMENT_ISSUE',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'task';\n },\n key: 'TIMELINE.NEW_COMMENT_TASK',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'epic';\n },\n key: 'TIMELINE.NEW_COMMENT_EPIC',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && timeline.hasIn(['data', 'value_diff', 'value', 'backlog_order']) && event.type === 'change';\n },\n key: 'TIMELINE.US_MOVED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && event.type === 'change' && event.obj === 'userstory') {\n return timeline.getIn(['data', 'value_diff', 'value', 'milestone']).get(1) === null;\n }\n return false;\n },\n key: 'TIMELINE.US_REMOVED_FROM_MILESTONE',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && event.type === 'change' && event.obj === 'userstory';\n },\n key: 'TIMELINE.US_ADDED_MILESTONE',\n translate_params: ['username', 'obj_name', 'sprint_name']\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'blocked' && event.type === 'change') {\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) === true;\n }\n return false;\n },\n key: 'TIMELINE.BLOCKED',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n if (timeline.hasIn(['data', 'value_diff', 'value', 'blocked_note_html'])) {\n text = timeline.getIn(['data', 'value_diff', 'value', 'blocked_note_html']).get(1);\n return $($.parseHTML(text)).text();\n } else {\n return false;\n }\n }\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'blocked' && event.type === 'change') {\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) === false;\n }\n return false;\n },\n key: 'TIMELINE.UNBLOCKED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'milestone' && event.type === 'change';\n },\n key: 'TIMELINE.MILESTONE_UPDATED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'wikipage' && event.type === 'change';\n },\n key: 'TIMELINE.WIKI_UPDATED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'points';\n },\n key: 'TIMELINE.US_UPDATED_POINTS',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value', 'role_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.US_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change';\n },\n key: 'TIMELINE.US_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.ISSUE_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'change';\n },\n key: 'TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.TASK_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_US',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.EPIC_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'color';\n },\n key: 'TIMELINE.EPIC_UPDATED_WITH_NEW_COLOR',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change';\n },\n key: 'TIMELINE.EPIC_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'user' && event.type === 'create';\n },\n key: 'TIMELINE.NEW_USER',\n translate_params: ['username']\n }\n ];\n return _.find(types, function(obj) {\n return obj.check(timeline, event);\n });\n };\n\n UserTimelineType = (function() {\n function UserTimelineType() {}\n\n UserTimelineType.prototype.getType = function(timeline, event) {\n return timelineType(timeline, event);\n };\n\n return UserTimelineType;\n\n })();\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineItemType\", UserTimelineType);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item.directive.coffee\n */\n\n(function() {\n var UserTimelineItemDirective;\n\n UserTimelineItemDirective = function() {\n return {\n templateUrl: \"user-timeline/user-timeline-item/user-timeline-item.html\",\n scope: {\n timeline: \"=tgUserTimelineItem\"\n }\n };\n };\n\n angular.module(\"taigaUserTimeline\").directive(\"tgUserTimelineItem\", UserTimelineItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-pagination-sequence.service.coffee\n */\n\n(function() {\n var UserTimelinePaginationSequence;\n\n UserTimelinePaginationSequence = function() {\n var obj;\n obj = {};\n obj.generate = function(config) {\n var getContent, items, next, page;\n page = 1;\n items = Immutable.List();\n config.minItems = config.minItems || 20;\n next = function() {\n items = Immutable.List();\n return getContent();\n };\n getContent = function() {\n return config.fetch(page).then(function(response) {\n var data;\n page++;\n data = response.get(\"data\");\n if (config.filter) {\n data = config.filter(data);\n }\n if (config.map) {\n data = data.map(config.map);\n }\n items = items.concat(data);\n if (items.size < config.minItems && response.get(\"next\")) {\n return getContent();\n }\n return Immutable.Map({\n items: items,\n next: response.get(\"next\")\n });\n });\n };\n return {\n next: function() {\n return next();\n }\n };\n };\n return obj;\n };\n\n angular.module(\"taigaUserTimeline\").factory(\"tgUserTimelinePaginationSequenceService\", UserTimelinePaginationSequence);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/profile/profile-timeline/profile-timeline.controller.coffee\n */\n\n(function() {\n var UserTimelineController, mixOf, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n UserTimelineController = (function(superClass) {\n extend(UserTimelineController, superClass);\n\n UserTimelineController.$inject = [\"tgUserTimelineService\"];\n\n function UserTimelineController(userTimelineService) {\n this.userTimelineService = userTimelineService;\n this.timelineList = Immutable.List();\n this.scrollDisabled = false;\n this.timeline = null;\n if (this.projectId) {\n this.timeline = this.userTimelineService.getProjectTimeline(this.projectId);\n } else if (this.currentUser) {\n this.timeline = this.userTimelineService.getProfileTimeline(this.user.get(\"id\"));\n } else {\n this.timeline = this.userTimelineService.getUserTimeline(this.user.get(\"id\"));\n }\n }\n\n UserTimelineController.prototype.loadTimeline = function() {\n this.scrollDisabled = true;\n return this.timeline.next().then((function(_this) {\n return function(response) {\n _this.timelineList = _this.timelineList.concat(response.get(\"items\"));\n if (response.get(\"next\")) {\n _this.scrollDisabled = false;\n }\n return _this.timelineList;\n };\n })(this));\n };\n\n return UserTimelineController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n angular.module(\"taigaUserTimeline\").controller(\"UserTimeline\", UserTimelineController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.directive.coffee\n */\n\n(function() {\n var UserTimelineDirective;\n\n UserTimelineDirective = function() {\n return {\n templateUrl: \"user-timeline/user-timeline/user-timeline.html\",\n controller: \"UserTimeline\",\n controllerAs: \"vm\",\n scope: {\n projectId: \"=projectid\",\n user: \"=\",\n currentUser: \"=\"\n },\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgUserTimeline\", UserTimelineDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.service.coffee\n */\n\n(function() {\n var UserTimelineService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n UserTimelineService = (function(superClass) {\n extend(UserTimelineService, superClass);\n\n UserTimelineService.$inject = [\"tgResources\", \"tgUserTimelinePaginationSequenceService\", \"tgUserTimelineItemType\", \"tgUserTimelineItemTitle\"];\n\n function UserTimelineService(rs, userTimelinePaginationSequenceService, userTimelineItemType, userTimelineItemTitle) {\n this.rs = rs;\n this.userTimelinePaginationSequenceService = userTimelinePaginationSequenceService;\n this.userTimelineItemType = userTimelineItemType;\n this.userTimelineItemTitle = userTimelineItemTitle;\n }\n\n UserTimelineService.prototype._valid_fields = ['status', 'subject', 'description_diff', 'assigned_users', 'assigned_to', 'points', 'severity', 'priority', 'type', 'attachments', 'is_iocaine', 'content_diff', 'name', 'estimated_finish', 'estimated_start', 'blocked', 'moveInBacklog', 'milestone', 'color', 'due_date', 'due_date_reason'];\n\n UserTimelineService.prototype._invalid = [\n {\n check: function(timeline) {\n var fieldKey, value_diff;\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n if (value_diff) {\n fieldKey = value_diff.get('key');\n if (this._valid_fields.indexOf(fieldKey) === -1) {\n return true;\n } else if (fieldKey === 'attachments' && value_diff.get('value').get('new').size === 0) {\n return true;\n }\n }\n return false;\n }\n }, {\n check: function(timeline) {\n var event, value_diff;\n event = timeline.get('event_type').split(\".\");\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n return event[2] === 'change' && value_diff === void 0;\n }\n }, {\n check: function(timeline) {\n var event;\n event = timeline.get('event_type').split(\".\");\n return event[2] === 'delete';\n }\n }, {\n check: function(timeline) {\n var event;\n event = timeline.get('event_type').split(\".\");\n return event[1] === 'project' && event[2] === 'change';\n }\n }, {\n check: function(timeline) {\n return !!timeline.get(\"data\").get(\"comment_deleted\");\n }\n }, {\n check: function(timeline) {\n var event, value_diff;\n event = timeline.get('event_type').split(\".\");\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n if (value_diff && event[1] === \"task\" && event[2] === \"change\" && value_diff.get(\"key\") === \"milestone\") {\n return timeline.get(\"data\").get(\"value_diff\").get(\"value\");\n }\n return false;\n }\n }\n ];\n\n UserTimelineService.prototype._isInValidTimeline = function(timeline) {\n return _.some(this._invalid, (function(_this) {\n return function(invalid) {\n return invalid.check.call(_this, timeline);\n };\n })(this));\n };\n\n UserTimelineService.prototype._parseEventType = function(event_type) {\n event_type = event_type.split(\".\");\n return {\n section: event_type[0],\n obj: event_type[1],\n type: event_type[2]\n };\n };\n\n UserTimelineService.prototype._getTimelineObject = function(timeline, event) {\n if (timeline.get('data').get(event.obj)) {\n return timeline.get('data').get(event.obj);\n }\n };\n\n UserTimelineService.prototype._attachExtraInfoToTimelineEntry = function(timeline, event, type) {\n var title;\n title = this.userTimelineItemTitle.getTitle(timeline, event, type);\n timeline = timeline.set('title_html', title);\n timeline = timeline.set('obj', this._getTimelineObject(timeline, event));\n if (type.description) {\n timeline = timeline.set('description', type.description(timeline));\n }\n if (type.member) {\n timeline = timeline.set('member', type.member(timeline));\n }\n if (timeline.getIn(['data', 'value_diff', 'key']) === 'attachments' && timeline.hasIn(['data', 'value_diff', 'value', 'new'])) {\n timeline = timeline.set('attachments', timeline.getIn(['data', 'value_diff', 'value', 'new']));\n }\n return timeline;\n };\n\n UserTimelineService.prototype._parseTimeline = function(response) {\n var newdata;\n newdata = Immutable.List();\n response.get('data').forEach((function(_this) {\n return function(item) {\n var data, event, newItem, values_diff;\n event = _this._parseEventType(item.get('event_type'));\n data = item.get('data');\n values_diff = data.get('values_diff');\n if (values_diff && values_diff.count()) {\n if (values_diff.has('is_blocked')) {\n values_diff = Immutable.Map({\n 'blocked': values_diff\n });\n }\n if (values_diff.has('milestone')) {\n if (event.obj === 'userstory') {\n values_diff = Immutable.Map({\n 'moveInBacklog': values_diff\n });\n } else {\n values_diff = values_diff.deleteIn(['values_diff', 'milestone']);\n }\n } else if (event.obj === 'milestone') {\n values_diff = Immutable.Map({\n 'milestone': values_diff\n });\n }\n return values_diff.forEach(function(value, key) {\n var newItem, obj;\n obj = Immutable.Map({\n key: key,\n value: value\n });\n newItem = item.setIn(['data', 'value_diff'], obj);\n newItem = newItem.deleteIn(['data', 'values_diff']);\n return newdata = newdata.push(newItem);\n });\n } else {\n newItem = item.deleteIn(['data', 'values_diff']);\n return newdata = newdata.push(newItem);\n }\n };\n })(this));\n return response.set('data', newdata);\n };\n\n UserTimelineService.prototype._addEntyAttributes = function(item) {\n var event, type;\n event = this._parseEventType(item.get('event_type'));\n type = this.userTimelineItemType.getType(item, event);\n return this._attachExtraInfoToTimelineEntry(item, event, type);\n };\n\n UserTimelineService.prototype.getProfileTimeline = function(userId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.users.getProfileTimeline(userId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n UserTimelineService.prototype.getUserTimeline = function(userId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.users.getUserTimeline(userId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n UserTimelineService.prototype.getProjectTimeline = function(projectId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.projects.getTimeline(projectId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n return UserTimelineService;\n\n })(taiga.Service);\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineService\", UserTimelineService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: isolate-click.directive.coffee\n */\n\n(function() {\n var IsolateClickDirective;\n\n IsolateClickDirective = function() {\n var link;\n link = function(scope, el, attrs) {\n return el.on('click', (function(_this) {\n return function(e) {\n return e.stopPropagation();\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n angular.module(\"taigaUtils\").directive(\"tgIsolateClick\", IsolateClickDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryDiffDirective, module;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryDiffDirective = function() {\n return {\n templateUrl: \"wiki/history/wiki-history-diff.html\",\n scope: {\n key: \"<\",\n diff: \"<\"\n }\n };\n };\n\n module.directive(\"tgWikiHistoryDiff\", WikiHistoryDiffDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryEntryDirective, module;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryEntryDirective = function() {\n var link;\n link = function(scope, el, attr) {\n return scope.singleHistoryEntry = scope.historyEntry.toJS();\n };\n return {\n link: link,\n templateUrl: \"wiki/history/wiki-history-entry.html\",\n scope: {\n historyEntry: \"<\"\n }\n };\n };\n\n module.directive(\"tgWikiHistoryEntry\", WikiHistoryEntryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.controller.coffee\n */\n\n(function() {\n var WikiHistoryController, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaWikiHistory\");\n\n WikiHistoryController = (function() {\n WikiHistoryController.$inject = [\"tgWikiHistoryService\"];\n\n function WikiHistoryController(wikiHistoryService) {\n this.wikiHistoryService = wikiHistoryService;\n taiga.defineImmutableProperty(this, 'historyEntries', (function(_this) {\n return function() {\n return _this.wikiHistoryService.historyEntries;\n };\n })(this));\n this.toggle = false;\n }\n\n WikiHistoryController.prototype.initializeHistoryEntries = function(wikiId) {\n if (wikiId) {\n this.wikiHistoryService.setWikiId(wikiId);\n }\n return this.wikiHistoryService.loadHistoryEntries();\n };\n\n return WikiHistoryController;\n\n })();\n\n module.controller(\"WikiHistoryCtrl\", WikiHistoryController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryDirective, bindOnce, module;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return bindOnce(scope, 'vm.wikiId', function(value) {\n return ctrl.initializeHistoryEntries(value);\n });\n };\n return {\n scope: {},\n bindToController: {\n wikiId: \"<\"\n },\n controller: \"WikiHistoryCtrl\",\n controllerAs: \"vm\",\n templateUrl: \"wiki/history/wiki-history.html\",\n link: link\n };\n };\n\n module.directive(\"tgWikiHistory\", WikiHistoryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.service.coffee\n */\n\n(function() {\n var WikiHistoryService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryService = (function(superClass) {\n extend(WikiHistoryService, superClass);\n\n WikiHistoryService.$inject = [\"tgResources\", \"tgXhrErrorService\"];\n\n function WikiHistoryService(rs, xhrError) {\n this.rs = rs;\n this.xhrError = xhrError;\n this._wikiId = null;\n this._historyEntries = Immutable.List();\n taiga.defineImmutableProperty(this, \"wikiId\", (function(_this) {\n return function() {\n return _this._wikiId;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"historyEntries\", (function(_this) {\n return function() {\n return _this._historyEntries;\n };\n })(this));\n }\n\n WikiHistoryService.prototype.setWikiId = function(wikiId) {\n this._wikiId = wikiId;\n return this._historyEntries = Immutable.List();\n };\n\n WikiHistoryService.prototype.loadHistoryEntries = function() {\n if (!this._wikiId) {\n return;\n }\n return this.rs.wikiHistory.getWikiHistory(this._wikiId).then((function(_this) {\n return function(historyEntries) {\n if (historyEntries.size) {\n return _this._historyEntries = historyEntries.reverse();\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n _;\n\n return WikiHistoryService;\n\n })(taiga.Service);\n\n module.service(\"tgWikiHistoryService\", WikiHistoryService);\n\n}).call(this);\n\n//# sourceMappingURL=maps/app.js.map\n"]} \ No newline at end of file diff --git a/dist/v-1527758585938/js/templates.js b/dist/v-1527758585938/js/templates.js deleted file mode 100644 index 0c3fdcb..0000000 --- a/dist/v-1527758585938/js/templates.js +++ /dev/null @@ -1,16 +0,0 @@ -angular.module("templates",[]).run(["$templateCache",function(t){t.put("auth/change-password-from-recovery.html",'\n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n\n\n
    \n

    Taiga

    \n
    \n


    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("auth/forgot-password.html",'\n
    '),t.put("auth/invitation.html",'\n
    \n
    \n
    \n

    \n

    \n
    \n \n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("auth/login-text.html",'\n'),t.put("auth/login.html",'\n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n\n\n
    \n

    Taiga

    \n

    \n \n
    \n
    \n
    '),t.put("auth/register.html",'\n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n\n\n
    \n

    Taiga

    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("common/lightbox-feedback.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("backlog/backlog.html",'\n
    \n \n \n \n \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    --
    \n
    --
    \n
    --
    \n
    --
    \n
    \n \n
    \n
    \n
    \n \n
    \n

    \n

    {{\'BACKLOG.CUSTOMIZE_GRAPH_TEXT\' | translate}} {{\'BACKLOG.CUSTOMIZE_GRAPH_ADMIN\' | translate}}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n {{ ::us.total_voters }}\n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    {{\'BACKLOG.EMPTY\' | translate}}\n

    \n
    \n
    \n \n
    \n
    \n

    \n \n
    \n
    {{\'BACKLOG.SPRINTS.EMPTY\' | translate}}\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT_ANONYMOUS\' | translate }}{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT_ANONYMOUS\' | translate }}{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '), -t.put("backlog/progress-bar.html",'\n
    \n
    \n
    '),t.put("backlog/sprint-header.html",'\n\n
    \n
    {{::estimatedDateRange}}
    \n
      \n
    • {{::closedPoints | number}}
    • \n
    • {{::totalPoints | number}}
    • \n
    \n
    '),t.put("backlog/us-role-points-popover.html",'\n'),t.put("contrib/main.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    '),t.put("contrib/user-settings.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    '),t.put("custom-attributes/custom-attribute-value-edit.html",'\n
    \n
    \n <% if (description){ %><%- description %><% } %>\n
    \n
    <% if (type=="text") { %>\n <% } else if (type=="multiline") { %>\n <% } else if (type=="richtext") { %>\n <% } else if (type=="date") { %>\n <% } else if (type=="url") { %>\n <% } else { %>\n <% } %>\n
    <% if (type != "richtext") { %>\n <% } %>\n
    '),t.put("custom-attributes/custom-attribute-value.html",'\n
    \n
    <%- name %><% if (description){ %><%- description %><% } %>
    <% if (type=="url") { %>\n <% } else if (type=="richtext") { %>\n
    \n
    \n
    <% } else { %>\n
    <%- value %>
    <% } %>\n <% if (isEditable) { %>\n <% } %>\n
    '),t.put("custom-attributes/custom-attributes-values.html",'\n
    \n \n
    \n
    \n
    \n
    '),t.put("admin/admin-membership-paginator.html",'\n
      <% if (showPrevious) { %>\n <% } %>\n <% _.each(pages, function(item) { %>\n
    • <% if (item.type === "page") { %><%- item.num %><% } else if (item.type === "page-active") { %><%- item.num %><% } else { %>...<% } %>
    • <% }); %>\n <% if (showNext) { %>\n <% } %>\n
    '),t.put("admin/admin-memberships-row-checkbox.html",'\n
    \n \n
    \n
    '),t.put("admin/admin-memberships.html",'\n
    \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-change-owner.html",'\n
    {{::owner.full_name_display}}
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.PROJECT_OWNER\' | translate }}
    \n
    {{::owner.full_name_display}}
    \n
    {{ \'ADMIN.PROJECT_PROFILE.CHANGE_OWNER\' | translate }}'),t.put("admin/admin-project-default-values.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-export.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n \n \n
    \n
    '),t.put("admin/admin-project-modules.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n

    \n
    \n \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    '), -t.put("admin/admin-project-profile.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.RECRUITING\' | translate }}\n \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.FEEDBACK\' | translate }}\n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n {{\'ADMIN.PROJECT_PROFILE.PRIVATE_OR_PUBLIC\' | translate }}\n
    \n {{ \'ADMIN.PROJECT_PROFILE.DELETE\' | translate }}\n
    \n
    \n
    \n
    \n'),t.put("admin/admin-project-reports.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n
    '),t.put("admin/admin-project-request-ownership.html",'\n
    {{::owner.full_name_display}}
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.PROJECT_OWNER\' | translate }}
    \n
    {{::owner.full_name_display}}
    \n
    {{ \'ADMIN.PROJECT_PROFILE.REQUEST_OWNERSHIP\' | translate }}'),t.put("admin/admin-project-restrictions.html",'\n
    {{ \'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS_MEMBERS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS_MEMBERS\' | translate }}
    '),t.put("admin/admin-project-values-custom-fields.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ customFieldSectionTitle | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ customFieldSectionTitle | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ customFieldSectionTitle | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ customFieldSectionTitle | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    '), -t.put("admin/admin-project-values-points.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{sectionName | translate}}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ value.name }}
    \n
    {{ value.value }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-priorities.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-severities.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-status.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n
    \n \n
    \n
    {{ value.wip_limit }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '), -t.put("admin/admin-project-values-tags.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{\'BACKLOG.EMPTY\' | translate}}\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    {{\'BACKLOG.EMPTY\' | translate}}\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-types.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-roles.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n \n \n
    \n

    {{ role.name }}\n

    \n
    \n
    \n

    {{ role.name }}

    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-third-parties-bitbucket.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n \n
    \n \n
    \n
    '),t.put("admin/admin-third-parties-github.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    '),t.put("admin/admin-third-parties-gitlab.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n \n
    \n \n
    \n
    '), -t.put("admin/admin-third-parties-gogs.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    '),t.put("admin/admin-third-parties-webhooks.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("admin/lightbox-add-members.html",'\n\n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n

    \n
    '),t.put("admin/memberships-row-avatar.html",'\n
    <%- full_name %>\n
    \n
    <%- full_name %><% if (isOwner) { %>\n <% } %>\n
    \n
    <% if (pending) { %><%- pending %><% } %>
    \n
    \n
    '),t.put("admin/memberships-warning-message.html",'\n

    \n

    '),t.put("admin/no-more-memberships-explanation.html",'\n

    \n

    '),t.put("admin/project-csv.html",'\n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n \n \n
    \n
    '),t.put("epic/epic-detail.html",'\n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n \n \n \n
    '),t.put("error/error.html",'\n
    \n
    TAIGA\n

    Taiga

    \n

    \n
    \n
    '),t.put("error/not-found.html",'\n
    \n
    TAIGA\n

    \n

    \n
    \n
    '),t.put("error/permission-denied.html",'\n
    \n
    TAIGA\n

    \n

    \n
    \n
    '),t.put("issue/iocaine-button.html",'\n
    \n \n \n
    '),t.put("issue/issue-paginator.html",'\n
      <% if (showPrevious) { %>\n <% } %>\n <% _.each(pages, function(item) { %>\n
    • <% if (item.type === "page") { %><%- item.num %><% } else if (item.type === "page-active") { %><%- item.num %><% } else { %>...<% } %>
    • <% }); %>\n <% if (showNext) { %>\n <% } %>\n
    '),t.put("issue/issue-priority-button.html",'\n
    <%- priority.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issue-severity-button.html",'\n
    <%- severity.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issue-status-inline-edition-selection.html",'\n'),t.put("issue/issue-type-button.html",'\n
    <%- type.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issues-detail.html",'\n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n \n \n \n
    '),t.put("issue/issues.html",'\n'), -t.put("issue/promote-issue-to-us-button.html",'\n '),t.put("kanban/kanban.html",'\n
    \n \n
    \n \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    {{ usByStatus.get(s.id.toString()).size }}0
    \n
    \n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '),t.put("search/lightbox-search.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("search/search.html",'\n
    \n \n \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n \n
    \n \n \n \n \n \n
    \n
    '),t.put("task/related-task-create-form.html",'\n'),t.put("task/related-task-row-edit.html",'\n
    \n \n
    \n\n\n
    \n
    \n
    \n \n
    \n
    '),t.put("task/related-task-row.html",'\n\n
    <% if(perms.modify_task) { %>\n <% } %>\n <% if(perms.delete_task) { %>\n <% } %>\n
    \n\n
    \n
    \n
    <% if(perms.modify_task) { %>\n <% } %>\n
    \n
    '),t.put("task/task-detail.html",'\n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n \n \n \n
    '),t.put("taskboard/taskboard-user.html",'\n
    \n'),t.put("taskboard/taskboard.html",'\n
    \n \n
    \n \n
    \n

    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    {{rolePoint.points}}{{rolePoint.name}}
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n

    \n \n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n

    \n

    \n

    \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n

    \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '), -t.put("team/leave-project.html",'\n {{ \'TEAM.ACTION_LEAVE_PROJECT\' | translate }}'),t.put("team/team-filter.html",'\n'),t.put("team/team-member-current-user.html",'\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("team/team-member-stats.html",'\n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("team/team-members.html",'\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("team/team.html",'\n
    \n \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{filtersRole.name || ("TEAM.SECTION_FILTER_ALL" | translate)}}

    \n
    \n
    \n
    '),t.put("us/us-client-requirement-button.html",'\n\n'),t.put("us/us-detail.html",'\n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n {{\'US.TRIBE.PUBLISH_INFO\' | translate}}\n
    \n
    \n \n \n \n \n \n
    \n
    \n \n \n \n \n
    '),t.put("us/us-team-requirement-button.html",'\n\n'),t.put("user/cancel-account.html",'\n'),t.put("user/change-email.html",'\n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n\n\n
    \n

    Taiga

    \n
    \n

    \n

    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("user/live-notifications.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    {{sectionName | translate}}

    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("user/mail-notifications.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    {{sectionName | translate}}

    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("user/user-change-password.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    {{sectionName | translate}}

    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("user/user-profile.html",'\n
    \n \n
    \n \n
    \n
    \n \n
    \n'),t.put("wiki/wiki-list.html",'\n
    \n \n \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{wikipage.editions}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '), -t.put("wiki/wiki-nav.html",'\n
    \n

    \n
    \n\n\n<% if (addWikiLinkPermission) { %>\n <% } %>\n'),t.put("wiki/wiki-summary.html",'\n
    \n
    <%- user.name %>
    \n
    <%- user.name %>
    \n
    \n
    <%- lastModifiedDate %>
    \n
    <%- totalEditions %>
    \n'),t.put("wiki/wiki.html",'\n
    \n \n \n
    \n
    \n

    \n
    \n \n
    \n \n \n
    \n
    '),t.put("common/estimation/us-estimation-points-per-role.html",'\n
      <% _.each(roles, function(role) { %>\n
    • <%- role.points %>\n <%- role.name %>
    • <% }); %>\n
    • <%- totalPoints %>
    • \n
    '),t.put("common/estimation/us-estimation-points.html",'\n'),t.put("common/estimation/us-estimation-total.html",'<%= text %><% if (editable) { %>\n <% } %>'),t.put("common/estimation/us-points-roles-popover.html",'\n'),t.put("common/components/add-button.html",'\n '),t.put("common/components/assigned-to.html",'\n
    <%- fullName %><% if (isIocaine) { %>\n
    \n \n
    <% }; %>\n
    \n
    <% if (isUnassigned) { %>\n
    {{ "COMMON.ASSIGNED_TO.NOT_ASSIGNED" | translate }}
    <% } else { %>\n
    {{ "COMMON.FIELDS.ASSIGNED_TO" | translate }}
    <% }; %>\n
    <% if (!isEditable && fullNameVisible) { %><%- fullName %><% }; %>\n <% if (isEditable) { %>\n <% if (fullNameVisible) { %>\n <%- fullName %>\n <% }; %>\n <% if (!isUnassigned) { %>\n <% }; %><% }; %>\n <% if (isEditable && isUnassigned) { %> {{ "COMMON.ASSIGNED_TO.SELF" | translate }}<% }; %>\n
    <% if (isEditable && !isUnassigned) { %>\n <% } %>\n
    '),t.put("common/components/assigned-users.html",'\n
    {{ "COMMON.ASSIGNED_TO.NOT_ASSIGNED" | translate }}
    \n
    {{ "COMMON.FIELDS.ASSIGNED_TO" | translate }}
    \n\n
    \n {{ "COMMON.ASSIGNED_USERS.ADD_ASSIGNED" | translate }}\n
    '),t.put("common/components/block-button.html",'\n \n '),t.put("common/components/created-by.html",'\n
    \n
    {{date}}
    \n
    \n
    {{owner.full_name_display}}
    '),t.put("common/components/delete-button.html",'\n '),t.put("common/components/editable-description-msg-edit-mode.html",'\n

    '),t.put("common/components/editable-description-msg-read-mode.html",'\n

    '),t.put("common/components/editable-subject.html",'\n
    {{ item.subject }}\n \n
    \n
    \n \n \n
    '),t.put("common/components/kanban-placeholder.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'KANBAN.PLACEHOLDER_CARD_TITLE\' | translate}}

    \n

    {{\'KANBAN.PLACEHOLDER_CARD_TEXT\' | translate}}

    '),t.put("common/components/level.html",'\n
    '),t.put("common/components/list-item-assigned-to-avatar.html",'\n
    <%- name %><%- name %>
    '),t.put("common/components/main-title.html",'{{ projectName }}{{ sectionName | translate }}'),t.put("common/components/progress-bar.html",'\n
    '),t.put("common/components/status-button.html",'<%- status.name %><% if(editable){ %>\n <% }%>\n'),t.put("common/components/status-display.html",'<% if (is_closed) { %><% } else { %><% } %>'),t.put("common/components/taskboard-placeholder.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'TASKBOARD.PLACEHOLDER_CARD_TITLE\' | translate}}

    \n

    {{\'TASKBOARD.PLACEHOLDER_CARD_TEXT\' | translate}}

    '),t.put("common/components/user-display.html",'\n
    {{user.full_name_display}}
    {{user.full_name_display}}\n
    {{user.full_name_display}}
    {{user.full_name_display}}'),t.put("common/components/watchers.html",'\n
    \n
    {{watcher.full_name_display}}
    \n
    {{watcher.full_name_display}}\n \n
    \n
    '),t.put("common/components/wysiwyg-toolbar.html",'\n
    \n
    \n

    {{\'COMMON.WYSIWYG.OUTDATED\' | translate}}

    \n
    \n
    \n \n
    Markdown ModeHTML Mode\n
    \n
    \n\n'),t.put("common/lightbox/lightbox-assigned-to-users.html",'<% if (selected) { %>\n<% } %>\n<% _.each(users, function(user) { %>\n<% }) %>\n<% if (showMore) { %>\n
    <% } %>'),t.put("common/lightbox/lightbox-assigned-to.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n
    '),t.put("common/lightbox/lightbox-assigned-users-users.html",'<% _.each(selected, function(user) { %>\n<% }) %>\n<% _.each(users, function(user) { %>\n<% }) %>\n<% if (showMore) { %>\n
    <% } %>'),t.put("common/lightbox/lightbox-assigned-users.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n
    \n
    '),t.put("common/lightbox/lightbox-block.html",'\n\n
    \n

    \n
    \n \n
    \n
    '),t.put("common/lightbox/lightbox-blocking-message-input.html",'\n'),t.put("common/lightbox/lightbox-change-owner.html",'\n\n
    \n

    \n
    \n \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n \n
    '),t.put("common/lightbox/lightbox-due-date.html",'\n\n
    \n

    \n
    \n \n
      \n
    • {{ \'LIGHTBOX.SET_DUE_DATE.SUGGESTIONS.IN_ONE_WEEK\' | translate }}
    • \n
    • {{ \'LIGHTBOX.SET_DUE_DATE.SUGGESTIONS.IN_TWO_WEEKS\' | translate }}
    • \n
    • {{ \'LIGHTBOX.SET_DUE_DATE.SUGGESTIONS.IN_ONE_MONTH\' | translate }}
    • \n
    • {{ \'LIGHTBOX.SET_DUE_DATE.SUGGESTIONS.IN_THREE_MONTHS\' | translate }}
    • \n
    \n
    \n
    {{ \'LIGHTBOX.SET_DUE_DATE.REASON_FOR_DUE_DATE\' | translate }}\n \n
    \n \n \n
    '),t.put("common/lightbox/lightbox-leave-project-warning.html",'\n\n
    \n \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.TITLE\' | translate}}

    \n
    \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.CURRENT_USER_OWNER.DESC\' | translate}}

    \n
    \n
    \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.OTHER_USER_OWNER.DESC\' | translate}}

    \n
    \n
    '),t.put("common/lightbox/lightbox-request-ownership.html",'\n\n
    \n

    \n

    \n
    '),t.put("common/lightbox/lightbox-users.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n
    \n
    '),t.put("common/popover/popover-related-task-status.html",'\n'),t.put("common/popover/popover-us-status.html",'\n'),t.put("common/tag/lb-tag-line-tags.html",'<% _.each(tags, function(tag) { %><%- tag.name %>\n <% }); %>'),t.put("common/tag/lb-tag-line.html",'\n
    \n'),t.put("common/tag/tag-line.html",'\n
    \n '),t.put("common/tag/tags-line-tags.html",'\n<% _.each(tags, function(tag) { %>\n<% if (tag.name == deleteTagLoading) { %>\n
    <% } else { %><%- tag.name %><% if (isEditable) { %>\n <% } %><% } %>\n<% }); %>\n
    '),t.put("common/wysiwyg/wysiwyg-markitup-preview.html",'\n
    \n
    \n \n
    <%= data %>
    \n
    \n
    '),t.put("user/lightbox/lightbox-delete-account.html",'\n\n
    \n

    \n

    \n
    \n
    '),t.put("projects/create/asana-import/asana-import-project-form/asana-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n

    \n

    \n
    \n \n \n
    \n
    \n
    \n
    '),t.put("projects/create/github-import/github-import-project-form/github-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    '), -t.put("projects/create/invite-members/single-member/single-member.html",'\n'),t.put("projects/create/jira-import/jira-import-project-form/jira-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n

    \n

    \n
    \n

    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    '),t.put("projects/create/trello-import/trello-import-project-form/trello-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    '),t.put("external-apps/external-app.html",'\n
    \n \n

    Taiga

    \n

    \n
    \n
    \n
    {{::vm.user.get(\'full_name_display\')}}
    \n
    \n

    {{ ::vm.user.get("full_name_display") }}

    \n

    {{ ::vm.user.get("email") }}

    \n
    \n
    \n
    \n
    \n
    \n
    {{::vm.application.get(\'name\')}}
    \n
    \n

    {{ ::vm.application.get("name") }}

    {{ ::vm.application.get(\'web\') }}\n

    {{ ::vm.application.get("description") }}

    \n
    \n
    \n
    \n
    '),t.put("history/history.html",'\n
    \n \n \n \n
    '),t.put("home/home.html",'\n
    \n
    \n

    {{"HOME.DASHBOARD" | translate}}

    \n \n
    \n \n
    '),t.put("invite-members/lightbox-add-members.html",'\n\n
    \n

    \n \n \n
    '),t.put("navigation-bar/navigation-bar.html",'\n'),t.put("profile/profile.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    '),t.put("components/assigned-to/assigned-to.html",'{{vm.assignedTo.get(\'full_name_display\')}}{{vm.assignedTo.get(\'full_name_display\')}}{{\'EPICS.DASHBOARD.UNASSIGNED\' | translate}}{{\'EPICS.DASHBOARD.UNASSIGNED\' | translate}}'),t.put("components/attachment/attachment-gallery.html","\n"),t.put("components/attachment/attachment.html",'\n
    \n \n
    {{\'ATTACHMENT.DEPRECATED\' | translate}}{{vm.attachment.getIn([\'file\', \'description\'])}}
    \n
    {{::vm.attachment.getIn([\'file\', \'size\']) | sizeFormat}}
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n \n
    '),t.put("components/attachments-full/attachments-full.html",'\n
    \n
    \n

    {{vm.attachments.size}}

    \n
    \n \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    {{\'ATTACHMENT.DROP\' | translate}}
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n {{file.name}}\n
    \n
    {{file.size | sizeFormat}}
    \n
    {{file.progressMessage}}\n
    \n
    \n
    \n
    \n
    \n \n
    \n'),t.put("components/belong-to-epics/belong-to-epics-pill.html","\n
    "),t.put("components/belong-to-epics/belong-to-epics-text.html",""),t.put("components/attachments-preview/attachments-preview.html",'\n
    \n \n \n
    '),t.put("components/attachments-simple/attachments-simple.html",'\n
    \n
    \n

    {{vm.attachments.size}}

    \n
    \n \n \n
    \n
    \n
    \n
    {{\'ATTACHMENT.DROP\' | translate}}
    \n
    \n
    \n
    \n
    \n {{attachment.get(\'name\')}}\n
    \n
    {{attachment.get(\'size\') | sizeFormat}}
    \n \n
    \n
    \n
    '),t.put("components/board-zoom/board-zoom.html",'\n'),t.put("components/card/card.html",'\n
    \n
    \n
    \n
    \n
    {{vm.item.getIn([\'assigned_to\', \'full_name\'])}}\n \n
    \n \n \n
    \n \n \n
    \n
    \n \n
    {{"COMMON.FIELDS.POINTS" | translate}} {{vm.item.getIn([\'model\', \'total_points\'])}}\n
    \n \n
    \n \n
    \n
    \n {{vm.item.getIn([\'model\', \'total_voters\'])}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'watchers\']).size}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'total_comments\'])}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'attachments\']).size}}\n
    \n
    \n
    \n
    \n
    \n
    tasks {{vm.getClosedTasks().size}}/{{vm.item.getIn([\'model\', \'tasks\']).size}}\n
    \n
      \n
    • \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '), -t.put("components/card-slideshow/card-slideshow.html",'\n
    \n \n \n
    \n \n
    \n
    '),t.put("components/color-selector/color-selector.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
      \n
    • \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    '),t.put("components/filter/filter.html",'\n

    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    {{it.name}}\n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    '),t.put("components/due-date/due-date-button.html",'\n'),t.put("components/due-date/due-date-icon.html",'\n'),t.put("components/live-announcement/live-announcement.html",'\n
    \n
    Loading...\n
    \n

    {{vm.title}}

    \n

    \n \n
    \n
    \n
    '),t.put("components/project-menu/project-menu.html",'\n'),t.put("components/terms-announcement/terms-announcement.html",'\n
    \n
    Loading...\n
    \n

    {{\'LEGAL.GDPR_ANNOUNCEMENT_TITLE\' | translate}}

    \n

    {{ \'LEGAL.GDPR_ANNOUNCEMENT_DESCRIPTION\' | translate }}

    {{\'LEGAL.GDPR_ANNOUNCEMENT_INFOLINK\' | translate}}\n \n
    \n
    \n
    '),t.put("components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html",'\n

    \n \n

    '),t.put("components/tribe-button/tribe-button.html",'{{ \'US.TRIBE.PUBLISH\' | translate }}'),t.put("components/tribe-button/tribe-linked.html",'\n'),t.put("components/watch-button/watch-button-ticket.html",'\n
    {{ vm.item.watchers.length }} {{\'COMMON.WATCHERS.WATCHERS\' | translate}}
    \n'),t.put("components/watch-button/watch-button.html",'\n {{ vm.item.watchers.length }}\n {{ vm.item.watchers.length }}'),t.put("components/vote-button/vote-button.html",'\n {{ vm.item.total_voters }}\n {{ ::vm.item.total_voters }}'),t.put("discover/discover-home/discover-home.html",'\n
    \n
    \n \n
    \n
    \n \n \n
    \n \n
    '),t.put("discover/discover-search/discover-search.html",'\n
    \n \n
    {{ DISCOVER.EMPTY | translate }}\n

    \n
    \n
    \n
    \n
    \n \n
    \n
      \n
    • \n
      {{::project.get(\'name\')}}\n
      \n

      {{project.get(\'name\')}}\n \n

      \n

      {{ ::project.get(\'description\') | limitTo:300 }}...

      \n
      \n
      \n
      \n {{::project.get(\'total_fans\')}}\n {{::project.get(\'total_watchers\')}}\n {{ ::project.get(\'members\').size }}
      \n
    • \n
    {{ \'DISCOVER.VIEW_MORE\' | translate }}\n
    \n
    \n
    '),t.put("epics/dashboard/epics-dashboard.html",'\n
    \n \n
    \n
    \n

    \n
    \n \n
    \n
    \n \n
    \n

    \n

    \n \n
    \n
    \n
    '),t.put("epics/create-epic/create-epic.html",'\n\n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    '),t.put("epics/related-userstories/related-userstories.html",'\n'),t.put("history/comments/comment.html",'\n
    \n
    \n
    {{vm.comment.user.name}}{{vm.comment.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}\n
    {{vm.comment.edit_comment_date | momentFormat:\'DD MMM YYYY HH:mm\'}}-\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    - {{vm.comment.delete_comment_date | momentFormat:\'DD MMM YYYY HH:mm\'}}\n \n \n
    \n

    \n
    '),t.put("history/comments/comments.html",'\n
    \n
    \n \n
    \n \n
    '),t.put("history/history/history-diff.html",'\n
    \n
    {{diff[0]}}\n {{diff[1]}}\n
    \n
    \n
    \n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    \n
    \n
    \n
    {{vm.diff[0]}}...\n {{vm.diff[1]}}...\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    \n

    \n

    \n

    \n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0] | momentFormat:\'DD MMM YYYY\'}}\n {{vm.diff[1] | momentFormat:\'DD MMM YYYY\'}}\n
    \n
    \n
    \n
    \n

    {{vm.diffRemoveTags}}

    \n

    {{vm.diffAddTags}}

    \n
    \n
    \n
    \n
    ({{newCustom.name}})\n

    {{newCustom.value}}
    \n
    ({{changeCustom.name}})\n

    {{changeCustom.changes.value[0]}}\n {{changeCustom.changes.value[1]}}
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    '), -t.put("history/history/history.html",'\n
    \n
    \n
    \n
    \n
    {{activity.user.name}}{{activity.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}
    \n
    \n
    \n
    \n
    \n
    '),t.put("history/history-lightbox/comment-history-lightbox.html",'\n\n
    \n

    \n
    \n \n
    \n
    '),t.put("history/history-lightbox/history-entry.html",'\n
    \n
    \n
    {{entry.user.full_name_display}}\n \n
    \n
    \n
    \n
    '),t.put("history/history-tabs/history-tabs.html",'\n'),t.put("home/duties/duty.html","\n
    \n
    \n
    \n

    {{ ::vm.duty.getIn(['project', 'name']) }}{{ ::vm.getDutyType() }}{{ ::vm.duty.get('status_extra_info').get('name') }}\n \n

    \n

    {{ 'COMMON.BLOCKED' | translate }}

    \n
    "),t.put("home/projects/home-project-list.html",'\n
    \n
    \n
    \n
    \n

    {{::project.get(\'name\')}}\n \n \n \n

    \n
    \n

    {{::project.get(\'description\')| limitTo:100 }}...

    \n
    \n {{::project.get(\'total_fans\')}}\n {{::project.get(\'total_watchers\')}}\n {{ ::project.get(\'members\').size }}\n
    \n
    \n
    \n
    \n
    \n \n

    \n
    '),t.put("home/working-on/empty.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("home/working-on/working-on.html",'\n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("invite-members/invite-members-form/invite-members-form.html",'\n
    \n
      \n
    • \n
      {{contact.full_name}}{{contact.full_name}}
      \n \n
    • \n
    • \n
      {{userMail.email}}
      \n \n
    • \n
    \n
    \n \n
    \n \n \n \n

    \n
    '),t.put("invite-members/suggest-add-members/suggest-add-members.html",'\n
    \n
    \n \n \n
    \n
      \n
    • {{contact.get(\'full_name_display\')}}{{contact.get(\'full_name_display\')}}
    • \n
    \n
    '),t.put("navigation-bar/dropdown-project-list/dropdown-project-list.html",'\n \n'),t.put("navigation-bar/dropdown-user/dropdown-user.html",'{{ vm.user.get(\'full_name_display\') }}{{ vm.user.get(\'full_name_display\') }}\n'),t.put("profile/profile-bar/profile-bar.html",'\n
    \n
    {{::vm.user.get(\'full_name\')}}
    \n
    \n

    {{::vm.user.get("full_name_display")}}

    \n
    @{{::vm.user.get("username")}}
    \n

    {{::vm.stats.get(\'roles\').join(", ")}}

    \n
    \n
    \n
    {{::vm.stats.get(\'total_num_projects\')}}
    \n
    {{::vm.stats.get(\'total_num_closed_userstories\')}}
    \n
    {{::vm.stats.get(\'total_num_contacts\')}}
    \n
    \n
    {{::vm.user.get("bio") | limitTo:210 }}{{vm.user.get("bio").length < 210 ? \'\' : \'...\'}}
    \n
    '),t.put("profile/profile-contacts/profile-contacts.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    {{ \'USER.PROFILE.CONTACTS_EMPTY\' | translate }}\n
    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n
    {{::contact.get(\'full_name\')}}\n
    \n

    {{::contact.get(\'full_name_display\')}}

    \n

    {{::contact.get(\'roles\').join(", ")}}

    \n

    {{::contact.get(\'bio\')}}

    \n
    \n
    \n
    '),t.put("profile/profile-favs/profile-favs.html",'\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{ \'COMMON.LOADING\'|translate }}
    \n
    \n
    {{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}\n

    {{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}

    \n
    \n
    '),t.put("profile/profile-hints/profile-hints.html",'\n

    \n \n

    \n

    {{::vm.hint.title}}

    \n

    \n {{::vm.hint.text}}\n  \n

    '),t.put("profile/profile-projects/profile-projects.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    \n \n

    \n
    \n
    \n
    \n
    {{::project.get(\'name\')}}\n
    \n

    {{::project.get(\'name\')}}\n \n

    \n

    {{ ::project.get(\'description\') | limitTo:300 }}

    \n
    \n
    \n
    \n
    \n
    \n {{ ::project.get(\'total_fans\') }}\n {{ ::project.get(\'total_watchers\') }}
    \n
    {{::contact.get(\'full_name\')}}
    \n
    \n
    \n
    '),t.put("profile/profile-tabs/profile-tabs.html",'\n'),t.put("profile/profile-tab/profile-tab.html",'\n
    \n \n
    '),t.put("projects/listing/projects-listing.html",'\n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
      \n
    • \n
      \n
      {{::project.get(\'name\')}}\n
      \n

      {{project.get(\'name\')}}\n \n \n \n

      \n

      {{ ::project.get(\'description\') | limitTo:300 }}...

      \n
      \n
      \n
      \n \n
    • \n
    \n
    \n \n
    \n
    '),t.put("projects/create/create-project.html",'\n'),t.put("projects/project/blocked-project-explanation.html","\n
    \n
    {{'PROJECT.BLOCKED_PROJECT.THIS_PROJECT_IS_BLOCKED' | translate}}
    \n
    \n
    \n
    {{'PROJECT.BLOCKED_PROJECT.TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF' | translate}}
    \n
    "), -t.put("projects/project/blocked-project.html",'\n
    \n
    \n
    \n
    {{::vm.project.get(\'name\')}}\n \n
    {{::vm.project.get("name")}}\n
    \n
    \n

    {{\'PROJECT.BLOCKED_PROJECT.BLOCKED\' | translate}}

    \n \n
    \n
    \n
    '),t.put("projects/project/project.html",'\n
    \n \n
    \n
    \n \n
    \n
    \n
    \n

    {{::vm.project.get("name")}}

    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n {{ ::vm.project.get(\'total_fans\') }}\n {{ ::vm.project.get(\'total_watchers\') }}
    \n
    \n
    \n

    {{vm.project.get(\'description\')}}

    \n
    \n
    \n
    {{::tag}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'PROJECT.LOOKING_FOR_PEOPLE\' | translate}}

    \n

    {{::vm.project.get(\'looking_for_people_note\')}}

    \n \n
    \n

    {{"PROJECT.SECTION.TEAM" | translate}}

    \n \n
    \n
    \n
    \n
    '),t.put("projects/transfer/cant-own-project-explanation.html",'\n

    '),t.put("projects/transfer/transfer-page.html",'\n'),t.put("projects/transfer/transfer-project.html",'\n
    \n

    \n
    {{vm.project.get(\'name\')}}\n
    \n

    {{::vm.project.get("name")}}

    \n
    \n \n {{::vm.project.get("total_memberships")}}
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n \n \n
    \n \n
    \n
    \n
    \n \n
    '),t.put("user-timeline/user-timeline/user-timeline.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    \n
    \n
    \n
    '),t.put("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html",'\n\n
    \n
    {{::attachment.get(\'filename\')}}
    \n
    '),t.put("user-timeline/user-timeline-attachment/user-timeline-attachment.html",'\n'),t.put("user-timeline/user-timeline-item/user-timeline-item.html","\n
    {{::timeline.get('created') | momentFromNow}}\n
    \n
    \n \n
    \"{{::timeline.getIn(['data',
    \n \n
    \"{{::timeline.getIn(['data',
    \n

    \n
    \n
    {{::timeline.get('description') | limitTo:300}}
    \n
    \"{{::timeline.getIn(['member','user',\n
    {{::timeline.getIn(['member','user', 'name'])}}\n

    {{::timeline.getIn(['member','role', 'name'])}}

    \n
    \n
    \n
    \n
    \n
    \n
    "),t.put("wiki/history/wiki-history-diff.html",'\n
    \n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    \n
    \n
    \n

    \n

    \n
    '),t.put("wiki/history/wiki-history-entry.html",'\n
    \n
    \n
    {{singleHistoryEntry.user.name}}{{singleHistoryEntry.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}
    \n
    \n
    \n
    '),t.put("wiki/history/wiki-history.html",'\n\n
    \n \n
    '),t.put("components/assigned-to/assigned-to-selector/assigned-to-selector.html",'\n\n
    \n

    \n \n
      \n
    • \n \n \n
    • \n
    • \n \n
    • \n
    \n
    '),t.put("components/assigned-to/assigned-item/assigned-item.html",'\n
    \n
    {{member.full_name}}
    \n
    '),t.put("components/card/card-templates/card-completion.html","\n
    \n
    \n
    tasks {{vm.getClosedTasks().size}}/{{vm.item.getIn(['model', 'tasks']).size}}\n
    "),t.put("components/card/card-templates/card-data.html","\n
    {{\"COMMON.FIELDS.POINTS\" | translate}} {{vm.item.getIn(['model', 'total_points'])}}\n
    \n \n
    \n \n
    \n
    \n {{vm.item.getIn(['model', 'total_voters'])}}\n
    \n
    \n {{vm.item.getIn(['model', 'watchers']).size}}\n
    \n
    \n {{vm.item.getIn(['model', 'total_comments'])}}\n
    \n
    \n {{vm.item.getIn(['model', 'attachments']).size}}\n
    \n
    \n
    "),t.put("components/card/card-templates/card-owner.html",'\n
    \n
    \n
    {{vm.item.getIn([\'assigned_to\', \'full_name\'])}}\n \n
    \n \n \n
    \n \n \n
    \n
    '),t.put("components/card/card-templates/card-tags.html",'\n
    '),t.put("components/card/card-templates/card-tasks.html","\n
      \n
    • \n
    "),t.put("components/card/card-templates/card-title.html","\n

    {{::\"#\" + vm.item.getIn(['model', 'ref'])}}\n

    "),t.put("components/card/card-templates/card-unfold.html",'\n
    \n \n
    \n
    '),t.put("components/detail/header/detail-header.html",'\n
    \n

    {{\'#\' + vm.item.ref}}\n \n \n

    \n
    \n \n \n
    \n
    \n
    \n \n
    \n\n
    \n\n\n
    {{vm.item.blocked_note}}
    \n'),t.put("components/tags/components/add-tag-button.html",'\n '),t.put("components/tags/components/add-tag-input.html",'\n
    \n \n \n \n \n
    '),t.put("components/tags/tag/tag.html",'\n'),t.put("components/tags/tag-dropdown/tag-dropdown.html",'\n
      \n
    • \n
      {{tag[0]}}
      \n
    • \n
    '),t.put("components/tags/tag-line-common/tag-line-common.html",'\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n \n \n
    '),t.put("components/tags/tag-line-detail/tag-line-detail.html",'\n'),t.put("components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    '), -t.put("discover/components/discover-search-bar/discover-search-bar.html",'\n
    \n
    \n

    {{ \'DISCOVER.DISCOVER_TITLE\' | translate }}

    \n

    \n
    \n \n
    \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n
    '),t.put("discover/components/discover-home-order-by/discover-home-order-by.html",'\n
    {{vm.currentText()}}\n \n
      \n
    • {{ \'DISCOVER.FILTERS.WEEK\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.MONTH\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.YEAR\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.ALL_TIME\' | translate }}
    • \n
    \n
    '),t.put("discover/components/discover-search-list-header/discover-search-list-header.html",'\n'),t.put("discover/components/featured-projects/featured-projects.html",'\n'),t.put("discover/components/highlighted/highlighted.html",'\n
    \n
    \n
    \n
    \n
    \n

    {{::project.get(\'name\')}}\n \n

    \n
    \n {{::project.get(\'total_fans\')}}\n {{::project.get(\'total_watchers\')}}\n {{ ::project.get(\'members\').size }}
    \n
    \n

    {{ ::project.get(\'description\') | limitTo:150 }}{{ ::project.get(\'description\').length < 150 ? \'\' : \'...\'}}

    \n
    \n
    \n \n
    '),t.put("discover/components/most-active/most-active.html",'\n
    \n
    \n
    \n \n

    {{ \'DISCOVER.MOST_ACTIVE\' | translate }}

    \n
    \n \n
    \n \n
    \n
    \n {{ \'DISCOVER.MOST_ACTIVE_EMPTY\' | translate }}\n
    '),t.put("discover/components/most-liked/most-liked.html",'\n
    \n
    \n
    \n \n

    {{ \'DISCOVER.MOST_LIKED\' | translate }}

    \n
    \n \n
    \n \n
    \n
    \n {{ \'DISCOVER.MOST_LIKED_EMPTY\' | translate }}\n
    '),t.put("epics/dashboard/epic-row/epic-row.html",'\n
    \n \n
    \n {{::vm.epic.get(\'total_voters\')}}\n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    {{vm.epic.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n \n
      \n
    • {{status.name}}
    • \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    '),t.put("epics/dashboard/epics-table/epics-table.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("epics/dashboard/story-row/story-row.html",'\n
    \n
    \n {{::vm.story.get(\'total_voters\')}}\n
    \n
    \n \n
    \n
    {{::vm.story.getIn([\'project_extra_info\', \'name\'])}}
    \n
    {{::vm.story.get(\'milestone_name\')}}
    \n
    {{::vm.story.getIn([\'assigned_to_extra_info\', \'full_name_display\'])}}
    \n
    {{EPICS.DASHBOARD.UNASSIGNED | translate}}
    \n
    {{vm.story.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n
    \n
    \n
    \n
    '),t.put("epics/related-userstories/related-userstories-create/related-userstories-create.html",'\n \n'),t.put("epics/related-userstories/related-userstory-row/related-userstory-row.html",'\n\n
    \n \n
    \n\n
    {{::vm.userstory.getIn([\'project_extra_info\', \'name\'])}}
    \n
    {{vm.userstory.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n
    {{ vm.avatar.full_name_display }}\n
    {{ vm.getAssignedToFullNameDisplay() }}
    \n
    \n
    \n
    '),t.put("history/history/history-templates/blocked.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/client-requirement.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-assigned-users.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-assigned.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-attachments.html",'\n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    '),t.put("history/history/history-templates/history-color.html",'\n
    \n \n
    '),t.put("history/history/history-templates/history-custom-attributes.html",'\n
    ({{newCustom.name}})\n

    {{newCustom.value}}
    \n
    ({{changeCustom.name}})\n

    {{changeCustom.changes.value[0]}}\n {{changeCustom.changes.value[1]}}
    '), -t.put("history/history/history-templates/history-description.html",'\n
    \n

    \n

    \n

    \n
    '),t.put("history/history/history-templates/history-due-date.html",'\n
    {{vm.diff[0] | momentFormat:\'DD MMM YYYY\'}}\n {{vm.diff[1] | momentFormat:\'DD MMM YYYY\'}}\n
    '),t.put("history/history/history-templates/history-milestone.html",'\n
    {{vm.diff[0]}}...\n {{vm.diff[1]}}...\n
    '),t.put("history/history/history-templates/history-points.html",'\n
    {{diff[0]}}\n {{diff[1]}}\n
    '),t.put("history/history/history-templates/history-priority.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-severity.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-status.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-subject.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-tags.html",'\n
    \n

    {{vm.diffRemoveTags}}

    \n

    {{vm.diffAddTags}}

    \n
    '),t.put("history/history/history-templates/history-type.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/team-requirement.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("profile/profile-favs/items/project.html",'\n
    \n
    \n
    \n
    \n

    {{ ::vm.item.get(\'name\') }}\n \n \n

    \n

    {{ ::vm.item.get(\'description\') }}

    \n
    \n
    \n
    \n
    \n {{ ::vm.item.get(\'total_fans\') }}\n {{ ::vm.item.get(\'total_watchers\') }}
    \n
    '),t.put("profile/profile-favs/items/ticket.html",'\n
    {{ ::vm.item.getIn([\'assigned_to_extra_info\', \'full_name_display\']) }}{{ \'COMMON.ASSIGNED_TO.NOT_ASSIGNED\'|translate }}\n
    \n

    {{:: vm.item.get(\'project_name\') }}{{:: vm.item.get(\'status\') }}\n \n

    \n

    \n
    \n
    \n {{ ::vm.item.get(\'total_voters\') }}\n {{ ::vm.item.get(\'total_watchers\') }}
    \n
    '),t.put("projects/create/asana-import/asana-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/create-project-form/create-project-form.html",'\n
    \n
    \n \n

    \n
    \n

    \n
    \n \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    '),t.put("projects/create/create-project-members-restrictions/create-project-members-restrictions.html",'\n
    \n \n
    \n
    \n \n
    '),t.put("projects/create/create-project-restrictions/create-project-restrictions.html",'\n
    \n {{ \'PROJECT.CREATE.MAX_PRIVATE_PROJECTS\' | translate }}\n
    \n
    \n {{ \'PROJECT.CREATE.MAX_PUBLIC_PROJECTS\' | translate }}\n
    '),t.put("projects/create/duplicate/duplicate-project.html",'\n
    \n

    \n

    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    '),t.put("projects/create/github-import/github-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/import/import-header.html",'\n
    \n

    \n

    \n
    '),t.put("projects/create/import/import-project-error-lb.html",'\n\n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n
    '),t.put("projects/create/import/import-project.html",'\n
    \n
    \n
      \n
    • \n
    • \n \n
      Jira\n

      \n
      \n \n \n \n
      \n
      \n
    • \n
    • \n \n
      Github\n

      \n
      \n
    • \n
    • \n \n
      Trello\n

      \n
      \n
    • \n
    • \n \n
      Asana\n

      \n
      \n
    • \n
    \n
    \n \n
    \n
    \n\n\n\n'),t.put("projects/create/import-project-form-common/actions.html",'\n
    \n \n \n
    '),t.put("projects/create/import-project-form-common/description.html",'\n
    \n \n
    '),t.put("projects/create/import-project-form-common/links.html",'\n
    \n \n
    \n \n
    \n
    \n
    '),t.put("projects/create/import-project-form-common/name.html",'\n
    \n \n \n
    '),t.put("projects/create/import-project-form-common/project-privacy.html",'\n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    '),t.put("projects/create/import-project-members/import-project-members.html",'\n
    \n
    \n

    \n

    \n \n
    \n \n \n
    \n
      \n
    • \n
      \n
      {{member.get(\'full_name\')[0].toUpperCase()}}
      \n
      {{member.get(\'full_name\') || member.get(\'username\') }}\n
      \n
      \n
      \n \n \n
      \n
      \n {{vm.getUser(member).get(\'full_name\') || vm.getUser(member)}}\n
      \n \n
      \n
    • \n
    \n
    \n \n \n
    \n \n \n
    '),t.put("projects/create/import-project-selector/import-project-selector.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
      \n
    • {{project.name}}
    • \n
    \n
    \n

    {{ vm.noProjectsMsg }}

    \n
    \n
    \n

    \n
    \n
    \n \n
    \n
    \n
    \n
    '), -t.put("projects/create/import-taiga/import-taiga.html",'\n\n\n
    Taiga\n

    \n
    '),t.put("projects/create/invite-members/invite-members.html",'\n
    \n
    \n \n
    \n
    '),t.put("projects/create/jira-import/jira-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/select-import-user-lightbox/select-import-user-lightbox.html",'\n\n
    \n
    \n
    {{vm.user.get(\'full_name\')[0].toUpperCase() || vm.user.get(\'username\')[0].toUpperCase()}}
    \n
    {{vm.user.get(\'full_name\') || vm.user.get(\'username\')}}\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    '),t.put("projects/create/trello-import/trello-import.html",'\n\n\n'),t.put("projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html",'\n\n
    \n

    \n

    \n
    \n \n \n
    \n
    '),t.put("projects/components/contact-project-button/contact-project-button.html",'\n'),t.put("projects/components/lb-contact-project/lb-contact-project.html",'\n\n'),t.put("projects/components/like-project-button/like-project-button.html",'\n'),t.put("projects/components/watch-project-button/watch-project-button.html",'\n\n'),t.put("wiki/history/history-templates/history-attachments.html",'\n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    ')}]); \ No newline at end of file diff --git a/dist/v-1527758585938/locales/taiga/locale-de.json b/dist/v-1527758585938/locales/taiga/locale-de.json deleted file mode 100644 index 2ff1cb9..0000000 --- a/dist/v-1527758585938/locales/taiga/locale-de.json +++ /dev/null @@ -1 +0,0 @@ -{"COMMON":{"YES":"Ja","NO":"Nein","OR":"oder","LOADING":"Wird geladen...","DATE":"DD. MMM YYYY","DATETIME":"DD. MMM YYYY HH:mm","SAVE":"Speichern","CANCEL":"Abbrechen","ACCEPT":"Akzeptieren","DELETE":"Löschen","UNLINK":"Verknüpfung auflösen","CREATE":"Erzeugen","ADD":"Hinzufügen","COPY_TO_CLIPBOARD":"Ins Clipboard übernehmen: Strg+C","EDIT":"Bearbeiten","DRAG":"Ziehen","TAG_LINE":"Dein agiles, freies und quelloffenes Projekt-Management Tool","TAG_LINE_2":"LIEBE DEIN PROJEKT","BLOCK":"Blockieren","BLOCK_TITLE":"Block this item for example if it has a dependency that can not be satisfied","BLOCKED":"Blockiert","UNBLOCK":"Blockierung aufheben","UNBLOCK_TITLE":"Unblock this item","BLOCKED_NOTE":"Why is this blocked?","BLOCKED_REASON":"Bitte erklären Sie den Grund","CREATED_BY":"Erstellt durch {{fullDisplayName}}","CLOSE":"schließen","GO_HOME":"Führe mich heim","PLUGINS":"Plugins","ONE_ITEM_LINE":"Ein Eintrag pro Zeile...","NEW_BULK":"Neue Massenerstellung","RELATED_TASKS":"Verbundene Aufgaben","PREVIOUS":"Zurück","NEXT":"Weiter","LOGOUT":"Ausloggen","EXTERNAL_USER":"ein externer Benutzer","GENERIC_ERROR":"Eins unserer Helferlein sagt {{error}}.","IOCAINE_TEXT":"This member is feeling a bit overwhelmed by this task. Will become immune to the iocaine poison over time with your help. For now, may need a hug.","CLIENT_REQUIREMENT":"Client requirement is new requirement that was not previously expected and it is required to be part of the project","TEAM_REQUIREMENT":"Team requirement is a requirement that must exist in the project but should have no cost for the client","OWNER":"Projekteigentümer","CAPSLOCK_WARNING":"Achtung! Sie verwenden Großbuchstaben in einem Eingabefeld, dass Groß- und Kleinschreibung berücksichtigt.","CONFIRM_CLOSE_EDIT_MODE_TITLE":"Sind Sie sicher, dass Sie den Bearbeitungsmodus beenden möchten?","CONFIRM_CLOSE_EDIT_MODE_MESSAGE":"Beachten Sie, dass alle Änderungen verloren gehen, wenn Sie den Bearbeitungsmodus schließen, ohne vorher zu speichern.","RELATED_USERSTORIES":"Verwandte User Stories","CARD":{"ASSIGN_TO":"Zuweisen an","EDIT":"Karte bearbeiten","DELETE":"Delete card"},"FORM_ERRORS":{"DEFAULT_MESSAGE":"Dieser Wert scheint ungültig zu sein.","TYPE_EMAIL":"Dieser Wert sollte eine gültige E-Mail Adresse enthalten.","TYPE_URL":"Dieser Wert sollte eine gültige URL enthalten.","TYPE_URLSTRICT":"Dieser Wert sollte eine gültige URL enthalten.","TYPE_NUMBER":"Dieser Wert sollte eine gültige Nummer enthalten.","TYPE_DIGITS":"Dieser Wert sollte Ziffern enthalten.","TYPE_DATEISO":"Dieser Wert sollte ein gültiges Datum sein (YYYY-MM-DD)","TYPE_ALPHANUM":"Dieser Wert sollte alphanumersich sein.","TYPE_PHONE":"Dieser Wert sollte eine gültige Telefonnummer enthalten.","NOTNULL":"Dieser Wert darf nicht leer sein.","NOT_BLANK":"Dieser Wert darf nicht leer bleiben.","REQUIRED":"Diese Angabe ist erforderlich","REGEXP":"Dieser Wert scheint ungültig zu sein.","MIN":"Dieser Wert sollte größer oder gleich %s sein.","MAX":"Dieser Wert sollte niedriger oder gleich %s sein.","RANGE":"Der Wert sollte zwischen %s und %s liegen.","MIN_LENGTH":"Diese Angabe ist zu kurz. Sie sollte mindestens %s Zeichen haben oder mehr.","MAX_LENGTH":"Diese Angabe ist zu lang. Sie sollte %s Zeichen haben oder weniger.","RANGE_LENGTH":"Die Länge des Wertes ist ungültig. Sie sollte zwischen %s und %s Zeichen liegen.","MIN_CHECK":"Sie müssen mindestens %s auswählen.","MAX_CHECK":"Wählen Sie %s oder weniger.","RANGE_CHECK":"Wählen Sie zwischen %s und %s","EQUAL_TO":"Dieser Wert sollte der gleiche sein.","LINEWIDTH":"Eine oder mehrere Zeilen sind vielleicht zu lang. Versuchen Sie unter %s Zeichen zu bleiben.","PIKADAY":"Ungültiges Datumsformat. Bitte nutze DD MMM YYYY (etwa 23 März 1984)"},"PICKERDATE":{"FORMAT":"DD. MMM YYYY","IS_RTL":"falsch","FIRST_DAY_OF_WEEK":"1","PREV_MONTH":"Vorheriger Monat","NEXT_MONTH":"Nächster Monat","MONTHS":{"JAN":"Januar","FEB":"Februar","MAR":"März","APR":"April","MAY":"Mai","JUN":"Juni","JUL":"Juli","AUG":"August","SEP":"September","OCT":"Oktober","NOV":"November","DEC":"Dezember"},"WEEK_DAYS":{"SUN":"Sonntag","MON":"Montag","TUE":"Dienstag","WED":"Mittwoch","THU":"Donnerstag","FRI":"Freitag","SAT":"Samstag"},"WEEK_DAYS_SHORT":{"SUN":"So","MON":"Mo","TUE":"Di","WED":"Mi","THU":"Do","FRI":"Fr","SAT":"Sa"}},"SEE_USER_PROFILE":"Profil von {{username }} ansehen","USER_STORY":"User-Story","TASK":"Aufgabe","ISSUE":"Ticket","EPIC":"Epic","TAGS":{"PLACEHOLDER":"Gib einen Tag ein","DELETE":"Schlagwort löschen","ADD":"Schlagwort hinzufügen"},"DESCRIPTION":{"EMPTY":"Bitte geben Sie eine Beschreibung ein...","NO_DESCRIPTION":"Noch keine Beschreibung"},"FIELDS":{"SUBJECT":"Thema","NAME":"Name","URL":"URL","DESCRIPTION":"Beschreibung","VALUE":"Wert","SLUG":"Slug","COLOR":"Farbe","IS_CLOSED":"ist geschlossen?","STATUS":"Status","TYPE":"Typen","SEVERITY":"Gewichtung","PRIORITY":"Priorität","ASSIGNED_TO":"Zugewiesen an","ASSIGNED_USERS":"Assigned users","POINTS":"Punkte","IS_BLOCKED":"wird blockiert","REF":"Ref","VOTES":"Stimmen","SPRINT":"Sprint","DUE_DATE":"Due date","DUE_DATE_REASON":"Due date reason"},"ROLES":{"ALL":"Alle"},"ASSIGNED_TO":{"NOT_ASSIGNED":"Nicht zugeordnet","ASSIGN":"Zuweisen","DELETE_ASSIGNMENT":"Zuordnung löschen","REMOVE_ASSIGNED":"Zugewiesene entfernen","TOO_MANY":"...zu viele Benutzer. Filtern Sie!","CONFIRM_UNASSIGNED":"Möchten dies wirklich ohne eine Zuordnung verlassen?","TITLE_ACTION_EDIT_ASSIGNMENT":"Zuordnungen bearbeiten","SELF":"An mich zuweisen"},"DUE_DATE":{"TITLE_ACTION_SET_DUE_DATE":"Set due date","DUE_SOON":"due soon","PAST_DUE":"past due date","NO_LONGER_APPLICABLE":"no longer applicable"},"ASSIGNED_USERS":{"ADD":"Select assigned user","ADD_ASSIGNED":"Add assigned","TITLE_LIGHTBOX_DELETE_ASSIGNED":"Delete assigned..."},"STATUS":{"CLOSED":"Geschlossen","OPEN":"Geöffnet"},"WATCHERS":{"WATCHERS":"Beobachter","ADD":"Beobachter hinzufügen","TITLE_ADD":"Füge ein neues Projektmitglied der Beobachterliste hinzu","DELETE":"Beobachter löschen","TITLE_LIGHTBOX_DELETE_WARTCHER":"Beobachter löschen..."},"WATCH_BUTTON":{"WATCH":"Beobachten","WATCHING":"Beobachtet","UNWATCH":"Nicht beobachten","WATCHERS":"Beobachter","BUTTON_TITLE":"Beobachte/Beobachte dieses Objekt (nicht mehr)","COUNTER_TITLE":"{total, plural, one{ein Beobachter} other{# Beobachter}}"},"VOTE_BUTTON":{"BUTTON_TITLE":"Upvote/Downvote diesen Eintrag","COUNTER_TITLE":"{total, plural, one{eine Stimme} other{# Stimmen}}"},"CUSTOM_ATTRIBUTES":{"CUSTOM_FIELDS":"Benutzerdefinierte Felder","SAVE":"Benutzerdefiniertes Feld speichern","EDIT":"Benutzerdefiniertes Feld bearbeiten","DELETE":"benutzerdefiniertes Attribut löschen","CONFIRM_DELETE":"Alle Werte in benutzerdefinierten Feldern werden gelöscht.\n Sind Sie sicher, dass Sie fortfahren wollen?"},"FILTERS":{"INPUT_PLACEHOLDER":"Betreff oder Verweis","TITLE_ACTION_FILTER_BUTTON":"suche","TITLE":"Filter","TITLE_ACTION_SEARCH":"Suche","ACTION_SAVE_CUSTOM_FILTER":"Als Benutzerfilter speichern","PLACEHOLDER_FILTER_NAME":"Benennen Sie den Filter und drücken Sie die Eingabetaste","APPLIED_FILTERS_NUM":"Filter wurden angewandt","CATEGORIES":{"TYPE":"Arten","STATUS":"Status","SEVERITY":"Gewichtung","PRIORITIES":"Prioritäten","TAGS":"Schlagwörter","ASSIGNED_TO":"Zugeordnet zu","ROLE":"Rolle","CREATED_BY":"Erstellt durch","CUSTOM_FILTERS":"Benutzerfilter","EPIC":"Epic"}},"WYSIWYG":{"CODE_SNIPPET":"Codeschnipsel","DB_CLICK":"Doppelklick zum Bearbeiten","SELECT_LANGUAGE_PLACEHOLDER":"Sprache wählen","SELECT_LANGUAGE_REMOVE_FORMATING":"Lösche Formatierung","OUTDATED":"Eine andere Person hat, während deiner Bearbeitung, Änderungen vorgenommen. Überprüfe die neue Version in der Aktivitätstabelle, bevor du deine Änderungen speicherst","MARKDOWN_HELP":"Markdown syntax Hilfe"},"PERMISIONS_CATEGORIES":{"EPICS":{"NAME":"Epics","VIEW_EPICS":"Epics anzeigen","ADD_EPICS":"Epics hinzufügen","MODIFY_EPICS":"Epics verändern","COMMENT_EPICS":"Epics kommentieren","DELETE_EPICS":"Epics löschen"},"SPRINTS":{"NAME":"Sprints","VIEW_SPRINTS":"Sprints ansehen","ADD_SPRINTS":"Sprints hinzufügen","MODIFY_SPRINTS":"Sprints modifizieren","DELETE_SPRINTS":"Gelöschte Sprints"},"USER_STORIES":{"NAME":"User-Stories","VIEW_USER_STORIES":"User-Stories ansehen","ADD_USER_STORIES":"User-Stories hinzufügen","MODIFY_USER_STORIES":"User-Stories modifizieren","COMMENT_USER_STORIES":"User-Stories kommentieren","DELETE_USER_STORIES":"User-Stories löschen"},"TASKS":{"NAME":"Aufgaben","VIEW_TASKS":"Aufgaben ansehen","ADD_TASKS":"Aufgaben hinzufügen","MODIFY_TASKS":"Aufgaben ändern","COMMENT_TASKS":"Aufgaben kommentieren","DELETE_TASKS":"Aufgaben löschen"},"ISSUES":{"NAME":"Tickets","VIEW_ISSUES":"Tickets ansehen","ADD_ISSUES":"Tickets hinzufügen","MODIFY_ISSUES":"Tickets ändern","COMMENT_ISSUES":"Tickets kommentieren","DELETE_ISSUES":"Tickets löschen"},"WIKI":{"NAME":"Wiki","VIEW_WIKI_PAGES":"Wiki Seiten ansehen","ADD_WIKI_PAGES":"Wiki Seiten hinzufügen","MODIFY_WIKI_PAGES":"Wiki Seiten ändern","DELETE_WIKI_PAGES":"Wiki Seiten löschen","VIEW_WIKI_LINKS":"Wiki Links ansehen","ADD_WIKI_LINKS":"Wiki Links hinzufügen","DELETE_WIKI_LINKS":"Wiki Links löschen"}}},"LOGIN":{"PAGE_TITLE":"Login - Taiga","PAGE_DESCRIPTION":"Melden Sie sich bei Taiga an, einer Projekt-Management Plattform für Neugründer und agile Entwickler und Designer, die ein unkompliziertes und ansprechendes Tool möchten, das die Arbeit wirklich angenehm macht."},"AUTH":{"INVITED_YOU":"hat Sie zum Projekt eingeladen","NOT_REGISTERED_YET":"Noch nicht registiert?","REGISTER":"Registrieren","CREATE_ACCOUNT":"Ein kostenloses Benutzerkonto anlegen"},"LOGIN_COMMON":{"HEADER":"Ich bin bereits bei Taiga angemeldet","PLACEHOLDER_AUTH_NAME":"Benutzername oder E-Mail-Adresse","LINK_FORGOT_PASSWORD":"Haben Sie es vergessen?","TITLE_LINK_FORGOT_PASSWORD":"Haben Sie Ihr Passwort vergessen?","ACTION_ENTER":"Eingabe","ACTION_SIGN_IN":"Login","PLACEHOLDER_AUTH_PASSWORD":"Passwort","ALT_LOGIN":"Oder einloggen mit"},"LOGIN_FORM":{"ERROR_AUTH_INCORRECT":"Laut unserem Helferlein ist Dein Benutzername/Deine E-Mail-Adresse oder Dein Passwort nicht korrekt. (Bitte achte auf die Groß- und Kleinschreibung.)","SUCCESS":"Herzlich willkommen bei Taiga, unsere Helferlein freuen sich."},"REGISTER":{"PAGE_TITLE":"Registrieren - Taiga","PAGE_DESCRIPTION":"Erstelle Dein Benutzerkonto in Taiga, einer Projekt-Management Plattform für Neugründer und agile Entwickler und Designer, die ein unkompliziertes und ansprechendes Tool möchten, das die Arbeit wirklich angenehm macht."},"REGISTER_FORM":{"TITLE":"Ein neues Taiga Benutzerkonto registrieren (kostenlos)","PLACEHOLDER_NAME":"Wählen Sie einen Benutzernamen (Groß- und Kleinschreibung beachten)","PLACEHOLDER_FULL_NAME":"Wähle Deinen Anzeigenamen","PLACEHOLDER_EMAIL":"Deine E-Mail","PLACEHOLDER_PASSWORD":"Setzen Sie ein Passwort (Groß- und Kleinschreibung beachten)","ACTION_SIGN_UP":"Anmelden","TITLE_LINK_LOGIN":"anmelden","LINK_LOGIN":"Sind Sie bereits registriert? Loggen Sie sich ein"},"FORGOT_PASSWORD":{"PAGE_TITLE":"Passwort vergessen - Taiga","PAGE_DESCRIPTION":"Gib Dein Benutzernamen oder Deine E-Mail Adresse ein, um ein neues Passwort zu erhalten, und wieder auf Taiga zuzugreifen."},"FORGOT_PASSWORD_FORM":{"TITLE":"Huch, hast Du Dein Passwort vergessen?","SUBTITLE":"Gib Deinen Benutzernamen oder Deine E-Mail-Adresse ein, um einen neuen zu erhalten.","PLACEHOLDER_FIELD":"Benutzername oder E-Mail-Adresse","ACTION_RESET_PASSWORD":"Passwort zurücksetzen","LINK_CANCEL":"Nein, bring mich zurück. Ich denke, ich erinnere mich daran.","SUCCESS_TITLE":"Prüfen Sie bitte Ihre Emails!","SUCCESS_TEXT":"Wir haben Ihnen eine Email mit den Anweisungen zum ändern Ihres Passworts geschickt","ERROR":"Laut unseren Helferlein sind Sie bislang noch nicht registriert."},"CHANGE_PASSWORD":{"PAGE_TITLE":"Ändere Dein Passwort - Taiga","SECTION_NAME":"Passwort ändern","FIELD_CURRENT_PASSWORD":"Aktuelles Passwort","PLACEHOLDER_CURRENT_PASSWORD":"Dein aktuelles Passwort (oder leer, wenn Du noch kein Passwort hast)","FIELD_NEW_PASSWORD":"Neues Passwort","PLACEHOLDER_NEW_PASSWORD":"Geben Sie ein neues Passwort ein","FIELD_RETYPE_PASSWORD":"Neues Passwort wiederholen","PLACEHOLDER_RETYPE_PASSWORD":"Wiederholen Sie das neue Passwort","ERROR_PASSWORD_MATCH":"Die Passwörter stimmen nicht überein"},"CHANGE_PASSWORD_RECOVERY_FORM":{"TITLE":"Erstellen Sie einen neues Passwort","SUBTITLE":"Und hey, es empfiehlt sich, mehr eisenreiche Nahrung zu sich zu nehmen - die ist gut für's Gehirn :P","PLACEHOLDER_NEW_PASSWORD":"Neues Passwort","PLACEHOLDER_RE_TYPE_NEW_PASSWORD":"Wiederholen Sie die Eingabe des neuen Passworts","ACTION_RESET_PASSWORD":"Passwort zurücksetzen","ERROR":"Unsere Helferelein haben Probleme deine Anfrage zum Zurücksetzen des Passworts zu finden. Probiere es einfach nochmal.","SUCCESS":"Unsere Helferlein haben das neue Passwort gespeichert.
    Hier gehts zum login."},"INVITATION":{"PAGE_TITLE":"Einladung Annahme - Taiga","PAGE_DESCRIPTION":"Nehmen Sie die Einladung an und treten Sie einem Projekt in Taiga bei, einer Projekt-Management Plattform für Neugründer und agile Entwickler und Designer, die ein unkompliziertes und ansprechendes Tool möchten, das die Arbeit wirklich angenehm macht."},"INVITATION_LOGIN_FORM":{"NOT_FOUND":"Unsere Helferlein können deine Einladung nicht finden.","SUCCESS":"Sie sind diesem Projekt erfolgreich beigetreten. Herzlich willkommen bei {{project_name}}"},"HOME":{"PAGE_TITLE":"Home - Taiga","PAGE_DESCRIPTION":"Die Taiga Homepage mit Ihren wichtigsten Projekten und all Ihren zugeordneten und beobachteten User-Stories, Aufgaben und Tickets.","EMPTY_WORKING_ON":"Es sieht hier noch leer aus, oder? Beginne mit Taiga zu arbeiten und du wirst hier Storys, Tasks und Tickets an denen gearbeitet wird sehen.","EMPTY_WATCHING":"Folge User Stories, Tasks, Tickets in deinem Projekt und erhalte Benachrichtigungen, wenn sich etwas ändert. :)","EMPTY_PROJECT_LIST":"Sie haben noch keine Projekte","WORKING_ON_SECTION":"Zuletzt bearbeitet","WATCHING_SECTION":"Beobachtet","DASHBOARD":"ProjeKte Dashboard"},"EPICS":{"TITLE":"EPICS","SECTION_NAME":"Epics","EPIC":"EPIC","PAGE_TITLE":"Epics - {{projectName}}","PAGE_DESCRIPTION":"Die Liste der Epics dieses Projekts {{projectName}}: {{projectDescription}}","DASHBOARD":{"ADD":"+ EPIC HINZUFÜGEN","UNASSIGNED":"Nicht zugeordnet"},"EMPTY":{"TITLE":"Es sind noch keine Epics vorhanden","EXPLANATION":"Epics sind Elemente, die User-Stories umfassen.
    Sie stehen dabei an oberster Stelle in der Hierarchie und können dazu verwendet werden, User-Stories zu gruppieren.","HELP":"Erfahren Sie mehr über Epics"},"TABLE":{"VOTES":"Stimmen","NAME":"Name","PROJECT":"Projekt","SPRINT":"Sprint","ASSIGNED_TO":"Zugewiesen","STATUS":"Status","PROGRESS":"Fortschritt","VIEW_OPTIONS":"Zeige Optionen"},"CREATE":{"TITLE":"Neues Epic","PLACEHOLDER_DESCRIPTION":"Bitte beschreiben Sie dieses Epic zum leichteren Verständnis","TEAM_REQUIREMENT":"Team-Anforderung","CLIENT_REQUIREMENT":"Kunden-Anforderung","BLOCKED":"Blockiert","BLOCKED_NOTE_PLACEHOLDER":"Warum ist dieses Epic geblockt?","CREATE_EPIC":"Epic erzeugen"}},"PROJECTS":{"PAGE_TITLE":"Meine Projekte - Taiga","PAGE_DESCRIPTION":"Eine Liste mit all Deinen Projekten. Du kannst sie ordnen oder ein Neues anlegen.","MY_PROJECTS":"Meine Projekte"},"ATTACHMENT":{"SECTION_NAME":"Anhänge","TITLE":"{{ fileName }} hochgeladen am {{ date }}","LIST_VIEW_MODE":"List view mode","GALLERY_VIEW_MODE":"Gallery view mode","DESCRIPTION":"Geben Sie eine kurze Beschreibung ein","DEPRECATED":"(verworfen)","DEPRECATED_FILE":"Verworfen?","ADD":"Neuen Anhang hinzufügen. {{maxFileSizeMsg}}","DROP":"Ziehe Anhänge hierher!","SHOW_DEPRECATED":"+ verworfene Anhänge zeigen","HIDE_DEPRECATED":"- verworfene Anhänge verbergen","COUNT_DEPRECATED":"({{ counter }} verworfen)","MAX_UPLOAD_SIZE":"Die maximale Dateigröße beträgt {{maxFileSize}}","DATE":"DD. MMM YYYY [um] hh:mm","ERROR_UPLOAD_ATTACHMENT":"Das Hochladen war uns nicht möglich '{{fileName}}'. {{errorMessage}}","TITLE_LIGHTBOX_DELETE_ATTACHMENT":"Anhang löschen...","MSG_LIGHTBOX_DELETE_ATTACHMENT":"der Anhang '{{fileName}}'","ERROR_DELETE_ATTACHMENT":"Es war uns nicht möglich, zu löschen: {{errorMessage}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) ist zu schwierig für unsere Helferlein, versuchen Sie es bitte mit einer kleineren Datei als ({{maxFileSize}})"},"PAGINATION":{"PREVIOUS":"Zurück","NEXT":"Weiter"},"ADMIN":{"COMMON":{"TITLE_ACTION_EDIT_VALUE":"Wert bearbeiten","TITLE_ACTION_DELETE_VALUE":"Wert löschen","TITLE_ACTION_DELETE_TAG":"Schlagwort löschen"},"HELP":"Wenn Sie Hilfe benötigen, besuchen Sie unsere Support-Seite!","PROJECT_DEFAULT_VALUES":{"TITLE":"Vorgabewerte","SUBTITLE":"Standardwerte für alle ausgewählten Eingaben setzen."},"MEMBERSHIPS":{"TITLE":"Mitglieder verwalten","PAGE_TITLE":"Mitgliedschaften - {{projectName}}","ADD_BUTTON":"+ Neues Mitglied","ADD_BUTTON_TITLE":"Neues Mitglied hinzufügen","LIMIT_USERS_WARNING_MESSAGE_FOR_ADMIN":"Leider hat dieses Projekt sein Limit von ({{members}}) Mitgliedern bereits erreicht","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"Dieses Projekt hat seine Grenze von ({{members}}) erlaubten Mitgliedern erreicht. Wenn Sie diese Grenze erhöhen möchten, kontaktieren Sie den Administrator."},"PROJECT_EXPORT":{"TITLE":"Exportieren","SUBTITLE":"Exportieren Sie Ihr Projekt, um ein Backup durchzuführen, oder ein neues, darauf basierendes, zu erstellen.","EXPORT_BUTTON":"Exportieren","EXPORT_BUTTON_TITLE":"Exportieren Sie Ihr Projekt","LOADING_TITLE":"Wir erzeugen die Exportdatei","DUMP_READY":"Ihre Export-Datei ist fertig!","LOADING_MESSAGE":"Bitte lassen Sie diese Seite geöffnet!","ASYNC_MESSAGE":"Wir werden nach Fertigstellung eine E-Mail senden.","SYNC_MESSAGE":"Wenn der Download nicht automatisch startet, klicken Sie hier.","ERROR":"Unsere Helferlein haben Probleme, Ihre Export-Datei zu erzeugen. Bitte versuchen Sie es erneut.","ERROR_BUSY":"Entschuldigung, unsere Helferlein sind zur Zeit sehr beschäftigt. Bitte versuchen Sie es in ein paar Minuten erneut."},"MODULES":{"TITLE":"Module","EPICS":"Epics","EPICS_DESCRIPTION":"Visualisieren und verwalten Sie den strategischsten Teil Ihres Projektes","BACKLOG":"Backlog","BACKLOG_DESCRIPTION":"Verwalten Sie Ihre User-Stories, um einen organisierten Überblick der anstehenden und priorisierten Aufgaben zu erhalten.","NUMBER_SPRINTS":"Erwartete Anzahl an Sprints","NUMBER_SPRINTS_HELP":"0 für eine unbestimmte Anzahl","NUMBER_US_POINTS":"Erwartete Gesamt-Story-Punkte","NUMBER_US_POINTS_HELP":"0 für eine unbestimmte Anzahl","KANBAN":"Kanban","KANBAN_DESCRIPTION":"Organisieren Sie Ihr Projekt auf übersichtliche Art.","ISSUES":"Tickets","ISSUES_DESCRIPTION":"Verfolgen Sie Fehler, Fragen und Verbesserungen, die mit Ihrem Projekt verbunden sind. Vermissen Sie nichts!","WIKI":"Wiki","WIKI_DESCRIPTION":"Fügen Sie Inhalte hinzu, ändern oder löschen Sie sie in Zusammenarbeit mit anderen. Dies ist der richtige Ort für Ihre Projektdokumentation.","MEETUP":"Zusammentreffen","MEETUP_DESCRIPTION":"Wähle Sie Ihr Videokonferenzsystem.","SELECT_VIDEOCONFERENCE":"Wählen Sie ein Videokonferenzsystem","SALT_CHAT_ROOM":"Fügen Sie ein Präfix für den Chatraum-Namen hinzu","JITSI_CHAT_ROOM":"Jitsi","APPEARIN_CHAT_ROOM":"Appear.in","TALKY_CHAT_ROOM":"Talky.io","CUSTOM_CHAT_ROOM":"Benutzerdefiniert","URL_CHAT_ROOM":"URL Ihres Chatrooms"},"PROJECT_PROFILE":{"PAGE_TITLE":"{{sectionName}} - Projekt Profil - {{projectName}}","PROJECT_DETAILS":"Projekt Details","PROJECT_NAME":"Projektname","TAGS":"Schlagwörter","DESCRIPTION":"Beschreibung","RECRUITING":"Auf der Suche nach Mitgliedern?","RECRUITING_MESSAGE":"Wen suchst du denn?","RECRUITING_PLACEHOLDER":"Define the profiles you are looking for","FEEDBACK":"Feedback von Taiga-Nutzern erhalten?","PUBLIC_PROJECT":"Öffentliches Projekt","PRIVATE_PROJECT":"Privates Projekt","PRIVATE_OR_PUBLIC":"Was ist der Unterschied zwischen öffentlichen und privaten Projekten?","DELETE":"Dieses Projekt löschen","CHANGE_LOGO":"Logo ändern","ACTION_USE_DEFAULT_LOGO":"Nutze Standardbild","MAX_PRIVATE_PROJECTS":"Sie haben die maximale Anzahl privater Projekte erreicht, die in Ihrem derzeitigen Plan erlaubt sind","MAX_PRIVATE_PROJECTS_MEMBERS":"Die maximale Anzahl von Mitgliedern für privater Projekte sind erreicht","MAX_PUBLIC_PROJECTS":"Leider haben Sie die maximale Anzahl öffentlicher Projekte erreicht, die in Ihrem derzeitigen Plan erlaubt sind","MAX_PUBLIC_PROJECTS_MEMBERS":"Die maximale Anzahl von Mitgliedern für öffentliche Projekte sind erreicht","PROJECT_OWNER":"Projekteigentümer","REQUEST_OWNERSHIP":"Besitz beantragen","REQUEST_OWNERSHIP_CONFIRMATION_TITLE":"Möchtest du der neue Projektleiter werden?","REQUEST_OWNERSHIP_DESC":"Anfrage vom derzeitigen Projektleiter {{name}}, die Leitung für dieses Projekt zu übernehmen.","REQUEST_OWNERSHIP_BUTTON":"Anfrage","REQUEST_OWNERSHIP_SUCCESS":"Wir werden den Projektleiter benachrichtigen","CHANGE_OWNER":"Ändere Besitzer","CHANGE_OWNER_SUCCESS_TITLE":"Ok, deine Anfrage wurde versendet!","CHANGE_OWNER_SUCCESS_DESC":"Wir informieren Sie via Email, ob sie als neuer Projektleiter akzeptiert wurden oder ob die Anfrage zurückgewiesen wurde."},"REPORTS":{"TITLE":"Berichte","SUBTITLE":"Exportieren Sie Ihre Projektdaten in CSV Format und erstellen Sie Ihre eigenen Berichte.","DESCRIPTION":"Laden Sie eine CSV-Datei herunter oder kopieren Sie die generierte URL und öffnen Sie sie in Ihrem Lieblingstexteditor oder Tabellenkalkulationsprogramm um Ihre eigenen Projektdaten Berichte zu erstellen. So können Sie Ihre Daten einfach visualisieren und analysieren.","HELP":"Wie kann ich dies in meiner eigenen Tabellenkalkulation nutzen?","REGENERATE_TITLE":"Die URL ändern","REGENERATE_SUBTITLE":"Sie sind im Begriff, die CSV data access URL zu ändern. Die vorherige URL wird deaktiviert. Sind Sie sicher?"},"CSV":{"SECTION_TITLE_EPIC":"Epics Berichte","SECTION_TITLE_US":"User-Stories Berichte","SECTION_TITLE_TASK":"Aufgabenberichte","SECTION_TITLE_ISSUE":"Ticket Berichte","DOWNLOAD":"CSV herunterladen","URL_FIELD_PLACEHOLDER":"Bitte erstellen Sie die CSV URL neu","TITLE_REGENERATE_URL":"Erstellen Sie die CSV URL neu","ACTION_GENERATE_URL":"URL erzeugen","ACTION_REGENERATE":"Neu erstellen"},"CUSTOM_FIELDS":{"TITLE":"Benutzerfelder","SUBTITLE":"Spezifizieren Sie die Benutzerfelder für Ihre User-Stories, Aufgaben und Tickets.","EPIC_DESCRIPTION":"Benutzerdefinierte Felder der Epics","EPIC_ADD":"Benutzerdefiniertes Feld bei Epics hinzufügen","US_DESCRIPTION":"Benutzerdefinierte Felder der User-Story","US_ADD":"Benutzerdefiniertes Feld bei User-Stories hinzufügen","TASK_DESCRIPTION":"Aufgaben benutzerdefinierte Felder","TASK_ADD":"Fügen Sie ein benutzerdefiniertes Feld bei Aufgaben hinzu","ISSUE_DESCRIPTION":"Tickets benutzerdefinierte Felder","ISSUE_ADD":"Fügen Sie den Tickets ein benutzerdefiniertes Feld hinzu","FIELD_TYPE_TEXT":"Text","FIELD_TYPE_RICHTEXT":"Rich Text","FIELD_TYPE_MULTI":"Mehrzeilig","FIELD_TYPE_DATE":"Datum","FIELD_TYPE_URL":"Url"},"PROJECT_VALUES":{"PAGE_TITLE":"{{sectionName}} - Projekt Werte - {{projectName}}","REPLACEMENT":"Alle Einträge mit diesem Wert werden geändert zu","ERROR_DELETE_ALL":"Sie dürfen nicht alle Werte löschen!"},"PROJECT_VALUES_POINTS":{"TITLE":"Punkte","SUBTITLE":"Bitte schätzen Sie die Punktzahl für Ihre User-Stories","US_TITLE":"User-Story Punkte","ACTION_ADD":"Neuen Punkt hinzufügen"},"PROJECT_VALUES_PRIORITIES":{"TITLE":"Prioritäten","SUBTITLE":"Legen Sie die Prioritäten Ihrer Tickets fest","ISSUE_TITLE":"Ticket Prioritäten","ACTION_ADD":"Neue Priorität hinzufügen"},"PROJECT_VALUES_SEVERITIES":{"TITLE":"Schweregrade","SUBTITLE":"Legen Sie die Gewichtung Ihrer Tickets fest","ISSUE_TITLE":"Ticket Gewichtung","ACTION_ADD":"Neue Gewichtung hinzufügen"},"PROJECT_VALUES_STATUS":{"TITLE":"Status","SUBTITLE":"Spezifizieren Sie die Status, die Ihre User-Stories, Aufgaben und Tickets durchlaufen werden.","EPIC_TITLE":"Epic Status","US_TITLE":"User-Story Status","TASK_TITLE":"Aufgaben-Status","ISSUE_TITLE":"Ticket-Status"},"PROJECT_VALUES_TYPES":{"TITLE":"Typen","SUBTITLE":"Spezifizieren Sie, welche Arten Ihre Tickets haben können","ISSUE_TITLE":"Ticketarten","ACTION_ADD":"Neu hinzufügen {{objName}}"},"PROJECT_VALUES_TAGS":{"TITLE":"Schlagwörter","SUBTITLE":"Farben der Tags anzeigen und verändern","EMPTY":"Zur Zeit sind keine Tags vorhanden","EMPTY_SEARCH":"Es sieht so aus, als konnte zu Ihren Suchkriterien nichts passendes gefunden werden.","ACTION_ADD":"Schlagwort hinzufügen","NEW_TAG":"Neuer Tag","MIXING_HELP_TEXT":"Wähle die Tags aus, die zu zusammenführen willst","MIXING_MERGE":"Tags zusammenführen","SELECTED":"Ausgewählt"},"ROLES":{"PAGE_TITLE":"Rollen - {{projectName}}","WARNING_NO_ROLE":"Beachten Sie, keine Rolle in Ihrem Projekt wird in der Lage sein, die Punktevergabe für User-Stories einzuschätzen.","HELP_ROLE_ENABLED":"Wenn Sie dies freischalten, werden Mitglieder, denen diese Rolle zugewiesen ist, in der Lage sein, die Punktevergabe für User-Stories vorzunehmen.","DISABLE_COMPUTABLE_ALERT_TITLE":"Bist du sicher, dass in dieser Rolle Estimatepoints deaktivieren möchtest?","DISABLE_COMPUTABLE_ALERT_SUBTITLE":"Wenn du die Estimatepoints für die Rolle {{roleName}} deaktivierst, werden alle bisherigen gelöscht","COUNT_MEMBERS":"{{ role.members_count }} Mitglieder mit dieser Rolle","TITLE_DELETE_ROLE":"Rolle löschen","REPLACEMENT_ROLE":"Alle Benutzer mit dieser Rolle werden verschoben nach","WARNING_DELETE_ROLE":"Achtung! Alle Rollenverteilungen werden entfernt.","ERROR_DELETE_ALL":"Sie können nicht alle Werte löschen","EXTERNAL_USER":"Externer Benutzer","NOTE_EXTERNAL_USERS":"Note: by External User we mean any anonymous user not belonging to the Taiga platform, including search engines. Please use this role with care."},"THIRD_PARTIES":{"SECRET_KEY":"Geheimschlüssel","PAYLOAD_URL":"Payload URL","VALID_IPS":"Gültige Quell-IPs (getrennt von ,)"},"BITBUCKET":{"SECTION_NAME":"Bitbucket","PAGE_TITLE":"Bitbucket - {{projectName}}","INFO_VERIFYING_IP":"Bitbucket Anfragen sind nicht signiert, daher ist der beste Weg die Quelle anhand der IP zu prüfen. Wenn das Feld leer bleibt, wird keine Prüfung der IP vorgenommen."},"GITLAB":{"SECTION_NAME":"Gitlab","PAGE_TITLE":"Gitlab - {{projectName}}","INFO_VERIFYING_IP":"Gitlab rAnfragen sind nicht signiert, daher ist der beste Weg die Quelle anhand der IP zu prüfen. Wenn das Feld leer bleibt, wird keine Prüfung der IP vorgenommen."},"GITHUB":{"SECTION_NAME":"GitHub","PAGE_TITLE":"GitHub - {{projectName}}"},"GOGS":{"SECTION_NAME":"Gogs","PAGE_TITLE":"Gogs - {{projectName}}"},"WEBHOOKS":{"PAGE_TITLE":"Webhooks - {{projectName}}","SECTION_NAME":"Webhooks","ADD_NEW":"Fügen Sie ein neues Webhook hinzu","TYPE_NAME":"Servicename...","TYPE_PAYLOAD_URL":"Geben Sie die Service Payload URL ein","TYPE_SERVICE_SECRET":"Sicherheitsschlüssel...","SAVE":"Webhook sichern","CANCEL":"Webhook beenden","SHOW_HISTORY":"(Chronik anzeigen)","TEST":"Webhook Test","EDIT":"Webhook bearbeiten","DELETE":"Webhook löschen","REQUEST":"Anfrage","RESEND_REQUEST":"Anfrage erneut senden","HEADERS":"Überschriften","PAYLOAD":"Ladung","RESPONSE":"Rückmeldung","DATE":"DD. MMM YYYY [um] hh:mm:ss","ACTION_HIDE_HISTORY":"(Chronik verbergen)","ACTION_HIDE_HISTORY_TITLE":"Chronik Details verbergen","ACTION_SHOW_HISTORY":"(Chronik anzeigen)","ACTION_SHOW_HISTORY_TITLE":"Chronik Details anzeigen","WEBHOOK_NAME":"Webhook '{{name}}'"},"CUSTOM_ATTRIBUTES":{"PAGE_TITLE":"{{sectionName}} - Kunden Attribute - {{projectName}}","ADD":"Benutzerdefiniertes Feld hinzufügen","EDIT":"Benutzerdefiniertes Feld bearbeiten","DELETE":"Benutzerdefiniertes Feld löschen","SAVE_TITLE":"Benutzerdefiniertes Feld speichern","CANCEL_TITLE":"Erstellung abbrechen","SET_FIELD_NAME":"Legen Sie den Namen Ihres benutzerdefinierten Feldes fest","SET_FIELD_DESCRIPTION":"Legen Sie Ihre Beschreibung für das benutzerdefinierte Feld fest","FIELD_TYPE_DEFAULT":"-- Bitte auswählen --","ACTION_UPDATE":"Benutzerdefiniertes Feld aktualisieren","ACTION_CANCEL_EDITION":"Bearbeitung abbrechen"},"MEMBERSHIP":{"COLUMN_MEMBER":"Mitglied","COLUMN_ADMIN":"Admin","COLUMN_ROLE":"Rolle","COLUMN_STATUS":"Status","STATUS_ACTIVE":"Aktiv","STATUS_PENDING":"Noch nicht erledigt","DELETE_MEMBER":"Mitglied löschen","RESEND":"Neu senden","SUCCESS_SEND_INVITATION":"Wir haben die Einladung erneut versandt an '{{email}}'.","SUCCESS_DELETE":"Gelöscht {{message}}.","ERROR_DELETE":"Das Löschen ist fehlgeschlagen {{message}}.","DEFAULT_DELETE_MESSAGE":"die Einladung an {{email}}"},"DEFAULT_VALUES":{"LABEL_EPIC_STATUS":"Standardwert für Epic Status","LABEL_US_STATUS":"Standardwert für Userstory Status","LABEL_POINTS":"Vorgegebener Wert für Punkteauswahl","LABEL_TASK_STATUS":"Vorgegebene Auswahl für den Aufgaben-Status","LABEL_ISSUE_TYPE":"Vorgegebener Wert für Ticketartauswahl","LABEL_ISSUE_STATUS":"Vorgegebene Auswahl für den Ticket-Status","LABEL_PRIORITY":"Vorgegebener Wert für Prioritätsauswahl","LABEL_SEVERITY":"Vorgegebener Wert für Gewichtungsauswahl"},"STATUS":{"PLACEHOLDER_WRITE_STATUS_NAME":"Benennen Sie den neuen Status"},"TYPES":{"PLACEHOLDER_WRITE_NAME":"Geben Sie dem neuen Element einen Namen"},"US_STATUS":{"ACTION_ADD_STATUS":"Neuen Status hinzufügen","IS_ARCHIVED_COLUMN":"Archiviert","IS_CLOSED_COLUMN":"Geschlossen","WIP_LIMIT_COLUMN":"WIP Limit","PLACEHOLDER_WRITE_NAME":"Benennen Sie den neuen Status"},"MENU":{"PROJECT":"Projekt","ATTRIBUTES":"Attribute","MEMBERS":"Mitglieder","PERMISSIONS":"Berechtigungen","INTEGRATIONS":"Integrationen"},"SUBMENU_PROJECT_VALUES":{"STATUS":"Status","POINTS":"Punkte","PRIORITIES":"Prioritäten","SEVERITIES":"Schweregrade","TYPES":"Typen","CUSTOM_FIELDS":"Benutzerdefinierte Felder","TAGS":"Schlagwörter"},"SUBMENU_ROLES":{"TITLE":"Rollen","ACTION_NEW_ROLE":"+ Neue Rolle","TITLE_ACTION_NEW_ROLE":"Neue Rolle hinzufügen"},"PROJECT_TRANSFER":{"DO_YOU_ACCEPT_PROJECT_OWNERNSHIP":"Möchten Sie der neue Projektleiter werden?","PRIVATE":"Privat","ACCEPTED_PROJECT_OWNERNSHIP":"Herzlichen Glückwunsch. Sie sind der neue Projektleiter.","REJECTED_PROJECT_OWNERNSHIP":"Ok, wir kontaktieren den aktuellen Projektleiter","ACCEPT":"Akzeptieren","REJECT":"Zurückweisen","PROPOSE_OWNERSHIP":"{{owner}}, der derzeitige Leiter des Projekts {{project}} hat Sie gefragt, ob Sie der neue Projektleiter werden möchten.","ADD_COMMENT":"Möchten Sie einen Kommentar für den Projektleiter hinzufügen?","UNLIMITED_PROJECTS":"Unbegrenzt","OWNER_MESSAGE":{"PRIVATE":"Bitte denken Sie daran, dass Sie bis zu {{maxProjects}} private Projekte besitzen können. Dezeit besitzen Sie {{currentProjects}} private Projekte","PUBLIC":"Bitte denken Sie daran, dass Sie bis zu {{maxProjects}} öffentliche Projekte besitzen können. Dezeit besitzen Sie {{currentProjects}} öffentliche Projekte"},"CANT_BE_OWNED":"Zur Zeit können Sie kein Projektleiter für diesen Projekt-Typ werden werden. Wenn Sie Projektleiter für dieses Projekt werden möchten, kontaktieren Sie bitte den Administrator, damit er Ihre Benutzerkonto-Einstellungen anpassen kann, um Projektleiter werden zu können."}},"USER":{"PROFILE":{"PAGE_TITLE":"{{userFullName}} (@{{userUsername}})","EDIT":"Profil ändern","CLOSED_US":"Geschlossene User-Story","PROJECTS":"Projekte","PROJECTS_EMPTY":"{{username}} besitzt noch keine Projekte","CONTACTS":"Kontakte","CONTACTS_EMPTY":"{{username}} hat noch keine Kontakte","CURRENT_USER_CONTACTS_EMPTY":"Sie haben noch keine Kontakte","CURRENT_USER_CONTACTS_EMPTY_EXPLAIN":"Die Leute, mit denen Sie auf Taiga zusammenarbeiten, werden automatisch zu Ihren Kontakten","TABS":{"ACTIVITY_TAB":"Zeitlinie","ACTIVITY_TAB_TITLE":"Alle Aktivitäten dieses Benutzers anzeigen","PROJECTS_TAB":"Projekte","PROJECTS_TAB_TITLE":"Liste alle Projekte auf, bei denen der Benutzer Mitglied ist","LIKES_TAB":"Likes","LIKES_TAB_TITLE":"Zeige alle Likes von diesem Benutzer","VOTES_TAB":"Stimmen","VOTES_TAB_TITLE":"Zeige alle Votes von diesem Nutzer","WATCHED_TAB":"Beobachtet","WATCHED_TAB_TITLE":"Zeige alle von diesem Nutzer beobachteten Items an","CONTACTS_TAB":"Kontakte","CONTACTS_TAB_TITLE":"Alle Kontakte dieses Buntzers anzeigen"}},"PROFILE_SIDEBAR":{"TITLE":"Dein Profil","DESCRIPTION":"Da andere Mitglieder sehen, dass sie ebenfalls an einem Projekt arbeiten wäre es schön, wenn Sie ein paar Informationen zu Ihrer Person angeben.","ADD_INFO":"Biographie bearbeiten"},"PROFILE_FAVS":{"FILTER_INPUT_PLACEHOLDER":"Geben sie etwas ein...","FILTER_TYPE_ALL":"Alle","FILTER_TYPE_ALL_TITLE":"Alle anzeigen","FILTER_TYPE_PROJECTS":"Projekte","FILTER_TYPE_PROJECTS_TITLE":"Nur Projekte anzeigen","FILTER_TYPE_EPICS":"Epics","FILTER_TYPE_EPICS_TITLE":"Nur Epics anzeigen","FILTER_TYPE_USER_STORIES":"Stories","FILTER_TYPE_USER_STORIES_TITLE":"Nur User-Stories anzeigen","FILTER_TYPE_TASKS":"Aufgaben","FILTER_TYPE_TASKS_TITLE":"Zeige nur Tasks","FILTER_TYPE_ISSUES":"Tickets","FILTER_TYPE_ISSUES_TITLE":"Nur Fehler anzeigen","EMPTY_TITLE":"Es sieht so aus, als wäre hier nichts."}},"PROJECT":{"PAGE_TITLE":"{{projectName}}","HELP":"Sortieren Sie Ihre Projekte nach Wichtigkeit.
    Die ersten 10 Projekte erscheinen prominent in der Projektliste der Navigationsleiste.","PRIVATE":"Privates Projekt","LOOKING_FOR_PEOPLE":"Dieses Projekt sucht nach Mitarbeitern","FANS_COUNTER_TITLE":"{total, plural, one{ein Fan} other{# Fans}}","WATCHERS_COUNTER_TITLE":"{total, plural, one{ein Beobachter} other{# Beobachter}}","MEMBERS_COUNTER_TITLE":"{total, plural, one{one member} other{# members}}","BLOCKED_PROJECT":{"BLOCKED":"Blockiertes Projekt","THIS_PROJECT_IS_BLOCKED":"Dieses Projekt ist vorrübergehend blockiert","TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF":"Um dein Projekt zu entsperren kontaktiere bitte einen Administrator."},"SECTION":{"SEARCH":"Suche","TIMELINE":"Zeitlinie","BACKLOG":"Backlog","KANBAN":"Kanban","ISSUES":"Tickets","WIKI":"Wiki","TEAM":"Team","MEETUP":"Zusammentreffen","ADMIN":"Administrator"},"NAVIGATION":{"ACTION_CREATE_PROJECT":"Projekt anlegen","MANAGE_PROJECTS":"Projekte verwalten","TITLE_CREATE_PROJECT":"Projekt anlegen","HELP_TITLE":"Taiga Support Seite","HELP":"Hilfe","HOMEPAGE":"Homepage","FEEDBACK_TITLE":"Feedback senden","FEEDBACK":"Feedback","NOTIFICATIONS_TITLE":"Benachrichtigungseinstellungen bearbeiten","NOTIFICATIONS":"Benachrichtigungen","VIEW_PROFILE_TITLE":"Profil ansehen","VIEW_PROFILE":"Profil ansehen","EDIT_PROFILE_TITLE":"Bearbeiten Sie Ihr Profil","EDIT_PROFILE":"Profil bearbeiten","CHANGE_PASSWORD_TITLE":"Passwort ändern","CHANGE_PASSWORD":"Passwort ändern","DASHBOARD_TITLE":"Dashboard","DISCOVER_TITLE":"Entdecke aktuelle Projekte","DISCOVER":"Entdecken"},"LIKE_BUTTON":{"LIKE":"Gefällt mir","LIKED":"Gefällt mir","UNLIKE":"Gefällt mir nicht mehr","BUTTON_TITLE":"Like oder Unlike dieses Projekt","COUNTER_TITLE":"{total, plural, one{ein Fan} other{# Fans}}"},"WATCH_BUTTON":{"BUTTON_TITLE":"Beobachte dieses Projekt und setze Benachrichtigungsregeln","WATCH":"Beobachten","WATCHING":"Beobachtet","COUNTER_TITLE":"{total, plural, one{ein Beobachter} other{# Beobachter}}","OPTIONS":{"NOTIFY_ALL":"Alle Benachrichtigungen empfangen","NOTIFY_ALL_TITLE":"Alle Benachrichtigungen für dieses Projekt anzeigen","NOTIFY_INVOLVED":"Nur Beteiligte","NOTIFY_INVOLVED_TITLE":"Erhalte Benachrichtigungen wenn du involviert bist","UNWATCH":"Nicht beobachten","UNWATCH_TITLE":"Nicht beobachten"}},"CONTACT_BUTTON":{"CONTACT_TITLE":"Kontaktiere das Projekt-Team","CONTACT_BUTTON":"Kontaktiere das Projekt"},"CREATE":{"TITLE":"Projekt erstellen","CHOOSE_TEMPLATE":"Welches Template passt am besten zu Ihrem Projekt?","TEMPLATE_SCRUM":"Scrum","TEMPLATE_SCRUM_DESC":"Priorisiere und löse deine Aufgaben in kurzen Zeitintervallen","TEMPLATE_SCRUM_LONGDESC":"Scrum is an iterative and incremental agile software development methodology for managing product development.\nThe product backlog is what will ultimately be delivered, ordered into the sequence in which it should be delivered. Product Backlogs are broken into manageable, executable chunks named sprints. Every certain amount of time the team initiates a new sprint and commits to deliver a certain number of user stories from the backlog, in accordance with their skills, abilities and resources. The project advances as the backlog becomes depleted.","TEMPLATE_KANBAN":"Kanban","TEMPLATE_KANBAN_DESC":"Halte einen konstanten Workflow bei unabhängigen Aufgaben","TEMPLATE_KANBAN_LONGDESC":"The Kanban methodology is used to divide project development (any sort of project) into stages.\nA kanban card is like an index card or post-it note that details every task (or user story) in a project that needs to be completed. The Kanban board is used to move each card from one state of completion to the next and in so doing, helps track progress.","DUPLICATE":"Projekt duplizieren","DUPLICATE_DESC":"Starte sauber und behalte Deine Konfiguration","IMPORT":"Projekt importieren","IMPORT_DESC":"Importiere Dein Projekt von verschiedenen Plattformen zu Taiga","INVITE":"Lade jemanden in dieses Projekt ein","SOLO_PROJECT":"Du bist alleine in diesem Projekt","INVITE_LATER":"(Später kannst du mehr Mitglieder einladen)","BACK":"Zurück","MAX_PRIVATE_PROJECTS":"Unfortunately, You've reached the maximum number of private projects.\nIf you would like to increase the current limit please contact the administrator.","MAX_PUBLIC_PROJECTS":"Unfortunately, You've reached the maximum number of public projects.\nIf you would like to increase the current limit please contact the administrator.","PUBLIC_PROJECT":"Öffentliches Projekt","PRIVATE_PROJECT":"Privates Projekt"},"COMMON":{"DETAILS":"Projekt Details","PROJECT_TITLE":"Projektname","PROJECT_DESCRIPTION":"Projekt-Beschreibung"},"DUPLICATE":{"TITLE":"Projekt duplizieren","DESCRIPTION":"Starte sauber und behalte Deine Konfiguration","SELECT_PLACEHOLDER":"Wähle ein bestehendes Projekt zum Duplizieren aus"},"IMPORT":{"TITLE":"Projekt importieren","DESCRIPTION":"Importiere Dein Projekt von verschiedenen Plattformen zu Taiga","ASYNC_IN_PROGRESS_TITLE":"Unsere Helferlein importieren Ihr Projekt","ASYNC_IN_PROGRESS_MESSAGE":"Dieser Vorgang könnte ein paar Minuten benötigen
    Nach Fertigstellung benachrichtigen wir Sie per E-Mail.","UPLOAD_IN_PROGRESS_MESSAGE":"Hochgeladen {{uploadedSize}} von {{totalSize}}","ERROR":"Unsere Helferlein haben Probleme beim Importieren Ihrer Daten. Bitte versuchen Sie es erneut.","ERROR_TOO_MANY_REQUEST":"Entschuldigung, unsere Helferlein sind zur Zeit sehr beschäftigt. Bitte versuchen Sie es in ein paar Minuten erneut.","ERROR_MESSAGE":"Unsere Helferlein haben Probleme beim Importieren Ihrer Datei: {{error_message}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) ist zu schwierig für unsere Helferlein, versuchen Sie es bitte mit einer kleineren Datei als ({{maxFileSize}})","SYNC_SUCCESS":"Ihr Projekt wurde erfolgreich importiert","IMPORT":"Importieren","WHO_IS":"Ihre Aufgaben werden zugewiesen an ...","WRITE_EMAIL":"Oder wenn du willst, schreibe die Email, welcher der User in Taiga benützt","SEARCH_CONTACT":"Oder such in deinen Kontakten, wenn du willst","WRITE_EMAIL_LABEL":"Schreibe eine Email, das dieser User Taiga benützt","ACCEEDE":"Acceede","PROJECT_MEMBERS":"Projektmitglieder","PROCESS_DESCRIPTION":"Sage uns, wem aus Taiga du die Aufgaben aus {{platform}} zuweisen möchtest","MATCH":"Ist {{user_external}} die selbe Person als {{user_internal}}?","CHOOSE":"Wähle User","LINKS":"Links mit {{platform}}","LINKS_DESCRIPTION":"Möchtest du den Link von jedem Item mit der originalen {{platform}} Informationen behalten?","WARNING_MAIL_USER":"Wenn der User keinen Taiga Account besitzt, können ihm keine Aufgaben zugewiesen werden","ASSIGN":"Zuweisen","PROJECT_SELECTOR":{"NO_RESULTS":"Es sieht so aus, als konnte zu Ihren Suchkriterien nichts passendes gefunden werden.","ACTION_SEARCH":"suche","ACTION_BACK":"Zurück"},"PROJECT_RESTRICTIONS":{"PROJECT_MEMBERS_DESC_PRIVATE":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per private project. If you would like to increase that limit please contact the administrator.","PROJECT_MEMBERS_DESC_PUBLIC":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per public project. If you would like to increase that limit please contact the administrator.","ACCOUNT_ALLOW_MEMBERS":"Dieser Account erlaubt nur {{members}} Mitglieder","PRIVATE_PROJECTS_SPACE":{"TITLE":"Leider erlaubt Ihr derzeitiger Plan keine weiteren privaten Projekte anzulegen.","DESC":"Das Projekt, das Sie versuchen zu importieren, ist privat. Leider erlaubt Ihr derzeitiger Plan keine weiteren privaten Projekte hinzuzufügen."},"PUBLIC_PROJECTS_SPACE":{"TITLE":"Leider erlaubt Ihr derzeitiger Plan keine weiteren öffentlichen Projekte anzulegen.","DESC":"Das Projekt, das Sie versuchen zu importieren, ist öffentlich. Leider erlaubt Ihr derzeitiger Plan keine weiteren öffentlichen Projekte hinzuzufügen."},"PRIVATE_PROJECTS_MEMBERS":{"TITLE":"Ihr derzeitiger Plan erlaubt maximal {{max_memberships}} Mitglieder pro privatem Projekt"},"PUBLIC_PROJECTS_MEMBERS":{"TITLE":"Ihr derzeitiger Plan erlaubt maximal {{max_memberships}} Mitglieder pro öffentlichem Projekt"},"PRIVATE_PROJECTS_SPACE_MEMBERS":{"TITLE":"Leider erlaubt Ihr derzeitiger Plan keine weiteren privaten Projekte anzulegen oder eine Erhöhung von mehr als {{max_memberships}} Mitglieder pro privatem Projekt","DESC":"Das Projekt, dass Sie importieren möchten, ist privat und hat {{members}} Mitglieder."},"PUBLIC_PROJECTS_SPACE_MEMBERS":{"TITLE":"Leider erlaubt Ihr derzeitiger Plan keine weiteren öffentlichen Projekte anzulegen oder eine Erhöhung von mehr als {{max_memberships}} Mitglieder pro öffentlichem Projekt","DESC":"Das Projekt, dass Sie importieren möchten, ist öffentlich und hat mehr als {{members}} Mitglieder."}},"IN_PROGRESS":{"TITLE":"Projekt importieren","DESCRIPTION":"Dieser Vorgang kann etwas dauern. Bitte schliessen Sie das Fenster nicht!"},"WARNING":{"TITLE":"Einige Tasks werden noch nicht zugewiesen","DESCRIPTION":"Es gibt immer noch nicht identifizierte Personen. Die Objekte, die diesen Personen zugewiesen sind, werden in Taiga nicht ohne Zuweisung erstellt. Überprüfe alle Kontakte, um Informationsverlust zu vermeiden","CHECK":"Überprüfe Kontakte"},"TAIGA":{"SELECTOR":"Importiere dein Taiga Projekt"},"TRELLO":{"SELECTOR":"Importiere Trello Projekt in Taiga","CHOOSE_PROJECT":"Wähle Board welches importiert werden soll","NO_PROJECTS":"Bist du sicher, dass du in Trello Boards besitzt "},"GITHUB":{"SELECTOR":"Importiere Github Projekt Issues","CHOOSE_PROJECT":"Finde das Projekt, welches du importieren möchtest","NO_PROJECTS":"Es scheint, als hättest du keinen Projekte in Github","HOW_DO_YOU_WANT_TO_IMPORT":"Wie willst du deine Probleme in Taiga importieren?","KANBAN_PROJECT":"Als Userstories in einem Kanban Projekt","KANBAN_PROJECT_DESCRIPTION":"Danach kannst du Scrum mit dem Backlog aktivieren","SCRUM_PROJECT":"Als Userstory in einem Scrum Projekt","SCRUM_PROJECT_DESCRIPTION":"Danach ist der Kanban Modus aktivierbar","ISSUES_PROJECT":"Als Ticket","ISSUES_PROJECT_DESCRIPTION":"Diese Tickets sind im Kanban oder Scrum Modus nicht verfügbar. Wenn neue Userstories angelegt werden, ist der Kanban oder Scrum Modus verfügbar "},"ASANA":{"SELECTOR":"Importiere dein Asana Projekt und entscheide, wie du es verwalten willst","CHOOSE_PROJECT":"Wähle das Projekt, welches importiert werden soll","NO_PROJECTS":"Es scheint, als hättest du keine Projekte in Asana","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","CREATE_AS_SCRUM_DESCRIPTION":"Die Aufgaben und Teilaufgaben von deinem Projekt werden als Taiga Userstories und Taiga Aufgaben erzeugt","CREATE_AS_KANBAN_DESCRIPTION":"Die Aufgaben und Teilaufgaben von deinem Projekt werden als Taiga Userstories und Taiga Aufgaben erzeugt"},"JIRA":{"SELECTOR":"Importiere dein Jira Projekt und entscheide, wie du es verwalten willst","HOW_TO_CONFIGURE":"(Konfigurationshilfe)","CHOOSE_PROJECT":"Wähle Projekt oder Board welches importiert werden soll","NO_PROJECTS":"Es scheint, dass keine Projekte oder Boards in Jira bestehen","URL":"Deine Jira URL","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","ISSUES_PROJECT":"Tickets","CREATE_AS_SCRUM_DESCRIPTION":"Die Tickets und Sub-Tickets von deinem Projekt werden als Taiga Userstories und Taiga Aufgaben erstellt","CREATE_AS_KANBAN_DESCRIPTION":"Die Tickets und Sub-Tickets von deinem Projekt werden als Taiga Userstories und Taiga Aufgaben erstellt","CREATE_AS_ISSUES_DESCRIPTION":"Was möchtest du mit den Sub-Tickets aus dem Jira Projekt tun? (Taiga erlaubt keine Sub-Tickets) ","CREATE_NEW_ISSUES":" Konvertiere Sub-Tickets zu neuen Taiga Tickets","NOT_CREATE_NEW_ISSUES":"Importiere keine Sub-Tickets"}}},"LIGHTBOX":{"DELETE_ACCOUNT":{"CONFIRM":"Sind Sie sicher, dass Sie Ihr Taiga Benutzerkonto löschen wollen?","CANCEL":"Zurück zu Einstellungen","ACCEPT":"Benutzerkonto löschen","BLOCK_PROJECT":"Beachten Sie, dass alle Projekte die Sie besitzen, gesperrt werden, nachdem Sie Ihr Konto gelöscht haben. Wenn Sie möchten, dass Ihre Projekte nicht gesperrt werden, ernennen Sie ein anderes Mitglied zum Projektleiter für jedes Projekt, bevor Sie Ihr Konto löschen."},"DELETE_PROJECT":{"TITLE":"Projekt löschen","QUESTION":"Sind Sie sicher, dass Sie das Projekt löschen möchten?","SUBTITLE":"Sämtliche Projektdaten (User-Stories, Aufgaben, Tickets, Sprints und Wiki Seiten) werden verloren gehen! :-(","CONFIRM":"Ja, ich bin mir sicher"},"ASSIGNED_TO":{"SELECT":"Zuweisung auswählen","SEARCH":"Nach Benutzern suchen"},"ADD_MEMBER":{"TITLE":"Neues Mitglied","PLACEHOLDER":"Nach Nutzern suchen oder per E-Mail einladen","ADD_EMAIL":"E-Mail hinzufügen","REMOVE":"Entfernen","INVITE":"Einladen","CHOOSE_ROLE":"Rolle auswählen","PLACEHOLDER_INVITATION_TEXT":"(Optional) Fügen Sie einen persönlichen Text zur Einladung hinzu. Erzählen Sie Ihren neuen Mitgliedern etwas Schönes. ;-)","HELP_TEXT":"Wenn Benutzer schon bei Taiga registriert sind, werden diese automatisch hinzugefügt. Ansonsten erhalten sie eine Einladung."},"CREATE_ISSUE":{"TITLE":"Ticket hinzufügen"},"FEEDBACK":{"TITLE":"Erzählen Sie uns etwas...","COMMENT":"...einen Fehler, Anregungen, etwas Tolles... oder Ihren schlimmsten Alptraum mit Taiga.","ACTION_SEND":"Feedback senden"},"SEARCH":{"TITLE":"Suche","PLACEHOLDER_SEARCH":"Wonach suchen Sie?"},"ADD_EDIT_SPRINT":{"TITLE":"Neuer Sprint","PLACEHOLDER_SPRINT_NAME":"Sprint Bezeichnung","PLACEHOLDER_SPRINT_START":"Geschätzter Beginn","PLACEHOLDER_SPRINT_END":"Geschätztes Ende","ACTION_DELETE_SPRINT":"Möchten Sie diesen Sprint löschen?","TITLE_ACTION_DELETE_SPRINT":"Sprint löschen","LAST_SPRINT_NAME":"letzter Sprint ist {{lastSprint}} ;-) "},"CREATE_EDIT_TASK":{"TITLE":"Neue Aufgabe","PLACEHOLDER_SUBJECT":"Aufgaben Betreff","PLACEHOLDER_STATUS":"Aufgaben-Status","OPTION_UNASSIGNED":"Nicht zugeordnet","PLACEHOLDER_SHORT_DESCRIPTION":"Geben Sie eine kurze Beschreibung ein","ACTION_EDIT":"Aufgabe bearbeiten","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"CREATE_EDIT_US":{"TITLE":"Neue User-Story","PLACEHOLDER_DESCRIPTION":"Fügen Sie bitte einen Beschreibungstext hinzu, um anderen diese User-Story näher zu erläutern","NEW_US":"Neue User-Story","EDIT_US":"User-Story bearbeiten","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"DELETE_DUE_DATE":{"TITLE":"Delete due date","SUBTITLE":"Are you sure you want to delete this due date?"},"DELETE_SPRINT":{"TITLE":"Sprint löschen"},"CREATE_MEMBER":{"PLACEHOLDER_INVITATION_TEXT":"(Optional) Fügen Sie einen persönlichen Text zur Einladung hinzu. Erzählen Sie Ihren neuen Mitgliedern etwas Schönes. ;-)","PLACEHOLDER_TYPE_EMAIL":"Geben Sie eine E-Mail ein","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"Dieses Projekt erreicht bald die maximale Anzahl von {{maxMembers}} Mitgliedern. Wenn Sie diese Grenze erhöhen möchten, kontaktieren Sie bitte den Administrator.","LIMIT_USERS_WARNING_MESSAGE":"Dieses Projekt erreicht bald die maximale Anzahl von {{maxMembers}} Mitgliedern."},"LEAVE_PROJECT_WARNING":{"TITLE":"Das Projekt kann nicht ohne einen Projektleiter existieren.","CURRENT_USER_OWNER":{"DESC":"Du bist der aktuelle Besitzer dieses Projektes. Bitte übertrage den Besitzerstatus an jemand anderes bevor du das Projekt verlässt.","BUTTON":"Projektleiter wechseln"},"OTHER_USER_OWNER":{"DESC":"Leider können Sie das Mitglied nicht löschen, da es der derzeitige Projektleiter ist. Bitte ordnen Sie dem Projekt zuerst einen neuen Projektleiter zu.","BUTTON":"Antrag Projektleiter-Wechsel "}},"CHANGE_OWNER":{"TITLE":"Wen möchtest du zum neuen Projektleiter ernennen?","ADD_COMMENT":"Kommentar hinzufügen","BUTTON":"Fragen Sie dieses Projektmitglied, um Projektleiter zu werden"},"CONTACT_PROJECT":{"TITLE":"Sende eine E-Mail an","WARNING":"Die E-Mail wird von den Projekt-Administratoren empfangen","PLACEHOLDER":"Schreibe Deine Nachricht","SEND":"Senden"},"SET_DUE_DATE":{"TITLE":"Set due date","PLACEHOLDER_DUE_DATE":"Select date","REASON_FOR_DUE_DATE":"Reason for the due date","PLACEHOLDER_REASON_FOR_DUE_DATE":"Why does this US need a due date?","SUGGESTIONS":{"IN_ONE_WEEK":"In one week","IN_TWO_WEEKS":"In two weeks","IN_ONE_MONTH":"In one month","IN_THREE_MONTHS":"In three months"},"TITLE_ACTION_DELETE_DUE_DATE":"Delete due date"}},"EPIC":{"PAGE_TITLE":"{{epicSubject}} - Epic {{epicRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{epicStatus }}. Beschreibung: {{epicDescription}}","SECTION_NAME":"Epic","TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY":"Verknüpfung zur zugehören User-Story lösen","MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY":"Dies wird die Verknüpfung zur zugehörigen User-Story '{{subject}}' löschen","ERROR_UNLINK_RELATED_USERSTORY":"Die Verknüpfung konnte nicht gelöscht werden: {{errorMessage}}","CREATE_RELATED_USERSTORIES":"Erstelle eine Verbindung mit","NEW_USERSTORY":"Neue User-Story","EXISTING_USERSTORY":"Bestehende User-Story","CHOOSE_PROJECT_FOR_CREATION":"Welches Projekt?","SUBJECT":"Thema","SUBJECT_BULK_MODE":"Thema (Mehrfacheingaben möglich)","CHOOSE_PROJECT_FROM":"Welches Projekt?","CHOOSE_USERSTORY":"Beschreibe die Userstory","NO_USERSTORIES":"Dieses Projekt hat zurzeit keine User Stories. Bitte wähle ein anderes Projekt.","NO_USERSTORIES_FOUND":"Es sieht so aus, als konnte zu Ihren Suchkriterien nichts passendes gefunden werden.","FILTER_USERSTORIES":"User-Stories filter","LIGHTBOX_TITLE_BLOKING_EPIC":"Blocke Epic","ACTION_DELETE":"Epic löschen"},"US":{"PAGE_TITLE":"{{userStorySubject}} - User-Story {{userStoryRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{userStoryStatus }}. Abgeschlossen {{userStoryProgressPercentage}}% ({{userStoryClosedTasks}} von {{userStoryTotalTasks}} Aufgaben geschlossen). Punkte: {{userStoryPoints}}. Beschreibung: {{userStoryDescription}}","SECTION_NAME":"User-Story","LINK_TASKBOARD":"Taskboard","TITLE_LINK_TASKBOARD":"Zu Taskboard wechseln","TOTAL_POINTS":"Gesamtpunkte","ADD":"+ Neue User-Story anlegen","ADD_BULK":"Mehrere neue User-Stories hinzufügen","PROMOTED":"Diese User-Story entstand aus Ticket:","TITLE_LINK_GO_TO_ISSUE":"Zum Ticket wechseln","TITLE_DELETE_ACTION":"User-Story löschen","LIGHTBOX_TITLE_BLOKING_US":"Blockiert uns","NOT_ESTIMATED":"Nicht eingeschätzt","OWNER_US":"Userstory gehört","TRIBE":{"PUBLISH":"Als Gig in Taiga Tribe veröffentlichen","PUBLISH_INFO":"Weitere Infos","PUBLISH_TITLE":"Mehr Infos zum Veröffentlichen in Taiga Tribe","PUBLISHED_AS_GIG":"Story veröffentlicht als Gig in Taiga Tribe","EDIT_LINK":"Link bearbeiten","CLOSE":"Schließen","SYNCHRONIZE_LINK":"mit Taiga Tribe synchronisieren","PUBLISH_MORE_INFO_TITLE":"Brauchen Sie jemanden für diese Aufgabe?","PUBLISH_MORE_INFO_TEXT":"

    If you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

    TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

    "},"FIELDS":{"TEAM_REQUIREMENT":"Team Anforderung","CLIENT_REQUIREMENT":"Kundenanforderung"}},"COMMENTS":{"DELETED_INFO":"Kommentar gelöscht von {{user}}","COMMENTS_COUNT":"{{comments}} Kommentare","OLDER_FIRST":"Ältere zuerst","RECENT_FIRST":"Letzte zuerst","COMMENT":"Kommentieren","EDITED_COMMENT":"Bearbeitet:","SHOW_HISTORY":"Verlauf anzeigen","TYPE_NEW_COMMENT":"Geben Sie hier einen neuen Kommentar ein","SHOW_DELETED":"Gelöschten Kommentar anzeigen","HIDE_DELETED":"Gelöschten Kommentar ausblenden","DELETE":"Kommentar löschen","RESTORE":"Kommentar wiederherstellen","HISTORY":{"TITLE":"Aktivität"}},"ACTIVITY":{"TITLE":"Aktivität","ACTIVITIES_COUNT":"{{activities}} Aktivitäten","TAGS_ADDED":"Tags hinzugefügt:","TAGS_REMOVED":"Tags entfernt:","US_POINTS":"{{role}} points","NEW_ATTACHMENT":"neuer Anhang:","DELETED_ATTACHMENT":"gelöschter Anhang:","UPDATED_ATTACHMENT":"Anhang aktualisiert ({{filename}}):","CREATED_CUSTOM_ATTRIBUTE":"benutzerdefiniertes Attribut erstellt","UPDATED_CUSTOM_ATTRIBUTE":"benutzerdefiniertes Attribut aktualisiert","BECAME_DEPRECATED":"ist veraltet","BECAME_UNDEPRECATED":"ist wieder aktuell","TEAM_REQUIREMENT":"Team Anforderung","CLIENT_REQUIREMENT":"Kundenanforderung","BLOCKED":"Blockiert","VALUES":{"NOT_SET":"not set","UNASSIGNED":"nicht zugeordnet"},"FIELDS":{"SUBJECT":"Thema","DESCRIPTION":"Beschreibung","PRIORITY":"Priorität","SEVERITY":"Gewichtung","STATUS":"Status","TYPE":"Typen","ASSIGNED_TO":"zugewiesen an","ASSIGNED_USERS":"assigned users","DUE_DATE":"due date","MILESTONE":"Sprint","COLOR":"Farbe"}},"BACKLOG":{"PAGE_TITLE":"Backlog - {{projectName}}","PAGE_DESCRIPTION":"Das Backlog-Panel mit User-Stories und Sprints des Projekts. {{projectName}}: {{projectDescription}}","SECTION_NAME":"Backlog","CUSTOMIZE_GRAPH":"Personalisiere deinen Backloggraph","CUSTOMIZE_GRAPH_TEXT":"Um schöne Graphen, die Dir bei der Entwicklung Deines Projekts helfen, zu sehen, musst du Estimatepoints und Sprints einstellen","CUSTOMIZE_GRAPH_ADMIN":"Administrator","CUSTOMIZE_GRAPH_TITLE":"Stelle Points und Sprints über das Adminpanel ein","MOVE_US_TO_CURRENT_SPRINT":"Zum aktuellen Sprint wechseln","MOVE_US_TO_LATEST_SPRINT":"Zum aktuellen Sprint wechseln.","EMPTY":"Das Backlog ist leer!","CREATE_NEW_US":"Eine neue User-Story anlegen","CREATE_NEW_US_EMPTY_HELP":"Sie sollten eine User-Story anlegen","EXCESS_OF_POINTS":"Punkte Überschuss","PENDING_POINTS":"Unerledigte Punkte","CLOSED_POINTS":"geschlossen","COMPACT_SPRINT":"Kompakt Sprint","GO_TO_TASKBOARD":"Gehen Sie zum Taskboard von {{::name}}","EDIT_SPRINT":"Sprint bearbeiten","TOTAL_POINTS":"insgesamt","STATUS_NAME":"Status Bezeichnung","SORTABLE_FILTER_ERROR":"Es ist kein Drag & Drop über dem Backlog möglich, wenn Filter geöffnet sind.","DOOMLINE":"Projekt Umfang [Doomline]","CHART":{"XAXIS_LABEL":"Sprints","YAXIS_LABEL":"Punkte","OPTIMAL":"Optimale unerledigte Punkte für Sprint \"{{sprintName}}\" sollten sein {{value}}","REAL":"Tatsächliche Anzahl unerledigter Punkte für Sprint \"{{sprintName}}\" ist {{value}}","INCREMENT_TEAM":"Erhöhte Punktezahl von Teamanfragen für Sprint \"{{sprintName}}\" ist {{value}}","INCREMENT_CLIENT":"Erhöhte Punkteanzahl von Kundenanfragen für Sprint \"{{sprintName}}\" ist {{value}}"},"TAGS":{"TOGGLE":"Sichtbarkeit des Schlagwortes umschalten","SHOW":"Schlagwörter anzeigen","HIDE":"Schlagwörter ausblenden"},"FORECASTING":{"TITLE":"Velocity Vorhersage","BACKLOG":"Backlog anzeigen","NEW_SPRINT":"Candidate User Stories for your next sprint based on your velocity. Click to create a new sprint.","CURRENT_SPRINT":"Candidate User Stories for your sprint based on your velocity. Click to add to current sprint."},"TABLE":{"COLUMN_US":"User-Stories","TITLE_COLUMN_POINTS":"Ansicht mittels Rolle auswählen"},"SPRINT_SUMMARY":{"TOTAL_POINTS":"gesamte
    Punkte","COMPLETED_POINTS":"vollständige
    Punkte","OPEN_TASKS":"offene
    Aufgaben","CLOSED_TASKS":"geschlossene
    Aufgaben","IOCAINE_DOSES":"Iocaine
    Dosen","SHOW_STATISTICS_TITLE":"Statistik anzeigen","TOGGLE_BAKLOG_GRAPH":"Zeige/Verstecke Burndowngraph","POINTS_PER_ROLE":"Points pro Rolle"},"SUMMARY":{"PROJECT_POINTS":"Projekt
    Punkte","DEFINED_POINTS":"definierte
    Punkte","CLOSED_POINTS":"geschlossene
    Punkte","POINTS_PER_SPRINT":"Punkte /
    Sprint"},"FILTERS":{"TOGGLE":"Filter sichtbar schalten","HIDE":"Filter verbergen","SHOW":"Filter anzeigen"},"SPRINTS":{"TITLE":"SPRINTS","DATE":"DD. MMM YYYY","LINK_TASKBOARD":"Sprint Taskboard","TITLE_LINK_TASKBOARD":"Gehe zu Taskboard von \"{{name}}\"","EMPTY":"Derzeit sind keine Sprints vorhanden","WARNING_EMPTY_SPRINT_ANONYMOUS":"Dieser Sprint enthält keiner User Stories","WARNING_EMPTY_SPRINT":"Ziehe Stories aus deinem Backlog hierher, um einen neuen Sprint zu starten","TITLE_ACTION_NEW_SPRINT":"Neuen Sprint hinzufügen","TEXT_ACTION_NEW_SPRINT":"Du möchtest einen neuen Sprint in Deinem Projekt erstellen","ACTION_SHOW_CLOSED_SPRINTS":"Geschlossene Sprints anzeigen","ACTION_HIDE_CLOSED_SPRINTS":"Geschlossene Sprints ausblenden"}},"ERROR":{"TEXT1":"Es gibt ein Problem und unsere Helferlein arbeiten schon daran!","NOT_FOUND":"Nicht gefunden","NOT_FOUND_TEXT":"Fehler 404. Die angeforderte Seite existiert nicht mehr. Möglicherweise finden Sie das Gesuchte, wenn Sie zur TAIGA Homepage zurückkehren.","PERMISSION_DENIED":"Berechtigung verweigert","PERMISSION_DENIED_TEXT":"Sie haben nicht die Berechtigung um auf diese Seite zuzugreifen","VERSION_ERROR":"Jemand anderes hat dies schon geändert und unsere Helferlein können Ihre Änderungen deshalb nicht übernehmen. Bitte laden Sie die Seite neu und machen Sie die Änderungen erneut (die aktuelle Eingabe geht dabei verloren)."},"TASKBOARD":{"PAGE_TITLE":"{{sprintName}} - Sprint Taskboard - {{projectName}}","PAGE_DESCRIPTION":"Sprint {{sprintName}} (von {{startDate}} zu {{endDate}}) von {{projectName}}. Abgeschlossen {{completedPercentage}}% ({{completedPoints}} von {{totalPoints}} points). {{openTasks}} offene Aufgaben von {{totalTasks}}.","SECTION_NAME":"Taskboard","TITLE_ACTION_ADD":"Neue Aufgabe hinzufügen","TITLE_ACTION_ADD_BULK":"Mehrere Aufgaben hinzufügen","TITLE_ACTION_ASSIGN":"Aufgabe zuweisen","PLACEHOLDER_CARD_TITLE":"Das könnte ein Task sein","PLACEHOLDER_CARD_TEXT":"Teile Stories in Tasks auf um sie einzeln zu verfolgen","TABLE":{"COLUMN":"User-Story","TITLE_ACTION_FOLD":"Spalte einklappen","TITLE_ACTION_UNFOLD":"Spalte aufklappen","TITLE_ACTION_FOLD_ROW":"Reihe einklappen","TITLE_ACTION_UNFOLD_ROW":"Reihe aufklappen","FIELD_POINTS":"Punkte","ROW_UNASSIGED_TASKS_TITLE":"Nicht zugeordnete Aufgaben"},"CHARTS":{"XAXIS_LABEL":"Tage","YAXIS_LABEL":"Punkte","OPTIMAL":"Optimale unerledigte Punkte für Tag {{formattedDate}} sollten sein {{roundedValue}}","REAL":"Tatsächliche Anzahl unerledigter Punkte für Tag {{formattedDate}} ist {{roundedValue}}","DATE":"DD. MMMM YYYY"}},"TASK":{"PAGE_TITLE":"{{taskSubject}} - Aufgabe {{taskRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{taskStatus }}. Beschreibung: {{taskDescription}}","SECTION_NAME":"Aufgabe","LINK_TASKBOARD":"Taskboard","TITLE_LINK_TASKBOARD":"Zu Taskboard wechseln","PLACEHOLDER_SUBJECT":"Betreff...","TITLE_SELECT_STATUS":"Status Bezeichnung","OWNER_US":"Diese Aufgabe gehört zu","TITLE_LINK_GO_OWNER":"Zur User-Story wechseln","TITLE_DELETE_ACTION":"Aufgabe löschen","LIGHTBOX_TITLE_BLOKING_TASK":"Blockierende Aufgabe","FIELDS":{"IS_IOCAINE":"Ist Iocaine"},"TITLE_ACTION_IOCAINE":"Fühlen Sie sich von einer Aufgabe etwas erdrückt? Stellen Sie sicher, dass andere davon erfahren, indem Sie auf Locaine klicken, wenn Sie eine Aufgabe ändern. Es ist möglich, gegen dieses (fiktive) tödliche Gift immun zu werden, indem man kleine Mengen über einen Zeitraum hinweg einnimmt. Genauso, wie es möglich ist, besser in dem zu werden, was man tut, indem man gelegentlich zusätzliche Herausforderungen annimmt!"},"NOTIFICATION":{"OK":"Alles in Ordnung","WARNING":"Huch, es gibt ein Problem...","WARNING_TEXT":"Unsere Helferlein bedauern, Ihre Änderungen wurden nicht gespeichert!","SAVED":"Die Helferlein haben Ihre Änderungen gespeichert!","CLOSE":"Benachrichtigung schließen","MAIL":"Benachrichtigungen per Mail","DESKTOP":"Desktop notifications using browser alerts","ASK_DELETE":"Möchten Sie wirklich löschen?"},"CANCEL_ACCOUNT":{"TITLE":"Ihr Benutzerkonto löschen","SUBTITLE":"Wir bedauern, dass Sie die Taiga verlassen. Wir hoffen, Sie hatten einen angenehmen Aufenthalt. :)","PLACEHOLDER_INPUT_TOKEN":"Benutzerkonto Token ungültig machen","ACTION_LEAVING":"Ja, ich gehe!","SUCCESS":"Unsere Helferlein haben Ihr Benutzerkonto entfernt."},"CHANGE_EMAIL_FORM":{"TITLE":"Ändern Sie Ihre E-Mail","SUBTITLE":"Noch ein Klick und Ihre E-Mail wird aktualisiert!","PLACEHOLDER_INPUT_TOKEN":"E-Mail-Token ändern","ACTION_CHANGE_EMAIL":"E-Mail ändern","SUCCESS":"Unsere Helferlein haben Ihre E-Mail-Adresse aktualisiert"},"ISSUES":{"PAGE_TITLE":"Tickets - {{projectName}}","PAGE_DESCRIPTION":"Das Ticket-Listen Panel des Projekts {{projectName}}: {{projectDescription}}","SECTION_NAME":"Ticket","ACTION_NEW_ISSUE":"+ NEUES TICKET","ACTION_PROMOTE_TO_US":"Zur User-Story aufwerten","PROMOTED":"Dieses Ticket wurde aufgewertet zu User-Story:","EXTERNAL_REFERENCE":"Dieses Ticket wurde erstellt durch","GO_TO_EXTERNAL_REFERENCE":"Zur Quelle wechseln","ACTION_DELETE":"Ticket löschen","LIGHTBOX_TITLE_BLOKING_ISSUE":"Blockierendes Ticket","FIELDS":{"PRIORITY":"Priorität","SEVERITY":"Gewichtung","TYPE":"Arten"},"CONFIRM_PROMOTE":{"TITLE":"Dieses Problem zur User-Story aufwerten","MESSAGE":"Sind Sie sicher, dass Sie aus diesem Ticket eine neue User-Story erstellen möchten?"},"TABLE":{"COLUMNS":{"TYPE":"Arten","SEVERITY":"Gewichtung","PRIORITY":"Priorität","SUBJECT":"Thema","VOTES":"Stimmen","STATUS":"Status","CREATED":"Erstellt","ASSIGNED_TO":"Zugeordnet"},"TITLE_ACTION_CHANGE_STATUS":"Status wechseln","TITLE_ACTION_ASSIGNED_TO":"Zugeordnet zu","BLOCKED":"Blockiert","EMPTY":{"TITLE":"Es gibt keine Probleme zu berichten :-)","SUBTITLE":"Haben Sie ein Problem gefunden?"}}},"ISSUE":{"PAGE_TITLE":"{{issueSubject}} - Ticket {{issueRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{issueStatus }}. Typ: {{issueType}}, Priorität: {{issuePriority}}. Gewichtung: {{issueSeverity}}. Beschreibung: {{issueDescription}}"},"KANBAN":{"PAGE_TITLE":"Kanban - {{projectName}}","PAGE_DESCRIPTION":"Das Kanban Panel, mit User-Stories des Projekts {{projectName}}: {{projectDescription}}","SECTION_NAME":"Kanban","TITLE_ACTION_FOLD":"Seite einklappen","TITLE_ACTION_UNFOLD":"Spalte aufklappen","TITLE_ACTION_ADD_US":"Neue User-Story hinzufügen","TITLE_ACTION_ADD_BULK":"Neue Menge hinzufügen","ACTION_SHOW_ARCHIVED":"Archivierte anzeigen","ACTION_HIDE_ARCHIVED":"Archivierte verbergen","HIDDEN_USER_STORIES":"Die User-Stories in diesem Status werden automatisch verborgen","PLACEHOLDER_CARD_TITLE":"Dies sind deine User Stories","PLACEHOLDER_CARD_TEXT":"Stories können Unteraufgaben für weitere Anforderungen haben"},"SEARCH":{"PAGE_TITLE":"Suche - {{projectName}}","PAGE_DESCRIPTION":"Suchen Sie User-Stories, Tickets, Aufgaben oder Wiki Seiten im Projekt {{projectName}}: {{projectDescription}}","FILTER_EPICS":"Epics","FILTER_USER_STORIES":"User-Stories","FILTER_ISSUES":"Tickets","FILTER_TASKS":"Aufgaben","FILTER_WIKI":"Wiki Seiten","PLACEHOLDER_SEARCH":"Suchen in...","TITLE_ACTION_SEARCH":"suchen","EMPTY_TITLE":"Es sieht so aus, als könnte unter Ihren Suchkriterien nichts gefunden werden.","EMPTY_DESCRIPTION":"Vielleicht versuchen Sie es mit einem der oberen Reiter, oder Sie suchen erneut"},"TEAM":{"PAGE_TITLE":"Team - {{projectName}}","PAGE_DESCRIPTION":"Das Team Panel, um alle Mitglieder des Projekts anzuzeigen {{projectName}}: {{projectDescription}}","SECTION_NAME":"Team","PLACEHOLDER_INPUT_SEARCH":"Unter Anzeigenamen suchen...","COLUMN_MR_WOLF":"Herr Wolf","EXPLANATION_COLUMN_MR_WOLF":"Geschlossene Tickets","COLUMN_IOCAINE":"Locaine Trinker","EXPLANATION_COLUMN_IOCAINE":"Locaine Dosen eingenommen","COLUMN_CERVANTES":"Cervantes","EXPLANATION_COLUMN_CERVANTES":"Wiki Seiten geändert","COLUMN_BUG_HUNTER":"Bug-Jäger","EXPLANATION_COLUMN_BUG_HUNTER":"Gemeldete Tickets","COLUMN_NIGHT_SHIFT":"Nachtschicht","EXPLANATION_COLUMN_NIGHT_SHIFT":"Aufgaben geschlossen","COLUMN_TOTAL_POWER":"Gesamtleistung","EXPLANATION_COLUMN_TOTAL_POWER":"Punktesumme","SECTION_TITLE_TEAM":"Team >","SECTION_FILTER_ALL":"Alle","CONFIRM_LEAVE_PROJECT":"Sind Sie sicher, dass Sie das Projekt verlassen möchten?","ACTION_LEAVE_PROJECT":"Das Projekt verlassen"},"USER_SETTINGS":{"AVATAR_MAX_SIZE":"[Max. Größe: {{maxFileSize}}]","MENU":{"SECTION_TITLE":"Benutzereinstellungen","USER_PROFILE":"Benutzerprofil","CHANGE_PASSWORD":"Passwort ändern","EMAIL_NOTIFICATIONS":"E-Mail Benachrichtigungen","DESKTOP_NOTIFICATIONS":"Desktop notifications"},"NOTIFICATIONS":{"LIVE_SECTION_NAME":"Desktop Notifications","SECTION_NAME":"E-Mail-Benachrichtigungen","COLUMN_PROJECT":"Projekt","COLUMN_RECEIVE_ALL":"Alle erhalten","COLUMN_ONLY_INVOLVED":"Nur Einbezogene","COLUMN_NO_NOTIFICATIONS":"Keine Benachrichtigungen","OPTION_ALL":"Alle","OPTION_INVOLVED":"Beteiligt","OPTION_NONE":"Keine"}},"USER_PROFILE":{"ACTION_USE_GRAVATAR":"Standardbild verwenden","ACTION_DELETE_ACCOUNT":"Ihr Taiga Benutzerkonto löschen","ACTION_DOWNLOAD_PROFILE":"Download Taiga profile","CHANGE_EMAIL_SUCCESS":"Sehen Sie in Ihren Posteingang!
    Wir haben eine E-Mail an Ihr Konto gesendet
    mit der Anleitung, wie Sie Ihre neue Adresse anlegen","CHANGE_PHOTO":"Foto ändern","FIELD":{"USERNAME":"Benutzername","EMAIL":"E-Mail","FULL_NAME":"Anzeigename","PLACEHOLDER_FULL_NAME":"Geben Sie Ihren Anzeigenamen an (z.B. Vorname Nachname)","BIO":"Bio (max. 210 Zeichen)","PLACEHOLDER_BIO":"Erzählen Sie etwas über sich","LANGUAGE":"Sprache","LANGUAGE_DEFAULT":"-- benutzen Sie eine vorgegebene Sprache --","THEME":"Theme","THEME_DEFAULT":"-- Standard-Theme benutzen --"}},"WIKI":{"PAGE_TITLE":"{{wikiPageName}} - Wiki - {{projectName}}","PAGE_DESCRIPTION":"Letzte Bearbeitung am {{lastModifiedDate}} ({{totalEditions}} Gesamtzahl der Bearbeitungen) Inhalt: {{ wikiPageContent }}","DATETIME":"DD MMM YYYY HH:mm","REMOVE":"Diese Wiki Seite entfernen","DELETE_LIGHTBOX_TITLE":"Wiki Seite löschen","DELETE_LINK_TITLE":"Entferne Wiki Link","NAVIGATION":{"HOME":"Hauptseite","SECTION_NAME":"BOOKMARKS","ACTION_ADD_LINK":"Bookmark hinzufügen","ALL_PAGES":"Alle Wiki-Seiten"},"SUMMARY":{"TIMES_EDITED":"mal
    bearbeitet","LAST_EDIT":"letzte
    Bearbeitung","LAST_MODIFICATION":"letzte Änderung"},"SECTION_PAGES_LIST":"Alle Seiten","PAGES_LIST_COLUMNS":{"TITLE":"Titel","EDITIONS":"Ausgaben","CREATED":"Erstellt","MODIFIED":"Geändert","CREATOR":"Ersteller","LAST_MODIFIER":"Letzter Bearbeiter"}},"HINTS":{"SECTION_NAME":"Hinweis","LINK":"Mehr dazu auf unserer Support Seite","LINK_TITLE":"Besuchen Sie unsere Support Seite","HINT1_TITLE":"Wussten Sie, dass Sie Projekte importieren und exportieren?","HINT1_TEXT":"Dies erlaubt Ihnen, alle Ihre Daten zu extrahieren und sie von einer Taiga zur nächsten zu transportieren","HINT2_TITLE":"Wussten Sie, dass Sie benutzerdefinierte Felder erstellen können?","HINT2_TEXT":"Teams können nun benutzerdefinierte Felder anlegen, um Werte einzugeben, die für Ihren Workflow wichtig sind.","HINT3_TITLE":"Sortiere Deine Projekte, um Dir vor allem die anzuzeigen, die relevant für Dich sind.","HINT3_TEXT":"Die 10 Projekt sind in der Zugriffsleiste am oberen Bildschirmrand aufgelistet.","HINT4_TITLE":"Did you forget what were you working on?","HINT4_TEXT":"Machen Sie sich keine Sorgen, im Dashboard finden Sie Aufgaben, Tickets und User-Stories in der Reihenfolge in der Sie diese bearbeitet haben."},"TIMELINE":{"UPLOAD_ATTACHMENT":"{{username}} fügte {{obj_name}} einen neuen Anhang zu","US_CREATED":"{{username}} erstellte die neue User-Story {{obj_name}} in {{project_name}}","ISSUE_CREATED":"{{username}} erstellte das neue Ticket {{obj_name}} in {{project_name}}","TASK_CREATED":"{{username}} erstellte die neue Aufgabe {{obj_name}} in {{project_name}}","TASK_CREATED_WITH_US":"{{username}} erstellte die neue Aufgabe {{obj_name}} in {{project_name}}, die zur User-Story {{us_name}} gehört","WIKI_CREATED":"{{username}} erstellte die neue Wiki Seite {{obj_name}} in {{project_name}}","MILESTONE_CREATED":"{{username}} erstellte den neuen Sprint {{obj_name}} in {{project_name}}","EPIC_CREATED":"{{username}} hat einen neuen Epic {{obj_name}} in {{project_name}} erstellt","EPIC_RELATED_USERSTORY_CREATED":"{{username}} hat die Userstory {{related_us_name}} mit der Epic {{epic_name}} im Projekt {{project_name}} verbunden","NEW_PROJECT":"{{username}} erstellte das Projekt {{project_name}}","MILESTONE_UPDATED":"{{username}} aktualisierte den Sprint {{obj_name}}","US_UPDATED":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der User-Story {{obj_name}}","US_UPDATED_WITH_NEW_VALUE":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der User-Story {{obj_name}} zu {{new_value}}","US_UPDATED_POINTS":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Story {{obj_name}} zu {{new_value}}","ISSUE_UPDATED":"{{username}} aktualisierte das Attribut \"{{field_name}}\" des Tickets {{obj_name}}","ISSUE_UPDATED_WITH_NEW_VALUE":"{{username}} aktualisierte das Attribut \"{{field_name}}\" des Tickets {{obj_name}} zu {{new_value}}","TASK_UPDATED":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Aufgabe {{obj_name}} zu {{new_value}}","TASK_UPDATED_WITH_NEW_VALUE":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Aufgabe {{obj_name}} zu {{new_value}}","TASK_UPDATED_WITH_US":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Aufgabe {{obj_name}} von User-Story {{us_name}}","TASK_UPDATED_WITH_US_NEW_VALUE":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Aufgabe {{obj_name}} die zu der User-Story gehört {{us_name}} zu {{new_value}}","WIKI_UPDATED":"{{username}} aktualisierte die WIKI Seite {{obj_name}}","EPIC_UPDATED":"Attribut \"{{field_name}}\" des Epics {{obj_name}} wurde von {{username}} aktualisiert","EPIC_UPDATED_WITH_NEW_VALUE":"Attribut \"{{field_name}}\" des Epics {{obj_name}} wurde von {{username}} zu aktualisiert","EPIC_UPDATED_WITH_NEW_COLOR":"Feld \"{{field_name}}\" des Epics {{obj_name}} wurde von {{username}} zu aktualisiert","NEW_COMMENT_US":"{{username}} schrieb einen Kommentar in der User-Story {{obj_name}}","NEW_COMMENT_ISSUE":"{{username}} schrieb einen Kommentar im Ticket {{obj_name}}","NEW_COMMENT_TASK":"{{username}} schrieb einen Kommentar in der Aufgabe {{obj_name}}","NEW_COMMENT_EPIC":"{{username}} hat das Epic {{obj_name}} kommentiert","NEW_MEMBER":"{{project_name}} hat ein neues Mitglied","US_ADDED_MILESTONE":"{{username}} fügte dem Sprint {{sprint_name}} die User-Story {{obj_name}} hinzu","US_MOVED":"{{username}} wurde in die Story {{obj_name}} verschoben","US_REMOVED_FROM_MILESTONE":"{{username}} fügte dem Backlog die User-Story {{obj_name}} hinzu","BLOCKED":"{{username}} vermerkte die Blockierung von {{obj_name}}","UNBLOCKED":"{{username}} hob die Blockierung von {{obj_name}} auf","NEW_USER":"{{username}} ist Taiga beigetreten"},"LEGAL":{"TERMS_OF_SERVICE_AND_PRIVACY_POLICY_AD":"When creating a new account, you agree to our terms of service and privacy policy.","GDPR_ANNOUNCEMENT_TITLE":"General Data Protection Regulation (GDPR)","GDPR_ANNOUNCEMENT_DESCRIPTION":"You saw this comming, right? Updates to our Terms of Service","GDPR_ANNOUNCEMENT_INFOLINK":"Please read our announcement here"},"EXTERNAL_APP":{"PAGE_TITLE":"Eine externe Anwendung benötigt eine Genehmigung","PAGE_DESCRIPTION":"Eine externe Anwendung benötigt eine Genehmigung","AUTHORIZATION_REQUEST":"{{application}} erlauben ihren Taiga Account zu benutzen?","LOGIN_WITH_ANOTHER_USER":"Mit einem anderen Benutzer einloggen.","AUTHORIZE_APP":"Anwendung autorisieren","CANCEL":"Abbrechen"},"JOYRIDE":{"NAV":{"NEXT":"Weiter","BACK":"Zurück","SKIP":"Überspringen","DONE":"Erledigt"},"DASHBOARD":{"STEP1":{"TITLE":"Ihr Projekt","TEXT":"Willkommen! Hier wirst du deine Projekte sehen."},"STEP2":{"TITLE":"Zuletzt bearbeitet","TEXT":"Hier wirst du deine User Stories, Tasks und Issues sehen, an denen du arbeitest."},"STEP3":{"TITLE":"Beobachtet","TEXT1":"And right here you will find the ones in your projects that you want to know about.","TEXT2":"Du arbeitest schon mit Taiga ;)"},"STEP4":{"TITLE":"Los geht’s","TEXT1":"Du kannst anfangen, indem du dein erstes Taiga-Projekt startest","TEXT2":"Viel Glück!"}},"BACKLOG":{"STEP1":{"TITLE":"Projektzusammenfassung","TEXT1":"Hier wirst du den Status deines Projektes sehen.","TEXT2":"Du kannst dein Projekt im Adminpanel verwalten."},"STEP2":{"TITLE":"Produkt Backlog","TEXT":"Das Backlog zeigt dir alle Anforderungen (User Stories) für das Projekt an. Hier kannst du auch deine Sprints planen."},"STEP3":{"TITLE":"Sprints","TEXT":"Sprints sind kurze Zeiträume (üblicherweise 2 Wochen) in welchem eine bestimmte Arbeit erledigt und geliefert wird."},"STEP4":{"TITLE":"User-Stories","TEXT":"Dies sind die Anforderungen. Du kannst sie dem Backlog hinzufügen und sie zu einem Sprint hinzufügen."}},"KANBAN":{"STEP1":{"TITLE":"Personalisiere deinen Workflow","TEXT":"Stelle die Spalten für deinen Workflow im Adminpanel ein."},"STEP2":{"TITLE":"User-Stories und Tasks","TEXT":"User Stories sind die Anforderungen an dein Projekt. Du kannst sie zwischen den verschiedenen Spalten hin- und herziehen."},"STEP3":{"TITLE":"User-Stories hinzufügen","TEXT1":"Du möchtest wahrscheinlich eine einzelne User Story (Story Icon) oder mehrere (Mehrfach Icon) hinzufügen.","TEXT2":"Viel Glück!"}}},"DISCOVER":{"PAGE_TITLE":"Entdecke Projekte - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","DISCOVER_TITLE":"Entdecke Projekte","DISCOVER_SUBTITLE":"{projects, plural, one{Ein öffentliches Projekt verfügbar} other{# öffentliche Projekte verfügbar}}","MOST_ACTIVE":"Most active","MOST_ACTIVE_EMPTY":"There are no ACTIVE projects yet","MOST_LIKED":"Most liked","MOST_LIKED_EMPTY":"There are no LIKED projects yet","VIEW_MORE":"Zeige mehr","FEATURED":"Empfohlene Projekte","EMPTY":"Es existieren keine Projekte mit den angegebenen Kriterien
    Versuche es nochmal!","FILTERS":{"ALL":"Alle","KANBAN":"Kanban","SCRUM":"Scrum","PEOPLE":"Auf der Suche nach Mitgliedern?","WEEK":"Letzte Woche","MONTH":"Letzter Monat","YEAR":"Letztes Jahr","ALL_TIME":"All time","CLEAR":"Filter zurücksetzen"},"SEARCH":{"PAGE_TITLE":"Suche - Entdecke Projekte - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","INPUT_PLACEHOLDER":"Geben sie etwas ein...","ACTION_TITLE":"Suche","RESULTS":"Suchergebnisse"}}} \ No newline at end of file diff --git a/dist/v-1527758585938/locales/taiga/locale-en.json b/dist/v-1527758585938/locales/taiga/locale-en.json deleted file mode 100644 index 8e36b3c..0000000 --- a/dist/v-1527758585938/locales/taiga/locale-en.json +++ /dev/null @@ -1 +0,0 @@ -{"COMMON":{"YES":"Yes","NO":"No","OR":"or","LOADING":"Loading...","DATE":"DD MMM YYYY","DATETIME":"DD MMM YYYY HH:mm","SAVE":"Save","CANCEL":"Cancel","ACCEPT":"Accept","DELETE":"Delete","UNLINK":"Unlink","CREATE":"Create","ADD":"Add","COPY_TO_CLIPBOARD":"Copy to clipboard: Ctrl+C","EDIT":"Edit","DRAG":"Drag","TAG_LINE":"Your agile, free, and open source project management tool","TAG_LINE_2":"LOVE YOUR PROJECT","BLOCK":"Block","BLOCK_TITLE":"Block this item for example if it has a dependency that can not be satisfied","BLOCKED":"Blocked","UNBLOCK":"Unblock","UNBLOCK_TITLE":"Unblock this item","BLOCKED_NOTE":"Why is this blocked?","BLOCKED_REASON":"Please explain the reason","CREATED_BY":"Created by {{fullDisplayName}}","CLOSE":"close","GO_HOME":"Take me home","PLUGINS":"Plugins","ONE_ITEM_LINE":"One item per line...","NEW_BULK":"New bulk insert","RELATED_TASKS":"Related tasks","PREVIOUS":"Previous","NEXT":"Next","LOGOUT":"Logout","EXTERNAL_USER":"an external user","GENERIC_ERROR":"One of our Oompa Loompas says {{error}}.","IOCAINE_TEXT":"This member is feeling a bit overwhelmed by this task. Will become immune to the iocaine poison over time with your help. For now, may need a hug.","CLIENT_REQUIREMENT":"Client requirement is new requirement that was not previously expected and it is required to be part of the project","TEAM_REQUIREMENT":"Team requirement is a requirement that must exist in the project but should have no cost for the client","OWNER":"Project Owner","CAPSLOCK_WARNING":"Be careful! You are using capital letters in an input field that is case sensitive.","CONFIRM_CLOSE_EDIT_MODE_TITLE":"Are you sure you want to close the edit mode?","CONFIRM_CLOSE_EDIT_MODE_MESSAGE":"Remember that if you close the edit mode without saving all the changes will be lost","RELATED_USERSTORIES":"Related user stories","CARD":{"ASSIGN_TO":"Assign To","EDIT":"Edit card","DELETE":"Delete card"},"FORM_ERRORS":{"DEFAULT_MESSAGE":"This value seems to be invalid.","TYPE_EMAIL":"This value should be a valid email.","TYPE_URL":"This value should be a valid url.","TYPE_URLSTRICT":"This value should be a valid url.","TYPE_NUMBER":"This value should be a valid number.","TYPE_DIGITS":"This value should be digits.","TYPE_DATEISO":"This value should be a valid date (YYYY-MM-DD).","TYPE_ALPHANUM":"This value should be alphanumeric.","TYPE_PHONE":"This value should be a valid phone number.","NOTNULL":"This value should not be null.","NOT_BLANK":"This value should not be blank.","REQUIRED":"This value is required.","REGEXP":"This value seems to be invalid.","MIN":"This value should be greater than or equal to %s.","MAX":"This value should be lower than or equal to %s.","RANGE":"This value should be between %s and %s.","MIN_LENGTH":"This value is too short. It should have %s characters or more.","MAX_LENGTH":"This value is too long. It should have %s characters or less.","RANGE_LENGTH":"This value length is invalid. It should be between %s and %s characters long.","MIN_CHECK":"You must select at least %s choices.","MAX_CHECK":"You must select %s choices or less.","RANGE_CHECK":"You must select between %s and %s choices.","EQUAL_TO":"This value should be the same.","LINEWIDTH":"One or more lines is perhaps too long. Try to keep under %s characters.","PIKADAY":"Invalid date format, please use DD MMM YYYY (like 23 Mar 1984)"},"PICKERDATE":{"FORMAT":"DD MMM YYYY","IS_RTL":"false","FIRST_DAY_OF_WEEK":"1","PREV_MONTH":"Previous Month","NEXT_MONTH":"Next Month","MONTHS":{"JAN":"January","FEB":"February","MAR":"March","APR":"April","MAY":"May","JUN":"June","JUL":"July","AUG":"August","SEP":"September","OCT":"October","NOV":"November","DEC":"December"},"WEEK_DAYS":{"SUN":"Sunday","MON":"Monday","TUE":"Tuesday","WED":"Wednesday","THU":"Thursday","FRI":"Friday","SAT":"Saturday"},"WEEK_DAYS_SHORT":{"SUN":"Sun","MON":"Mon","TUE":"Tue","WED":"Wed","THU":"Thu","FRI":"Fri","SAT":"Sat"}},"SEE_USER_PROFILE":"See {{username }} profile","USER_STORY":"User story","TASK":"Task","ISSUE":"Issue","EPIC":"Epic","TAGS":{"PLACEHOLDER":"Enter tag","DELETE":"Delete tag","ADD":"Add tag"},"DESCRIPTION":{"EMPTY":"Empty space is so boring... go on be descriptive...","NO_DESCRIPTION":"No description yet"},"FIELDS":{"SUBJECT":"Subject","NAME":"Name","URL":"URL","DESCRIPTION":"Description","VALUE":"Value","SLUG":"Slug","COLOR":"Color","IS_CLOSED":"Is closed?","STATUS":"Status","TYPE":"Type","SEVERITY":"Severity","PRIORITY":"Priority","ASSIGNED_TO":"Assigned to","ASSIGNED_USERS":"Assigned users","POINTS":"Points","IS_BLOCKED":"is blocked","REF":"Ref","VOTES":"Votes","SPRINT":"Sprint","DUE_DATE":"Due date","DUE_DATE_REASON":"Due date reason"},"ROLES":{"ALL":"All"},"ASSIGNED_TO":{"NOT_ASSIGNED":"Not assigned","ASSIGN":"Assign","DELETE_ASSIGNMENT":"Delete assignment","REMOVE_ASSIGNED":"Remove assigned","TOO_MANY":"...too many users, keep filtering","CONFIRM_UNASSIGNED":"Are you sure you want to leave it unassigned?","TITLE_ACTION_EDIT_ASSIGNMENT":"Edit assignment","SELF":"Assign to me"},"DUE_DATE":{"TITLE_ACTION_SET_DUE_DATE":"Set due date","DUE_SOON":"due soon","PAST_DUE":"past due date","NO_LONGER_APPLICABLE":"no longer applicable"},"ASSIGNED_USERS":{"ADD":"Select assigned user","ADD_ASSIGNED":"Add assigned","TITLE_LIGHTBOX_DELETE_ASSIGNED":"Delete assigned..."},"STATUS":{"CLOSED":"Closed","OPEN":"Open"},"WATCHERS":{"WATCHERS":"Watchers","ADD":"Add watchers","TITLE_ADD":"Add a project member to the watchers list","DELETE":"Delete watcher","TITLE_LIGHTBOX_DELETE_WARTCHER":"Delete watcher..."},"WATCH_BUTTON":{"WATCH":"Watch","WATCHING":"Watching","UNWATCH":"Unwatch","WATCHERS":"Watchers","BUTTON_TITLE":"Watch/Unwatch this item","COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}"},"VOTE_BUTTON":{"BUTTON_TITLE":"Upvote/Downvote this item","COUNTER_TITLE":"{total, plural, one{one vote} other{# votes}}"},"CUSTOM_ATTRIBUTES":{"CUSTOM_FIELDS":"Custom Fields","SAVE":"Save Custom Field","EDIT":"Edit Custom Field","DELETE":"Delete custom attribute","CONFIRM_DELETE":"Remeber that all values in this custom field will be deleted.\n Are you sure you want to continue?"},"FILTERS":{"INPUT_PLACEHOLDER":"Subject or reference","TITLE_ACTION_FILTER_BUTTON":"search","TITLE":"Filters","TITLE_ACTION_SEARCH":"Search","ACTION_SAVE_CUSTOM_FILTER":"save as custom filter","PLACEHOLDER_FILTER_NAME":"Write the filter name and press enter","APPLIED_FILTERS_NUM":"filters applied","CATEGORIES":{"TYPE":"Type","STATUS":"Status","SEVERITY":"Severity","PRIORITIES":"Priorities","TAGS":"Tags","ASSIGNED_TO":"Assigned to","ROLE":"Role","CREATED_BY":"Created by","CUSTOM_FILTERS":"Custom filters","EPIC":"Epic"}},"WYSIWYG":{"CODE_SNIPPET":"Code Snippet","DB_CLICK":"double click to edit","SELECT_LANGUAGE_PLACEHOLDER":"Select Language","SELECT_LANGUAGE_REMOVE_FORMATING":"Remove formatting","OUTDATED":"Another person has made changes while you were editing. Check the new version on the activity tab before you save your changes.","MARKDOWN_HELP":"Markdown syntax help"},"PERMISIONS_CATEGORIES":{"EPICS":{"NAME":"Epics","VIEW_EPICS":"View epics","ADD_EPICS":"Add epics","MODIFY_EPICS":"Modify epics","COMMENT_EPICS":"Comment epics","DELETE_EPICS":"Delete epics"},"SPRINTS":{"NAME":"Sprints","VIEW_SPRINTS":"View sprints","ADD_SPRINTS":"Add sprints","MODIFY_SPRINTS":"Modify sprints","DELETE_SPRINTS":"Delete sprints"},"USER_STORIES":{"NAME":"User Stories","VIEW_USER_STORIES":"View user stories","ADD_USER_STORIES":"Add user stories","MODIFY_USER_STORIES":"Modify user stories","COMMENT_USER_STORIES":"Comment user stories","DELETE_USER_STORIES":"Delete user stories"},"TASKS":{"NAME":"Tasks","VIEW_TASKS":"View tasks","ADD_TASKS":"Add tasks","MODIFY_TASKS":"Modify tasks","COMMENT_TASKS":"Comment tasks","DELETE_TASKS":"Delete tasks"},"ISSUES":{"NAME":"Issues","VIEW_ISSUES":"View issues","ADD_ISSUES":"Add issues","MODIFY_ISSUES":"Modify issues","COMMENT_ISSUES":"Comment issues","DELETE_ISSUES":"Delete issues"},"WIKI":{"NAME":"Wiki","VIEW_WIKI_PAGES":"View wiki pages","ADD_WIKI_PAGES":"Add wiki pages","MODIFY_WIKI_PAGES":"Modify wiki pages","DELETE_WIKI_PAGES":"Delete wiki pages","VIEW_WIKI_LINKS":"View wiki links","ADD_WIKI_LINKS":"Add wiki links","DELETE_WIKI_LINKS":"Delete wiki links"}}},"LOGIN":{"PAGE_TITLE":"Login - Taiga","PAGE_DESCRIPTION":"Logging in to Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"AUTH":{"INVITED_YOU":"has invited you to join the project","NOT_REGISTERED_YET":"Not registered yet?","REGISTER":"Register","CREATE_ACCOUNT":"create your free account here"},"LOGIN_COMMON":{"HEADER":"I already have a Taiga login","PLACEHOLDER_AUTH_NAME":"Username or email (case sensitive)","LINK_FORGOT_PASSWORD":"Forgot it?","TITLE_LINK_FORGOT_PASSWORD":"Did you forget your password?","ACTION_ENTER":"Enter","ACTION_SIGN_IN":"Login","PLACEHOLDER_AUTH_PASSWORD":"Password (case sensitive)","ALT_LOGIN":"Or login with"},"LOGIN_FORM":{"ERROR_AUTH_INCORRECT":"According to our Oompa Loompas, your username/email or password are incorrect.","SUCCESS":"Our Oompa Loompas are happy, welcome to Taiga."},"REGISTER":{"PAGE_TITLE":"Register - Taiga","PAGE_DESCRIPTION":"Create your account in Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"REGISTER_FORM":{"TITLE":"Register a new Taiga account (free)","PLACEHOLDER_NAME":"Pick a username (case sensitive)","PLACEHOLDER_FULL_NAME":"Pick your full name","PLACEHOLDER_EMAIL":"Your email","PLACEHOLDER_PASSWORD":"Set a password (case sensitive)","ACTION_SIGN_UP":"Sign up","TITLE_LINK_LOGIN":"Log in","LINK_LOGIN":"Are you already registered? Log in"},"FORGOT_PASSWORD":{"PAGE_TITLE":"Forgot password - Taiga","PAGE_DESCRIPTION":"Enter your username or email to get a new password and you can access to Taiga again."},"FORGOT_PASSWORD_FORM":{"TITLE":"Oops, did you forget your password?","SUBTITLE":"Enter your username or email to get a new one","PLACEHOLDER_FIELD":"Username or email","ACTION_RESET_PASSWORD":"Reset Password","LINK_CANCEL":"Nah, take me back. I think I remember it.","SUCCESS_TITLE":"Check your inbox!","SUCCESS_TEXT":"We sent you an email with the instructions to set a new password","ERROR":"According to our Oompa Loompas, your are not registered yet."},"CHANGE_PASSWORD":{"PAGE_TITLE":"Change you password - Taiga","SECTION_NAME":"Change password","FIELD_CURRENT_PASSWORD":"Current password","PLACEHOLDER_CURRENT_PASSWORD":"Your current password (or empty if you have no password yet)","FIELD_NEW_PASSWORD":"New password","PLACEHOLDER_NEW_PASSWORD":"Type a new password","FIELD_RETYPE_PASSWORD":"Retype new password","PLACEHOLDER_RETYPE_PASSWORD":"Retype the new password","ERROR_PASSWORD_MATCH":"The passwords doesn't match"},"CHANGE_PASSWORD_RECOVERY_FORM":{"TITLE":"Create a new Taiga pass","SUBTITLE":"And hey, you may want to eat some more iron-rich food, it's good for your brain :P","PLACEHOLDER_NEW_PASSWORD":"New password","PLACEHOLDER_RE_TYPE_NEW_PASSWORD":"Re-type new password","ACTION_RESET_PASSWORD":"Reset Password","ERROR":"Our Oompa Loompas can't find your request to recover your password. Try to ask for it again.","SUCCESS":"Our Oompa Loompas saved your new password.
    Try to sign in with it."},"INVITATION":{"PAGE_TITLE":"Invitation acceptance - Taiga","PAGE_DESCRIPTION":"Accept the invitation to join a project in Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"INVITATION_LOGIN_FORM":{"NOT_FOUND":"Our Oompa Loompas can't find your invitation.","SUCCESS":"You've successfully joined this project, Welcome to {{project_name}}"},"HOME":{"PAGE_TITLE":"Home - Taiga","PAGE_DESCRIPTION":"The Taiga home page with your main projects and all your assigned and watched user stories, tasks and issues","EMPTY_WORKING_ON":"It feels empty, doesn't it? Start working with Taiga and you'll see here the stories, tasks and issues you are working on.","EMPTY_WATCHING":"Follow User Stories, Tasks, Issues in your projects and be notified about its changes :)","EMPTY_PROJECT_LIST":"You don't have any projects yet","WORKING_ON_SECTION":"Working on","WATCHING_SECTION":"Watching","DASHBOARD":"Projects Dashboard"},"EPICS":{"TITLE":"EPICS","SECTION_NAME":"Epics","EPIC":"EPIC","PAGE_TITLE":"Epics - {{projectName}}","PAGE_DESCRIPTION":"The epics list of the project {{projectName}}: {{projectDescription}}","DASHBOARD":{"ADD":"+ ADD EPIC","UNASSIGNED":"Unassigned"},"EMPTY":{"TITLE":"It looks like there aren't any epics yet","EXPLANATION":"Epics are items at a higher level that encompass user stories.
    Epics are at the top of the hierarchy and can be used to group user stories together.","HELP":"Learn more about epics"},"TABLE":{"VOTES":"Votes","NAME":"Name","PROJECT":"Project","SPRINT":"Sprint","ASSIGNED_TO":"Assigned","STATUS":"Status","PROGRESS":"Progress","VIEW_OPTIONS":"View options"},"CREATE":{"TITLE":"New Epic","PLACEHOLDER_DESCRIPTION":"Please add descriptive text to help others better understand this epic","TEAM_REQUIREMENT":"Team requirement","CLIENT_REQUIREMENT":"Client requirement","BLOCKED":"Blocked","BLOCKED_NOTE_PLACEHOLDER":"Why is this epic blocked?","CREATE_EPIC":"Create epic"}},"PROJECTS":{"PAGE_TITLE":"My projects - Taiga","PAGE_DESCRIPTION":"A list with all your projects, you can reorder or create a new one.","MY_PROJECTS":"My projects"},"ATTACHMENT":{"SECTION_NAME":"attachments","TITLE":"{{ fileName }} uploaded on {{ date }}","LIST_VIEW_MODE":"List view mode","GALLERY_VIEW_MODE":"Gallery view mode","DESCRIPTION":"Type a short description","DEPRECATED":"(deprecated)","DEPRECATED_FILE":"Deprecated?","ADD":"Add new attachment. {{maxFileSizeMsg}}","DROP":"Drop attachments here!","SHOW_DEPRECATED":"+ show deprecated attachments","HIDE_DEPRECATED":"- hide deprecated attachments","COUNT_DEPRECATED":"({{ counter }} deprecated)","MAX_UPLOAD_SIZE":"Maximum upload size is {{maxFileSize}}","DATE":"DD MMM YYYY [at] hh:mm","ERROR_UPLOAD_ATTACHMENT":"We have not been able to upload '{{fileName}}'. {{errorMessage}}","TITLE_LIGHTBOX_DELETE_ATTACHMENT":"Delete attachment...","MSG_LIGHTBOX_DELETE_ATTACHMENT":"the attachment '{{fileName}}'","ERROR_DELETE_ATTACHMENT":"We have not been able to delete: {{errorMessage}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) is too heavy for our Oompa Loompas, try it with a smaller than ({{maxFileSize}})"},"PAGINATION":{"PREVIOUS":"Prev","NEXT":"Next"},"ADMIN":{"COMMON":{"TITLE_ACTION_EDIT_VALUE":"Edit value","TITLE_ACTION_DELETE_VALUE":"Delete value","TITLE_ACTION_DELETE_TAG":"Delete tag"},"HELP":"Do you need help? Check out our support page!","PROJECT_DEFAULT_VALUES":{"TITLE":"Default Values","SUBTITLE":"Set default values for all selector inputs."},"MEMBERSHIPS":{"TITLE":"Manage members","PAGE_TITLE":"Memberships - {{projectName}}","ADD_BUTTON":"+ New member","ADD_BUTTON_TITLE":"Add new member","LIMIT_USERS_WARNING_MESSAGE_FOR_ADMIN":"Unfortunately, this project has reached its limit of ({{members}}) allowed members.","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"This project has reached its limit of ({{members}}) allowed members. If you would like to increase that limit please contact the administrator."},"PROJECT_EXPORT":{"TITLE":"Export","SUBTITLE":"Export your project to save a backup or to create a new one based on this.","EXPORT_BUTTON":"Export","EXPORT_BUTTON_TITLE":"Export your project","LOADING_TITLE":"We are generating your dump file","DUMP_READY":"Your dump file is ready!","LOADING_MESSAGE":"Please don't close this page.","ASYNC_MESSAGE":"We will send you an email when ready.","SYNC_MESSAGE":"If the download doesn't start automatically click here.","ERROR":"Our Oompa Loompas have some problems generating your dump. Please try it again.","ERROR_BUSY":"Sorry, our Oompa Loompas are very busy right now. Please try again in a few minutes."},"MODULES":{"TITLE":"Modules","EPICS":"Epics","EPICS_DESCRIPTION":"Visualize and manage the most strategic part of your project","BACKLOG":"Backlog","BACKLOG_DESCRIPTION":"Manage your user stories to maintain an organized view of upcoming and prioritized work.","NUMBER_SPRINTS":"Expected number of sprints","NUMBER_SPRINTS_HELP":"0 for an undetermined number","NUMBER_US_POINTS":"Expected total of story points","NUMBER_US_POINTS_HELP":"0 for an undetermined number","KANBAN":"Kanban","KANBAN_DESCRIPTION":"Organize your project in a lean way with this board.","ISSUES":"Issues","ISSUES_DESCRIPTION":"Track the bugs, questions and enhancements related to your project. Don't miss anything!","WIKI":"Wiki","WIKI_DESCRIPTION":"Add, modify, or delete content in collaboration with others. This is the right place for your project documentation.","MEETUP":"Meet Up","MEETUP_DESCRIPTION":"Choose your videoconference system.","SELECT_VIDEOCONFERENCE":"Select a videoconference system","SALT_CHAT_ROOM":"Add a prefix to the chatroom name","JITSI_CHAT_ROOM":"Jitsi","APPEARIN_CHAT_ROOM":"AppearIn","TALKY_CHAT_ROOM":"Talky","CUSTOM_CHAT_ROOM":"Custom","URL_CHAT_ROOM":"URL of your chat room"},"PROJECT_PROFILE":{"PAGE_TITLE":"{{sectionName}} - Project profile - {{projectName}}","PROJECT_DETAILS":"Project details","PROJECT_NAME":"Project name","TAGS":"Tags","DESCRIPTION":"Description","RECRUITING":"Is this project looking for people?","RECRUITING_MESSAGE":"Who are you looking for?","RECRUITING_PLACEHOLDER":"Define the profiles you are looking for","FEEDBACK":"Receive feedback from Taiga users?","PUBLIC_PROJECT":"Public project","PRIVATE_PROJECT":"Private project","PRIVATE_OR_PUBLIC":"What's the difference between public and private projects?","DELETE":"Delete this project","CHANGE_LOGO":"Change logo","ACTION_USE_DEFAULT_LOGO":"Use default image","MAX_PRIVATE_PROJECTS":"You've reached the maximum number of private projects allowed by your current plan","MAX_PRIVATE_PROJECTS_MEMBERS":"The maximum number of members for private projects has been exceeded","MAX_PUBLIC_PROJECTS":"Unfortunately, you've reached the maximum number of public projects allowed by your current plan","MAX_PUBLIC_PROJECTS_MEMBERS":"The project exceeds your maximum number of members for public projects","PROJECT_OWNER":"Project owner","REQUEST_OWNERSHIP":"Request ownership","REQUEST_OWNERSHIP_CONFIRMATION_TITLE":"Do you want to become the new project owner?","REQUEST_OWNERSHIP_DESC":"Request that current project owner {{name}} transfer ownership of this project to you.","REQUEST_OWNERSHIP_BUTTON":"Request","REQUEST_OWNERSHIP_SUCCESS":"We'll notify the project owner","CHANGE_OWNER":"Change owner","CHANGE_OWNER_SUCCESS_TITLE":"Ok, your request has been sent!","CHANGE_OWNER_SUCCESS_DESC":"We will notify you by email if the project ownership request is accepted or declined"},"REPORTS":{"TITLE":"Reports","SUBTITLE":"Export your project data in CSV format and make your own reports.","DESCRIPTION":"Download a CSV file or copy the generated URL and open it in your favourite text editor or spreadsheet to make your own project data reports. You will be able to visualize and analyze all your data easily.","HELP":"How to use this on my own spreadsheet?","REGENERATE_TITLE":"Change URL","REGENERATE_SUBTITLE":"You going to change the CSV data access url. The previous url will be disabled. Are you sure?"},"CSV":{"SECTION_TITLE_EPIC":"epics reports","SECTION_TITLE_US":"user stories reports","SECTION_TITLE_TASK":"tasks reports","SECTION_TITLE_ISSUE":"issues reports","DOWNLOAD":"Download CSV","URL_FIELD_PLACEHOLDER":"Please regenerate CSV url","TITLE_REGENERATE_URL":"Regenerate CSV url","ACTION_GENERATE_URL":"Generate Url","ACTION_REGENERATE":"Regenerate"},"CUSTOM_FIELDS":{"TITLE":"Custom Fields","SUBTITLE":"Specify the custom fields for your user stories, tasks and issues","EPIC_DESCRIPTION":"Epics custom fields","EPIC_ADD":"Add a custom field in epics","US_DESCRIPTION":"User stories custom fields","US_ADD":"Add a custom field in user stories","TASK_DESCRIPTION":"Tasks custom fields","TASK_ADD":"Add a custom field in tasks","ISSUE_DESCRIPTION":"Issues custom fields","ISSUE_ADD":"Add a custom field in issues","FIELD_TYPE_TEXT":"Text","FIELD_TYPE_RICHTEXT":"Rich text","FIELD_TYPE_MULTI":"Multi-line","FIELD_TYPE_DATE":"Date","FIELD_TYPE_URL":"Url"},"PROJECT_VALUES":{"PAGE_TITLE":"{{sectionName}} - Project values - {{projectName}}","REPLACEMENT":"All items with this value will be changed to","ERROR_DELETE_ALL":"You can't delete all values."},"PROJECT_VALUES_POINTS":{"TITLE":"Points","SUBTITLE":"Specify the points your user stories could be estimated to","US_TITLE":"US points","ACTION_ADD":"Add new point"},"PROJECT_VALUES_PRIORITIES":{"TITLE":"Priorities","SUBTITLE":"Specify the priorities your issues will have","ISSUE_TITLE":"Issue priorities","ACTION_ADD":"Add new priority"},"PROJECT_VALUES_SEVERITIES":{"TITLE":"Severities","SUBTITLE":"Specify the severities your issues will have","ISSUE_TITLE":"Issue severities","ACTION_ADD":"Add new severity"},"PROJECT_VALUES_STATUS":{"TITLE":"Statuses","SUBTITLE":"Specify the statuses your user stories, tasks and issues will go through","EPIC_TITLE":"Epic Statuses","US_TITLE":"User Story Statuses","TASK_TITLE":"Task Statuses","ISSUE_TITLE":"Issue Statuses"},"PROJECT_VALUES_TYPES":{"TITLE":"Types","SUBTITLE":"Specify the types your issues could be","ISSUE_TITLE":"Issues types","ACTION_ADD":"Add new {{objName}}"},"PROJECT_VALUES_TAGS":{"TITLE":"Tags","SUBTITLE":"View and edit the color of your tags","EMPTY":"Currently there are no tags","EMPTY_SEARCH":"It looks like nothing was found with your search criteria","ACTION_ADD":"Add tag","NEW_TAG":"New tag","MIXING_HELP_TEXT":"Select the tags that you want to merge","MIXING_MERGE":"Merge Tags","SELECTED":"Selected"},"ROLES":{"PAGE_TITLE":"Roles - {{projectName}}","WARNING_NO_ROLE":"Be careful, no role in your project will be able to estimate the point value for user stories","HELP_ROLE_ENABLED":"When enabled, members assigned to this role will be able to estimate the point value for user stories","DISABLE_COMPUTABLE_ALERT_TITLE":"Are you sure you want to disable this role estimations?","DISABLE_COMPUTABLE_ALERT_SUBTITLE":"If you disable estimation permissions for role {{roleName}} all previous estimations made by this role will be removed","COUNT_MEMBERS":"{{ role.members_count }} members with this role","TITLE_DELETE_ROLE":"Delete Role","REPLACEMENT_ROLE":"All the users with this role will be moved to","WARNING_DELETE_ROLE":"Be careful! All role estimations will be removed","ERROR_DELETE_ALL":"You can't delete all values","EXTERNAL_USER":"External user","NOTE_EXTERNAL_USERS":"Note: by External User we mean any anonymous user not belonging to the Taiga platform, including search engines. Please use this role with care."},"THIRD_PARTIES":{"SECRET_KEY":"Secret key","PAYLOAD_URL":"Payload URL","VALID_IPS":"Valid origin IPs (separated by ,)"},"BITBUCKET":{"SECTION_NAME":"Bitbucket","PAGE_TITLE":"Bitbucket - {{projectName}}","INFO_VERIFYING_IP":"Bitbucket requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."},"GITLAB":{"SECTION_NAME":"Gitlab","PAGE_TITLE":"Gitlab - {{projectName}}","INFO_VERIFYING_IP":"Gitlab requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."},"GITHUB":{"SECTION_NAME":"GitHub","PAGE_TITLE":"GitHub - {{projectName}}"},"GOGS":{"SECTION_NAME":"Gogs","PAGE_TITLE":"Gogs - {{projectName}}"},"WEBHOOKS":{"PAGE_TITLE":"Webhooks - {{projectName}}","SECTION_NAME":"Webhooks","ADD_NEW":"Add a New Webhook","TYPE_NAME":"Type the service name","TYPE_PAYLOAD_URL":"Type the service payload url","TYPE_SERVICE_SECRET":"Type the service secret key","SAVE":"Save Webhook","CANCEL":"Cancel Webhook","SHOW_HISTORY":"(Show history)","TEST":"Test Webhook","EDIT":"Edit Webhook","DELETE":"Delete Webhook","REQUEST":"Request","RESEND_REQUEST":"Resend request","HEADERS":"Headers","PAYLOAD":"Payload","RESPONSE":"Response","DATE":"DD MMM YYYY [at] hh:mm:ss","ACTION_HIDE_HISTORY":"(Hide history)","ACTION_HIDE_HISTORY_TITLE":"Hide history details","ACTION_SHOW_HISTORY":"(Show history)","ACTION_SHOW_HISTORY_TITLE":"Show history details","WEBHOOK_NAME":"Webhook '{{name}}'"},"CUSTOM_ATTRIBUTES":{"PAGE_TITLE":"{{sectionName}} - Custom Attributes - {{projectName}}","ADD":"Add custom field","EDIT":"Edit Custom Field","DELETE":"Delete Custom Field","SAVE_TITLE":"Save Custom Field","CANCEL_TITLE":"Cancel creation","SET_FIELD_NAME":"Set your custom field name","SET_FIELD_DESCRIPTION":"Set your custom field description","FIELD_TYPE_DEFAULT":"-- select one --","ACTION_UPDATE":"Update Custom Field","ACTION_CANCEL_EDITION":"Cancel edition"},"MEMBERSHIP":{"COLUMN_MEMBER":"Member","COLUMN_ADMIN":"Admin","COLUMN_ROLE":"Role","COLUMN_STATUS":"Status","STATUS_ACTIVE":"Active","STATUS_PENDING":"Pending","DELETE_MEMBER":"Delete member","RESEND":"Resend","SUCCESS_SEND_INVITATION":"We've sent the invitation again to '{{email}}'.","SUCCESS_DELETE":"We've deleted {{message}}.","ERROR_DELETE":"We have not been able to delete {{message}}.","DEFAULT_DELETE_MESSAGE":"the invitation to {{email}}"},"DEFAULT_VALUES":{"LABEL_EPIC_STATUS":"Default value for epic status selector","LABEL_US_STATUS":"Default value for user story status selector","LABEL_POINTS":"Default value for points selector","LABEL_TASK_STATUS":"Default value for task status selector","LABEL_ISSUE_TYPE":"Default value for issue type selector","LABEL_ISSUE_STATUS":"Default value for issue status selector","LABEL_PRIORITY":"Default value for priority selector","LABEL_SEVERITY":"Default value for severity selector"},"STATUS":{"PLACEHOLDER_WRITE_STATUS_NAME":"Write a name for the new status"},"TYPES":{"PLACEHOLDER_WRITE_NAME":"Write a name for the new element"},"US_STATUS":{"ACTION_ADD_STATUS":"Add new status","IS_ARCHIVED_COLUMN":"Archived","IS_CLOSED_COLUMN":"Closed","WIP_LIMIT_COLUMN":"WIP Limit","PLACEHOLDER_WRITE_NAME":"Write a name for the new status"},"MENU":{"PROJECT":"Project","ATTRIBUTES":"Attributes","MEMBERS":"Members","PERMISSIONS":"Permissions","INTEGRATIONS":"Integrations"},"SUBMENU_PROJECT_VALUES":{"STATUS":"Status","POINTS":"Points","PRIORITIES":"Priorities","SEVERITIES":"Severities","TYPES":"Types","CUSTOM_FIELDS":"Custom fields","TAGS":"Tags"},"SUBMENU_ROLES":{"TITLE":"Roles","ACTION_NEW_ROLE":"+ New role","TITLE_ACTION_NEW_ROLE":"Add new role"},"PROJECT_TRANSFER":{"DO_YOU_ACCEPT_PROJECT_OWNERNSHIP":"Would you like to become the new project owner?","PRIVATE":"Private","ACCEPTED_PROJECT_OWNERNSHIP":"Congratulations! You're now the new project owner.","REJECTED_PROJECT_OWNERNSHIP":"OK. We'll contact the current project owner","ACCEPT":"Accept","REJECT":"Reject","PROPOSE_OWNERSHIP":"{{owner}}, the current owner of the project {{project}} has asked that you become the new project owner.","ADD_COMMENT":"Would you like to add a comment for the project owner?","UNLIMITED_PROJECTS":"Unlimited","OWNER_MESSAGE":{"PRIVATE":"Please remember that you can own up to {{maxProjects}} private projects. You currently own {{currentProjects}} private projects","PUBLIC":"Please remember that you can own up to {{maxProjects}} public projects. You currently own {{currentProjects}} public projects"},"CANT_BE_OWNED":"At the moment you cannot become an owner of a project of this type. If you would like to become the owner of this project, please contact the administrator so they change your account settings to enable project ownership."}},"USER":{"PROFILE":{"PAGE_TITLE":"{{userFullName}} (@{{userUsername}})","EDIT":"Edit profile","CLOSED_US":"Closed US","PROJECTS":"Projects","PROJECTS_EMPTY":"{{username}} doesn't' have projects yet","CONTACTS":"Contacts","CONTACTS_EMPTY":"{{username}} doesn't have contacts yet","CURRENT_USER_CONTACTS_EMPTY":"You don't have contacts yet","CURRENT_USER_CONTACTS_EMPTY_EXPLAIN":"The people with whom you work at Taiga will be your contacts automatically","TABS":{"ACTIVITY_TAB":"Timeline","ACTIVITY_TAB_TITLE":"Show all the activity of this user","PROJECTS_TAB":"Projects","PROJECTS_TAB_TITLE":"List of all projects in which the user is a member","LIKES_TAB":"Likes","LIKES_TAB_TITLE":"List all likes made by this user","VOTES_TAB":"Votes","VOTES_TAB_TITLE":"List all votes made by this user","WATCHED_TAB":"Watched","WATCHED_TAB_TITLE":"List all item watched by this user","CONTACTS_TAB":"Contacts","CONTACTS_TAB_TITLE":"List all contacts made by this user"}},"PROFILE_SIDEBAR":{"TITLE":"Your profile","DESCRIPTION":"People can see everything you do and what you are working on. Add a nice bio to give an enhanced version of your information.","ADD_INFO":"Edit bio"},"PROFILE_FAVS":{"FILTER_INPUT_PLACEHOLDER":"Type something...","FILTER_TYPE_ALL":"All","FILTER_TYPE_ALL_TITLE":"Show all","FILTER_TYPE_PROJECTS":"Projects","FILTER_TYPE_PROJECTS_TITLE":"Show only projects","FILTER_TYPE_EPICS":"Epics","FILTER_TYPE_EPICS_TITLE":"Show only epics","FILTER_TYPE_USER_STORIES":"Stories","FILTER_TYPE_USER_STORIES_TITLE":"Show only user stories","FILTER_TYPE_TASKS":"Tasks","FILTER_TYPE_TASKS_TITLE":"Show only tasks","FILTER_TYPE_ISSUES":"Issues","FILTER_TYPE_ISSUES_TITLE":"Show only issues","EMPTY_TITLE":"It looks like there's nothing to show here."}},"PROJECT":{"PAGE_TITLE":"{{projectName}}","HELP":"Reorder your projects to set in the top the most used ones.
    The top 10 projects will appear in the top navigation bar project list","PRIVATE":"Private project","LOOKING_FOR_PEOPLE":"This project is looking for people","FANS_COUNTER_TITLE":"{total, plural, one{one fan} other{# fans}}","WATCHERS_COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}","MEMBERS_COUNTER_TITLE":"{total, plural, one{one member} other{# members}}","BLOCKED_PROJECT":{"BLOCKED":"Blocked project","THIS_PROJECT_IS_BLOCKED":"This project is temporarily blocked","TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF":"In order to unblock your projects, contact the administrator."},"SECTION":{"SEARCH":"Search","TIMELINE":"Timeline","BACKLOG":"Backlog","KANBAN":"Kanban","ISSUES":"Issues","WIKI":"Wiki","TEAM":"Team","MEETUP":"Meet Up","ADMIN":"Admin"},"NAVIGATION":{"ACTION_CREATE_PROJECT":"Create project","MANAGE_PROJECTS":"Manage projects","TITLE_CREATE_PROJECT":"Create project","HELP_TITLE":"Taiga Support Page","HELP":"Help","HOMEPAGE":"Homepage","FEEDBACK_TITLE":"Send feedback","FEEDBACK":"Feedback","NOTIFICATIONS_TITLE":"Edit your notification settings","NOTIFICATIONS":"Notifications","VIEW_PROFILE_TITLE":"View Profile","VIEW_PROFILE":"View Profile","EDIT_PROFILE_TITLE":"Edit your profile","EDIT_PROFILE":"Edit Profile","CHANGE_PASSWORD_TITLE":"Change password","CHANGE_PASSWORD":"Change password","DASHBOARD_TITLE":"Dashboard","DISCOVER_TITLE":"Discover trending projects","DISCOVER":"Discover"},"LIKE_BUTTON":{"LIKE":"Like","LIKED":"Liked","UNLIKE":"Unlike","BUTTON_TITLE":"Like or unlike this project","COUNTER_TITLE":"{total, plural, one{one fan} other{# fans}}"},"WATCH_BUTTON":{"BUTTON_TITLE":"Watch this project and set notification policy","WATCH":"Watch","WATCHING":"Watching","COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}","OPTIONS":{"NOTIFY_ALL":"Receive all notifications","NOTIFY_ALL_TITLE":"Receive all notifications for this project","NOTIFY_INVOLVED":"Only involved","NOTIFY_INVOLVED_TITLE":"Recive notificacions only when you are involved","UNWATCH":"Unwatch","UNWATCH_TITLE":"Unwatch this project"}},"CONTACT_BUTTON":{"CONTACT_TITLE":"Contact the project team","CONTACT_BUTTON":"Contact the project"},"CREATE":{"TITLE":"Create Project","CHOOSE_TEMPLATE":"Which template fits your project better?","TEMPLATE_SCRUM":"Scrum","TEMPLATE_SCRUM_DESC":"Prioritize and solve your tasks in short time cycles.","TEMPLATE_SCRUM_LONGDESC":"Scrum is an iterative and incremental agile software development methodology for managing product development.\nThe product backlog is what will ultimately be delivered, ordered into the sequence in which it should be delivered. Product Backlogs are broken into manageable, executable chunks named sprints. Every certain amount of time the team initiates a new sprint and commits to deliver a certain number of user stories from the backlog, in accordance with their skills, abilities and resources. The project advances as the backlog becomes depleted.","TEMPLATE_KANBAN":"Kanban","TEMPLATE_KANBAN_DESC":"Keep a constant workflow on independent tasks","TEMPLATE_KANBAN_LONGDESC":"The Kanban methodology is used to divide project development (any sort of project) into stages.\nA kanban card is like an index card or post-it note that details every task (or user story) in a project that needs to be completed. The Kanban board is used to move each card from one state of completion to the next and in so doing, helps track progress.","DUPLICATE":"Duplicate project","DUPLICATE_DESC":"Start clean and keep your configuration","IMPORT":"Import project","IMPORT_DESC":"Import your project from multiple platforms into Taiga","INVITE":"Invite to the project","SOLO_PROJECT":"You'll be alone in this project","INVITE_LATER":"(You'll be able to invite more members later)","BACK":"Back","MAX_PRIVATE_PROJECTS":"Unfortunately, You've reached the maximum number of private projects.\nIf you would like to increase the current limit please contact the administrator.","MAX_PUBLIC_PROJECTS":"Unfortunately, You've reached the maximum number of public projects.\nIf you would like to increase the current limit please contact the administrator.","PUBLIC_PROJECT":"Public Project","PRIVATE_PROJECT":"Private Project"},"COMMON":{"DETAILS":"New project details","PROJECT_TITLE":"Project Name","PROJECT_DESCRIPTION":"Project Description"},"DUPLICATE":{"TITLE":"Duplicate Project","DESCRIPTION":"Start clean and keep your configuration","SELECT_PLACEHOLDER":"Choose an existing project to duplicate"},"IMPORT":{"TITLE":"Import Project","DESCRIPTION":"Import your project from multiple platforms into Taiga","ASYNC_IN_PROGRESS_TITLE":"Our Oompa Loompas are importing your project","ASYNC_IN_PROGRESS_MESSAGE":"This process could take a few minutes
    We will send you an email when ready","UPLOAD_IN_PROGRESS_MESSAGE":"Uploaded {{uploadedSize}} of {{totalSize}}","ERROR":"Our Oompa Loompas have some problems importing your dump data. Please try again.","ERROR_TOO_MANY_REQUEST":"Sorry, our Oompa Loompas are very busy right now. Please try again in a few minutes.","ERROR_MESSAGE":"Our Oompa Loompas have some problems importing your dump data: {{error_message}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) is too heavy for our Oompa Loompas, try it with a smaller than ({{maxFileSize}})","SYNC_SUCCESS":"Your project has been imported successfuly","IMPORT":"Import","WHO_IS":"Their tasks will be assigned to ...","WRITE_EMAIL":"Or if you want, write the email that this user uses in Taiga","SEARCH_CONTACT":"Or if you want, search in your contacts","WRITE_EMAIL_LABEL":"Write the email that this user uses in Taiga","ACCEEDE":"Acceede","PROJECT_MEMBERS":"Project Members","PROCESS_DESCRIPTION":"Tell us who from Taiga you want to assign the tasks of {{platform}}","MATCH":"Is {{user_external}} the same person as {{user_internal}}?","CHOOSE":"Select user","LINKS":"Links with {{platform}}","LINKS_DESCRIPTION":"Do you want to keep the link of each item with the original {{platform}} card?","WARNING_MAIL_USER":"Note that if the user does not have a Taiga account we will not be able to assign the tasks to him.","ASSIGN":"Assign","PROJECT_SELECTOR":{"NO_RESULTS":"It looks like nothing was found with your search criteria","ACTION_SEARCH":"search","ACTION_BACK":"Back"},"PROJECT_RESTRICTIONS":{"PROJECT_MEMBERS_DESC_PRIVATE":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per private project. If you would like to increase that limit please contact the administrator.","PROJECT_MEMBERS_DESC_PUBLIC":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per public project. If you would like to increase that limit please contact the administrator.","ACCOUNT_ALLOW_MEMBERS":"Your account only allows {{members}} members","PRIVATE_PROJECTS_SPACE":{"TITLE":"Unfortunately, your current plan does not allow for additional private projects","DESC":"The project you are trying to import is private. Unfortunately, your current plan does not allow for additional private projects."},"PUBLIC_PROJECTS_SPACE":{"TITLE":"Unfortunately, your current plan does not allow for additional public projects","DESC":"The project you are trying to import is public. Unfortunately, your current plan does not allow additional public projects."},"PRIVATE_PROJECTS_MEMBERS":{"TITLE":"Your current plan allows for a maximum of {{max_memberships}} members per private project"},"PUBLIC_PROJECTS_MEMBERS":{"TITLE":"Your current plan allows for a maximum of {{max_memberships}} members per public project."},"PRIVATE_PROJECTS_SPACE_MEMBERS":{"TITLE":"Unfortunately your current plan doesn't allow additional private projects or an increase of more than {{max_memberships}} members per private project","DESC":"The project that you are trying to import is private and has {{members}} members."},"PUBLIC_PROJECTS_SPACE_MEMBERS":{"TITLE":"Unfortunately your current plan doesn't allow additional public projects or an increase of more than {{max_memberships}} members per public project","DESC":"The project that you are trying to import is public and has more than {{members}} members."}},"IN_PROGRESS":{"TITLE":"Importing Project","DESCRIPTION":"This process can take a while, please keep the window open."},"WARNING":{"TITLE":"Some taks will be unassigned","DESCRIPTION":"There are still unidentified people. The cards assigned to these people will remain unassigned. Check all the contacts to not lose that information.","CHECK":"Check contacts"},"TAIGA":{"SELECTOR":"Import your Taiga project"},"TRELLO":{"SELECTOR":"Import your Trello boards into Taiga","CHOOSE_PROJECT":"Choose board that you want to import","NO_PROJECTS":"It seems you have no boards in Trello"},"GITHUB":{"SELECTOR":"Import your GitHub project issues","CHOOSE_PROJECT":"Find the project you want to import","NO_PROJECTS":"It seems you have no porjects in GitHub","HOW_DO_YOU_WANT_TO_IMPORT":"How do you want to import your issues into Taiga?","KANBAN_PROJECT":"As user stories in a kanban project","KANBAN_PROJECT_DESCRIPTION":"After that you can enable scrum with backlog.","SCRUM_PROJECT":"As user stories in a scrum project","SCRUM_PROJECT_DESCRIPTION":"After that you can enable kanban mode.","ISSUES_PROJECT":"As issues","ISSUES_PROJECT_DESCRIPTION":"You will not be able to use your issues in kanban or scrum mode. You will be able to enable kanban or scrum for new user stories"},"ASANA":{"SELECTOR":"Import your Asana project and choose how to manage it","CHOOSE_PROJECT":"Choose project that you want to import","NO_PROJECTS":"It seems you have no porjects in Asana","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","CREATE_AS_SCRUM_DESCRIPTION":"The tasks and sub-tasks of your project will be created as Taiga user stories and tasks.","CREATE_AS_KANBAN_DESCRIPTION":"The tasks and sub-tasks of your project will be created as Taiga user stories and tasks."},"JIRA":{"SELECTOR":"Import your Jira project and choose how to manage it","HOW_TO_CONFIGURE":"(configuration help)","CHOOSE_PROJECT":"Choose project or board that you want to import","NO_PROJECTS":"It seems you have no porjects or boards in Jira","URL":"Your Jira URL","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","ISSUES_PROJECT":"Issues","CREATE_AS_SCRUM_DESCRIPTION":"The issues and sub-issues of your project will be created as Taiga user stories and tasks.","CREATE_AS_KANBAN_DESCRIPTION":"The issues and sub-issues of your project will be created as Taiga user stories and tasks.","CREATE_AS_ISSUES_DESCRIPTION":"What do you want to do with sub-issues from the Jira project? (Taiga doesn't allow sub-issues)","CREATE_NEW_ISSUES":"Convert sub-issues to new Taiga issues","NOT_CREATE_NEW_ISSUES":"Do not import sub-issues"}}},"LIGHTBOX":{"DELETE_ACCOUNT":{"CONFIRM":"Are you sure you want to delete your Taiga account?","CANCEL":"Back to settings","ACCEPT":"Delete account","BLOCK_PROJECT":"Note that all the projects you own projects will be blocked after you delete your account. If you do not want a project blocked, transfer ownership to another member of each project prior to deleting your account. "},"DELETE_PROJECT":{"TITLE":"Delete project","QUESTION":"Are you sure you want to delete this project?","SUBTITLE":"All project data (user stories, tasks, issues, sprints and wiki pages) will be lost! :-(","CONFIRM":"Yes, I'm really sure"},"ASSIGNED_TO":{"SELECT":"Select assigned to","SEARCH":"Search for users"},"ADD_MEMBER":{"TITLE":"New Member","PLACEHOLDER":"Filter users or write an email to invite","ADD_EMAIL":"Add email","REMOVE":"Remove","INVITE":"Invite","CHOOSE_ROLE":"Choose a role","PLACEHOLDER_INVITATION_TEXT":"(Optional) Add a personalized text to the invitation. Tell something lovely to your new members ;-)","HELP_TEXT":"If users are already registered on Taiga, they will be added automatically. Otherwise they will receive an invitation."},"CREATE_ISSUE":{"TITLE":"Add Issue"},"FEEDBACK":{"TITLE":"Tell us something...","COMMENT":"...a bug, some suggestions, something cool... or even your worst nightmare with Taiga","ACTION_SEND":"Send feedback"},"SEARCH":{"TITLE":"Search","PLACEHOLDER_SEARCH":"What are you looking for?"},"ADD_EDIT_SPRINT":{"TITLE":"New sprint","PLACEHOLDER_SPRINT_NAME":"sprint name","PLACEHOLDER_SPRINT_START":"Estimated Start","PLACEHOLDER_SPRINT_END":"Estimated End","ACTION_DELETE_SPRINT":"Do you want to delete this sprint?","TITLE_ACTION_DELETE_SPRINT":"delete sprint","LAST_SPRINT_NAME":"last sprint is {{lastSprint}} ;-) "},"CREATE_EDIT_TASK":{"TITLE":"New task","PLACEHOLDER_SUBJECT":"A task subject","PLACEHOLDER_STATUS":"Task status","OPTION_UNASSIGNED":"Unassigned","PLACEHOLDER_SHORT_DESCRIPTION":"Type a short description","ACTION_EDIT":"Edit task","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"CREATE_EDIT_US":{"TITLE":"New US","PLACEHOLDER_DESCRIPTION":"Please add descriptive text to help others better understand this US","NEW_US":"New user story","EDIT_US":"Edit user story","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"DELETE_DUE_DATE":{"TITLE":"Delete due date","SUBTITLE":"Are you sure you want to delete this due date?"},"DELETE_SPRINT":{"TITLE":"Delete sprint"},"CREATE_MEMBER":{"PLACEHOLDER_INVITATION_TEXT":"(Optional) Add a personalized text to the invitation. Tell something lovely to your new members ;-)","PLACEHOLDER_TYPE_EMAIL":"Type an Email","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"You are about to reach the maximum number of members allowed for this project, {{maxMembers}} members. If you would like to increase the current limit, please contact the administrator.","LIMIT_USERS_WARNING_MESSAGE":"You are about to reach the maximum number of members allowed for this project, {{maxMembers}} members."},"LEAVE_PROJECT_WARNING":{"TITLE":"Unfortunately, this project can't be left without an owner","CURRENT_USER_OWNER":{"DESC":"You are the current owner of this project. Before leaving, please transfer ownership to someone else.","BUTTON":"Change the project owner"},"OTHER_USER_OWNER":{"DESC":"Unfortunately, you can't delete a member who is also the current project owner. First, please assign a new project owner.","BUTTON":"Request project owner change"}},"CHANGE_OWNER":{"TITLE":"Who do you want to be the new project owner?","ADD_COMMENT":"Add comment","BUTTON":"Ask this project member to become the new project owner"},"CONTACT_PROJECT":{"TITLE":"Send an email to","WARNING":"The email will be received by the project admins","PLACEHOLDER":"Write your message","SEND":"Send"},"SET_DUE_DATE":{"TITLE":"Set due date","PLACEHOLDER_DUE_DATE":"Select date","REASON_FOR_DUE_DATE":"Reason for the due date","PLACEHOLDER_REASON_FOR_DUE_DATE":"Why does this US need a due date?","SUGGESTIONS":{"IN_ONE_WEEK":"In one week","IN_TWO_WEEKS":"In two weeks","IN_ONE_MONTH":"In one month","IN_THREE_MONTHS":"In three months"},"TITLE_ACTION_DELETE_DUE_DATE":"Delete due date"}},"EPIC":{"PAGE_TITLE":"{{epicSubject}} - Epic {{epicRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{epicStatus }}. Description: {{epicDescription}}","SECTION_NAME":"Epic","TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY":"Unlink related userstory","MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY":"It will delete the link to the related userstory '{{subject}}'","ERROR_UNLINK_RELATED_USERSTORY":"We have not been able to unlink: {{errorMessage}}","CREATE_RELATED_USERSTORIES":"Create a relationship with","NEW_USERSTORY":"New user story","EXISTING_USERSTORY":"Existing user story","CHOOSE_PROJECT_FOR_CREATION":"What's the project?","SUBJECT":"Subject","SUBJECT_BULK_MODE":"Subject (bulk insert)","CHOOSE_PROJECT_FROM":"What's the project?","CHOOSE_USERSTORY":"What's the user story?","NO_USERSTORIES":"This project has no User Stories yet. Please select another project.","NO_USERSTORIES_FOUND":"It looks like nothing was found with your search criteria","FILTER_USERSTORIES":"Filter user stories","LIGHTBOX_TITLE_BLOKING_EPIC":"Blocking epic","ACTION_DELETE":"Delete epic"},"US":{"PAGE_TITLE":"{{userStorySubject}} - User Story {{userStoryRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{userStoryStatus }}. Completed {{userStoryProgressPercentage}}% ({{userStoryClosedTasks}} of {{userStoryTotalTasks}} tasks closed). Points: {{userStoryPoints}}. Description: {{userStoryDescription}}","SECTION_NAME":"User story","LINK_TASKBOARD":"Taskboard","TITLE_LINK_TASKBOARD":"Go to the taskboard","TOTAL_POINTS":"total points","ADD":"+ Add a new User Story","ADD_BULK":"Add some new User Stories in bulk","PROMOTED":"This US has been promoted from Issue:","TITLE_LINK_GO_TO_ISSUE":"Go to issue","TITLE_DELETE_ACTION":"Delete User Story","LIGHTBOX_TITLE_BLOKING_US":"Blocking us","NOT_ESTIMATED":"Not estimated","OWNER_US":"This User Story belongs to","TRIBE":{"PUBLISH":"Publish as Gig in Taiga Tribe","PUBLISH_INFO":"More info","PUBLISH_TITLE":"More info on publishing in Taiga Tribe","PUBLISHED_AS_GIG":"Story published as Gig in Taiga Tribe","EDIT_LINK":"Edit link","CLOSE":"Close","SYNCHRONIZE_LINK":"synchronize with Taiga Tribe","PUBLISH_MORE_INFO_TITLE":"Do you need somebody for this task?","PUBLISH_MORE_INFO_TEXT":"

    If you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

    TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

    "},"FIELDS":{"TEAM_REQUIREMENT":"Team Requirement","CLIENT_REQUIREMENT":"Client Requirement"}},"COMMENTS":{"DELETED_INFO":"Comment deleted by {{user}}","COMMENTS_COUNT":"{{comments}} Comments","OLDER_FIRST":"Older first","RECENT_FIRST":"Recent first","COMMENT":"Comment","EDITED_COMMENT":"Edited:","SHOW_HISTORY":"View historic","TYPE_NEW_COMMENT":"Type a new comment here","SHOW_DELETED":"Show deleted comment","HIDE_DELETED":"Hide deleted comment","DELETE":"Delete comment","RESTORE":"Restore comment","HISTORY":{"TITLE":"Activity"}},"ACTIVITY":{"TITLE":"Activity","ACTIVITIES_COUNT":"{{activities}} Activities","TAGS_ADDED":"tags added:","TAGS_REMOVED":"tags removed:","US_POINTS":"{{role}} points","NEW_ATTACHMENT":"new attachment:","DELETED_ATTACHMENT":"deleted attachment:","UPDATED_ATTACHMENT":"updated attachment ({{filename}}):","CREATED_CUSTOM_ATTRIBUTE":"created custom attribute","UPDATED_CUSTOM_ATTRIBUTE":"updated custom attribute","BECAME_DEPRECATED":"became deprecated","BECAME_UNDEPRECATED":"became undeprecated","TEAM_REQUIREMENT":"Team Requirement","CLIENT_REQUIREMENT":"Client Requirement","BLOCKED":"Blocked","VALUES":{"NOT_SET":"not set","UNASSIGNED":"unassigned"},"FIELDS":{"SUBJECT":"subject","DESCRIPTION":"description","PRIORITY":"priority","SEVERITY":"severity","STATUS":"status","TYPE":"type","ASSIGNED_TO":"assigned to","ASSIGNED_USERS":"assigned users","DUE_DATE":"due date","MILESTONE":"sprint","COLOR":"color"}},"BACKLOG":{"PAGE_TITLE":"Backlog - {{projectName}}","PAGE_DESCRIPTION":"The backlog panel, with user stories and sprints of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Backlog","CUSTOMIZE_GRAPH":"Customize your backlog graph","CUSTOMIZE_GRAPH_TEXT":"To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the","CUSTOMIZE_GRAPH_ADMIN":"Admin","CUSTOMIZE_GRAPH_TITLE":"Set up the points and sprints through the Admin","MOVE_US_TO_CURRENT_SPRINT":"Move to Current Sprint","MOVE_US_TO_LATEST_SPRINT":"Move to latest Sprint","EMPTY":"The backlog is empty!","CREATE_NEW_US":"Create a new US","CREATE_NEW_US_EMPTY_HELP":"You may want to create a new user story","EXCESS_OF_POINTS":"Excess of points","PENDING_POINTS":"Pending Points","CLOSED_POINTS":"closed","COMPACT_SPRINT":"Compact Sprint","GO_TO_TASKBOARD":"Go to the taskboard of {{::name}}","EDIT_SPRINT":"Edit Sprint","TOTAL_POINTS":"total","STATUS_NAME":"Status Name","SORTABLE_FILTER_ERROR":"You can't drop on backlog when filters are open","DOOMLINE":"Project Scope [Doomline]","CHART":{"XAXIS_LABEL":"Sprints","YAXIS_LABEL":"Points","OPTIMAL":"Optimal pending points for sprint \"{{sprintName}}\" should be {{value}}","REAL":"Real pending points for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_TEAM":"Incremented points by team requirements for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_CLIENT":"Incremented points by client requirements for sprint \"{{sprintName}}\" is {{value}}"},"TAGS":{"TOGGLE":"Toggle tags visibility","SHOW":"Show tags","HIDE":"Hide tags"},"FORECASTING":{"TITLE":"Velocity forecasting","BACKLOG":"Display backlog","NEW_SPRINT":"Candidate User Stories for your next sprint based on your velocity. Click to create a new sprint.","CURRENT_SPRINT":"Candidate User Stories for your sprint based on your velocity. Click to add to current sprint."},"TABLE":{"COLUMN_US":"User Stories","TITLE_COLUMN_POINTS":"Select view per Role"},"SPRINT_SUMMARY":{"TOTAL_POINTS":"total
    points","COMPLETED_POINTS":"completed
    points","OPEN_TASKS":"open
    tasks","CLOSED_TASKS":"closed
    tasks","IOCAINE_DOSES":"iocaine
    doses","SHOW_STATISTICS_TITLE":"Show statistics","TOGGLE_BAKLOG_GRAPH":"Show/Hide burndown graph","POINTS_PER_ROLE":"Points per role"},"SUMMARY":{"PROJECT_POINTS":"project
    points","DEFINED_POINTS":"defined
    points","CLOSED_POINTS":"closed
    points","POINTS_PER_SPRINT":"points /
    sprint"},"FILTERS":{"TOGGLE":"Toggle filters visibility","HIDE":"Hide Filters","SHOW":"Show Filters"},"SPRINTS":{"TITLE":"SPRINTS","DATE":"DD MMM YYYY","LINK_TASKBOARD":"Sprint Taskboard","TITLE_LINK_TASKBOARD":"Go to Taskboard of \"{{name}}\"","EMPTY":"There are no sprints yet","WARNING_EMPTY_SPRINT_ANONYMOUS":"This sprint has no User Stories","WARNING_EMPTY_SPRINT":"Drop here Stories from your backlog to start a new sprint","TITLE_ACTION_NEW_SPRINT":"Add new sprint","TEXT_ACTION_NEW_SPRINT":"You may want to create a new sprint in your project","ACTION_SHOW_CLOSED_SPRINTS":"Show closed sprints","ACTION_HIDE_CLOSED_SPRINTS":"Hide closed sprints"}},"ERROR":{"TEXT1":"Something happened and our Oompa Loompas are working on it.","NOT_FOUND":"Not found","NOT_FOUND_TEXT":"Error 404. The page you are looking for no longer exists. Perhaps you can return back to TAIGA homepage and see if you can find what you are looking for.","PERMISSION_DENIED":"Permission denied","PERMISSION_DENIED_TEXT":"You don't have permission to access this page.","VERSION_ERROR":"Someone inside Taiga has changed this before and our Oompa Loompas cannot apply your changes. Please reload and apply your changes again (they will be lost)."},"TASKBOARD":{"PAGE_TITLE":"{{sprintName}} - Sprint taskboard - {{projectName}}","PAGE_DESCRIPTION":"Sprint {{sprintName}} (from {{startDate}} to {{endDate}}) of {{projectName}}. Completed {{completedPercentage}}% ({{completedPoints}} of {{totalPoints}} points). {{openTasks}} opened tasks of {{totalTasks}}.","SECTION_NAME":"Taskboard","TITLE_ACTION_ADD":"Add a new Task","TITLE_ACTION_ADD_BULK":"Add some new Tasks in bulk","TITLE_ACTION_ASSIGN":"Assign task","PLACEHOLDER_CARD_TITLE":"This could be a task","PLACEHOLDER_CARD_TEXT":"Split Stories into tasks to track them separately","TABLE":{"COLUMN":"User story","TITLE_ACTION_FOLD":"Fold column","TITLE_ACTION_UNFOLD":"Unfold column","TITLE_ACTION_FOLD_ROW":"Fold Row","TITLE_ACTION_UNFOLD_ROW":"Unfold Row","FIELD_POINTS":"points","ROW_UNASSIGED_TASKS_TITLE":"Unassigned tasks"},"CHARTS":{"XAXIS_LABEL":"Days","YAXIS_LABEL":"Points","OPTIMAL":"Optimal pending points for day {{formattedDate}} should be {{roundedValue}}","REAL":"Real pending points for day {{formattedDate}} is {{roundedValue}}","DATE":"DD MMMM YYYY"}},"TASK":{"PAGE_TITLE":"{{taskSubject}} - Task {{taskRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{taskStatus }}. Description: {{taskDescription}}","SECTION_NAME":"Task","LINK_TASKBOARD":"Taskboard","TITLE_LINK_TASKBOARD":"Go to the taskboard","PLACEHOLDER_SUBJECT":"Type the new task subject","TITLE_SELECT_STATUS":"Status Name","OWNER_US":"This task belongs to","TITLE_LINK_GO_OWNER":"Go to user story","TITLE_DELETE_ACTION":"Delete Task","LIGHTBOX_TITLE_BLOKING_TASK":"Blocking task","FIELDS":{"IS_IOCAINE":"Is iocaine"},"TITLE_ACTION_IOCAINE":"Feeling a bit overwhelmed by a task? Make sure others know about it by clicking on Iocaine when editing a task. It's possible to become immune to this (fictional) deadly poison by consuming small amounts over time just as it's possible to get better at what you do by occasionally taking on extra challenges!"},"NOTIFICATION":{"OK":"Everything is ok","WARNING":"Oops, something happened...","WARNING_TEXT":"Our Oompa Loompas are sad, your changes were not saved!","SAVED":"Our Oompa Loompas saved all your changes!","CLOSE":"Close notification","MAIL":"Notifications By Mail","DESKTOP":"Desktop notifications using browser alerts","ASK_DELETE":"Are you sure you want to delete?"},"CANCEL_ACCOUNT":{"TITLE":"Cancel your account","SUBTITLE":"We're sorry you are leaving the taiga, we hope you enjoyed your stay :)","PLACEHOLDER_INPUT_TOKEN":"cancel account token","ACTION_LEAVING":"Yes, I'm leaving!","SUCCESS":"Our Oompa Loompas removed your account"},"CHANGE_EMAIL_FORM":{"TITLE":"Change your email","SUBTITLE":"One click more and your email will be updated!","PLACEHOLDER_INPUT_TOKEN":"change email token","ACTION_CHANGE_EMAIL":"Change email","SUCCESS":"Our Oompa Loompas updated your email"},"ISSUES":{"PAGE_TITLE":"Issues - {{projectName}}","PAGE_DESCRIPTION":"The issues list panel of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Issue","ACTION_NEW_ISSUE":"+ NEW ISSUE","ACTION_PROMOTE_TO_US":"Promote to User Story","PROMOTED":"This issue has been promoted to US:","EXTERNAL_REFERENCE":"This issue has been created from","GO_TO_EXTERNAL_REFERENCE":"Go to origin","ACTION_DELETE":"Delete issue","LIGHTBOX_TITLE_BLOKING_ISSUE":"Blocking issue","FIELDS":{"PRIORITY":"Priority","SEVERITY":"Severity","TYPE":"Type"},"CONFIRM_PROMOTE":{"TITLE":"Promote this issue to a new user story","MESSAGE":"Are you sure you want to create a new US from this Issue?"},"TABLE":{"COLUMNS":{"TYPE":"Type","SEVERITY":"Severity","PRIORITY":"Priority","SUBJECT":"Subject","VOTES":"Votes","STATUS":"Status","CREATED":"Created","ASSIGNED_TO":"Assigned to"},"TITLE_ACTION_CHANGE_STATUS":"Change status","TITLE_ACTION_ASSIGNED_TO":"Assigned to","BLOCKED":"Blocked","EMPTY":{"TITLE":"There are no issues to report :-)","SUBTITLE":"Did you find an issue?"}}},"ISSUE":{"PAGE_TITLE":"{{issueSubject}} - Issue {{issueRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{issueStatus }}. Type: {{issueType}}, Priority: {{issuePriority}}. Severity: {{issueSeverity}}. Description: {{issueDescription}}"},"KANBAN":{"PAGE_TITLE":"Kanban - {{projectName}}","PAGE_DESCRIPTION":"The kanban panel, with user stories of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Kanban","TITLE_ACTION_FOLD":"Fold column","TITLE_ACTION_UNFOLD":"Unfold column","TITLE_ACTION_ADD_US":"Add New User Story","TITLE_ACTION_ADD_BULK":"Add New bulk","ACTION_SHOW_ARCHIVED":"Show archived","ACTION_HIDE_ARCHIVED":"Hide archived","HIDDEN_USER_STORIES":"The user stories in this status are hidden by default","PLACEHOLDER_CARD_TITLE":"These are your User Stories","PLACEHOLDER_CARD_TEXT":"Stories might also have subtasks to separate requirements"},"SEARCH":{"PAGE_TITLE":"Search - {{projectName}}","PAGE_DESCRIPTION":"Search anything, user stories, issues, tasks or wiki pages, in the project {{projectName}}: {{projectDescription}}","FILTER_EPICS":"Epics","FILTER_USER_STORIES":"User Stories","FILTER_ISSUES":"Issues","FILTER_TASKS":"Tasks","FILTER_WIKI":"Wiki Pages","PLACEHOLDER_SEARCH":"Search in...","TITLE_ACTION_SEARCH":"search","EMPTY_TITLE":"It looks like nothing was found with your search criteria.","EMPTY_DESCRIPTION":"Maybe try one of the tabs above or search again"},"TEAM":{"PAGE_TITLE":"Team - {{projectName}}","PAGE_DESCRIPTION":"The team panel to show all the members of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Team","PLACEHOLDER_INPUT_SEARCH":"Search by full name...","COLUMN_MR_WOLF":"Mr. Wolf","EXPLANATION_COLUMN_MR_WOLF":"Closed issues","COLUMN_IOCAINE":"Iocaine Drinker","EXPLANATION_COLUMN_IOCAINE":"Iocaine doses ingested","COLUMN_CERVANTES":"Cervantes","EXPLANATION_COLUMN_CERVANTES":"Wiki pages edited","COLUMN_BUG_HUNTER":"Bug Hunter","EXPLANATION_COLUMN_BUG_HUNTER":"Issues reported","COLUMN_NIGHT_SHIFT":"Night Shift","EXPLANATION_COLUMN_NIGHT_SHIFT":"Tasks closed","COLUMN_TOTAL_POWER":"Total Power","EXPLANATION_COLUMN_TOTAL_POWER":"Total Points","SECTION_TITLE_TEAM":"Team >","SECTION_FILTER_ALL":"All","CONFIRM_LEAVE_PROJECT":"Are you sure you want to leave the project?","ACTION_LEAVE_PROJECT":"Leave this project"},"USER_SETTINGS":{"AVATAR_MAX_SIZE":"[Max. size: {{maxFileSize}}]","MENU":{"SECTION_TITLE":"User Settings","USER_PROFILE":"User profile","CHANGE_PASSWORD":"Change password","EMAIL_NOTIFICATIONS":"Email notifications","DESKTOP_NOTIFICATIONS":"Desktop notifications"},"NOTIFICATIONS":{"LIVE_SECTION_NAME":"Desktop Notifications","SECTION_NAME":"Email Notifications","COLUMN_PROJECT":"Project","COLUMN_RECEIVE_ALL":"Receive All","COLUMN_ONLY_INVOLVED":"Only Involved","COLUMN_NO_NOTIFICATIONS":"No notifications","OPTION_ALL":"All","OPTION_INVOLVED":"Involved","OPTION_NONE":"None"}},"USER_PROFILE":{"ACTION_USE_GRAVATAR":"Use default image","ACTION_DELETE_ACCOUNT":"Delete Taiga account","ACTION_DOWNLOAD_PROFILE":"Download Taiga profile","CHANGE_EMAIL_SUCCESS":"Check your inbox!
    We have sent a mail to your account
    with the instructions to set your new address","CHANGE_PHOTO":"Change photo","FIELD":{"USERNAME":"Username","EMAIL":"Email","FULL_NAME":"Full name","PLACEHOLDER_FULL_NAME":"Set your full name (ex. Íñigo Montoya)","BIO":"Bio (max. 210 chars)","PLACEHOLDER_BIO":"Tell us something about you","LANGUAGE":"Language","LANGUAGE_DEFAULT":"-- use default language --","THEME":"Theme","THEME_DEFAULT":"-- use default theme --"}},"WIKI":{"PAGE_TITLE":"{{wikiPageName}} - Wiki - {{projectName}}","PAGE_DESCRIPTION":"Last edition on {{lastModifiedDate}} ({{totalEditions}} editions in total) Content: {{ wikiPageContent }}","DATETIME":"DD MMM YYYY HH:mm","REMOVE":"Remove this wiki page","DELETE_LIGHTBOX_TITLE":"Delete Wiki Page","DELETE_LINK_TITLE":"Delete Wiki link","NAVIGATION":{"HOME":"Main Page","SECTION_NAME":"BOOKMARKS","ACTION_ADD_LINK":"Add bookmark","ALL_PAGES":"All wiki pages"},"SUMMARY":{"TIMES_EDITED":"times
    edited","LAST_EDIT":"last
    edit","LAST_MODIFICATION":"last modification"},"SECTION_PAGES_LIST":"All pages","PAGES_LIST_COLUMNS":{"TITLE":"Title","EDITIONS":"Editions","CREATED":"Created","MODIFIED":"Modified","CREATOR":"Creator","LAST_MODIFIER":"Last modifier"}},"HINTS":{"SECTION_NAME":"Hint","LINK":"If you want to know how to use it visit our support page","LINK_TITLE":"Visit our support page","HINT1_TITLE":"Did you know you can import and export projects?","HINT1_TEXT":"This allow you to extract all your data from one Taiga and move it to another one.","HINT2_TITLE":"Did you know you can create custom fields?","HINT2_TEXT":"Teams can now create custom fields as a flexible means to enter specific data useful for their particular workflow.","HINT3_TITLE":"Reorder your projects to feature those most relevant to you.","HINT3_TEXT":"The 10 projects are listed in the direct access bar at the top.","HINT4_TITLE":"Did you forget what were you working on?","HINT4_TEXT":"Don't worry, on your dashboard you'll find your open tasks, issues, and user stories in the order you worked on them."},"TIMELINE":{"UPLOAD_ATTACHMENT":"{{username}} has uploaded a new attachment in {{obj_name}}","US_CREATED":"{{username}} has created a new US {{obj_name}} in {{project_name}}","ISSUE_CREATED":"{{username}} has created a new issue {{obj_name}} in {{project_name}}","TASK_CREATED":"{{username}} has created a new task {{obj_name}} in {{project_name}}","TASK_CREATED_WITH_US":"{{username}} has created a new task {{obj_name}} in {{project_name}} which belongs to the US {{us_name}}","WIKI_CREATED":"{{username}} has created a new wiki page {{obj_name}} in {{project_name}}","MILESTONE_CREATED":"{{username}} has created a new sprint {{obj_name}} in {{project_name}}","EPIC_CREATED":"{{username}} has created a new epic {{obj_name}} in {{project_name}}","EPIC_RELATED_USERSTORY_CREATED":"{{username}} has related the userstory {{related_us_name}} to the epic {{epic_name}} in {{project_name}}","NEW_PROJECT":"{{username}} created the project {{project_name}}","MILESTONE_UPDATED":"{{username}} has updated the sprint {{obj_name}}","US_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the US {{obj_name}}","US_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the US {{obj_name}} to {{new_value}}","US_UPDATED_POINTS":"{{username}} has updated '{{role_name}}' points of the US {{obj_name}} to {{new_value}}","ISSUE_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the issue {{obj_name}}","ISSUE_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the issue {{obj_name}} to {{new_value}}","TASK_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} to {{new_value}}","TASK_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} to {{new_value}}","TASK_UPDATED_WITH_US":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} which belongs to the US {{us_name}}","TASK_UPDATED_WITH_US_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} which belongs to the US {{us_name}} to {{new_value}}","WIKI_UPDATED":"{{username}} has updated the wiki page {{obj_name}}","EPIC_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the epic {{obj_name}}","EPIC_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the epic {{obj_name}} to {{new_value}}","EPIC_UPDATED_WITH_NEW_COLOR":"{{username}} has updated the \"{{field_name}}\" of the epic {{obj_name}} to ","NEW_COMMENT_US":"{{username}} has commented in the US {{obj_name}}","NEW_COMMENT_ISSUE":"{{username}} has commented in the issue {{obj_name}}","NEW_COMMENT_TASK":"{{username}} has commented in the task {{obj_name}}","NEW_COMMENT_EPIC":"{{username}} has commented in the epic {{obj_name}}","NEW_MEMBER":"{{project_name}} has a new member","US_ADDED_MILESTONE":"{{username}} has added the US {{obj_name}} to {{sprint_name}}","US_MOVED":"{{username}} has moved the US {{obj_name}}","US_REMOVED_FROM_MILESTONE":"{{username}} has added the US {{obj_name}} to the backlog","BLOCKED":"{{username}} has blocked {{obj_name}}","UNBLOCKED":"{{username}} has unblocked {{obj_name}}","NEW_USER":"{{username}} has joined Taiga"},"LEGAL":{"TERMS_OF_SERVICE_AND_PRIVACY_POLICY_AD":"When creating a new account, you agree to our terms of service and privacy policy.","GDPR_ANNOUNCEMENT_TITLE":"General Data Protection Regulation (GDPR)","GDPR_ANNOUNCEMENT_DESCRIPTION":"You saw this comming, right? Updates to our Terms of Service","GDPR_ANNOUNCEMENT_INFOLINK":"Please read our announcement here"},"EXTERNAL_APP":{"PAGE_TITLE":"An external app requires authentication","PAGE_DESCRIPTION":"An external app requires authentication","AUTHORIZATION_REQUEST":"Authorize {{application}} to use your Taiga account?","LOGIN_WITH_ANOTHER_USER":"Login with another user","AUTHORIZE_APP":"Authorize app","CANCEL":"Cancel"},"JOYRIDE":{"NAV":{"NEXT":"Next","BACK":"Back","SKIP":"Skip","DONE":"Done"},"DASHBOARD":{"STEP1":{"TITLE":"Your project","TEXT":"Welcome! Here you will find the projects you are involved on."},"STEP2":{"TITLE":"Working on","TEXT":"Here you will find the User Stories, Tasks and Issues in which you are working on."},"STEP3":{"TITLE":"Watching","TEXT1":"And right here you will find the ones in your projects that you want to know about.","TEXT2":"You are already working with Taiga ;)"},"STEP4":{"TITLE":"Let’s start","TEXT1":"You can start by creating your first Taiga project.","TEXT2":"Good luck!"}},"BACKLOG":{"STEP1":{"TITLE":"Project summary","TEXT1":"Here you will see the state of your project.","TEXT2":"You can change every kind of project settings through the admin."},"STEP2":{"TITLE":"Product backlog","TEXT":"The backlog is the list of requirements (User Stories) for the project. Here is where you will plan your sprints."},"STEP3":{"TITLE":"Sprints","TEXT":"Sprints are short periods of time (usually 2 weeks) during which specific work has to be completed and delivered."},"STEP4":{"TITLE":"User Stories","TEXT":"Those are the requirements at high level. You can add them to the backlog and drag them to the sprint in which it should be delivered."}},"KANBAN":{"STEP1":{"TITLE":"Customize your workflow","TEXT":"Set up the columns you need to map your workflow statuses through the admin."},"STEP2":{"TITLE":"User Stories & Tasks","TEXT":"User Stories are the requirements at high level. You can drag them to different columns."},"STEP3":{"TITLE":"Adding User Stories","TEXT1":"You may want to add a single User Story (add US icon) or a group of them (bulk icon)","TEXT2":"Good luck!"}}},"DISCOVER":{"PAGE_TITLE":"Discover projects - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","DISCOVER_TITLE":"Discover projects","DISCOVER_SUBTITLE":"{projects, plural, one{One public project to discover} other{# public projects to discover}}","MOST_ACTIVE":"Most active","MOST_ACTIVE_EMPTY":"There are no ACTIVE projects yet","MOST_LIKED":"Most liked","MOST_LIKED_EMPTY":"There are no LIKED projects yet","VIEW_MORE":"View more","FEATURED":"Featured Projects","EMPTY":"There are no projects to show with this search criteria.
    Try again!","FILTERS":{"ALL":"All","KANBAN":"Kanban","SCRUM":"Scrum","PEOPLE":"Looking for people","WEEK":"Last week","MONTH":"Last month","YEAR":"Last year","ALL_TIME":"All time","CLEAR":"Clear filters"},"SEARCH":{"PAGE_TITLE":"Search - Discover projects - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","INPUT_PLACEHOLDER":"Type something...","ACTION_TITLE":"Search","RESULTS":"Search results"}}} \ No newline at end of file diff --git a/dist/v-1527758585938/locales/taiga/locale-fi.json b/dist/v-1527758585938/locales/taiga/locale-fi.json deleted file mode 100644 index 44fcb1a..0000000 --- a/dist/v-1527758585938/locales/taiga/locale-fi.json +++ /dev/null @@ -1 +0,0 @@ -{"COMMON":{"YES":"Kyllä","NO":"Ei","OR":"tai","LOADING":"Ladataan...","DATE":"DD.MM.YY","DATETIME":"DD.MM.YY - HH:mm","SAVE":"Tallenna","CANCEL":"Peru","ACCEPT":"Hyväksy","DELETE":"Poista","UNLINK":"Poista linkki","CREATE":"Luo uusi","ADD":"Lisää","COPY_TO_CLIPBOARD":"Kopio leikekirjalle: Ctrl+C","EDIT":"Muokkaa","DRAG":"Vedä","TAG_LINE":"Ketterä, ilmainne avoimen koodin projektinhallintaohjelmisto","TAG_LINE_2":"Rakasta projektiasi","BLOCK":"Estä","BLOCK_TITLE":"Block this item for example if it has a dependency that can not be satisfied","BLOCKED":"Suljettu","UNBLOCK":"Salli","UNBLOCK_TITLE":"Poista este","BLOCKED_NOTE":"Miksi tämä on estetty?","BLOCKED_REASON":"Ole hyvä ja anna syy","CREATED_BY":"Luonut {{fullDisplayName}}","CLOSE":"sulje","GO_HOME":"Vie minut kotiin","PLUGINS":"Pluginit","ONE_ITEM_LINE":"Yksi riviä kohti...","NEW_BULK":"Lisää monta","RELATED_TASKS":"Liittyvät tehtävät","PREVIOUS":"Edellinen","NEXT":"Seuraava","LOGOUT":"Kirjaudu ulos","EXTERNAL_USER":"ulkoinen käyttäjä","GENERIC_ERROR":"Oompa Loompas havaitsivat virheen {{error}}.","IOCAINE_TEXT":"This member is feeling a bit overwhelmed by this task. Will become immune to the iocaine poison over time with your help. For now, may need a hug.","CLIENT_REQUIREMENT":"Client requirement is new requirement that was not previously expected and it is required to be part of the project","TEAM_REQUIREMENT":"Team requirement is a requirement that must exist in the project but should have no cost for the client","OWNER":"Projektin omistaja","CAPSLOCK_WARNING":"Be careful! You are using capital letters in an input field that is case sensitive.","CONFIRM_CLOSE_EDIT_MODE_TITLE":"Haluatko varmasti sulkea muokkaustilan?","CONFIRM_CLOSE_EDIT_MODE_MESSAGE":"Remember that if you close the edit mode without saving all the changes will be lost","RELATED_USERSTORIES":"Liittyvät käyttäjätarinat","CARD":{"ASSIGN_TO":"Valitse tekijä","EDIT":"Muokkaa korttia","DELETE":"Delete card"},"FORM_ERRORS":{"DEFAULT_MESSAGE":"Tämä arvo vaikuttaa virheelliseltä.","TYPE_EMAIL":"Tämän pitäisi olla toimiva sähköpostiosoite.","TYPE_URL":"Tämän pitäisi olla toimiva web-osoite.","TYPE_URLSTRICT":"Tämän pitäisi olla toimiva web-osoite.","TYPE_NUMBER":"Arvon pitäisi olla numeerinen.","TYPE_DIGITS":"Arvon pitäisi olla numeroita.","TYPE_DATEISO":"Arvon pitäisi olla muotoa (vvvv-kk-pp).","TYPE_ALPHANUM":"Arvon pitäisi olla alfanumeerinen.","TYPE_PHONE":"Arvon pitäisi olla toimiva puhelinnumero.","NOTNULL":"Arvo ei saa olla tyhjä.","NOT_BLANK":"Arvon ei pitäisi olla tyhjä.","REQUIRED":"Arvo vaaditaan.","REGEXP":"Tämä arvo vaikuttaa virheelliseltä.","MIN":"Arvon pitää olla vähintään %s.","MAX":"Arvon pitää olla korkeintaan %s.","RANGE":"Arvon pitää olla välissä %s - %s.","MIN_LENGTH":"Arvo on liian lyhyt. Tarvitaan vähintään %s merkkiä.","MAX_LENGTH":"Arvo on liian pitkä. Pituus saa olla korkeintaan %s merkkiä.","RANGE_LENGTH":"Arvo on väärän mittainen. Sen pituus pitäisi olla väliltä %s - %s.","MIN_CHECK":"Sinun täytyy valita vähintään %s valintaa.","MAX_CHECK":"Valitse korkeintaan %s vaihtoehtoa.","RANGE_CHECK":"Valitse %s - %s vaihteohtoa.","EQUAL_TO":"Arvojen pitäisi olla samat.","LINEWIDTH":"One or more lines is perhaps too long. Try to keep under %s characters.","PIKADAY":"Invalid date format, please use DD MMM YYYY (like 23 Mar 1984)"},"PICKERDATE":{"FORMAT":"DD.MM.YY","IS_RTL":"epätosi","FIRST_DAY_OF_WEEK":"1","PREV_MONTH":"Edellinen kuukausi","NEXT_MONTH":"Seuraava kuukausi","MONTHS":{"JAN":"Tammikuu","FEB":"Helmikuu","MAR":"Maaliskuu","APR":"Huhtikuu","MAY":"Toukokuu","JUN":"Kesäkuu","JUL":"Heinäkuu","AUG":"Elokuu","SEP":"Syyskuu","OCT":"Lokakuu","NOV":"Marraskuu","DEC":"Joulukuu"},"WEEK_DAYS":{"SUN":"Sunnuntai","MON":"Maanantai","TUE":"Tiistai","WED":"Keskiviikko","THU":"Torstai","FRI":"Perjantai","SAT":"Lauantai"},"WEEK_DAYS_SHORT":{"SUN":"Sun","MON":"Maa","TUE":"Tii","WED":"Kes","THU":"Tor","FRI":"Per","SAT":"Lau"}},"SEE_USER_PROFILE":"Näytä {{username }} profiili","USER_STORY":"Käyttäjätarina","TASK":"Tehtävä","ISSUE":"Issue","EPIC":"Eepos","TAGS":{"PLACEHOLDER":"Syötä tagi","DELETE":"Poista avainsana","ADD":"Lisää avainsana"},"DESCRIPTION":{"EMPTY":"Tyhjä tila on tylsää...kerro jotain...","NO_DESCRIPTION":"Ei vielä kuvausta lisätty"},"FIELDS":{"SUBJECT":"Aihe","NAME":"Nimi","URL":"URL","DESCRIPTION":"Kuvaus","VALUE":"Arvo","SLUG":"Hukka","COLOR":"Väri","IS_CLOSED":"Suljettu","STATUS":"Tila","TYPE":"Tyyppi","SEVERITY":"Vakavuus","PRIORITY":"Tärkeys","ASSIGNED_TO":"Tekijä","ASSIGNED_USERS":"Assigned users","POINTS":"Pisteet","IS_BLOCKED":"on estetty","REF":"Ref","VOTES":"Ääniä","SPRINT":"Kierros","DUE_DATE":"Due date","DUE_DATE_REASON":"Due date reason"},"ROLES":{"ALL":"Kaikki"},"ASSIGNED_TO":{"NOT_ASSIGNED":"Tekijää ei valittu","ASSIGN":"Valitse tekijä","DELETE_ASSIGNMENT":"Poista tekijä","REMOVE_ASSIGNED":"Poista tekijä","TOO_MANY":"...liikaa käyttäjiä, lisää suodattimia","CONFIRM_UNASSIGNED":"Haluatko varmasti jättää tämän ilman tekijää?","TITLE_ACTION_EDIT_ASSIGNMENT":"Muokkaa tekijää","SELF":"Ota tehtävä itsellesi"},"DUE_DATE":{"TITLE_ACTION_SET_DUE_DATE":"Set due date","DUE_SOON":"due soon","PAST_DUE":"past due date","NO_LONGER_APPLICABLE":"no longer applicable"},"ASSIGNED_USERS":{"ADD":"Select assigned user","ADD_ASSIGNED":"Add assigned","TITLE_LIGHTBOX_DELETE_ASSIGNED":"Delete assigned..."},"STATUS":{"CLOSED":"Suljettu","OPEN":"Avoin"},"WATCHERS":{"WATCHERS":"Seuraajat","ADD":"Lisää seuraajia","TITLE_ADD":"Add a project member to the watchers list","DELETE":"Poista vahti","TITLE_LIGHTBOX_DELETE_WARTCHER":"Poista vahti..."},"WATCH_BUTTON":{"WATCH":"Seuraa","WATCHING":"Seuraa","UNWATCH":"Lopeta seuraaminen","WATCHERS":"Seuraajat","BUTTON_TITLE":"Seuraa/Lopeta seuraaminen","COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}"},"VOTE_BUTTON":{"BUTTON_TITLE":"Upvote/Downvote this item","COUNTER_TITLE":"{total, plural, one{one vote} other{# votes}}"},"CUSTOM_ATTRIBUTES":{"CUSTOM_FIELDS":"Omat kentät","SAVE":"Tallenna oma kenttä","EDIT":"Muokkaa omaa kenttää","DELETE":"Poista oma attribuutti","CONFIRM_DELETE":"Remeber that all values in this custom field will be deleted.\n Are you sure you want to continue?"},"FILTERS":{"INPUT_PLACEHOLDER":"Aihe tai viittaus","TITLE_ACTION_FILTER_BUTTON":"hae","TITLE":"Suodattimet","TITLE_ACTION_SEARCH":"Hae","ACTION_SAVE_CUSTOM_FILTER":"tallenna omaksi suodattimeksi","PLACEHOLDER_FILTER_NAME":"Anna suodattimen nimi ja paina enter","APPLIED_FILTERS_NUM":"Suodattimet asetettu","CATEGORIES":{"TYPE":"Tyyppi","STATUS":"Tila","SEVERITY":"Vakavuus","PRIORITIES":"Kiireellisyydet","TAGS":"Avainsanat","ASSIGNED_TO":"Tekijä","ROLE":"Rooli","CREATED_BY":"Luoja","CUSTOM_FILTERS":"Omat suodattimet","EPIC":"Eepos"}},"WYSIWYG":{"CODE_SNIPPET":"Code Snippet","DB_CLICK":"tuplaklikkaa muokataksesi","SELECT_LANGUAGE_PLACEHOLDER":"Valitse kieli","SELECT_LANGUAGE_REMOVE_FORMATING":"Poista muotoilu","OUTDATED":"Another person has made changes while you were editing. Check the new version on the activity tab before you save your changes.","MARKDOWN_HELP":"Merkintätavan ohjeet"},"PERMISIONS_CATEGORIES":{"EPICS":{"NAME":"Eepokset","VIEW_EPICS":"Näytä eepokset","ADD_EPICS":"Lisää eepos","MODIFY_EPICS":"Modify epics","COMMENT_EPICS":"Comment epics","DELETE_EPICS":"Poista eepos"},"SPRINTS":{"NAME":"Kierrokset","VIEW_SPRINTS":"Katso kierroksia","ADD_SPRINTS":"Lisää kierroksia","MODIFY_SPRINTS":"Muokkaa kieroksia","DELETE_SPRINTS":"Poista kierroksia"},"USER_STORIES":{"NAME":"Käyttäjätarinat","VIEW_USER_STORIES":"Katso käyttäjätarinoita","ADD_USER_STORIES":"Lisää käyttäjätarinoita","MODIFY_USER_STORIES":"Muokkaa käyttäjätarinoita","COMMENT_USER_STORIES":"Comment user stories","DELETE_USER_STORIES":"Poista käyttäjätarinoita"},"TASKS":{"NAME":"Tehtävät","VIEW_TASKS":"Katsot tehtäviä","ADD_TASKS":"Lisää tehtäviä","MODIFY_TASKS":"Muokkaa tehtäviä","COMMENT_TASKS":"Comment tasks","DELETE_TASKS":"Poista tehtäviä"},"ISSUES":{"NAME":"Pyynnöt","VIEW_ISSUES":"Katso pyyntöjä","ADD_ISSUES":"Lisää pyyntöjä","MODIFY_ISSUES":"Muokkaa pyyntöjä","COMMENT_ISSUES":"Comment issues","DELETE_ISSUES":"Poista pyyntöjä"},"WIKI":{"NAME":"Wiki","VIEW_WIKI_PAGES":"Katso wiki-sivuja","ADD_WIKI_PAGES":"Lisää wiki-sivuja","MODIFY_WIKI_PAGES":"Muokkaa wiki-sivuja","DELETE_WIKI_PAGES":"Poista wiki-sivuja","VIEW_WIKI_LINKS":"Katso wiki-linkkejä","ADD_WIKI_LINKS":"Lisää wiki-linkkejä","DELETE_WIKI_LINKS":"Poista wiki-linkkejä"}}},"LOGIN":{"PAGE_TITLE":"Kirjaudu - Taiga","PAGE_DESCRIPTION":"Logging in to Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"AUTH":{"INVITED_YOU":"on kutsunut sinut projektiin","NOT_REGISTERED_YET":"Etkö ole vielä rekisteröitynyt?","REGISTER":"Rekisteröidy","CREATE_ACCOUNT":"luo ilmainen tunnuksesi täällä"},"LOGIN_COMMON":{"HEADER":"Minulla on jo Taiga tunnus","PLACEHOLDER_AUTH_NAME":"Käyttäjänimi tai sähköposti (kirjainkoko merkitsevä)","LINK_FORGOT_PASSWORD":"Unohditko?","TITLE_LINK_FORGOT_PASSWORD":"Unohditko salasanasi?","ACTION_ENTER":"Sisään","ACTION_SIGN_IN":"Kirjaudu","PLACEHOLDER_AUTH_PASSWORD":"Salasana (kirjainkoko merkitsevä)","ALT_LOGIN":"Tai kirjaudu käyttäen"},"LOGIN_FORM":{"ERROR_AUTH_INCORRECT":"Oompa Loompas sanovat että käyttäjänimesi tai sähköpostisi tai salasanasi on väärä.","SUCCESS":"Oompa Loompas ovat onnellisia, tervetuloa Taigaan."},"REGISTER":{"PAGE_TITLE":"Rekisteröidy - Taiga","PAGE_DESCRIPTION":"Create your account in Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"REGISTER_FORM":{"TITLE":"Rekisteröi uusi Taiga tunnus (ilmainen)","PLACEHOLDER_NAME":"Anna käyttäjänimi (kirjainkoko on merkitsevä)","PLACEHOLDER_FULL_NAME":"Anna koko nimesi","PLACEHOLDER_EMAIL":"Sähköpostisi","PLACEHOLDER_PASSWORD":"Anna salasana (kirjainkoko merkitsevä)","ACTION_SIGN_UP":"Kirjaudu sisään","TITLE_LINK_LOGIN":"Kirjaudu sisään","LINK_LOGIN":"Oletko jo rekisteröitynyt? Kirjaudu sisään"},"FORGOT_PASSWORD":{"PAGE_TITLE":"Unohditko salasanasi - Taiga","PAGE_DESCRIPTION":"Enter your username or email to get a new password and you can access to Taiga again."},"FORGOT_PASSWORD_FORM":{"TITLE":"Oops, unohditko salasanasi?","SUBTITLE":"Anna käyttäjänimesi tai sähköpostisi saadaksesi uuden","PLACEHOLDER_FIELD":"Käyttäjänimi tai sähköposti","ACTION_RESET_PASSWORD":"Uusi salsanasi","LINK_CANCEL":"Vie minut takaisin, muistan sen.","SUCCESS_TITLE":"Tarkista inbox!","SUCCESS_TEXT":"Lähetimme sinulle sähköpostin, jossa ohjeet uuden salasanan asettamiseksi.","ERROR":"Oompa Loompas sanovat että käyttäjänimesi tai sähköpostisi tai salasanasi on väärä."},"CHANGE_PASSWORD":{"PAGE_TITLE":"Vaihda salasanasi - Taiga","SECTION_NAME":"Muuta salasanaa","FIELD_CURRENT_PASSWORD":"Nykyinen salasana","PLACEHOLDER_CURRENT_PASSWORD":"Nykyinen salasanasi (tai on tyhjä jos sinulla ei vielä ole)","FIELD_NEW_PASSWORD":"Uusi salasana","PLACEHOLDER_NEW_PASSWORD":"Anna uusi salasana","FIELD_RETYPE_PASSWORD":"Anna salasana uudelleen","PLACEHOLDER_RETYPE_PASSWORD":"Anna salasana uudelleen","ERROR_PASSWORD_MATCH":"Salasanat eivät täsmää"},"CHANGE_PASSWORD_RECOVERY_FORM":{"TITLE":"Luo uusi pääsy Taigaan","SUBTITLE":"Rautapitoinen ruoka on hyväksi aivoille :P","PLACEHOLDER_NEW_PASSWORD":"Uusi salasana","PLACEHOLDER_RE_TYPE_NEW_PASSWORD":"Anna salasana uudelleen","ACTION_RESET_PASSWORD":"Uusi salsanasi","ERROR":"Our Oompa Loompas can't find your request to recover your password. Try to ask for it again.","SUCCESS":"Oompa Loompas tallensi uuden salasanasi.
    Yritä kirjautua sisään sillä."},"INVITATION":{"PAGE_TITLE":"Kutsun hyväksyminen - Taiga","PAGE_DESCRIPTION":"Accept the invitation to join a project in Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"INVITATION_LOGIN_FORM":{"NOT_FOUND":"Kutsuasi ei löydy.","SUCCESS":"Olet onnistuneesti liittynyt projektiin {{project_name}}. Tervetuloa!"},"HOME":{"PAGE_TITLE":"Etusivu - Taiga","PAGE_DESCRIPTION":"The Taiga home page with your main projects and all your assigned and watched user stories, tasks and issues","EMPTY_WORKING_ON":"Näyttää tyhjätlä, eikövain? Aloita työskentely ja näet tässä sinua koskevat käyttäjätarinat, tehtävät ja tukipyynnöt.","EMPTY_WATCHING":"Follow User Stories, Tasks, Issues in your projects and be notified about its changes :)","EMPTY_PROJECT_LIST":"Sinulla ei ole vielä projekteja","WORKING_ON_SECTION":"Käynnissä olevat","WATCHING_SECTION":"Seurqnnassa","DASHBOARD":"Projektit Dashboard"},"EPICS":{"TITLE":"Eepokset","SECTION_NAME":"Eepokset","EPIC":"Eepokset","PAGE_TITLE":"Eepokset - {{projectName}}","PAGE_DESCRIPTION":"Eepokset {{projectName}}: {{projectDescription}}","DASHBOARD":{"ADD":"+ Lisää Eepos","UNASSIGNED":"Tekijä puuttuu"},"EMPTY":{"TITLE":"Ei vielä lisättyjä eepoksia","EXPLANATION":"Epics are items at a higher level that encompass user stories.
    Epics are at the top of the hierarchy and can be used to group user stories together.","HELP":"Lue lisää eepoksista"},"TABLE":{"VOTES":"Ääniä","NAME":"Nimi","PROJECT":"Projekti","SPRINT":"Kierros","ASSIGNED_TO":"Tekijä valittu","STATUS":"Tila","PROGRESS":"Edistyminen","VIEW_OPTIONS":"Näytä asetukset"},"CREATE":{"TITLE":"Uusi Eepos","PLACEHOLDER_DESCRIPTION":"Please add descriptive text to help others better understand this epic","TEAM_REQUIREMENT":"Team requirement","CLIENT_REQUIREMENT":"Asiakasvaatimus","BLOCKED":"Suljettu","BLOCKED_NOTE_PLACEHOLDER":"Miksi tämä eepos on estetty?","CREATE_EPIC":"Luo eepos"}},"PROJECTS":{"PAGE_TITLE":"Minun projektit - Taiga","PAGE_DESCRIPTION":"Listaus kaikista projekteistasi, voit järjestää niitä tai luoda uuden.","MY_PROJECTS":"Minun projektit"},"ATTACHMENT":{"SECTION_NAME":"liitteet","TITLE":"{{ fileName }} ladattu {{ date }}\n","LIST_VIEW_MODE":"Listanäkymä","GALLERY_VIEW_MODE":"Gallerianäkymä","DESCRIPTION":"Kirjoita lyhyt kuvaus","DEPRECATED":"(poistettu)","DEPRECATED_FILE":"Vanhentunut?","ADD":"Lisää liitetiedosto {{maxFileSizeMsg}}","DROP":"Raahaa liitetiedostot tähän!","SHOW_DEPRECATED":"+ näytä vanhentuneet liitteet","HIDE_DEPRECATED":"- piilota vanhentuneet liitteet","COUNT_DEPRECATED":"({{ counter }} vanhentunutta)","MAX_UPLOAD_SIZE":"Maksimi tiedoston koko {{maxFileSize}}","DATE":"DD.MM.YY - hh:mm","ERROR_UPLOAD_ATTACHMENT":"Emme onnistuneet lataamaan tiedostoa '{{fileName}}'. {{errorMessage}}","TITLE_LIGHTBOX_DELETE_ATTACHMENT":"Poista liite...","MSG_LIGHTBOX_DELETE_ATTACHMENT":"liite '{{fileName}}'","ERROR_DELETE_ATTACHMENT":"Emme pystyneet poistamaan: {{errorMessage}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) on liian iso Oompa Loompaseille, kokeile pienemmällä kuin ({{maxFileSize}})"},"PAGINATION":{"PREVIOUS":"Edellinen","NEXT":"Seuraava"},"ADMIN":{"COMMON":{"TITLE_ACTION_EDIT_VALUE":"Muokkaa arvoa","TITLE_ACTION_DELETE_VALUE":"Poista arvo","TITLE_ACTION_DELETE_TAG":"Poista avainsana"},"HELP":"Tarvitsetko apua? Katso tukisivuilta.","PROJECT_DEFAULT_VALUES":{"TITLE":"Oletusarvot","SUBTITLE":"Aseta oletukset kaikille syötteille."},"MEMBERSHIPS":{"TITLE":"Hallinnoi jäseniä","PAGE_TITLE":"Jäsenet - {{projectName}}","ADD_BUTTON":"+ Uusi jäsen","ADD_BUTTON_TITLE":"Lisää jäsen","LIMIT_USERS_WARNING_MESSAGE_FOR_ADMIN":"Unfortunately, this project has reached its limit of ({{members}}) allowed members.","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"This project has reached its limit of ({{members}}) allowed members. If you would like to increase that limit please contact the administrator."},"PROJECT_EXPORT":{"TITLE":"Vie","SUBTITLE":"Vie projekti varmuuskopioksi tai luo uusi tämän pohjalta.","EXPORT_BUTTON":"Vie","EXPORT_BUTTON_TITLE":"Vie projekti","LOADING_TITLE":"Varmistustiedostoa muodostetaan","DUMP_READY":"Tiedostosi on valmis","LOADING_MESSAGE":"Älä sulje tätä sivua.","ASYNC_MESSAGE":"Lähetämme sähköpostia, kun on valmista.","SYNC_MESSAGE":"Jos lataus ei ala automaattisesti klikkaa tästä.","ERROR":"Oompa Loompas eivät onnistuneet tekemään tiedostoasi. Yritä uudelleen.","ERROR_BUSY":"Valitettavasti Oompa Loompas ovat kiireisiä juuri. Yritä kohta uudestaan."},"MODULES":{"TITLE":"Modulit","EPICS":"Eepokset","EPICS_DESCRIPTION":"Visualize and manage the most strategic part of your project","BACKLOG":"Odottavat","BACKLOG_DESCRIPTION":"Hallinnoi käyttäjätarinoita: järjestele ja priorisoi työtä.","NUMBER_SPRINTS":"Arvio sprinttien lukumäärästä","NUMBER_SPRINTS_HELP":"0 for an undetermined number","NUMBER_US_POINTS":"Arvioitu pisteiden kokonaismäärä","NUMBER_US_POINTS_HELP":"0 for an undetermined number","KANBAN":"Kanban","KANBAN_DESCRIPTION":"Järjestä projektisi tehokkaasti tällä taululla.","ISSUES":"Pyynnöt","ISSUES_DESCRIPTION":"Seuraa projektisi virheitä, kysymyksiä ja parannusehdotuksia. Älä jätä mitään huomiotta!","WIKI":"Wiki","WIKI_DESCRIPTION":"Lisää, muokkaa tai poista sisältöä yhteistyössä muiden kanssa. Tämä on oikea paikka projektin dokumentaatiolle.","MEETUP":"Tapaa","MEETUP_DESCRIPTION":"Valitse videoneuvottelusovellus","SELECT_VIDEOCONFERENCE":"Valitse videoconferenssi-järjestelmä","SALT_CHAT_ROOM":"Lisää vakio-osa keskusteluhuoneen nimeen","JITSI_CHAT_ROOM":"Jitsi","APPEARIN_CHAT_ROOM":"AppearIn","TALKY_CHAT_ROOM":"Talky","CUSTOM_CHAT_ROOM":"Custom","URL_CHAT_ROOM":"Videoneuvottelun URL-osoite"},"PROJECT_PROFILE":{"PAGE_TITLE":"{{sectionName}} - Projektin profiili - {{projectName}}","PROJECT_DETAILS":"Projektin tiedot","PROJECT_NAME":"Projektin nimi","TAGS":"Avainsanat","DESCRIPTION":"Kuvaus","RECRUITING":"Etsitäänkö tähän projektiin tekijöitä?","RECRUITING_MESSAGE":"Ketä etsit?","RECRUITING_PLACEHOLDER":"Määritä etsittävät profiilit","FEEDBACK":"Receive feedback from Taiga users?","PUBLIC_PROJECT":"Julkinen projekti","PRIVATE_PROJECT":"Yksityinen projekti","PRIVATE_OR_PUBLIC":"Mitä eroa on julkisella ja yksityisellä projektilla?","DELETE":"Poista tämä projekti","CHANGE_LOGO":"Vaihda logo","ACTION_USE_DEFAULT_LOGO":"Käytä oletuskuvaa","MAX_PRIVATE_PROJECTS":"You've reached the maximum number of private projects allowed by your current plan","MAX_PRIVATE_PROJECTS_MEMBERS":"The maximum number of members for private projects has been exceeded","MAX_PUBLIC_PROJECTS":"Unfortunately, you've reached the maximum number of public projects allowed by your current plan","MAX_PUBLIC_PROJECTS_MEMBERS":"The project exceeds your maximum number of members for public projects","PROJECT_OWNER":"Projektin omistaja","REQUEST_OWNERSHIP":"Pyydä omistusoikeutta","REQUEST_OWNERSHIP_CONFIRMATION_TITLE":"Do you want to become the new project owner?","REQUEST_OWNERSHIP_DESC":"Request that current project owner {{name}} transfer ownership of this project to you.","REQUEST_OWNERSHIP_BUTTON":"Pyyntö","REQUEST_OWNERSHIP_SUCCESS":"Ilmoitamme projektin omistajalle","CHANGE_OWNER":"Vaihda omistajaa","CHANGE_OWNER_SUCCESS_TITLE":"Ok, pyyntösi lähetetty!","CHANGE_OWNER_SUCCESS_DESC":"We will notify you by email if the project ownership request is accepted or declined"},"REPORTS":{"TITLE":"Raportit","SUBTITLE":"Vie projektisi CSV-tiedostoon","DESCRIPTION":"Download a CSV file or copy the generated URL and open it in your favourite text editor or spreadsheet to make your own project data reports. You will be able to visualize and analyze all your data easily.","HELP":"Kuinka tätä käytetään omassa taulukossani?","REGENERATE_TITLE":"Vaihda URL","REGENERATE_SUBTITLE":"Jos muutata CSV-datan URLia, edellien lakkaa toimimasta. Oletko varma?"},"CSV":{"SECTION_TITLE_EPIC":"epics reports","SECTION_TITLE_US":"käyttäjätarinoiden raportit","SECTION_TITLE_TASK":"tehtävien raportit","SECTION_TITLE_ISSUE":"pyyntöjen raportit","DOWNLOAD":"Lataa CSV-tiedosto","URL_FIELD_PLACEHOLDER":"Tee uusi CSV-url","TITLE_REGENERATE_URL":"Tee uusi CSV-url","ACTION_GENERATE_URL":"Luo URL","ACTION_REGENERATE":"Tee uusi"},"CUSTOM_FIELDS":{"TITLE":"Omat kentät","SUBTITLE":"Määritele omia kenttiä käyttäjätarinoihin, tehtäviin ja pyytöihin","EPIC_DESCRIPTION":"Eeposten vapaavalintaiset kentät","EPIC_ADD":"Lisää vapaavalintainen kenttä eepoksiin","US_DESCRIPTION":"Käyttäjätarinoiden omat kentät","US_ADD":"Lisää käyttäjätarinoihin oma kenttä","TASK_DESCRIPTION":"Tehtävien omat kentät","TASK_ADD":"Lisää omia kenttiä tehtäviin","ISSUE_DESCRIPTION":"Pyyntöjen omat kentät","ISSUE_ADD":"Lisää oma kenttä pyynnöille","FIELD_TYPE_TEXT":"Teksti","FIELD_TYPE_RICHTEXT":"Muotoiltu teksti","FIELD_TYPE_MULTI":"Monirivinen","FIELD_TYPE_DATE":"PVM","FIELD_TYPE_URL":"Url"},"PROJECT_VALUES":{"PAGE_TITLE":"{{sectionName}} - Project values - {{projectName}}","REPLACEMENT":"Kaikkii riveihin joissa on tämä arvo muutetaan ","ERROR_DELETE_ALL":"Et voi poistaa kaikkia arvoja."},"PROJECT_VALUES_POINTS":{"TITLE":"Pisteet","SUBTITLE":"Määrittele pisteet joihin käyttäjätarinat voidaan arvioida","US_TITLE":"Tarinapisteet","ACTION_ADD":"Lisää uusi piste"},"PROJECT_VALUES_PRIORITIES":{"TITLE":"Prioriteetit","SUBTITLE":"Määrittele tärkeydet pyynnöille","ISSUE_TITLE":"Issue prioriteetit","ACTION_ADD":"Lisää uusi tärkeys"},"PROJECT_VALUES_SEVERITIES":{"TITLE":"Vakavuudet","SUBTITLE":"Määrittele pyyntöjen vakavuudet","ISSUE_TITLE":"Issue severities","ACTION_ADD":"Lisää uusi vakavuus"},"PROJECT_VALUES_STATUS":{"TITLE":"Tilat","SUBTITLE":"Määrittele tilat joiden kautta käyttäjätarinasi, tehtäväsi ja pyyntösi kulkevat","EPIC_TITLE":"Epic Statuses","US_TITLE":"User Story Statuses","TASK_TITLE":"Tehtävien tilat","ISSUE_TITLE":"Pyyntöjen tilat"},"PROJECT_VALUES_TYPES":{"TITLE":"Tyypit","SUBTITLE":"Määrittele pyyntöjen tyypit","ISSUE_TITLE":"Pyyntöjen tyypit","ACTION_ADD":"Lisää uusi {{objName}}"},"PROJECT_VALUES_TAGS":{"TITLE":"Avainsanat","SUBTITLE":"Näytä ja muokkaa tagien värejä","EMPTY":"Ei tageja","EMPTY_SEARCH":"Ei hakutuloksia","ACTION_ADD":"Lisää avainsana","NEW_TAG":"Uusi tagi","MIXING_HELP_TEXT":"Valitse yhdistettävät tagit","MIXING_MERGE":"Yhdistä tagit","SELECTED":"Valittu"},"ROLES":{"PAGE_TITLE":"Roolit - {{projectName}}","WARNING_NO_ROLE":"Ole varovainen, yksikään rooli projektissasi ei voi arvioida käyttäjätarinoidesi kokoa","HELP_ROLE_ENABLED":"Tämän roolin omaavat jäsenet voivat arvioida käyttäjätarinoiden kokoja","DISABLE_COMPUTABLE_ALERT_TITLE":"Are you sure you want to disable this role estimations?","DISABLE_COMPUTABLE_ALERT_SUBTITLE":"If you disable estimation permissions for role {{roleName}} all previous estimations made by this role will be removed","COUNT_MEMBERS":"{{ role.members_count }} jäsentä joilla tämä rooli","TITLE_DELETE_ROLE":"Poista rooli","REPLACEMENT_ROLE":"Kaikki käyttäjä joilla on tämä rooli siirretään","WARNING_DELETE_ROLE":"Be careful! All role estimations will be removed","ERROR_DELETE_ALL":"Voit poistaa kaikki arvot","EXTERNAL_USER":"Ulkoinen käyttäjä","NOTE_EXTERNAL_USERS":"Note: by External User we mean any anonymous user not belonging to the Taiga platform, including search engines. Please use this role with care."},"THIRD_PARTIES":{"SECRET_KEY":"Salainen avain","PAYLOAD_URL":"Yhteyden URL-osoite","VALID_IPS":"Vaadittavat lähdeIPt (pilkuilla eroteltuna)"},"BITBUCKET":{"SECTION_NAME":"Bitbucket","PAGE_TITLE":"Bitbucket - {{projectName}}","INFO_VERIFYING_IP":"Bitbucket pyynnöt eivät ole allekirjoitettuja joten tarkista IP. Jos IP on tyhjä, ei sitä tarkisteta."},"GITLAB":{"SECTION_NAME":"Gitlab","PAGE_TITLE":"Gitlab - {{projectName}}","INFO_VERIFYING_IP":"Gitlab pyynnöt eivät ole allekirjoitettuja joten tarkista IP. Jos IP on tyhjä, ei sitä tarkisteta."},"GITHUB":{"SECTION_NAME":"GitHub","PAGE_TITLE":"GitHub - {{projectName}}"},"GOGS":{"SECTION_NAME":"Gogs","PAGE_TITLE":"Gogs - {{projectName}}"},"WEBHOOKS":{"PAGE_TITLE":"Webhooks - {{projectName}}","SECTION_NAME":"Webhookit","ADD_NEW":"Lisää webhook","TYPE_NAME":"Anna palvelun nimi","TYPE_PAYLOAD_URL":"Anna palvelun yhteysosoite (URL)","TYPE_SERVICE_SECRET":"Anna palvelun yksityinen avain","SAVE":"Tallenna Webhook","CANCEL":"Peruuta Webhook","SHOW_HISTORY":"(Näytä historia)","TEST":"Testaa webhook","EDIT":"Muokkaa webhookkia","DELETE":"Poista Webhook","REQUEST":"Pyyntö","RESEND_REQUEST":"Lähetä pyyntö uudestaan","HEADERS":"Ylätunnisteet","PAYLOAD":"Hyötykuorma","RESPONSE":"Vastaus","DATE":"DD.MM.YY - hh:mm:ss","ACTION_HIDE_HISTORY":"(Piilota historia)","ACTION_HIDE_HISTORY_TITLE":"Piilota historian yksityiskohdat","ACTION_SHOW_HISTORY":"(Näytä historia)","ACTION_SHOW_HISTORY_TITLE":"Näytä historian yksityiskohdat","WEBHOOK_NAME":"Webhook '{{name}}'"},"CUSTOM_ATTRIBUTES":{"PAGE_TITLE":"{{sectionName}} - Custom Attributes - {{projectName}}","ADD":"Anna oma kenttä","EDIT":"Muokkaa omaa kenttää","DELETE":"Poista oma kenttä","SAVE_TITLE":"Tallenna oma kenttä","CANCEL_TITLE":"Peru luonti","SET_FIELD_NAME":"Anna oman kentän nimi","SET_FIELD_DESCRIPTION":"Anna oman kenttäsi kuvaus","FIELD_TYPE_DEFAULT":"-- valitse yksi --","ACTION_UPDATE":"Päivitä oma kenttä","ACTION_CANCEL_EDITION":"Peru versio"},"MEMBERSHIP":{"COLUMN_MEMBER":"Jäsen","COLUMN_ADMIN":"Hallinnoi","COLUMN_ROLE":"Rooli","COLUMN_STATUS":"Tila","STATUS_ACTIVE":"Aktiivinen","STATUS_PENDING":"Odottaa","DELETE_MEMBER":"Poista jäsen","RESEND":"Lähetä uudelleen","SUCCESS_SEND_INVITATION":"Olemme lähettäneet kutsun uudelleen osoitteeseen '{{email}}'.","SUCCESS_DELETE":"Olemme poistaneet viestin {{message}}.","ERROR_DELETE":"Emme pystyneet poistamaan viestiä {{message}}.","DEFAULT_DELETE_MESSAGE":"kutsu sähköpostiin {{email}}"},"DEFAULT_VALUES":{"LABEL_EPIC_STATUS":"Default value for epic status selector","LABEL_US_STATUS":"Default value for user story status selector","LABEL_POINTS":"Oletukset pisteiden valintaan","LABEL_TASK_STATUS":"Oletukset tehtävien tilaksi","LABEL_ISSUE_TYPE":"Oletukset pyyntöjen tyypeiksi","LABEL_ISSUE_STATUS":"Oletukset pyyntöjen statuksiksi","LABEL_PRIORITY":"Oletus arvo tärkeyden valiintaan","LABEL_SEVERITY":"Oletukset vakavuudeksi"},"STATUS":{"PLACEHOLDER_WRITE_STATUS_NAME":"Anna uuden tilan nimi"},"TYPES":{"PLACEHOLDER_WRITE_NAME":"Anna uuden elementin nimi"},"US_STATUS":{"ACTION_ADD_STATUS":"Lisää uusi tila","IS_ARCHIVED_COLUMN":"Arkistoitu","IS_CLOSED_COLUMN":"Suljettu","WIP_LIMIT_COLUMN":"WIP raja","PLACEHOLDER_WRITE_NAME":"Anna uuden tilan nimi"},"MENU":{"PROJECT":"Projekti","ATTRIBUTES":"Attribuutit","MEMBERS":"Jäsenet","PERMISSIONS":"Oikeudet","INTEGRATIONS":"Intergraatiot"},"SUBMENU_PROJECT_VALUES":{"STATUS":"Tila","POINTS":"Pisteet","PRIORITIES":"Tärkeydet","SEVERITIES":"Vakavuudet","TYPES":"Tyypit","CUSTOM_FIELDS":"Omat kentät","TAGS":"Avainsanat"},"SUBMENU_ROLES":{"TITLE":"Roolit","ACTION_NEW_ROLE":"+ Uusi rooli","TITLE_ACTION_NEW_ROLE":"Lisää uusi rooli"},"PROJECT_TRANSFER":{"DO_YOU_ACCEPT_PROJECT_OWNERNSHIP":"Haluaisitko uudeksi projektin omistajaksi?","PRIVATE":"Yksityinen","ACCEPTED_PROJECT_OWNERNSHIP":"Onnittelu! Olet nyt projektin omistaja.","REJECTED_PROJECT_OWNERNSHIP":"OK. Ilmoitamme projektin omistajalle.","ACCEPT":"Hyväksy","REJECT":"Hylkää","PROPOSE_OWNERSHIP":"{{owner}}, the current owner of the project {{project}} has asked that you become the new project owner.","ADD_COMMENT":"Would you like to add a comment for the project owner?","UNLIMITED_PROJECTS":"Rajoittamaton","OWNER_MESSAGE":{"PRIVATE":"Please remember that you can own up to {{maxProjects}} private projects. You currently own {{currentProjects}} private projects","PUBLIC":"Please remember that you can own up to {{maxProjects}} public projects. You currently own {{currentProjects}} public projects"},"CANT_BE_OWNED":"At the moment you cannot become an owner of a project of this type. If you would like to become the owner of this project, please contact the administrator so they change your account settings to enable project ownership."}},"USER":{"PROFILE":{"PAGE_TITLE":"{{userFullName}} (@{{userUsername}})","EDIT":"Muokkaa profiilia","CLOSED_US":"Suljettu US","PROJECTS":"Projektit","PROJECTS_EMPTY":"{{username}} ei vielä omia projekteja","CONTACTS":"Yhteystiedot","CONTACTS_EMPTY":"{{username}} doesn't have contacts yet","CURRENT_USER_CONTACTS_EMPTY":"You don't have contacts yet","CURRENT_USER_CONTACTS_EMPTY_EXPLAIN":"The people with whom you work at Taiga will be your contacts automatically","TABS":{"ACTIVITY_TAB":"Aikajana","ACTIVITY_TAB_TITLE":"Näytä tämä käyttäjän tapahtumat","PROJECTS_TAB":"Projektit","PROJECTS_TAB_TITLE":"Projektit joissa tämä käyttäjä on mukana","LIKES_TAB":"Tykkäykset","LIKES_TAB_TITLE":"Näytä tämän käyttäjän tykkäykset","VOTES_TAB":"Ääniä","VOTES_TAB_TITLE":"Näyttä kaikki tämän käyttäjän äänestykset","WATCHED_TAB":"Seurattu","WATCHED_TAB_TITLE":"Näytä kaikki tämän käyttäjän seuraamat kohteet","CONTACTS_TAB":"Yhteystiedot","CONTACTS_TAB_TITLE":"Listaa tämän käyttäjän tekemät kontaktit"}},"PROFILE_SIDEBAR":{"TITLE":"Oma profiili","DESCRIPTION":"People can see everything you do and what you are working on. Add a nice bio to give an enhanced version of your information.","ADD_INFO":"Muokkaa bio"},"PROFILE_FAVS":{"FILTER_INPUT_PLACEHOLDER":"Kirjoita tähän...","FILTER_TYPE_ALL":"Kaikki","FILTER_TYPE_ALL_TITLE":"Näytä kaikki","FILTER_TYPE_PROJECTS":"Projektit","FILTER_TYPE_PROJECTS_TITLE":"Näytä vain projektit","FILTER_TYPE_EPICS":"Eepokset","FILTER_TYPE_EPICS_TITLE":"Näytä vain eepokset","FILTER_TYPE_USER_STORIES":"Tarinat","FILTER_TYPE_USER_STORIES_TITLE":"Näytä vain käyttäjätarinat","FILTER_TYPE_TASKS":"Tehtävät","FILTER_TYPE_TASKS_TITLE":"Näytä vain tehtävät","FILTER_TYPE_ISSUES":"Pyynnöt","FILTER_TYPE_ISSUES_TITLE":"Show only issues","EMPTY_TITLE":"It looks like there's nothing to show here."}},"PROJECT":{"PAGE_TITLE":"{{projectName}}","HELP":"Reorder your projects to set in the top the most used ones.
    The top 10 projects will appear in the top navigation bar project list","PRIVATE":"Yksityinen projekti","LOOKING_FOR_PEOPLE":"Tähän projektiin etsitään tekijöitä","FANS_COUNTER_TITLE":"{total, plural, one{one fan} other{# fans}}","WATCHERS_COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}","MEMBERS_COUNTER_TITLE":"{total, plural, one{one member} other{# members}}","BLOCKED_PROJECT":{"BLOCKED":"Estetty projekti","THIS_PROJECT_IS_BLOCKED":"Projekti estetty väliaikaisesti","TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF":"In order to unblock your projects, contact the administrator."},"SECTION":{"SEARCH":"Hae","TIMELINE":"Aikajana","BACKLOG":"Odottavat","KANBAN":"Kanban","ISSUES":"Pyynnöt","WIKI":"Wiki","TEAM":"Tiimi","MEETUP":"Tapaa","ADMIN":"Hallinnoi"},"NAVIGATION":{"ACTION_CREATE_PROJECT":"Luo projekti","MANAGE_PROJECTS":"Hallitse projekteja","TITLE_CREATE_PROJECT":"Luo projekti","HELP_TITLE":"Taiga Tukisivusto","HELP":"Ohjeet","HOMEPAGE":"Etusivu","FEEDBACK_TITLE":"Lähetä palautetta","FEEDBACK":"Palaute","NOTIFICATIONS_TITLE":"Muokkaa ilmoitusasetuksiasi","NOTIFICATIONS":"Ilmoitukset","VIEW_PROFILE_TITLE":"Näytä profiili","VIEW_PROFILE":"Näytä profiili","EDIT_PROFILE_TITLE":"Muokkaa profiiliasi","EDIT_PROFILE":"Muokkaa profiilia","CHANGE_PASSWORD_TITLE":"Muuta salasanaa","CHANGE_PASSWORD":"Muuta salasanaa","DASHBOARD_TITLE":"Dashboard","DISCOVER_TITLE":"Discover trending projects","DISCOVER":"Discover"},"LIKE_BUTTON":{"LIKE":"Tykkää","LIKED":"Tykätty","UNLIKE":"Poista tykkäys","BUTTON_TITLE":"Like or unlike this project","COUNTER_TITLE":"{total, plural, one{one fan} other{# fans}}"},"WATCH_BUTTON":{"BUTTON_TITLE":"Seuraa tätä projektia ja aseta ilmoitukset","WATCH":"Seuraa","WATCHING":"Seuraa","COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}","OPTIONS":{"NOTIFY_ALL":"Tilaa kaikki ilmoitukset","NOTIFY_ALL_TITLE":"Vastaanota kaikki tämän projektin ilmoitukset","NOTIFY_INVOLVED":"Only involved","NOTIFY_INVOLVED_TITLE":"Vastaanota ilmoituksia vain kun osallistut","UNWATCH":"Lopeta seuraaminen","UNWATCH_TITLE":"Lopeta seuraaminen"}},"CONTACT_BUTTON":{"CONTACT_TITLE":"Contact the project team","CONTACT_BUTTON":"Contact the project"},"CREATE":{"TITLE":"Luo projekti","CHOOSE_TEMPLATE":"Which template fits your project better?","TEMPLATE_SCRUM":"Scrum","TEMPLATE_SCRUM_DESC":"Prioritize and solve your tasks in short time cycles.","TEMPLATE_SCRUM_LONGDESC":"Scrum is an iterative and incremental agile software development methodology for managing product development.\nThe product backlog is what will ultimately be delivered, ordered into the sequence in which it should be delivered. Product Backlogs are broken into manageable, executable chunks named sprints. Every certain amount of time the team initiates a new sprint and commits to deliver a certain number of user stories from the backlog, in accordance with their skills, abilities and resources. The project advances as the backlog becomes depleted.","TEMPLATE_KANBAN":"Kanban","TEMPLATE_KANBAN_DESC":"Keep a constant workflow on independent tasks","TEMPLATE_KANBAN_LONGDESC":"The Kanban methodology is used to divide project development (any sort of project) into stages.\nA kanban card is like an index card or post-it note that details every task (or user story) in a project that needs to be completed. The Kanban board is used to move each card from one state of completion to the next and in so doing, helps track progress.","DUPLICATE":"Kopioi projekti","DUPLICATE_DESC":"Start clean and keep your configuration","IMPORT":"Luo projekti tiedostosta","IMPORT_DESC":"Tuo projekti muista järjestelmistä Taigaan","INVITE":"Kutsu projektiin","SOLO_PROJECT":"You'll be alone in this project","INVITE_LATER":"(You'll be able to invite more members later)","BACK":"Palvelin","MAX_PRIVATE_PROJECTS":"Unfortunately, You've reached the maximum number of private projects.\nIf you would like to increase the current limit please contact the administrator.","MAX_PUBLIC_PROJECTS":"Unfortunately, You've reached the maximum number of public projects.\nIf you would like to increase the current limit please contact the administrator.","PUBLIC_PROJECT":"Julkinen projekti","PRIVATE_PROJECT":"Yksityinen projekti"},"COMMON":{"DETAILS":"New project details","PROJECT_TITLE":"Projektin nimi","PROJECT_DESCRIPTION":"Projektikuvaus"},"DUPLICATE":{"TITLE":"Kopioi projekti","DESCRIPTION":"Start clean and keep your configuration","SELECT_PLACEHOLDER":"Valitse kopioitava projekti"},"IMPORT":{"TITLE":"Tuo projekti","DESCRIPTION":"Tuo projekti muista järjestelmistä Taigaan","ASYNC_IN_PROGRESS_TITLE":" Oompa Loompas tuovat projektia","ASYNC_IN_PROGRESS_MESSAGE":"Tämä voi kestää muutaman minuutin
    Lähetämme sähköpostin on valmista","UPLOAD_IN_PROGRESS_MESSAGE":"LAdattu {{uploadedSize}} / {{totalSize}}","ERROR":"Oompa Loompas eivät onnistuneet tuomaan tiedostoasi. Yritä uudestaan.","ERROR_TOO_MANY_REQUEST":"Valitettavasti Oompa Loompas ovat kiireisiä juuri. Yritä kohta uudestaan.","ERROR_MESSAGE":"Oompa Loompas eivät pysty lukemaan tiedostoasi: {{error_message}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) on liian iso Oompa Loompaseille, kokeile pienemmällä kuin ({{maxFileSize}})","SYNC_SUCCESS":"Projektisi on tuotu sisään onnistuneesti","IMPORT":"Tuo","WHO_IS":"Their tasks will be assigned to ...","WRITE_EMAIL":"Or if you want, write the email that this user uses in Taiga","SEARCH_CONTACT":"Or if you want, search in your contacts","WRITE_EMAIL_LABEL":"Write the email that this user uses in Taiga","ACCEEDE":"Acceede","PROJECT_MEMBERS":"Projektin jäsenet","PROCESS_DESCRIPTION":"Tell us who from Taiga you want to assign the tasks of {{platform}}","MATCH":"Onko {{user_external}} sama henkilö kuin {{user_internal}}?","CHOOSE":"Valitse käyttäjä","LINKS":"Links with {{platform}}","LINKS_DESCRIPTION":"Do you want to keep the link of each item with the original {{platform}} card?","WARNING_MAIL_USER":"Note that if the user does not have a Taiga account we will not be able to assign the tasks to him.","ASSIGN":"Valitse tekijä","PROJECT_SELECTOR":{"NO_RESULTS":"Ei hakutuloksia","ACTION_SEARCH":"hae","ACTION_BACK":"Palvelin"},"PROJECT_RESTRICTIONS":{"PROJECT_MEMBERS_DESC_PRIVATE":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per private project. If you would like to increase that limit please contact the administrator.","PROJECT_MEMBERS_DESC_PUBLIC":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per public project. If you would like to increase that limit please contact the administrator.","ACCOUNT_ALLOW_MEMBERS":"Tilisi sallii vain {{members}} jäsenet","PRIVATE_PROJECTS_SPACE":{"TITLE":"Unfortunately, your current plan does not allow for additional private projects","DESC":"The project you are trying to import is private. Unfortunately, your current plan does not allow for additional private projects."},"PUBLIC_PROJECTS_SPACE":{"TITLE":"Unfortunately, your current plan does not allow for additional public projects","DESC":"The project you are trying to import is public. Unfortunately, your current plan does not allow additional public projects."},"PRIVATE_PROJECTS_MEMBERS":{"TITLE":"Your current plan allows for a maximum of {{max_memberships}} members per private project"},"PUBLIC_PROJECTS_MEMBERS":{"TITLE":"Your current plan allows for a maximum of {{max_memberships}} members per public project."},"PRIVATE_PROJECTS_SPACE_MEMBERS":{"TITLE":"Unfortunately your current plan doesn't allow additional private projects or an increase of more than {{max_memberships}} members per private project","DESC":"The project that you are trying to import is private and has {{members}} members."},"PUBLIC_PROJECTS_SPACE_MEMBERS":{"TITLE":"Unfortunately your current plan doesn't allow additional public projects or an increase of more than {{max_memberships}} members per public project","DESC":"The project that you are trying to import is public and has more than {{members}} members."}},"IN_PROGRESS":{"TITLE":"Luetaan sisään projektia","DESCRIPTION":"Tämä voi kestää hetken, pidä ikkuna auki."},"WARNING":{"TITLE":"Some taks will be unassigned","DESCRIPTION":"There are still unidentified people. The cards assigned to these people will remain unassigned. Check all the contacts to not lose that information.","CHECK":"Check contacts"},"TAIGA":{"SELECTOR":"Import your Taiga project"},"TRELLO":{"SELECTOR":"Tuo Trello taulut Taigaan","CHOOSE_PROJECT":"Choose board that you want to import","NO_PROJECTS":"It seems you have no boards in Trello"},"GITHUB":{"SELECTOR":"Tuo GitHub issuet","CHOOSE_PROJECT":"Find the project you want to import","NO_PROJECTS":"It seems you have no porjects in GitHub","HOW_DO_YOU_WANT_TO_IMPORT":"How do you want to import your issues into Taiga?","KANBAN_PROJECT":"As user stories in a kanban project","KANBAN_PROJECT_DESCRIPTION":"After that you can enable scrum with backlog.","SCRUM_PROJECT":"As user stories in a scrum project","SCRUM_PROJECT_DESCRIPTION":"After that you can enable kanban mode.","ISSUES_PROJECT":"As issues","ISSUES_PROJECT_DESCRIPTION":"You will not be able to use your issues in kanban or scrum mode. You will be able to enable kanban or scrum for new user stories"},"ASANA":{"SELECTOR":"Import your Asana project and choose how to manage it","CHOOSE_PROJECT":"Choose project that you want to import","NO_PROJECTS":"It seems you have no porjects in Asana","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","CREATE_AS_SCRUM_DESCRIPTION":"The tasks and sub-tasks of your project will be created as Taiga user stories and tasks.","CREATE_AS_KANBAN_DESCRIPTION":"The tasks and sub-tasks of your project will be created as Taiga user stories and tasks."},"JIRA":{"SELECTOR":"Import your Jira project and choose how to manage it","HOW_TO_CONFIGURE":"(configuration help)","CHOOSE_PROJECT":"Choose project or board that you want to import","NO_PROJECTS":"It seems you have no porjects or boards in Jira","URL":"Your Jira URL","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","ISSUES_PROJECT":"Pyynnöt","CREATE_AS_SCRUM_DESCRIPTION":"The issues and sub-issues of your project will be created as Taiga user stories and tasks.","CREATE_AS_KANBAN_DESCRIPTION":"The issues and sub-issues of your project will be created as Taiga user stories and tasks.","CREATE_AS_ISSUES_DESCRIPTION":"What do you want to do with sub-issues from the Jira project? (Taiga doesn't allow sub-issues)","CREATE_NEW_ISSUES":"Convert sub-issues to new Taiga issues","NOT_CREATE_NEW_ISSUES":"Do not import sub-issues"}}},"LIGHTBOX":{"DELETE_ACCOUNT":{"CONFIRM":"Haluatko varmasti poistaa Taiga-tunnuksesi?","CANCEL":"Takaisin asetuksiin","ACCEPT":"Poista tili","BLOCK_PROJECT":"Note that all the projects you own projects will be blocked after you delete your account. If you do not want a project blocked, transfer ownership to another member of each project prior to deleting your account."},"DELETE_PROJECT":{"TITLE":"Poista projekti","QUESTION":"Haluatko varmasti poistaa tämän projektin?","SUBTITLE":"Projektin kaikki tiedot poistetaan :-(","CONFIRM":"Kyllä, tiedän mitä teen"},"ASSIGNED_TO":{"SELECT":"Valitse tekijä","SEARCH":"Hae käyttäjiä"},"ADD_MEMBER":{"TITLE":"Uusi jäsen","PLACEHOLDER":"Filter users or write an email to invite","ADD_EMAIL":"Lisää sähköposti","REMOVE":"Poista","INVITE":"Kutsu","CHOOSE_ROLE":"Valitse rooli","PLACEHOLDER_INVITATION_TEXT":"(Vapaaehtoinen) Lisää oma kuvaus kutsuusi uusille jäsenille ;-)","HELP_TEXT":"Taigan käyttäjät lisätään automaattisesti, muille lähetetään kutsu."},"CREATE_ISSUE":{"TITLE":"Lisää pyyntö"},"FEEDBACK":{"TITLE":"Kerro jotain...","COMMENT":"...virhe, ehdotuksia, tai huonoin kokemuksesi Taigan kanssa","ACTION_SEND":"Lähetä palautetta"},"SEARCH":{"TITLE":"Hae","PLACEHOLDER_SEARCH":"Mitä etsit?"},"ADD_EDIT_SPRINT":{"TITLE":"Uusi kierros","PLACEHOLDER_SPRINT_NAME":"kierroksen nimi","PLACEHOLDER_SPRINT_START":"Arvioitu alku","PLACEHOLDER_SPRINT_END":"Arvioitu loppu","ACTION_DELETE_SPRINT":"Haluatko poistaa tämän kierroksen?","TITLE_ACTION_DELETE_SPRINT":"poista kierros","LAST_SPRINT_NAME":"viimeinen kierros on {{lastSprint}} ;-) "},"CREATE_EDIT_TASK":{"TITLE":"Uusi tehtävä","PLACEHOLDER_SUBJECT":"Tehtävän aihe","PLACEHOLDER_STATUS":"Tehtävän tila","OPTION_UNASSIGNED":"Ilman tekijää","PLACEHOLDER_SHORT_DESCRIPTION":"Kirjoita lyhyt kuvaus","ACTION_EDIT":"Muokkaa tehtävää","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"CREATE_EDIT_US":{"TITLE":"Uusi Kt","PLACEHOLDER_DESCRIPTION":"Lisää kuvaus jotta muut ymmärtäisivät käyttäjätarinasi paremmin","NEW_US":"Uusi käyttäjätarina","EDIT_US":"Muokkaa käyttäjätarinaa","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"DELETE_DUE_DATE":{"TITLE":"Delete due date","SUBTITLE":"Are you sure you want to delete this due date?"},"DELETE_SPRINT":{"TITLE":"Poista kierros"},"CREATE_MEMBER":{"PLACEHOLDER_INVITATION_TEXT":"(Vapaaehtoinen) Lisää oma kuvaus kutsuusi uusille jäsenille ;-)","PLACEHOLDER_TYPE_EMAIL":"Anna sähköposti","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"You are about to reach the maximum number of members allowed for this project, {{maxMembers}} members. If you would like to increase the current limit, please contact the administrator.","LIMIT_USERS_WARNING_MESSAGE":"You are about to reach the maximum number of members allowed for this project, {{maxMembers}} members."},"LEAVE_PROJECT_WARNING":{"TITLE":"Unfortunately, this project can't be left without an owner","CURRENT_USER_OWNER":{"DESC":"You are the current owner of this project. Before leaving, please transfer ownership to someone else.","BUTTON":"Vaihda projektin omistaja"},"OTHER_USER_OWNER":{"DESC":"Unfortunately, you can't delete a member who is also the current project owner. First, please assign a new project owner.","BUTTON":"Pyydä projektin omistajan muutosta"}},"CHANGE_OWNER":{"TITLE":"Who do you want to be the new project owner?","ADD_COMMENT":"Lisää kommentti","BUTTON":"Pyydä tätä jäsentä uudeksi projektin omistajaksi"},"CONTACT_PROJECT":{"TITLE":"Lähetä sähköposti","WARNING":"The email will be received by the project admins","PLACEHOLDER":"Kirjoita viesti","SEND":"Lähetä"},"SET_DUE_DATE":{"TITLE":"Set due date","PLACEHOLDER_DUE_DATE":"Select date","REASON_FOR_DUE_DATE":"Reason for the due date","PLACEHOLDER_REASON_FOR_DUE_DATE":"Why does this US need a due date?","SUGGESTIONS":{"IN_ONE_WEEK":"In one week","IN_TWO_WEEKS":"In two weeks","IN_ONE_MONTH":"In one month","IN_THREE_MONTHS":"In three months"},"TITLE_ACTION_DELETE_DUE_DATE":"Delete due date"}},"EPIC":{"PAGE_TITLE":"{{epicSubject}} - Eepos {{epicRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{epicStatus }}. Description: {{epicDescription}}","SECTION_NAME":"Eepos","TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY":"Unlink related userstory","MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY":"It will delete the link to the related userstory '{{subject}}'","ERROR_UNLINK_RELATED_USERSTORY":"We have not been able to unlink: {{errorMessage}}","CREATE_RELATED_USERSTORIES":"Linkitä","NEW_USERSTORY":"Uusi käyttäjätarina","EXISTING_USERSTORY":"Luodut käyttäjätarinat","CHOOSE_PROJECT_FOR_CREATION":"Mikä on projekti?","SUBJECT":"Aihe","SUBJECT_BULK_MODE":"Subject (bulk insert)","CHOOSE_PROJECT_FROM":"Mikä on projekti?","CHOOSE_USERSTORY":"Mikä on käyttäjätarina?","NO_USERSTORIES":"This project has no User Stories yet. Please select another project.","NO_USERSTORIES_FOUND":"Ei hakutuloksia","FILTER_USERSTORIES":"Suodata käyttäjätarinoita","LIGHTBOX_TITLE_BLOKING_EPIC":"Blocking epic","ACTION_DELETE":"Poista eepos"},"US":{"PAGE_TITLE":"{{userStorySubject}} - Käyttäjätarina {{userStoryRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{userStoryStatus }}. Completed {{userStoryProgressPercentage}}% ({{userStoryClosedTasks}} of {{userStoryTotalTasks}} tasks closed). Points: {{userStoryPoints}}. Description: {{userStoryDescription}}","SECTION_NAME":"Käyttäjätarina","LINK_TASKBOARD":"Tehtävätaulu","TITLE_LINK_TASKBOARD":"Siirry tehtävätauluun","TOTAL_POINTS":"pisteet yhteensä","ADD":"+ Lisää uusi käyttäjätarina","ADD_BULK":"Lisää monta käyttäjätarinaa","PROMOTED":"Tämä Kt on liitetty pyyntöön:","TITLE_LINK_GO_TO_ISSUE":"Siirry pyyntöön","TITLE_DELETE_ACTION":"Poista käyttäjätarina","LIGHTBOX_TITLE_BLOKING_US":"Meitä estää","NOT_ESTIMATED":"Ei arvioitu","OWNER_US":"This User Story belongs to","TRIBE":{"PUBLISH":"Publish as Gig in Taiga Tribe","PUBLISH_INFO":"Lisätietoa","PUBLISH_TITLE":"More info on publishing in Taiga Tribe","PUBLISHED_AS_GIG":"Story published as Gig in Taiga Tribe","EDIT_LINK":"Muokkaa linkkiä","CLOSE":"Sulje","SYNCHRONIZE_LINK":"synchronize with Taiga Tribe","PUBLISH_MORE_INFO_TITLE":"Tarvitsetko tekijän tälle tehtävälle?","PUBLISH_MORE_INFO_TEXT":"

    If you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

    TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

    "},"FIELDS":{"TEAM_REQUIREMENT":"Tiimin vaatimus","CLIENT_REQUIREMENT":"Asiakkaan vaatimus"}},"COMMENTS":{"DELETED_INFO":"Kommentti poistettu {{user}}","COMMENTS_COUNT":"{{comments}} Kommentit","OLDER_FIRST":"Vanhin ensin","RECENT_FIRST":"Viimeisin ensin","COMMENT":"Kommentti","EDITED_COMMENT":"Muokattu:","SHOW_HISTORY":"Näytä historia","TYPE_NEW_COMMENT":"Lisää uusi kommentti tässä","SHOW_DELETED":"Näytä poistettu kommentti","HIDE_DELETED":"Piilota poistettu kommentti","DELETE":"Poista kommentti","RESTORE":"Palauta kommentti","HISTORY":{"TITLE":"Aktiivisuus"}},"ACTIVITY":{"TITLE":"Aktiivisuus","ACTIVITIES_COUNT":"{{activities}} Aktiviteetit","TAGS_ADDED":"tagit lisätty","TAGS_REMOVED":"tagit poistettu:","US_POINTS":"{{role}} pisteet","NEW_ATTACHMENT":"uusi liitetiedosto:","DELETED_ATTACHMENT":"poistettu liitetiedosto:","UPDATED_ATTACHMENT":"päivitetty liitetiedosto ({{filename}}):","CREATED_CUSTOM_ATTRIBUTE":"created custom attribute","UPDATED_CUSTOM_ATTRIBUTE":"updated custom attribute","BECAME_DEPRECATED":"became deprecated","BECAME_UNDEPRECATED":"became undeprecated","TEAM_REQUIREMENT":"Tiimin vaatimus","CLIENT_REQUIREMENT":"Asiakkaan vaatimus","BLOCKED":"Suljettu","VALUES":{"NOT_SET":"not set","UNASSIGNED":"ilman tekijää"},"FIELDS":{"SUBJECT":"aihe","DESCRIPTION":"kuvaus","PRIORITY":"kiireellisyys","SEVERITY":"vakavuus","STATUS":"tila","TYPE":"tyyppi","ASSIGNED_TO":"tekijä on","ASSIGNED_USERS":"assigned users","DUE_DATE":"due date","MILESTONE":"kierros","COLOR":"väri"}},"BACKLOG":{"PAGE_TITLE":"Backlog - {{projectName}}","PAGE_DESCRIPTION":"The backlog panel, with user stories and sprints of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Odottavat","CUSTOMIZE_GRAPH":"Muokkaa backlog-graafia","CUSTOMIZE_GRAPH_TEXT":"To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the","CUSTOMIZE_GRAPH_ADMIN":"Hallinnoi","CUSTOMIZE_GRAPH_TITLE":"Set up the points and sprints through the Admin","MOVE_US_TO_CURRENT_SPRINT":"Siirrä nykyiseen kierrokseen","MOVE_US_TO_LATEST_SPRINT":"Move to latest Sprint","EMPTY":"The backlog is empty!","CREATE_NEW_US":"Luo uusi Kt","CREATE_NEW_US_EMPTY_HELP":"Voit haluta lisätä uuden käyttäjätarinan","EXCESS_OF_POINTS":"Pisteiden ylimäärä","PENDING_POINTS":"Odottavat pisteet","CLOSED_POINTS":"suljettu","COMPACT_SPRINT":"Kompakti kierros","GO_TO_TASKBOARD":"Siirry tehtävätauluun {{::name}}","EDIT_SPRINT":"Muokkaa kierrosta","TOTAL_POINTS":"yhteensä","STATUS_NAME":"Tilan nimi","SORTABLE_FILTER_ERROR":"Et voi viedä odottaviin, kun suodattimet ovat auki","DOOMLINE":"Projektin laajuus [Doomline]","CHART":{"XAXIS_LABEL":"Kierrokset","YAXIS_LABEL":"Pisteet","OPTIMAL":"Optimal pending points for sprint \"{{sprintName}}\" should be {{value}}","REAL":"Real pending points for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_TEAM":"Incremented points by team requirements for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_CLIENT":"Incremented points by client requirements for sprint \"{{sprintName}}\" is {{value}}"},"TAGS":{"TOGGLE":"Vaihda avainsanojen näkyvyyttä","SHOW":"Näytä avainsanat","HIDE":"Piilota avainsanat"},"FORECASTING":{"TITLE":"Velocity forecasting","BACKLOG":"Display backlog","NEW_SPRINT":"Candidate User Stories for your next sprint based on your velocity. Click to create a new sprint.","CURRENT_SPRINT":"Candidate User Stories for your sprint based on your velocity. Click to add to current sprint."},"TABLE":{"COLUMN_US":"Käyttäjätarinat","TITLE_COLUMN_POINTS":"Valitse näkymä roolille"},"SPRINT_SUMMARY":{"TOTAL_POINTS":"yhteensä
    pistettä","COMPLETED_POINTS":"valmiina
    pistettä","OPEN_TASKS":"avaa
    tehtävät","CLOSED_TASKS":"suljettu
    tehtävää","IOCAINE_DOSES":"myrkkye-
    annosta","SHOW_STATISTICS_TITLE":"Näytä tilastot","TOGGLE_BAKLOG_GRAPH":"Näytä/Piilota burndown-kaavio","POINTS_PER_ROLE":"Pisteitä per rooli"},"SUMMARY":{"PROJECT_POINTS":"projekti
    pistettä","DEFINED_POINTS":"määritellyt
    pisteet","CLOSED_POINTS":"suljettu
    pistettä","POINTS_PER_SPRINT":"pisettä/
    kierros"},"FILTERS":{"TOGGLE":"Vaihda suodattimien näkyvyyttä","HIDE":"Piilota suodattimet","SHOW":"Näytä suodattimet"},"SPRINTS":{"TITLE":"KIERROKSET","DATE":"DD.MM.YY","LINK_TASKBOARD":"Kierroksien tehtävätaulu","TITLE_LINK_TASKBOARD":"Siirry tehtävätauluun {{name}}","EMPTY":"Ei vielä sprinttejä","WARNING_EMPTY_SPRINT_ANONYMOUS":"Tässä sprintissä ei ole käyttäjätarinoita","WARNING_EMPTY_SPRINT":"Raahaa tähän käyttäjätarinoita aloittaaksesi uuden sprintin","TITLE_ACTION_NEW_SPRINT":"Lisää uusi sprintti","TEXT_ACTION_NEW_SPRINT":"Saatat haluta luoda uuden sprintin projektiisi","ACTION_SHOW_CLOSED_SPRINTS":"Näytä suljetut kierrokset","ACTION_HIDE_CLOSED_SPRINTS":"Piilota suljetut kierrokset"}},"ERROR":{"TEXT1":"Jotain tapahtui ja Oompa Loompas työskentelevät sen parissa.","NOT_FOUND":"Ei löytynyt","NOT_FOUND_TEXT":"Virhe 404. Sivua ei löydy. Palaa takaisin TAIGA etusivulle ja katso löydätkö haluamasi sieltä.","PERMISSION_DENIED":"Ei oikeutta","PERMISSION_DENIED_TEXT":"Pääsy estetty.","VERSION_ERROR":"Joku Taigassa on päivittänyt tätä ennen sinua. Muutoksiasi ei voida tallentaa. Lataa sivu uudestaan ja korjaa tilanne."},"TASKBOARD":{"PAGE_TITLE":"{{sprintName}} - Sprint tehtävätaulu - {{projectName}}","PAGE_DESCRIPTION":"Sprint {{sprintName}} (from {{startDate}} to {{endDate}}) of {{projectName}}. Completed {{completedPercentage}}% ({{completedPoints}} of {{totalPoints}} points). {{openTasks}} opened tasks of {{totalTasks}}.","SECTION_NAME":"Tehtävätaulu","TITLE_ACTION_ADD":"Lisää uusi tehtävä","TITLE_ACTION_ADD_BULK":"Lisää monta tehtävää","TITLE_ACTION_ASSIGN":"Valitse tekijä","PLACEHOLDER_CARD_TITLE":"This could be a task","PLACEHOLDER_CARD_TEXT":"Jaa tarinat tehtäviksi, että voit seurata niitä erikseen","TABLE":{"COLUMN":"Käyttäjätarina","TITLE_ACTION_FOLD":"Kavenna sarake","TITLE_ACTION_UNFOLD":"Laajenna sarake","TITLE_ACTION_FOLD_ROW":"Kavenna rivi","TITLE_ACTION_UNFOLD_ROW":"Laajenna rivi","FIELD_POINTS":"pisteet","ROW_UNASSIGED_TASKS_TITLE":"Poista tekijä"},"CHARTS":{"XAXIS_LABEL":"Päivät","YAXIS_LABEL":"Pisteet","OPTIMAL":"Optimaaliset odottavat pisteet {{formattedDate}} ovat {{roundedValue}}","REAL":"Todelliset odottavat pisteet {{formattedDate}} ovat {{roundedValue}}","DATE":"DD.MM.YY"}},"TASK":{"PAGE_TITLE":"{{taskSubject}} - Tehtävä {{taskRef}} - {{projectName}}","PAGE_DESCRIPTION":"Tilanne: {{taskStatus }}. Kuvaus: {{taskDescription}}","SECTION_NAME":"Tehtävä","LINK_TASKBOARD":"Tehtävätaulu","TITLE_LINK_TASKBOARD":"Siirry tehtävätauluun","PLACEHOLDER_SUBJECT":"Anna tehtävän aihe","TITLE_SELECT_STATUS":"Tilan nimi","OWNER_US":"Tehtävä kuuluu käyttäjälle ","TITLE_LINK_GO_OWNER":"Siirry käyttäjätarinaan","TITLE_DELETE_ACTION":"Poista tehtävä","LIGHTBOX_TITLE_BLOKING_TASK":"Estävä tehtävä","FIELDS":{"IS_IOCAINE":"Myrkyllinen"},"TITLE_ACTION_IOCAINE":"Rasittaako tehtävä? Kerro muillekin klikkaamalla myrkyn kuvaketta. Sattaa myös helpottaa jatkossa jos nautit vähitellen."},"NOTIFICATION":{"OK":"Kaikki on kunnossa","WARNING":"Oops, jotain tapahtui...","WARNING_TEXT":"Oompa Loompas eivät pystyneet tallentamaan muutoksiasi!","SAVED":"Oompa Loompas tallensivat kaikki muutoksesi!","CLOSE":"Sulje ilmoitus","MAIL":"Ilmoitukset sähköpostilla","DESKTOP":"Desktop notifications using browser alerts","ASK_DELETE":"Oletko varma että haluat poistaa tämän?"},"CANCEL_ACCOUNT":{"TITLE":"Peru tunnuksesi","SUBTITLE":"Olemme pahoillamme että jätät Taigan. Toivottavasti nautit oleskelusta :)","PLACEHOLDER_INPUT_TOKEN":"peru tunnus tokeni","ACTION_LEAVING":"Kyllä, olen lähdössä!","SUCCESS":" Oompa Loompas poistivat tunnuksesi"},"CHANGE_EMAIL_FORM":{"TITLE":"Muuta sähköpostisi","SUBTITLE":"Vielä yksi klikki ja sähköpostisi on päivitetty!","PLACEHOLDER_INPUT_TOKEN":"muuta sähköposti-tokenia","ACTION_CHANGE_EMAIL":"Muuta sähköpostisi","SUCCESS":"Oompa Loompas päivittivät sähköpostisi"},"ISSUES":{"PAGE_TITLE":"Issues - {{projectName}}","PAGE_DESCRIPTION":"The issues list panel of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Issue","ACTION_NEW_ISSUE":"+ UUSI PYYNTÖ","ACTION_PROMOTE_TO_US":"Liitä käyttäjätarinaan","PROMOTED":"Tämä pyyntö on liitetty Kthen:","EXTERNAL_REFERENCE":"Tämä pyyntö on luotu täältä:","GO_TO_EXTERNAL_REFERENCE":"Palaa alkuun","ACTION_DELETE":"Poista pyyntö","LIGHTBOX_TITLE_BLOKING_ISSUE":"Estävä pyyntö","FIELDS":{"PRIORITY":"Tärkeys","SEVERITY":"Vakavuus","TYPE":"Tyyppi"},"CONFIRM_PROMOTE":{"TITLE":"Liitä tämä pyyntö uuteen käyttäjätarinaan","MESSAGE":"Haluatko varmasti lisätä uuden käyttäjätarinan tästä pyynnöstä?"},"TABLE":{"COLUMNS":{"TYPE":"Tyyppi","SEVERITY":"Vakavuus","PRIORITY":"Tärkeys","SUBJECT":"Aihe","VOTES":"Ääniä","STATUS":"Tila","CREATED":"Luotu","ASSIGNED_TO":"Tekijä"},"TITLE_ACTION_CHANGE_STATUS":"Muuta tilaa","TITLE_ACTION_ASSIGNED_TO":"Tekijä","BLOCKED":"Suljettu","EMPTY":{"TITLE":"Ei raportoitavia pyyntöjä:-)","SUBTITLE":"Löysitkö ongelman?"}}},"ISSUE":{"PAGE_TITLE":"{{issueSubject}} - Issue {{issueRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{issueStatus }}. Type: {{issueType}}, Priority: {{issuePriority}}. Severity: {{issueSeverity}}. Description: {{issueDescription}}"},"KANBAN":{"PAGE_TITLE":"Kanban - {{projectName}}","PAGE_DESCRIPTION":"Kanban-taulu, projektin käyttäjätarinat {{projectName}}: {{projectDescription}}","SECTION_NAME":"Kanban","TITLE_ACTION_FOLD":"Kavenna sarake","TITLE_ACTION_UNFOLD":"Laajenna sarake","TITLE_ACTION_ADD_US":"Lisää uusi käyttäjätarina","TITLE_ACTION_ADD_BULK":"Lisää monta","ACTION_SHOW_ARCHIVED":"Näytä arkisto","ACTION_HIDE_ARCHIVED":"Piilota arkisto","HIDDEN_USER_STORIES":"Käyttäjätarinat tällä alueella ovat oletuksena piilotettuna","PLACEHOLDER_CARD_TITLE":"Nämä ovat käyttäjätarinasi","PLACEHOLDER_CARD_TEXT":"Stories might also have subtasks to separate requirements"},"SEARCH":{"PAGE_TITLE":"Etsi - {{projectName}}","PAGE_DESCRIPTION":"Etsi projektisisällöstä: tarinat, tehtävät, wiki... {{projectName}}: {{projectDescription}}","FILTER_EPICS":"Eepokset","FILTER_USER_STORIES":"Käyttäjätarinat","FILTER_ISSUES":"Pyynnöt","FILTER_TASKS":"Tehtävät","FILTER_WIKI":"Wiki-sivut","PLACEHOLDER_SEARCH":"Etsi täältä...","TITLE_ACTION_SEARCH":"hae","EMPTY_TITLE":"Mitään ei löytynyt.","EMPTY_DESCRIPTION":"Kokeile ylempiä välilehtiä ja hae uudestaan"},"TEAM":{"PAGE_TITLE":"Tiimi - {{projectName}}","PAGE_DESCRIPTION":"The team panel to show all the members of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Tiimi","PLACEHOLDER_INPUT_SEARCH":"Etsi koko nimellä...","COLUMN_MR_WOLF":"Mr. Wolf","EXPLANATION_COLUMN_MR_WOLF":"Suljetut pyynnöt","COLUMN_IOCAINE":"Myrkyn syöjä","EXPLANATION_COLUMN_IOCAINE":"Kertyneet myrkyt","COLUMN_CERVANTES":"Cervantes","EXPLANATION_COLUMN_CERVANTES":"Wiki-sivuja muokattu","COLUMN_BUG_HUNTER":"Virheiden metsästäjä","EXPLANATION_COLUMN_BUG_HUNTER":"Pyyntöjä raportoitu","COLUMN_NIGHT_SHIFT":"Yövuoro","EXPLANATION_COLUMN_NIGHT_SHIFT":"Suljetut tehtävät","COLUMN_TOTAL_POWER":"Kokonaisvoima","EXPLANATION_COLUMN_TOTAL_POWER":"Kokonaispisteet","SECTION_TITLE_TEAM":"Tiimi >","SECTION_FILTER_ALL":"Kaikki","CONFIRM_LEAVE_PROJECT":"Oletko varma että haluat poistua projektista?","ACTION_LEAVE_PROJECT":"Poistu projektista"},"USER_SETTINGS":{"AVATAR_MAX_SIZE":"Maksimi koko {{maxFileSize}}","MENU":{"SECTION_TITLE":"Käyttäjän asetukset","USER_PROFILE":"Käyttäjän profiili","CHANGE_PASSWORD":"Muuta salasanaa","EMAIL_NOTIFICATIONS":"Sähköposti-ilmoitukset","DESKTOP_NOTIFICATIONS":"Desktop notifications"},"NOTIFICATIONS":{"LIVE_SECTION_NAME":"Desktop Notifications","SECTION_NAME":"Sähköposti-ilmoitukset","COLUMN_PROJECT":"Projekti","COLUMN_RECEIVE_ALL":"Vastaanota kaikki","COLUMN_ONLY_INVOLVED":"Ainoa osallinen","COLUMN_NO_NOTIFICATIONS":"Ei ilmoituksia","OPTION_ALL":"Kaikki","OPTION_INVOLVED":"Osallisena","OPTION_NONE":"Ei yhtään"}},"USER_PROFILE":{"ACTION_USE_GRAVATAR":"Käytä oletuskuvaa","ACTION_DELETE_ACCOUNT":"Poista Taiga-tunnus","ACTION_DOWNLOAD_PROFILE":"Download Taiga profile","CHANGE_EMAIL_SUCCESS":"Tarkista sähköpostisi!
    Lähetimme ohjeet
    {{email}}
    uuden osoitteen asettamiseen","CHANGE_PHOTO":"Muuta kuva","FIELD":{"USERNAME":"Käyttäjänimi","EMAIL":"Sähköposti","FULL_NAME":"Koko nimi","PLACEHOLDER_FULL_NAME":"Anna koko nimesi","BIO":"Bio (max. 210 merkkiä)","PLACEHOLDER_BIO":"Kerro jotain itsestäsi","LANGUAGE":"Kieli","LANGUAGE_DEFAULT":"-- käytä oletuskieltä --","THEME":"Teema","THEME_DEFAULT":"-- käytä vakioteemaa --"}},"WIKI":{"PAGE_TITLE":"{{wikiPageName}} - Wiki - {{projectName}}","PAGE_DESCRIPTION":"Last edition on {{lastModifiedDate}} ({{totalEditions}} editions in total) Content: {{ wikiPageContent }}","DATETIME":"DD.MM.YY - HH:mm","REMOVE":"Poista tämä wiki-sivu","DELETE_LIGHTBOX_TITLE":"Poista wiki-sivu","DELETE_LINK_TITLE":"Poista Wiki linkki","NAVIGATION":{"HOME":"Etusivu","SECTION_NAME":"Kirjanmerkit","ACTION_ADD_LINK":"Lisää kirjanmerkki","ALL_PAGES":"Kaikki wiki-sivut"},"SUMMARY":{"TIMES_EDITED":"kertaa
    muokattu","LAST_EDIT":"viimeinen
    muokkaus","LAST_MODIFICATION":"viimeinen muokkaus"},"SECTION_PAGES_LIST":"Kaikki sivut","PAGES_LIST_COLUMNS":{"TITLE":"Otsikko","EDITIONS":"Editions","CREATED":"Luotu","MODIFIED":"Muokattu","CREATOR":"Luoja","LAST_MODIFIER":"Viimeinen muokkaaja"}},"HINTS":{"SECTION_NAME":"Vihje","LINK":"If you want to know how to use it visit our support page","LINK_TITLE":"Vieraile tukisivustolla","HINT1_TITLE":"Did you know you can import and export projects?","HINT1_TEXT":"This allow you to extract all your data from one Taiga and move it to another one.","HINT2_TITLE":"Did you know you can create custom fields?","HINT2_TEXT":"Teams can now create custom fields as a flexible means to enter specific data useful for their particular workflow.","HINT3_TITLE":"Järjestä projektit itsellesi tärkeysjärjestykseen.","HINT3_TEXT":"The 10 projects are listed in the direct access bar at the top.","HINT4_TITLE":"Did you forget what were you working on?","HINT4_TEXT":"Don't worry, on your dashboard you'll find your open tasks, issues, and user stories in the order you worked on them."},"TIMELINE":{"UPLOAD_ATTACHMENT":"{{username}} lisäsi uuden liitetiedoston {{obj_name}}","US_CREATED":"{{username}} loi uuden käyttäjätarinan {{obj_name}} {{project_name}}","ISSUE_CREATED":"{{username}} has created a new issue {{obj_name}} in {{project_name}}","TASK_CREATED":"{{username}} loi uuden tehtävän {{obj_name}} -\n {{project_name}}","TASK_CREATED_WITH_US":"{{username}} has created a new task {{obj_name}} in {{project_name}} which belongs to the US {{us_name}}","WIKI_CREATED":"{{username}} has created a new wiki page {{obj_name}} in {{project_name}}","MILESTONE_CREATED":"{{username}} loi uuden sprintin {{obj_name}} - {{project_name}}","EPIC_CREATED":"{{username}} loi uuden eepoksen {{obj_name}} - {{project_name}}","EPIC_RELATED_USERSTORY_CREATED":"{{username}} has related the userstory {{related_us_name}} to the epic {{epic_name}} in {{project_name}}","NEW_PROJECT":"{{username}} loi projektin {{project_name}}","MILESTONE_UPDATED":"{{username}} muokkasi sprinttiä {{obj_name}}","US_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the US {{obj_name}}","US_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the US {{obj_name}} to {{new_value}}","US_UPDATED_POINTS":"{{username}} has updated '{{role_name}}' points of the US {{obj_name}} to {{new_value}}","ISSUE_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the issue {{obj_name}}","ISSUE_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the issue {{obj_name}} to {{new_value}}","TASK_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} to {{new_value}}","TASK_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} to {{new_value}}","TASK_UPDATED_WITH_US":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} which belongs to the US {{us_name}}","TASK_UPDATED_WITH_US_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} which belongs to the US {{us_name}} to {{new_value}}","WIKI_UPDATED":"{{username}} päivitti wikiä {{obj_name}}","EPIC_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the epic {{obj_name}}","EPIC_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the epic {{obj_name}} to {{new_value}}","EPIC_UPDATED_WITH_NEW_COLOR":"{{username}} has updated the \"{{field_name}}\" of the epic {{obj_name}} to ","NEW_COMMENT_US":"{{username}} kommentoi tarinaa {{obj_name}}","NEW_COMMENT_ISSUE":"{{username}} has commented in the issue {{obj_name}}","NEW_COMMENT_TASK":"{{username}} has commented in the task {{obj_name}}","NEW_COMMENT_EPIC":"{{username}} has commented in the epic {{obj_name}}","NEW_MEMBER":"{{project_name}} uusi jäsen lisätty","US_ADDED_MILESTONE":"{{username}} has added the US {{obj_name}} to {{sprint_name}}","US_MOVED":"{{username}} has moved the US {{obj_name}}","US_REMOVED_FROM_MILESTONE":"{{username}} has added the US {{obj_name}} to the backlog","BLOCKED":"{{username}} has blocked {{obj_name}}","UNBLOCKED":"{{username}} has unblocked {{obj_name}}","NEW_USER":"{{username}} has joined Taiga"},"LEGAL":{"TERMS_OF_SERVICE_AND_PRIVACY_POLICY_AD":"When creating a new account, you agree to our terms of service and privacy policy.","GDPR_ANNOUNCEMENT_TITLE":"General Data Protection Regulation (GDPR)","GDPR_ANNOUNCEMENT_DESCRIPTION":"You saw this comming, right? Updates to our Terms of Service","GDPR_ANNOUNCEMENT_INFOLINK":"Please read our announcement here"},"EXTERNAL_APP":{"PAGE_TITLE":"An external app requires authentication","PAGE_DESCRIPTION":"An external app requires authentication","AUTHORIZATION_REQUEST":"Authorize {{application}} to use your Taiga account?","LOGIN_WITH_ANOTHER_USER":"Kirjaudu toisena käyttäjänä","AUTHORIZE_APP":"Authorize app","CANCEL":"Peru"},"JOYRIDE":{"NAV":{"NEXT":"Seuraava","BACK":"Palvelin","SKIP":"Ohita","DONE":"Tehty"},"DASHBOARD":{"STEP1":{"TITLE":"Projektisi","TEXT":"Tervetuloa! Tässä näet projektit, joissa olet mukana."},"STEP2":{"TITLE":"Käynnissä olevat","TEXT":"Here you will find the User Stories, Tasks and Issues in which you are working on."},"STEP3":{"TITLE":"Seuraa","TEXT1":"And right here you will find the ones in your projects that you want to know about.","TEXT2":"You are already working with Taiga ;)"},"STEP4":{"TITLE":"Aloitetaan","TEXT1":"You can start by creating your first Taiga project.","TEXT2":"Onnea matkaan!"}},"BACKLOG":{"STEP1":{"TITLE":"Projektiyhteenveto","TEXT1":"Here you will see the state of your project.","TEXT2":"Voit muokata projektiin liityviä asetuksia admin-näkymässä."},"STEP2":{"TITLE":"Product backlog","TEXT":"The backlog is the list of requirements (User Stories) for the project. Here is where you will plan your sprints."},"STEP3":{"TITLE":"Kierrokset","TEXT":"Sprints are short periods of time (usually 2 weeks) during which specific work has to be completed and delivered."},"STEP4":{"TITLE":"Käyttäjätarinat","TEXT":"Those are the requirements at high level. You can add them to the backlog and drag them to the sprint in which it should be delivered."}},"KANBAN":{"STEP1":{"TITLE":"Customize your workflow","TEXT":"Set up the columns you need to map your workflow statuses through the admin."},"STEP2":{"TITLE":"Käyttäjätarinat & Tehtävät","TEXT":"User Stories are the requirements at high level. You can drag them to different columns."},"STEP3":{"TITLE":"Adding User Stories","TEXT1":"You may want to add a single User Story (add US icon) or a group of them (bulk icon)","TEXT2":"Onnea matkaan!"}}},"DISCOVER":{"PAGE_TITLE":"Discover projects - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","DISCOVER_TITLE":"Discover projects","DISCOVER_SUBTITLE":"{projects, plural, one{One public project to discover} other{# public projects to discover}}","MOST_ACTIVE":"Aktiivisin","MOST_ACTIVE_EMPTY":"Ei vielä AKTIIVISIA projekteja","MOST_LIKED":"Eniten tykätty","MOST_LIKED_EMPTY":"There are no LIKED projects yet","VIEW_MORE":"Näytä lisää","FEATURED":"Featured Projects","EMPTY":"There are no projects to show with this search criteria.
    Try again!","FILTERS":{"ALL":"Kaikki","KANBAN":"Kanban","SCRUM":"Scrum","PEOPLE":"Etsitään tekijöitä","WEEK":"Viime viikko","MONTH":"Viime kuu","YEAR":"Viime vuosi","ALL_TIME":"All time","CLEAR":"Tyhjennä suodattimet"},"SEARCH":{"PAGE_TITLE":"Search - Discover projects - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","INPUT_PLACEHOLDER":"Kirjoita tähän...","ACTION_TITLE":"Hae","RESULTS":"Hakutulokset"}}} \ No newline at end of file diff --git a/dist/v-1527758585938/locales/taiga/locale-ja.json b/dist/v-1527758585938/locales/taiga/locale-ja.json deleted file mode 100644 index 81c78a9..0000000 --- a/dist/v-1527758585938/locales/taiga/locale-ja.json +++ /dev/null @@ -1 +0,0 @@ -{"COMMON":{"YES":"はい","NO":"いいえ","OR":"または","LOADING":"ロード中...","DATE":"YYYY年MM月DD日","DATETIME":"YYYY年MM月DD日 HH時mm分","SAVE":"保存","CANCEL":"キャンセル","ACCEPT":"はい","DELETE":"削除","UNLINK":"リンク解除","CREATE":"作成","ADD":"追加","COPY_TO_CLIPBOARD":"クリップボードにコピー: Ctrl+C","EDIT":"編集","DRAG":"ドラッグ","TAG_LINE":"あなたのアジャイルでフリーでオープンソースなマネジメントツールです","TAG_LINE_2":"LOVE YOUR PROJECT","BLOCK":"ブロック","BLOCK_TITLE":"Block this item for example if it has a dependency that can not be satisfied","BLOCKED":"ブロック中","UNBLOCK":"ブロック解除","UNBLOCK_TITLE":"ブロックを解除する","BLOCKED_NOTE":"なぜこれはブロックされているのか?","BLOCKED_REASON":"理由を説明してください","CREATED_BY":"{{fullDisplayName}} によって作成","CLOSE":"閉じる","GO_HOME":"ホームに戻る","PLUGINS":"プラグイン","ONE_ITEM_LINE":"1行に1アイテム","NEW_BULK":"一括登録","RELATED_TASKS":"関連タスク","PREVIOUS":"前","NEXT":"次へ","LOGOUT":"ログアウト","EXTERNAL_USER":"外部ユーザー","GENERIC_ERROR":"ウンパルンパのひとりが「{{error}}」と言っています。","IOCAINE_TEXT":"This member is feeling a bit overwhelmed by this task. Will become immune to the iocaine poison over time with your help. For now, may need a hug.","CLIENT_REQUIREMENT":"Client requirement is new requirement that was not previously expected and it is required to be part of the project","TEAM_REQUIREMENT":"Team requirement is a requirement that must exist in the project but should have no cost for the client","OWNER":"プロジェクトオーナー","CAPSLOCK_WARNING":"Be careful! You are using capital letters in an input field that is case sensitive.","CONFIRM_CLOSE_EDIT_MODE_TITLE":"本当にこの編集画面を閉じてもよろしいですか?","CONFIRM_CLOSE_EDIT_MODE_MESSAGE":"保存せずに編集画面を閉じた場合、すべての変更が失われます。","RELATED_USERSTORIES":"関連するユーザーストーリー","CARD":{"ASSIGN_TO":"アサイン","EDIT":"編集","DELETE":"Delete card"},"FORM_ERRORS":{"DEFAULT_MESSAGE":"無効な値です","TYPE_EMAIL":"有効なメールアドレスでなければいけません。","TYPE_URL":"有効なURLでなければいけません","TYPE_URLSTRICT":"有効なURLでなければいけません","TYPE_NUMBER":"有効な数字でなければいけません","TYPE_DIGITS":"アラビア数字でなければいけません","TYPE_DATEISO":"YYYY-MM-DD の形式でなければいけません (例: 2038年01月23日)","TYPE_ALPHANUM":"半角英数字でなければなりません","TYPE_PHONE":"有効な電話番号でなければいけません","NOTNULL":"null以外でなければいけません","NOT_BLANK":"空欄にできません","REQUIRED":"必須です","REGEXP":"無効な値です","MIN":"この値は %s 以上でなければいけません","MAX":"この値は %s 以下でなければいけません","RANGE":"この値は %s と %s の間でなければいけません","MIN_LENGTH":"文字数が短すぎます。%s 文字以上にしてください。","MAX_LENGTH":"入力した値が長すぎます。%s 文字以下にしてください。","RANGE_LENGTH":"文字数が無効です。%s から %s 文字の間でなければいけません ","MIN_CHECK":"%s 以上選択してください。","MAX_CHECK":"選択できるのは %s までです","RANGE_CHECK":"選択できるのは %s から %s までです","EQUAL_TO":"この値は同じでなければいけません","LINEWIDTH":"行がおそらく長すぎます。%s文字以内におさえてください。","PIKADAY":"無効なデータフォーマットです。DD MMM YYYYの形式で入力してください。(例:23 Mar 1984)"},"PICKERDATE":{"FORMAT":"YYYY年MM月DD日","IS_RTL":"false","FIRST_DAY_OF_WEEK":"1","PREV_MONTH":"先月","NEXT_MONTH":"翌月","MONTHS":{"JAN":"1月","FEB":"2月","MAR":"3月","APR":"4月","MAY":"5月","JUN":"6月","JUL":"7月","AUG":"8月","SEP":"9月","OCT":"10月","NOV":"11月","DEC":"12月"},"WEEK_DAYS":{"SUN":"日曜","MON":"月曜","TUE":"火曜","WED":"水曜","THU":"木曜日","FRI":"金曜","SAT":"土曜"},"WEEK_DAYS_SHORT":{"SUN":"日","MON":"月","TUE":"火","WED":"水","THU":"木","FRI":"金","SAT":"土"}},"SEE_USER_PROFILE":"{{username }} のプロフィールを見る","USER_STORY":"User story","TASK":"タスク","ISSUE":"課題","EPIC":"エピック","TAGS":{"PLACEHOLDER":"タグを入力","DELETE":"タグを削除","ADD":"タグを追加"},"DESCRIPTION":{"EMPTY":"空欄だと退屈です…。説明を追加してください。","NO_DESCRIPTION":"説明はありません"},"FIELDS":{"SUBJECT":"題名","NAME":"名前","URL":"URL","DESCRIPTION":"説明","VALUE":"値","SLUG":"スラッグ","COLOR":"色","IS_CLOSED":"クローズ","STATUS":"ステータス","TYPE":"タイプ","SEVERITY":"深刻度","PRIORITY":"優先度","ASSIGNED_TO":"担当者","ASSIGNED_USERS":"Assigned users","POINTS":"ポイント","IS_BLOCKED":"はブロックされています。","REF":"参照","VOTES":"投票","SPRINT":"スプリント","DUE_DATE":"Due date","DUE_DATE_REASON":"Due date reason"},"ROLES":{"ALL":"すべて"},"ASSIGNED_TO":{"NOT_ASSIGNED":"未アサイン","ASSIGN":"アサイン","DELETE_ASSIGNMENT":"アサインを解除","REMOVE_ASSIGNED":"Remove assigned","TOO_MANY":"…ユーザーが多すぎます。フィルタを継続してください。","CONFIRM_UNASSIGNED":"本当にこのアサインから外れてもよろしいですか?","TITLE_ACTION_EDIT_ASSIGNMENT":"アサインを編集","SELF":"自分が担当する"},"DUE_DATE":{"TITLE_ACTION_SET_DUE_DATE":"Set due date","DUE_SOON":"due soon","PAST_DUE":"past due date","NO_LONGER_APPLICABLE":"no longer applicable"},"ASSIGNED_USERS":{"ADD":"Select assigned user","ADD_ASSIGNED":"Add assigned","TITLE_LIGHTBOX_DELETE_ASSIGNED":"Delete assigned..."},"STATUS":{"CLOSED":"終了","OPEN":"オープン"},"WATCHERS":{"WATCHERS":"ウォッチャー","ADD":"ウォッチャー追加","TITLE_ADD":"プロジェクトメンバーをウォッチャーリストへ追加","DELETE":"ウォッチャーを削除","TITLE_LIGHTBOX_DELETE_WARTCHER":"ウォッチャーの削除..."},"WATCH_BUTTON":{"WATCH":"フォロー","WATCHING":"フォロー中","UNWATCH":"フォローをやめる","WATCHERS":"ウォッチャー","BUTTON_TITLE":"この項目のフォローを有効/無効にする","COUNTER_TITLE":"{total, plural, one{one watcher} other{# 人がフォロー中}}"},"VOTE_BUTTON":{"BUTTON_TITLE":"賛成/反対の投票を行う","COUNTER_TITLE":"{total, plural, one{one vote} other{# 人が賛成}}"},"CUSTOM_ATTRIBUTES":{"CUSTOM_FIELDS":"カスタムフィールド","SAVE":"カスタムフィールドを保存","EDIT":"カスタムフィールドを編集","DELETE":"カスタム属性を削除","CONFIRM_DELETE":"このカスタムフィールドのすべての値が削除されることになります。\n本当にこのまま続行してもよろしいですか?"},"FILTERS":{"INPUT_PLACEHOLDER":"Subject or reference","TITLE_ACTION_FILTER_BUTTON":"検索","TITLE":"フィルター","TITLE_ACTION_SEARCH":"検索","ACTION_SAVE_CUSTOM_FILTER":"カスタムフィルターとして保存する","PLACEHOLDER_FILTER_NAME":"フィルター名を入力しエンターキーを押してください。","APPLIED_FILTERS_NUM":"フィルター適用中","CATEGORIES":{"TYPE":"タイプ","STATUS":"ステータス","SEVERITY":"深刻度","PRIORITIES":"優先度","TAGS":"タグ","ASSIGNED_TO":"担当者","ROLE":"役割","CREATED_BY":"作成者","CUSTOM_FILTERS":"カスタムフィルター","EPIC":"エピック"}},"WYSIWYG":{"CODE_SNIPPET":"Code Snippet","DB_CLICK":"ダブルクリックして編集","SELECT_LANGUAGE_PLACEHOLDER":"言語を選択","SELECT_LANGUAGE_REMOVE_FORMATING":"Remove formatting","OUTDATED":"Another person has made changes while you were editing. Check the new version on the activity tab before you save your changes.","MARKDOWN_HELP":"Markdown記法のヘルプ"},"PERMISIONS_CATEGORIES":{"EPICS":{"NAME":"エピック","VIEW_EPICS":"エピックの表示","ADD_EPICS":"エピックを追加","MODIFY_EPICS":"エピックの変更","COMMENT_EPICS":"複数のエピックにコメントする","DELETE_EPICS":"エピックの削除"},"SPRINTS":{"NAME":"スプリント","VIEW_SPRINTS":"スプリントの表示","ADD_SPRINTS":"スプリントを追加","MODIFY_SPRINTS":"スプリントの変更","DELETE_SPRINTS":"スプリントの削除"},"USER_STORIES":{"NAME":"ユーザーストーリー","VIEW_USER_STORIES":"ユーザーストーリーの表示","ADD_USER_STORIES":"ユーザーストーリーを追加","MODIFY_USER_STORIES":"ユーザーストーリーの変更","COMMENT_USER_STORIES":"複数のユーザーストーリーにコメントする","DELETE_USER_STORIES":"ユーザーストーリーの削除"},"TASKS":{"NAME":"タスク","VIEW_TASKS":"タスクの表示","ADD_TASKS":"タスクを追加","MODIFY_TASKS":"タスクの変更","COMMENT_TASKS":"複数のタスクにコメントする","DELETE_TASKS":"タスクの削除"},"ISSUES":{"NAME":"課題","VIEW_ISSUES":"課題の表示","ADD_ISSUES":"課題を追加","MODIFY_ISSUES":"課題の変更","COMMENT_ISSUES":"複数の課題にコメントする","DELETE_ISSUES":"課題の削除"},"WIKI":{"NAME":"Wiki","VIEW_WIKI_PAGES":"Wikiページの表示","ADD_WIKI_PAGES":"Wikiページを追加","MODIFY_WIKI_PAGES":"Wikiページの変更","DELETE_WIKI_PAGES":"Wikiページの削除","VIEW_WIKI_LINKS":"Wikiリンクの表示","ADD_WIKI_LINKS":"Wikiリンクを追加","DELETE_WIKI_LINKS":"Wikiリンクの削除"}}},"LOGIN":{"PAGE_TITLE":"ログイン - Taiga","PAGE_DESCRIPTION":"スタートアップ、デベロッパー、デザイナーのための、仕事を真から楽しくするシンプルで美しいプロジェクトマネージメントツール、Taigaにログインしましょう。"},"AUTH":{"INVITED_YOU":"があなたをプロジェクトに招待しています","NOT_REGISTERED_YET":"未登録ですか?","REGISTER":"登録","CREATE_ACCOUNT":"こちらから無料でアカウントを作成"},"LOGIN_COMMON":{"HEADER":"すでにログインしたことがあります","PLACEHOLDER_AUTH_NAME":"ユーザー名 または メールアドレス","LINK_FORGOT_PASSWORD":"忘れましたか?","TITLE_LINK_FORGOT_PASSWORD":"パスワードをお忘れですか?","ACTION_ENTER":"決定","ACTION_SIGN_IN":"ログイン","PLACEHOLDER_AUTH_PASSWORD":"パスワード","ALT_LOGIN":"または次でログイン"},"LOGIN_FORM":{"ERROR_AUTH_INCORRECT":"「あなたのユーザー名/メールアドレス または パスワードが間違っている」とウンパルンパたちが言っています。","SUCCESS":"ウンパルンパたちは嬉しいみたいですよ。Taigaへようこそ。"},"REGISTER":{"PAGE_TITLE":"登録 - Taiga","PAGE_DESCRIPTION":"スタートアップ、デベロッパー、デザイナーのための、仕事を真から楽しくするシンプルで美しいプロジェクトマネージメントツール、Taigaのアカウントを作成しましょう。"},"REGISTER_FORM":{"TITLE":"新しいTaigaアカウントを登録する (無料)","PLACEHOLDER_NAME":"ユーザー名を記入","PLACEHOLDER_FULL_NAME":"フルネームを記入","PLACEHOLDER_EMAIL":"メールアドレスを記入","PLACEHOLDER_PASSWORD":"パスワードを設定 (大文字・小文字を区別)","ACTION_SIGN_UP":"サインアップ","TITLE_LINK_LOGIN":"ログイン","LINK_LOGIN":"登録の準備は整いましたか? ログイン"},"FORGOT_PASSWORD":{"PAGE_TITLE":"パスワードを忘れました - Taiga","PAGE_DESCRIPTION":"ユーザー名 または メールアドレスを記入して新しいパスワードを取得しすれば、Taigaに再びアクセスできます。"},"FORGOT_PASSWORD_FORM":{"TITLE":"おっと、パスワードを忘れてしまいましたか?","SUBTITLE":"新しく始めるためにユーザー名 または メールアドレスを入力","PLACEHOLDER_FIELD":"ユーザー名 または メールアドレス","ACTION_RESET_PASSWORD":"パスワードをリセット","LINK_CANCEL":"いいえ、戻ります。私はそれを覚えていると思います。","SUCCESS_TITLE":"Inboxを確認してください","SUCCESS_TEXT":"新しいパスワードを設定するための指示を記載したメールを送信しました","ERROR":"「あなたのアカウントはまだ登録されていない」とウンパルンパたちが言っています。"},"CHANGE_PASSWORD":{"PAGE_TITLE":"パスワードの変更 - Taiga","SECTION_NAME":"パスワード変更","FIELD_CURRENT_PASSWORD":"現在のパスワード","PLACEHOLDER_CURRENT_PASSWORD":"現在のパスワード (パスワードが未設定の場合は空)","FIELD_NEW_PASSWORD":"新しいパスワード","PLACEHOLDER_NEW_PASSWORD":"新しいパスワードを入力","FIELD_RETYPE_PASSWORD":"新しいパスワードを再入力","PLACEHOLDER_RETYPE_PASSWORD":"新しいパスワードを再入力","ERROR_PASSWORD_MATCH":"パスワードが一致しません。"},"CHANGE_PASSWORD_RECOVERY_FORM":{"TITLE":"新しいTaigaのパスを作成","SUBTITLE":"そして、いくつかの鉄分豊富な食品を摂取しましょう!脳にとって良いことです :-P","PLACEHOLDER_NEW_PASSWORD":"新しいパスワード","PLACEHOLDER_RE_TYPE_NEW_PASSWORD":"新しいパスワードを再入力","ACTION_RESET_PASSWORD":"パスワードをリセット","ERROR":"ウンパルンパたちはあなたのパスワード復元依頼を見つけられないようです。もう一度お試しください。","SUCCESS":"ウンパルンパたちはあなたの新しいパスワードを保存しました。
    新しい方のパスワードでサインイン してみてください。"},"INVITATION":{"PAGE_TITLE":"招待を受諾する - Taiga","PAGE_DESCRIPTION":"スタートアップ、デベロッパー、デザイナーのための、仕事を真から楽しくするシンプルで美しいプロジェクトマネージメントツール、Taigaへの招待を受諾します。"},"INVITATION_LOGIN_FORM":{"NOT_FOUND":"「あなたの招待を確認できなかった」とウンパルンパたちが言っています。","SUCCESS":"プロジェクトへの参加に成功しました, {{project_name}}へようこそ"},"HOME":{"PAGE_TITLE":"ホーム - Taiga","PAGE_DESCRIPTION":"あなたのメインプロジェクト、担当あるいはフォローしているユーザーストーリー、タスク、課題が表示されるTaigaのホームページです。","EMPTY_WORKING_ON":"何も表示されていませんか? Taigaで作業を始めると、ここにあなたが取り組んでいるユーザーストーリー、タスク、課題が表示されます。","EMPTY_WATCHING":"ユーザーストーリー、タスク、課題をフォローして変更が発生した際に通知を受け取りましょう。:)","EMPTY_PROJECT_LIST":"参加中のプロジェクトがありません","WORKING_ON_SECTION":"取り組んでいる作業","WATCHING_SECTION":"フォロー中","DASHBOARD":"プロジェクトのダッシュボート"},"EPICS":{"TITLE":"エピック","SECTION_NAME":"エピック","EPIC":"エピック","PAGE_TITLE":"エピック - {{projectName}}","PAGE_DESCRIPTION":"エピックの一覧 {{projectName}}: {{projectDescription}}","DASHBOARD":{"ADD":"エピックを追加","UNASSIGNED":"未アサイン"},"EMPTY":{"TITLE":"まだエピックが無いようです","EXPLANATION":"エピックはユーザーストーリーを包含する、より上の階層のものです。
    階級のトップにあり、ユーザーストーリーをグループ化してまとめるのにも用いられます。","HELP":"エピックについて"},"TABLE":{"VOTES":"投票","NAME":"名前","PROJECT":"プロジェクト","SPRINT":"スプリント","ASSIGNED_TO":"アサイン済","STATUS":"ステータス","PROGRESS":"進捗","VIEW_OPTIONS":"オプションの表示"},"CREATE":{"TITLE":"新しいエピック","PLACEHOLDER_DESCRIPTION":"このエピックを他の人が理解できるように説明を加えて下さい","TEAM_REQUIREMENT":"チームからの要求","CLIENT_REQUIREMENT":"お客様からの要求","BLOCKED":"ブロック中","BLOCKED_NOTE_PLACEHOLDER":"なぜこのエピックはブロックされているのか?","CREATE_EPIC":"エピックを作成"}},"PROJECTS":{"PAGE_TITLE":"マイ プロジェクト - Taiga","PAGE_DESCRIPTION":"A list with all your projects, you can reorder or create a new one.","MY_PROJECTS":"マイ プロジェクト"},"ATTACHMENT":{"SECTION_NAME":"添付ファイル","TITLE":"{{ fileName }} が {{ date }} にアップロードされました","LIST_VIEW_MODE":"ライブビューモード","GALLERY_VIEW_MODE":"ギャラリービューモード","DESCRIPTION":"要約を入力","DEPRECATED":"(非推奨)","DEPRECATED_FILE":"推奨されませんか?","ADD":"新しい添付ファイルを追加する。 {{maxFileSizeMsg}}","DROP":"添付ファイルをここにドロップ!","SHOW_DEPRECATED":"+ 非推奨のアタッチメントを表示する","HIDE_DEPRECATED":"- 非推奨のアタッチメントを隠す","COUNT_DEPRECATED":"({{ counter }} deprecated)","MAX_UPLOAD_SIZE":"アップロード上限サイズは {{maxFileSize}} です","DATE":"YYYY年MM月DD日 hh時mm分","ERROR_UPLOAD_ATTACHMENT":"'{{fileName}}'のアップロードに失敗. {{errorMessage}}","TITLE_LIGHTBOX_DELETE_ATTACHMENT":"添付ファイルの削除...","MSG_LIGHTBOX_DELETE_ATTACHMENT":"添付ファイル '{{fileName}}'","ERROR_DELETE_ATTACHMENT":" 削除に失敗: {{errorMessage}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) はウンパルンパたちには重すぎます。({{maxFileSize}})より少ないもので試してください。"},"PAGINATION":{"PREVIOUS":"前へ","NEXT":"次へ"},"ADMIN":{"COMMON":{"TITLE_ACTION_EDIT_VALUE":"値を編集","TITLE_ACTION_DELETE_VALUE":"値を削除","TITLE_ACTION_DELETE_TAG":"タグを削除"},"HELP":"手助けが必要な場合はサポートページをチェックしてください。","PROJECT_DEFAULT_VALUES":{"TITLE":"初期値設定","SUBTITLE":"プルダウン項目の初期値を設定してください。"},"MEMBERSHIPS":{"TITLE":"メンバー管理","PAGE_TITLE":"メンバーシップ - {{projectName}}","ADD_BUTTON":"+ 新規メンバー","ADD_BUTTON_TITLE":"新規メンバーを追加","LIMIT_USERS_WARNING_MESSAGE_FOR_ADMIN":"このプロジェクトは許可されている最大メンバー数({{members}}名)に達しました。","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"このプロジェクトは許可されている最大メンバー数({{members}}名)に達しました。上限を増やしたい場合は管理者にお問い合わせください。"},"PROJECT_EXPORT":{"TITLE":"エクスポート","SUBTITLE":"エクスポートの実行によりプロジェクトのバックアップを作成することができます。
    また、バックアップをベースとして新しいプロジェクトを作成することも可能です。","EXPORT_BUTTON":"エクスポート","EXPORT_BUTTON_TITLE":"プロジェクトをエクスポート","LOADING_TITLE":"ダンプファイルを生成中","DUMP_READY":"ダンプファイルの用意が出来ました!","LOADING_MESSAGE":"このページを閉じないでください。","ASYNC_MESSAGE":"準備が出来たらメールで通知します。","SYNC_MESSAGE":"ダウンロードが自動で開始されない場合はこちらをクリックしてください。","ERROR":"ウンパルンパたちはダンプファイルの生成に手こずっているようです。もう一度お試しください。","ERROR_BUSY":"すみません、ウンパルンパたちはとても忙しいようです。しばらくしてからまたお試しください。"},"MODULES":{"TITLE":"モジュール","EPICS":"エピック","EPICS_DESCRIPTION":"あなたのプロジェクトの最も戦略的な部分を視覚化し、管理する","BACKLOG":"バックログ","BACKLOG_DESCRIPTION":"ユーザーストーリーが適切にメンテナンスされるよう管理し、優先順位に基づく作業を行うためのビュー","NUMBER_SPRINTS":"予測されるスプリント数","NUMBER_SPRINTS_HELP":"0に設定した場合、無制限となります","NUMBER_US_POINTS":"予測されるストーリーポイントの合計","NUMBER_US_POINTS_HELP":"0に設定した場合、無制限となります","KANBAN":"かんばん","KANBAN_DESCRIPTION":"このかんばんを利用して、無駄のない方法でプロジェクトを整理しましょう。","ISSUES":"課題","ISSUES_DESCRIPTION":"プロジェクトのバグ追跡、質問、機能改善に関する議論などが行えるようになります。","WIKI":"Wiki","WIKI_DESCRIPTION":"他のメンバーと協力してコンテンツを編集することができます。
    プロジェクトの情報を文書化するのにぴったりです。","MEETUP":"会議","MEETUP_DESCRIPTION":"あなたが利用しているビデオ会議システムを選択してください。","SELECT_VIDEOCONFERENCE":"ビデオ会議システムを選択","SALT_CHAT_ROOM":"チャットルーム名に接頭辞を追加","JITSI_CHAT_ROOM":"Jitsi","APPEARIN_CHAT_ROOM":"AppearIn","TALKY_CHAT_ROOM":"Talky","CUSTOM_CHAT_ROOM":"カスタム","URL_CHAT_ROOM":"チャットルームのURL"},"PROJECT_PROFILE":{"PAGE_TITLE":"{{sectionName}} - プロジェクトプロフィール - {{projectName}}","PROJECT_DETAILS":"プロジェクト詳細","PROJECT_NAME":"プロジェクト名","TAGS":"タグ","DESCRIPTION":"説明","RECRUITING":"プロジェクトメンバーを探していますか?","RECRUITING_MESSAGE":"どんな人を探していますか?","RECRUITING_PLACEHOLDER":"探している人のプロフィールを記載してください","FEEDBACK":"Taigaユーザーからのフィードバックを受け取りますか?","PUBLIC_PROJECT":"パブリック プロジェクト","PRIVATE_PROJECT":"非公開プロジェクト","PRIVATE_OR_PUBLIC":"パブリックプロジェクトとプライベートプロジェクトの違いは何ですか?","DELETE":"このプロジェクトを削除","CHANGE_LOGO":"ロゴを変更","ACTION_USE_DEFAULT_LOGO":"デフォルトのイメージを使用する","MAX_PRIVATE_PROJECTS":"あなたの現在のプランで許可されている非公開プロジェクトの上限数に達しました。","MAX_PRIVATE_PROJECTS_MEMBERS":"非公開プロジェクトの最大メンバー数を超えました。","MAX_PUBLIC_PROJECTS":"あなたの現在のプランで許可されている公開プロジェクトの上限数に達しました。","MAX_PUBLIC_PROJECTS_MEMBERS":"The project exceeds your maximum number of members for public projects","PROJECT_OWNER":"プロジェクトオーナー","REQUEST_OWNERSHIP":"オーナー権限を要求","REQUEST_OWNERSHIP_CONFIRMATION_TITLE":"新しいプロジェクトオーナーになりますか?","REQUEST_OWNERSHIP_DESC":"現在のプロジェクトオーナー {{name}} に、このプロジェクトのオーナー権限をあなたに移すよう要求","REQUEST_OWNERSHIP_BUTTON":"リクエスト","REQUEST_OWNERSHIP_SUCCESS":"プロジェクトオーナーに通知します","CHANGE_OWNER":"オーナーを変更","CHANGE_OWNER_SUCCESS_TITLE":"あなたのリクエストが送信されました!","CHANGE_OWNER_SUCCESS_DESC":"プロジェクトのオーナー権限要求が承認または拒否されことをメールでお知らせします"},"REPORTS":{"TITLE":"レポート","SUBTITLE":"オリジナルのレポートを作成するためにプロジェクトのデータをCSVで出力することができます。","DESCRIPTION":"CSVのダウンロードボタンまたは生成されたURLへアクセスしてファイルを入手し、お好みのテキストエディタや表計算ソフトで開いてください。データの可視化や分析を簡単に行うことが可能です。","HELP":"このファイルをどうやって表計算ソフトで活用すればいいですか?","REGENERATE_TITLE":"URLが変更されます","REGENERATE_SUBTITLE":"CSV出力用のURLを変更しようとしています。前回のURLは無効化されます。よろしいですか?"},"CSV":{"SECTION_TITLE_EPIC":"エピックレポート","SECTION_TITLE_US":"ユーザーストーリーを出力する","SECTION_TITLE_TASK":"タスクを出力する","SECTION_TITLE_ISSUE":"課題を出力する","DOWNLOAD":"CSVのダウンロード","URL_FIELD_PLACEHOLDER":"CSV出力用のURLを作成してください","TITLE_REGENERATE_URL":"CSV出力用のURLを作成","ACTION_GENERATE_URL":"URL を生成","ACTION_REGENERATE":"再作成"},"CUSTOM_FIELDS":{"TITLE":"カスタムフィールド","SUBTITLE":"ユーザーストーリー、タスク、課題のためのカスタムフィールドを明記してください。","EPIC_DESCRIPTION":"エピックカスタムフィールド","EPIC_ADD":"複数のエピックにカスタムフィールドを追加","US_DESCRIPTION":"ユーザーストーリーのカスタムフィールド","US_ADD":"ユーザーストーリーにカスタムフィールドを追加","TASK_DESCRIPTION":"タスクカスタムフィールド","TASK_ADD":"タスクにカスタムフィールドを追加","ISSUE_DESCRIPTION":"課題のカスタムフィールド","ISSUE_ADD":"課題にカスタムフィールドを追加","FIELD_TYPE_TEXT":"テキスト","FIELD_TYPE_RICHTEXT":"リッチテキスト","FIELD_TYPE_MULTI":"マルチライン","FIELD_TYPE_DATE":"日時","FIELD_TYPE_URL":"Url"},"PROJECT_VALUES":{"PAGE_TITLE":"{{sectionName}} - Project values - {{projectName}}","REPLACEMENT":"この値を持つすべてのアイテムはこちらに変更されます:","ERROR_DELETE_ALL":"すべての値を削除することはできません。"},"PROJECT_VALUES_POINTS":{"TITLE":"ポイント","SUBTITLE":"予測されるユーザーストーリーのポイントを定義することができます。","US_TITLE":"ユーザーストーリーのポイント","ACTION_ADD":"新規ポイントを追加"},"PROJECT_VALUES_PRIORITIES":{"TITLE":"優先度","SUBTITLE":"課題の優先度を定義することができます。","ISSUE_TITLE":"課題の優先度","ACTION_ADD":"新しい優先度を追加"},"PROJECT_VALUES_SEVERITIES":{"TITLE":"深刻度","SUBTITLE":"課題の深刻度を定義することができます。","ISSUE_TITLE":"課題の深刻度","ACTION_ADD":"新しい深刻度を追加"},"PROJECT_VALUES_STATUS":{"TITLE":"ステータス","SUBTITLE":"ユーザーストーリー、タスク、課題のステータスを定義することができます。","EPIC_TITLE":"エピックステータス","US_TITLE":"ユーザーストーリーステータス","TASK_TITLE":"タスクのステータス","ISSUE_TITLE":"課題のステータス"},"PROJECT_VALUES_TYPES":{"TITLE":"タイプ","SUBTITLE":"課題のタイプを定義することができます。","ISSUE_TITLE":"課題のタイプ","ACTION_ADD":"新しい {{objName}} を追加"},"PROJECT_VALUES_TAGS":{"TITLE":"タグ","SUBTITLE":"タグの色を編集","EMPTY":"タグは現在ありません。","EMPTY_SEARCH":"検索条件に当てはまるものはありませんでした。","ACTION_ADD":"タグを追加","NEW_TAG":"新規タグ","MIXING_HELP_TEXT":"マージしたいタグを選択","MIXING_MERGE":"タグを結合","SELECTED":"選択中"},"ROLES":{"PAGE_TITLE":"役割 - {{projectName}}","WARNING_NO_ROLE":"Be careful, no role in your project will be able to estimate the point value for user stories","HELP_ROLE_ENABLED":"この設定を有効にするとメンバーがこの役割にアサインされた際、ユーザーストーリーのポイントに反映されます。","DISABLE_COMPUTABLE_ALERT_TITLE":"Are you sure you want to disable this role estimations?","DISABLE_COMPUTABLE_ALERT_SUBTITLE":"If you disable estimation permissions for role {{roleName}} all previous estimations made by this role will be removed","COUNT_MEMBERS":"{{ role.members_count }} members with this role","TITLE_DELETE_ROLE":"役割を削除","REPLACEMENT_ROLE":"All the users with this role will be moved to","WARNING_DELETE_ROLE":"Be careful! All role estimations will be removed","ERROR_DELETE_ALL":"すべての値を削除することはできません","EXTERNAL_USER":"外部ユーザー","NOTE_EXTERNAL_USERS":"Note: by External User we mean any anonymous user not belonging to the Taiga platform, including search engines. Please use this role with care."},"THIRD_PARTIES":{"SECRET_KEY":"シークレットキー","PAYLOAD_URL":"Payload URL","VALID_IPS":"Valid origin IPs (separated by ,)"},"BITBUCKET":{"SECTION_NAME":"Bitbucket","PAGE_TITLE":"Bitbucket - {{projectName}}","INFO_VERIFYING_IP":"Bitbucket requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."},"GITLAB":{"SECTION_NAME":"Gitlab","PAGE_TITLE":"Gitlab - {{projectName}}","INFO_VERIFYING_IP":"Gitlab requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."},"GITHUB":{"SECTION_NAME":"Github","PAGE_TITLE":"GitHub - {{projectName}}"},"GOGS":{"SECTION_NAME":"Gogs","PAGE_TITLE":"Gogs - {{projectName}}"},"WEBHOOKS":{"PAGE_TITLE":"Webhooks - {{projectName}}","SECTION_NAME":"Webhooks","ADD_NEW":"新規Webhookを追加","TYPE_NAME":"サービス名を入力","TYPE_PAYLOAD_URL":"サービスペイロードのURLを入力","TYPE_SERVICE_SECRET":"サービスのシークレットキーを入力","SAVE":"Webhookを保存","CANCEL":"Webhookをキャンセル","SHOW_HISTORY":"(履歴を表示)","TEST":"Webhookをテスト","EDIT":"Webhookを編集","DELETE":"Webhookを削除","REQUEST":"リクエスト","RESEND_REQUEST":"リクエストを再送","HEADERS":"ヘッダー","PAYLOAD":"Payload","RESPONSE":"レスポンス","DATE":"YYYY年MM月DD日 hh時mm分ss秒","ACTION_HIDE_HISTORY":"(履歴を非表示)","ACTION_HIDE_HISTORY_TITLE":"履歴を非表示","ACTION_SHOW_HISTORY":"(履歴を表示)","ACTION_SHOW_HISTORY_TITLE":"履歴を表示","WEBHOOK_NAME":"Webhook '{{name}}'"},"CUSTOM_ATTRIBUTES":{"PAGE_TITLE":"{{sectionName}} - カスタム属性 - {{projectName}}","ADD":"カスタムフィールドを追加","EDIT":"カスタムフィールドを編集","DELETE":"カスタムフィールドを削除","SAVE_TITLE":"カスタムフィールドを保存","CANCEL_TITLE":"作成するのをやめる","SET_FIELD_NAME":"カスタムフィールド名を設定","SET_FIELD_DESCRIPTION":"カスタムフィールドの説明を設定","FIELD_TYPE_DEFAULT":"-- 1つ選択 --","ACTION_UPDATE":"カスタムフィールドを更新","ACTION_CANCEL_EDITION":"編集をキャンセル"},"MEMBERSHIP":{"COLUMN_MEMBER":"メンバー","COLUMN_ADMIN":"管理","COLUMN_ROLE":"役割","COLUMN_STATUS":"ステータス","STATUS_ACTIVE":"有効","STATUS_PENDING":"Pending","DELETE_MEMBER":"メンバーを削除","RESEND":"再送信","SUCCESS_SEND_INVITATION":"招待メールを '{{email}}' へもう一度送りました。","SUCCESS_DELETE":"{{message}} を削除しました","ERROR_DELETE":"{{message}} を削除できませんでした","DEFAULT_DELETE_MESSAGE":"{{email}} への招待メール"},"DEFAULT_VALUES":{"LABEL_EPIC_STATUS":"エピックステータスの初期値","LABEL_US_STATUS":"ユーザーストーリーステータスの初期値","LABEL_POINTS":"ポイントの初期値","LABEL_TASK_STATUS":"タスクステータスの初期値","LABEL_ISSUE_TYPE":"課題タイプの初期値","LABEL_ISSUE_STATUS":"課題ステータスの初期値","LABEL_PRIORITY":"優先度の初期値","LABEL_SEVERITY":"深刻度の初期値"},"STATUS":{"PLACEHOLDER_WRITE_STATUS_NAME":"新しいステータス名を記入"},"TYPES":{"PLACEHOLDER_WRITE_NAME":"新しいエレメント名を記入"},"US_STATUS":{"ACTION_ADD_STATUS":"ステータスを追加","IS_ARCHIVED_COLUMN":"アーカイブ","IS_CLOSED_COLUMN":"終了","WIP_LIMIT_COLUMN":"WIP制限","PLACEHOLDER_WRITE_NAME":"新しいステータス名を記入"},"MENU":{"PROJECT":"プロジェクト","ATTRIBUTES":"属性","MEMBERS":"メンバー","PERMISSIONS":"権限","INTEGRATIONS":"インテグレーション"},"SUBMENU_PROJECT_VALUES":{"STATUS":"ステータス","POINTS":"ポイント","PRIORITIES":"優先度","SEVERITIES":"深刻度","TYPES":"タイプ","CUSTOM_FIELDS":"カスタムフィールド","TAGS":"タグ"},"SUBMENU_ROLES":{"TITLE":"役割","ACTION_NEW_ROLE":"+ 新規役割","TITLE_ACTION_NEW_ROLE":"新しい役割を追加"},"PROJECT_TRANSFER":{"DO_YOU_ACCEPT_PROJECT_OWNERNSHIP":"新しいプロジェクトオーナーとなりますか?","PRIVATE":"プライベート","ACCEPTED_PROJECT_OWNERNSHIP":"おめでとうございます! あなたが新しいプロジェクトオーナーです。","REJECTED_PROJECT_OWNERNSHIP":"承知致しました。現在のプロジェクトオーナーに連絡します","ACCEPT":"はい","REJECT":"却下","PROPOSE_OWNERSHIP":"プロジェクト {{project}} の現在のオーナー {{owner}} が、あなたに新しいプロジェクトオーナーになるよう要求しています。","ADD_COMMENT":"プロジェクトオーナーにコメントしますか?","UNLIMITED_PROJECTS":"無制限","OWNER_MESSAGE":{"PRIVATE":"あなたが持てる非公開プロジェクトは最大{{maxProjects}}個までです。現在{{currentProjects}}個持っています。","PUBLIC":"あなたが持てる公開プロジェクトは最大{{maxProjects}}個までです。現在{{currentProjects}}個持っています。"},"CANT_BE_OWNED":"あなたは現在、このタイプのプロジェクトオーナーにはなれません。このプロジェクトのオーナーになりたい場合は管理者に問い合わせてオーナー権限を変更してもらってください。"}},"USER":{"PROFILE":{"PAGE_TITLE":"{{userFullName}} (@{{userUsername}})","EDIT":"プロフィールを編集","CLOSED_US":"完了したユーザーストーリー","PROJECTS":"プロジェクト","PROJECTS_EMPTY":"{{username}} はまだプロジェクトに参加していません","CONTACTS":"連絡先","CONTACTS_EMPTY":"{{username}} はまだ連絡先を持っていません","CURRENT_USER_CONTACTS_EMPTY":"あなたへのコンタクトはまだありません。","CURRENT_USER_CONTACTS_EMPTY_EXPLAIN":"Taigaで一緒に仕事をしたメンバーは自動的に連絡先へ追加されます","TABS":{"ACTIVITY_TAB":"タイムライン","ACTIVITY_TAB_TITLE":"このユーザのすべてのアクティビティーを表示する","PROJECTS_TAB":"プロジェクト","PROJECTS_TAB_TITLE":"ユーザーが参加しているプロジェクト","LIKES_TAB":"いいね","LIKES_TAB_TITLE":"このユーザーが「いいね」と評価したすべての内容を表示","VOTES_TAB":"投票","VOTES_TAB_TITLE":"このユーザーが「賛成」したすべての内容を表示","WATCHED_TAB":"フォロー","WATCHED_TAB_TITLE":"このユーザーが「フォロー」したすべての内容を表示","CONTACTS_TAB":"連絡先","CONTACTS_TAB_TITLE":"このユーザーが「コンタクト」したすべての内容を表示"}},"PROFILE_SIDEBAR":{"TITLE":"プロフィール","DESCRIPTION":"すべてのメンバーはあなたが完了させた作業、あなたが今取り組んでいる作業を確認することができます。自己紹介を追記してあなたについてもっと知ってもらいましょう!","ADD_INFO":"編集する"},"PROFILE_FAVS":{"FILTER_INPUT_PLACEHOLDER":"入力してください","FILTER_TYPE_ALL":"すべて","FILTER_TYPE_ALL_TITLE":"すべてを表示","FILTER_TYPE_PROJECTS":"プロジェクト","FILTER_TYPE_PROJECTS_TITLE":"プロジェクトのみ表示","FILTER_TYPE_EPICS":"エピック","FILTER_TYPE_EPICS_TITLE":"エピックのみ表示","FILTER_TYPE_USER_STORIES":"ストーリー","FILTER_TYPE_USER_STORIES_TITLE":"ユーザーストーリーを表示","FILTER_TYPE_TASKS":"タスク","FILTER_TYPE_TASKS_TITLE":"タスクのみ表示","FILTER_TYPE_ISSUES":"課題","FILTER_TYPE_ISSUES_TITLE":"課題のみ表示","EMPTY_TITLE":"表示するものがありません。"}},"PROJECT":{"PAGE_TITLE":"{{projectName}}","HELP":"最も良く使うプロジェクトがトップになるように順序を入れ替えてみましょう。
    トップ10のプロジェクトが上のナビゲーションバーのプロジェクトリストに現れます。","PRIVATE":"プライベート プロジェクト","LOOKING_FOR_PEOPLE":"プロジェクトはメンバーを探しています","FANS_COUNTER_TITLE":"{total, plural, one{one fan} other{# 人のファン}}","WATCHERS_COUNTER_TITLE":"{total, plural, one{one watcher} other{# 人がフォロー中}}","MEMBERS_COUNTER_TITLE":"{total, plural, one{one member} other{# 人のメンバー}}","BLOCKED_PROJECT":{"BLOCKED":"ブロックされたプロジェクト","THIS_PROJECT_IS_BLOCKED":"このプロジェクトは一時的にブロックされています。","TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF":"プロジェクトのブロックを解除したい場合は管理者にお問い合わせください。"},"SECTION":{"SEARCH":"検索","TIMELINE":"タイムライン","BACKLOG":"バックログ","KANBAN":"かんばん","ISSUES":"課題","WIKI":"Wiki","TEAM":"チーム","MEETUP":"会議","ADMIN":"管理"},"NAVIGATION":{"ACTION_CREATE_PROJECT":"プロジェクトを作成","MANAGE_PROJECTS":"プロジェクト管理","TITLE_CREATE_PROJECT":"プロジェクトを作成","HELP_TITLE":"Taiga サポートページ","HELP":"ヘルプ","HOMEPAGE":"ホームページ","FEEDBACK_TITLE":"フィードバックを送る","FEEDBACK":"フィードバック","NOTIFICATIONS_TITLE":"通知設定を編集","NOTIFICATIONS":"通知","VIEW_PROFILE_TITLE":"プロフィールを表示","VIEW_PROFILE":"プロフィールを表示","EDIT_PROFILE_TITLE":"プロフィールを編集","EDIT_PROFILE":"プロフィールを編集","CHANGE_PASSWORD_TITLE":"パスワード変更","CHANGE_PASSWORD":"パスワード変更","DASHBOARD_TITLE":"ダッシュボード","DISCOVER_TITLE":"トレンドプロジェクトを探す","DISCOVER":"探す"},"LIKE_BUTTON":{"LIKE":"いいね","LIKED":"いいね","UNLIKE":"「いいね」を取り消す","BUTTON_TITLE":"Like or unlike this project","COUNTER_TITLE":"{total, plural, one{one fan} other{# 人のファン}}"},"WATCH_BUTTON":{"BUTTON_TITLE":"このプロジェクトをフォローして通知ポリシーを設定してください","WATCH":"フォロー","WATCHING":"フォロー中","COUNTER_TITLE":"{total, plural, one{one watcher} other{# 人がフォロー中}}","OPTIONS":{"NOTIFY_ALL":"すべての通知を受信する","NOTIFY_ALL_TITLE":"このプロジェクトのすべての通知を受信する","NOTIFY_INVOLVED":"関連するものだけ","NOTIFY_INVOLVED_TITLE":"あなたが携わっている時のみ通知を受信","UNWATCH":"フォローをやめる","UNWATCH_TITLE":"プロジェクトのフォローをやめる"}},"CONTACT_BUTTON":{"CONTACT_TITLE":"プロジェクトチームに連絡","CONTACT_BUTTON":"Contact the project"},"CREATE":{"TITLE":"プロジェクトを作成","CHOOSE_TEMPLATE":"どちらのテンプレートがあなたのプロジェクトにより適していますか?","TEMPLATE_SCRUM":"スクラム","TEMPLATE_SCRUM_DESC":"Prioritize and solve your tasks in short time cycles.","TEMPLATE_SCRUM_LONGDESC":"Scrum is an iterative and incremental agile software development methodology for managing product development.\nThe product backlog is what will ultimately be delivered, ordered into the sequence in which it should be delivered. Product Backlogs are broken into manageable, executable chunks named sprints. Every certain amount of time the team initiates a new sprint and commits to deliver a certain number of user stories from the backlog, in accordance with their skills, abilities and resources. The project advances as the backlog becomes depleted.","TEMPLATE_KANBAN":"かんばん","TEMPLATE_KANBAN_DESC":"Keep a constant workflow on independent tasks","TEMPLATE_KANBAN_LONGDESC":"The Kanban methodology is used to divide project development (any sort of project) into stages.\nA kanban card is like an index card or post-it note that details every task (or user story) in a project that needs to be completed. The Kanban board is used to move each card from one state of completion to the next and in so doing, helps track progress.","DUPLICATE":"プロジェクトを複製","DUPLICATE_DESC":"Start clean and keep your configuration","IMPORT":"プロジェクトをインポート","IMPORT_DESC":"複数プラットフォームからのプロジェクトをTaigaにインポート","INVITE":"プロジェクトに招待","SOLO_PROJECT":"このプロジェクトで独りになります","INVITE_LATER":"(You'll be able to invite more members later)","BACK":"バックエンド","MAX_PRIVATE_PROJECTS":"Unfortunately, You've reached the maximum number of private projects.\nIf you would like to increase the current limit please contact the administrator.","MAX_PUBLIC_PROJECTS":"Unfortunately, You've reached the maximum number of public projects.\nIf you would like to increase the current limit please contact the administrator.","PUBLIC_PROJECT":"パブリック プロジェクト","PRIVATE_PROJECT":"プライベート プロジェクト"},"COMMON":{"DETAILS":"New project details","PROJECT_TITLE":"プロジェクト名","PROJECT_DESCRIPTION":"プロジェクト概要"},"DUPLICATE":{"TITLE":"プロジェクトを複製","DESCRIPTION":"Start clean and keep your configuration","SELECT_PLACEHOLDER":"複製する既存プロジェクトを選択"},"IMPORT":{"TITLE":"プロジェクトをインポート","DESCRIPTION":"複数プラットフォームからのプロジェクトをTaigaにインポート","ASYNC_IN_PROGRESS_TITLE":"ウンパルンパたちがあなたのプロジェクトをインポートしています。","ASYNC_IN_PROGRESS_MESSAGE":"この処理には時間がかかります。
    準備が出来たらメールで通知します。","UPLOAD_IN_PROGRESS_MESSAGE":"{{totalSize}} 中 {{uploadedSize}} アップロード済み","ERROR":"ウンパルンパたちはダンプファイルのインポートに手こずっているようです。もう一度お試しください。","ERROR_TOO_MANY_REQUEST":"すみません、ウンパルンパたちはとても忙しいようです。しばらくしてからまたお試しください。","ERROR_MESSAGE":"ウンパルンパたちはダンプファイルのインポートに手こずっているようです。  \n{{error_message}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) はウンパルンパたちには重すぎます。({{maxFileSize}})より少ないもので試してください。","SYNC_SUCCESS":"プロジェクトのインポートに成功しました","IMPORT":"インポート","WHO_IS":"Their tasks will be assigned to ...","WRITE_EMAIL":"あるいは必要であれば、このユーザーがTaigaで使用しているメールアドレスを記入","SEARCH_CONTACT":"Or if you want, search in your contacts","WRITE_EMAIL_LABEL":"Taigaでこのユーザーが使用しているメールアドレスを記入","ACCEEDE":"Acceede","PROJECT_MEMBERS":"プロジェクトメンバー","PROCESS_DESCRIPTION":"Tell us who from Taiga you want to assign the tasks of {{platform}}","MATCH":"Is {{user_external}} the same person as {{user_internal}}?","CHOOSE":"ユーザーを選択","LINKS":"Links with {{platform}}","LINKS_DESCRIPTION":"Do you want to keep the link of each item with the original {{platform}} card?","WARNING_MAIL_USER":"Note that if the user does not have a Taiga account we will not be able to assign the tasks to him.","ASSIGN":"アサイン","PROJECT_SELECTOR":{"NO_RESULTS":"検索条件に当てはまるものはありませんでした。","ACTION_SEARCH":"検索","ACTION_BACK":"バックエンド"},"PROJECT_RESTRICTIONS":{"PROJECT_MEMBERS_DESC_PRIVATE":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per private project. If you would like to increase that limit please contact the administrator.","PROJECT_MEMBERS_DESC_PUBLIC":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per public project. If you would like to increase that limit please contact the administrator.","ACCOUNT_ALLOW_MEMBERS":"Your account only allows {{members}} members","PRIVATE_PROJECTS_SPACE":{"TITLE":"現在のプランではこれ以上の非公開プロジェクトは許可されていません。","DESC":"インポートしようとしているプロジェクトは非公開プロジェクトです。現在のプランではこれ以上の非公開プロジェクトは許可されていません。"},"PUBLIC_PROJECTS_SPACE":{"TITLE":"現在のプランではこれ以上の公開プロジェクトは許可されていません。","DESC":"インポートしようとしているプロジェクトは公開プロジェクトです。現在のプランではこれ以上の公開プロジェクトは許可されていません。"},"PRIVATE_PROJECTS_MEMBERS":{"TITLE":"現在のプランでは非公開プロジェクトごとに最大{{max_memberships}}名のメンバーが許可されています。"},"PUBLIC_PROJECTS_MEMBERS":{"TITLE":"現在のプランでは公開プロジェクトごとに最大{{max_memberships}}名のメンバーが許可されています。"},"PRIVATE_PROJECTS_SPACE_MEMBERS":{"TITLE":"現在のプランではこれ以上の非公開プロジェクトの作成や、一つの非公開プロジェクトに{{max_memberships}}名を超えるメンバーを追加することはできません。","DESC":"インポートしようとしているのは非公開プロジェクトで{{members}}名のメンバーがいます。"},"PUBLIC_PROJECTS_SPACE_MEMBERS":{"TITLE":"現在のプランではこれ以上の公開プロジェクトの作成や、一つの公開プロジェクトに{{max_memberships}}名を超えるメンバーを追加することはできません。","DESC":"インポートしようとしているのは公開プロジェクトで{{members}}名以上のメンバーがいます。"}},"IN_PROGRESS":{"TITLE":"プロジェクトをインポート中","DESCRIPTION":"このプロセスには時間がかかります。ウィンドウを開いたままにしていてください。"},"WARNING":{"TITLE":"Some taks will be unassigned","DESCRIPTION":"There are still unidentified people. The cards assigned to these people will remain unassigned. Check all the contacts to not lose that information.","CHECK":"コンタクトを確認"},"TAIGA":{"SELECTOR":"Taigaプロジェクトをインポート"},"TRELLO":{"SELECTOR":"TrelloボードをTaigaにインポート","CHOOSE_PROJECT":"Choose board that you want to import","NO_PROJECTS":"It seems you have no boards in Trello"},"GITHUB":{"SELECTOR":"GitHubプロジェクト課題をインポート","CHOOSE_PROJECT":"インポートしたいプロジェクトを検索","NO_PROJECTS":"GitHubプロジェクトがないようです","HOW_DO_YOU_WANT_TO_IMPORT":"課題をどのようにTaigaにインポートしたいですか?","KANBAN_PROJECT":"As user stories in a kanban project","KANBAN_PROJECT_DESCRIPTION":"After that you can enable scrum with backlog.","SCRUM_PROJECT":"As user stories in a scrum project","SCRUM_PROJECT_DESCRIPTION":"After that you can enable kanban mode.","ISSUES_PROJECT":"課題として","ISSUES_PROJECT_DESCRIPTION":"課題をカンバンまたはスクラムモードで使うことはできません。新しいユーザーストーリーからカンバンまたはスクラムを有効にすることができます。"},"ASANA":{"SELECTOR":"Asanaプロジェクトをインポートし管理方法を選択","CHOOSE_PROJECT":"インポートしたいプロジェクトを選択","NO_PROJECTS":"Asanaにプロジェクトがないようです","KANBAN_PROJECT":"かんばん","SCRUM_PROJECT":"スクラム","CREATE_AS_SCRUM_DESCRIPTION":"あなたのプロジェクトのタスクとサブタスクはTaigaユーザーストーリーとタスクとして作成されます。","CREATE_AS_KANBAN_DESCRIPTION":"あなたのプロジェクトのタスクとサブタスクはTaigaユーザーストーリーとタスクとして作成されます。"},"JIRA":{"SELECTOR":"Jiraプロジェクトをインポートし管理方法を選択","HOW_TO_CONFIGURE":"(設定ヘルプ)","CHOOSE_PROJECT":"インポートしたいプロジェクトまたはボードを選択","NO_PROJECTS":"Jiraにプロジェクトやボードがないようです","URL":"Jira URL","KANBAN_PROJECT":"かんばん","SCRUM_PROJECT":"スクラム","ISSUES_PROJECT":"課題","CREATE_AS_SCRUM_DESCRIPTION":"あなたのプロジェクトの課題とサブ課題はTaigaユーザーストーリーとタスクとして作成されます。","CREATE_AS_KANBAN_DESCRIPTION":"あなたのプロジェクトの課題とサブ課題はTaigaユーザーストーリーとタスクとして作成されます。","CREATE_AS_ISSUES_DESCRIPTION":"Jiraプロジェクトからのサブ課題をどうしますか? (Taigaはサブ課題というものを許可しません)","CREATE_NEW_ISSUES":"サブ課題を新しいTaiga課題に変換する","NOT_CREATE_NEW_ISSUES":"サブ課題をインポートしないでください"}}},"LIGHTBOX":{"DELETE_ACCOUNT":{"CONFIRM":"本当にあなたのTaigaアカウントを削除してもよろしいですか?","CANCEL":"設定に戻る","ACCEPT":"アカウントを削除する","BLOCK_PROJECT":"あなたが所有しているプロジェクトは、あなたのアカウント削除後にブロックされることを覚えておいてください。あなたのアカウントが削除されてプロジェクトがブロックされる前にプロジェクトのオーナー権限を他のメンバーに譲渡してください。"},"DELETE_PROJECT":{"TITLE":"プロジェクトを削除","QUESTION":"本当にこのプロジェクトを削除していいですか?","SUBTITLE":"プロジェクトのすべてのデータ (ユーザーストーリー、タスク、課題、スプリント、Wikiページ) が失われます! :-(","CONFIRM":"はい、問題ありません"},"ASSIGNED_TO":{"SELECT":"アサインする","SEARCH":"ユーザーを検索"},"ADD_MEMBER":{"TITLE":"新しいメンバー","PLACEHOLDER":"ユーザーをフィルターまたは招待メールを書く","ADD_EMAIL":"メールを追加","REMOVE":"削除","INVITE":"招待","CHOOSE_ROLE":"役割の選択","PLACEHOLDER_INVITATION_TEXT":"(任意) 招待する際のメッセージを追加できます。新メンバーに素敵な言葉を贈りましょう ;-)","HELP_TEXT":"ユーザーが既にTaigaに登録されている場合、自動的に追加されます。そうでない場合は招待状が送信されます。"},"CREATE_ISSUE":{"TITLE":"課題を追加"},"FEEDBACK":{"TITLE":"我々に教えてください...","COMMENT":"...バグ、提案、何かクールなことやTaigaを利用していて発生した悪夢など(英語で記載してください)","ACTION_SEND":"フィードバックを送る"},"SEARCH":{"TITLE":"検索","PLACEHOLDER_SEARCH":"何をお探しですか?"},"ADD_EDIT_SPRINT":{"TITLE":"新しいスプリント","PLACEHOLDER_SPRINT_NAME":"スプリント名","PLACEHOLDER_SPRINT_START":"見積もり開始","PLACEHOLDER_SPRINT_END":"見積もり終了","ACTION_DELETE_SPRINT":"このスプリントを削除しますか?","TITLE_ACTION_DELETE_SPRINT":"スプリントを削除","LAST_SPRINT_NAME":"最後のスプリントは {{lastSprint}}でした ;-) "},"CREATE_EDIT_TASK":{"TITLE":"新しいタスク","PLACEHOLDER_SUBJECT":"タスク名","PLACEHOLDER_STATUS":"タスクステータス","OPTION_UNASSIGNED":"未アサイン","PLACEHOLDER_SHORT_DESCRIPTION":"要約を入力","ACTION_EDIT":"タスクを編集","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"CREATE_EDIT_US":{"TITLE":"新規 US","PLACEHOLDER_DESCRIPTION":"このユーザーストーリーを他の人が理解できるように説明を加えてください","NEW_US":"新しいユーザーストーリー","EDIT_US":"ユーザーストーリーを編集","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"DELETE_DUE_DATE":{"TITLE":"Delete due date","SUBTITLE":"Are you sure you want to delete this due date?"},"DELETE_SPRINT":{"TITLE":"スプリントを削除"},"CREATE_MEMBER":{"PLACEHOLDER_INVITATION_TEXT":"(任意) 招待する際のメッセージを追加できます。新メンバーに素敵な言葉を贈りましょう ;-)","PLACEHOLDER_TYPE_EMAIL":"メールアドレスを入力","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"このプロジェクトで許可されている最大メンバー数{{maxMembers}}名に達しようとしています。上限を増やしたい場合は管理者にお問い合わせください。","LIMIT_USERS_WARNING_MESSAGE":"このプロジェクトで許可されている最大メンバー数{{maxMembers}}名に達しようとしています。"},"LEAVE_PROJECT_WARNING":{"TITLE":"オーナーが不在となるため、プロジェクトを離脱することができません。","CURRENT_USER_OWNER":{"DESC":"現在、あなたはこのプロジェクトのオーナーです。プロジェクトを離脱する前にオーナー権限を他の誰かに譲渡してください。","BUTTON":"プロジェクトのオーナーを変更"},"OTHER_USER_OWNER":{"DESC":"現在のプロジェクトのオーナーになっているメンバーを削除することはできません。まず新しいプロジェクトオーナーを指名してください。","BUTTON":"プロジェクトオーナーの変更をリクエスト"}},"CHANGE_OWNER":{"TITLE":"誰を新しいプロジェクトオーナーにしたいですか?","ADD_COMMENT":"コメントを追加","BUTTON":"新しいプロジェクトオーナーとなるようこのメンバーに要求"},"CONTACT_PROJECT":{"TITLE":"メールを送る","WARNING":"プロジェクト管理者がメールを受信します","PLACEHOLDER":"メッセージを書いてください","SEND":"送信"},"SET_DUE_DATE":{"TITLE":"Set due date","PLACEHOLDER_DUE_DATE":"Select date","REASON_FOR_DUE_DATE":"Reason for the due date","PLACEHOLDER_REASON_FOR_DUE_DATE":"Why does this US need a due date?","SUGGESTIONS":{"IN_ONE_WEEK":"In one week","IN_TWO_WEEKS":"In two weeks","IN_ONE_MONTH":"In one month","IN_THREE_MONTHS":"In three months"},"TITLE_ACTION_DELETE_DUE_DATE":"Delete due date"}},"EPIC":{"PAGE_TITLE":"{{epicSubject}} - エピック {{epicRef}} - {{projectName}}","PAGE_DESCRIPTION":"ステータス: {{epicStatus }}. 説明: {{epicDescription}}","SECTION_NAME":"エピック","TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY":"関連するユーザーストーリーのリンクを削除","MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY":"関連するユーザーストーリー '{{subject}}' とのリンクが削除されます。","ERROR_UNLINK_RELATED_USERSTORY":"リンクの削除に失敗: {{errorMessage}}","CREATE_RELATED_USERSTORIES":"関連付ける","NEW_USERSTORY":"新しいユーザーストーリー","EXISTING_USERSTORY":"既存のユーザーストーリー","CHOOSE_PROJECT_FOR_CREATION":"プロジェクトとは?","SUBJECT":"題名","SUBJECT_BULK_MODE":"題名 (一括登録)","CHOOSE_PROJECT_FROM":"プロジェクトとは?","CHOOSE_USERSTORY":"ユーザーストーリーとは?","NO_USERSTORIES":"このプロジェクトにはユーザーストーリーがまだありません。別のプロジェクトを選択してください。","NO_USERSTORIES_FOUND":"検索条件に当てはまるものはありませんでした。","FILTER_USERSTORIES":"ユーザーストーリーをフィルター","LIGHTBOX_TITLE_BLOKING_EPIC":"ブロックしているエピック","ACTION_DELETE":"エピックの削除"},"US":{"PAGE_TITLE":"{{userStorySubject}} - ユーザーストーリー {{userStoryRef}} - {{projectName}}","PAGE_DESCRIPTION":"ステータス: {{userStoryStatus }}. 進捗 {{userStoryProgressPercentage}}% ({{userStoryTotalTasks}}中{{userStoryClosedTasks}}タスク完了). ポイント: {{userStoryPoints}}. 説明: {{userStoryDescription}}","SECTION_NAME":"ユーザーストーリー","LINK_TASKBOARD":"タスクボード","TITLE_LINK_TASKBOARD":"タスクボードに移動","TOTAL_POINTS":"合計ポイント","ADD":"+ 新規ユーザーストーリーを追加する","ADD_BULK":"新規ユーザーストーリーを一括で追加する","PROMOTED":"このユーザーストーリーはこちらの課題から発展:","TITLE_LINK_GO_TO_ISSUE":"課題へ移動","TITLE_DELETE_ACTION":"ユーザーストーリーを削除","LIGHTBOX_TITLE_BLOKING_US":"Blocking us","NOT_ESTIMATED":"見積もりが行われていません","OWNER_US":"This User Story belongs to","TRIBE":{"PUBLISH":"Taiga Tribeでギグとして発行","PUBLISH_INFO":"詳細表示","PUBLISH_TITLE":"Taiga Tribeへの発行に関する情報","PUBLISHED_AS_GIG":"Taiga Tribeでギグとして発行されたストーリー","EDIT_LINK":"リンクを編集","CLOSE":"Close","SYNCHRONIZE_LINK":"Taiga Tribeと同期","PUBLISH_MORE_INFO_TITLE":"このタスクに誰か必要ですか?","PUBLISH_MORE_INFO_TEXT":"

    If you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

    TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

    "},"FIELDS":{"TEAM_REQUIREMENT":"チームからの要求","CLIENT_REQUIREMENT":"お客様からの要求"}},"COMMENTS":{"DELETED_INFO":"{{user}}によってコメントは削除されました。","COMMENTS_COUNT":"{{comments}}コメント","OLDER_FIRST":"古い順","RECENT_FIRST":"新しい順","COMMENT":"コメント","EDITED_COMMENT":"編集済み:","SHOW_HISTORY":"View historic","TYPE_NEW_COMMENT":"新しいコメントをここに入力","SHOW_DELETED":"削除済コメントを表示","HIDE_DELETED":"削除済コメントを隠す","DELETE":"コメントを削除","RESTORE":"コメントを復元","HISTORY":{"TITLE":"アクティビティ"}},"ACTIVITY":{"TITLE":"アクティビティ","ACTIVITIES_COUNT":"{{activities}} アクティビティー","TAGS_ADDED":"追加したタグ:","TAGS_REMOVED":"削除したタグ:","US_POINTS":"{{role}} ポイント","NEW_ATTACHMENT":"新しい添付ファイル:","DELETED_ATTACHMENT":"削除された添付ファイル:","UPDATED_ATTACHMENT":"更新された添付ファイル ({{filename}}):","CREATED_CUSTOM_ATTRIBUTE":"カスタム属性を作成しました","UPDATED_CUSTOM_ATTRIBUTE":"カスタム属性を更新しました","BECAME_DEPRECATED":"became deprecated","BECAME_UNDEPRECATED":"became undeprecated","TEAM_REQUIREMENT":"チームからの要求","CLIENT_REQUIREMENT":"お客様からの要求","BLOCKED":"ブロック中","VALUES":{"NOT_SET":"not set","UNASSIGNED":"未割当"},"FIELDS":{"SUBJECT":"題名","DESCRIPTION":"説明","PRIORITY":"優先度","SEVERITY":"深刻度","STATUS":"ステータス","TYPE":"タイプ","ASSIGNED_TO":"割り当てる","ASSIGNED_USERS":"assigned users","DUE_DATE":"due date","MILESTONE":"スプリント","COLOR":"色"}},"BACKLOG":{"PAGE_TITLE":"バックログ - {{projectName}}","PAGE_DESCRIPTION":"The backlog panel, with user stories and sprints of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"バックログ","CUSTOMIZE_GRAPH":"バックロググラフのカスタマイズ","CUSTOMIZE_GRAPH_TEXT":"To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the","CUSTOMIZE_GRAPH_ADMIN":"管理","CUSTOMIZE_GRAPH_TITLE":"管理ユーザーでポイントとスプリントを設定してください。","MOVE_US_TO_CURRENT_SPRINT":"現在のスプリントに移動","MOVE_US_TO_LATEST_SPRINT":"最新のスプリントに移動","EMPTY":"バックログが空です!","CREATE_NEW_US":"新規US作成","CREATE_NEW_US_EMPTY_HELP":"新しくユーザーストーリーを作成してください。","EXCESS_OF_POINTS":"ポイント超過","PENDING_POINTS":"保留ポイント","CLOSED_POINTS":"完了","COMPACT_SPRINT":"Compact Sprint","GO_TO_TASKBOARD":"タスクボード {{::name}} へ移動","EDIT_SPRINT":"スプリントを編集","TOTAL_POINTS":"合計","STATUS_NAME":"ステータス名","SORTABLE_FILTER_ERROR":"You can't drop on backlog when filters are open","DOOMLINE":"Project Scope [Doomline]","CHART":{"XAXIS_LABEL":"スプリント","YAXIS_LABEL":"ポイント","OPTIMAL":"Optimal pending points for sprint \"{{sprintName}}\" should be {{value}}","REAL":"スプリント \"{{sprintName}}\" の実際の保留ポイントは {{value}} です","INCREMENT_TEAM":"Incremented points by team requirements for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_CLIENT":"Incremented points by client requirements for sprint \"{{sprintName}}\" is {{value}}"},"TAGS":{"TOGGLE":"タグ表示を固定","SHOW":"タグを表示","HIDE":"タグを非表示"},"FORECASTING":{"TITLE":"Velocity forecasting","BACKLOG":"バックログを表示","NEW_SPRINT":"あなたの作業速度をもとにした次のスプリントのユーザーストーリー候補。新しくスプリントを作成するにはクリックしてください。","CURRENT_SPRINT":"あなたの作業速度をもとにしたスプリント向けのユーザーストーリー候補。現在のスプリントに追加するにはクリックしてください。"},"TABLE":{"COLUMN_US":"User Stories","TITLE_COLUMN_POINTS":"役割ごとにビューを選択"},"SPRINT_SUMMARY":{"TOTAL_POINTS":"合計
    ポイント","COMPLETED_POINTS":"完了済み
    ポイント","OPEN_TASKS":"オープン
    タスク","CLOSED_TASKS":"完了済み
    タスク","IOCAINE_DOSES":"iocaine
    doses","SHOW_STATISTICS_TITLE":"統計を表示","TOGGLE_BAKLOG_GRAPH":"バーンダウングラフ 表示/非表示","POINTS_PER_ROLE":"役割ごとのポイント"},"SUMMARY":{"PROJECT_POINTS":"プロジェクト
    ポイント","DEFINED_POINTS":"定義された
    ポイント","CLOSED_POINTS":"closed
    points","POINTS_PER_SPRINT":"ポイント /
    スプリント"},"FILTERS":{"TOGGLE":"フィルター表示を固定","HIDE":"フィルターを非表示","SHOW":"フィルターを表示"},"SPRINTS":{"TITLE":"スプリント","DATE":"YYYY年MM月DD日","LINK_TASKBOARD":"スプリントタスクボード","TITLE_LINK_TASKBOARD":"タスクボード{{name}}へ移動","EMPTY":"まだスプリントはありません","WARNING_EMPTY_SPRINT_ANONYMOUS":"このスプリントにはユーザーストーリーがありません","WARNING_EMPTY_SPRINT":"新しいスプリントを始めるために、バックログからストーリーをここにドロップしてください。","TITLE_ACTION_NEW_SPRINT":"新しいスプリントを追加","TEXT_ACTION_NEW_SPRINT":"新しくスプリントをプロジェクトに作成してください。","ACTION_SHOW_CLOSED_SPRINTS":"終了したスプリントを表示","ACTION_HIDE_CLOSED_SPRINTS":"終了したスプリントを非表示"}},"ERROR":{"TEXT1":"何かよくないことが発生したようですがウンパルンパたちは問題なく作業しています。","NOT_FOUND":"見つかりません","NOT_FOUND_TEXT":"Error 404. 参照しようとしているページはすでに存在しません。TAIGAホームページに戻って探してみてください。","PERMISSION_DENIED":"権限がありません","PERMISSION_DENIED_TEXT":"このページへのアクセスが許可されていません。","VERSION_ERROR":"以前、Taigaの中の誰かが変更をしたためウンパルンパたちはあなたの変更を適用できません。リロードをしてもう一度適用してみてください。(現在の変更は失われます)"},"TASKBOARD":{"PAGE_TITLE":"{{sprintName}} - スプリントタスクボード - {{projectName}}","PAGE_DESCRIPTION":"スプリント {{sprintName}} ({{startDate}}から{{endDate}}まで) / {{projectName}}。{{completedPercentage}}% ({{totalPoints}}中{{completedPoints}}ポイント) 完了。{{totalTasks}}タスク中{{openTasks}}タスクが未完了。","SECTION_NAME":"タスクボード","TITLE_ACTION_ADD":"新規タスクを追加","TITLE_ACTION_ADD_BULK":"新規タスクを一括で追加する","TITLE_ACTION_ASSIGN":"タスクをアサイン","PLACEHOLDER_CARD_TITLE":"This could be a task","PLACEHOLDER_CARD_TEXT":"ストーリーを分割しタスクとして別管理する。","TABLE":{"COLUMN":"ユーザーストーリー","TITLE_ACTION_FOLD":"列をたたむ","TITLE_ACTION_UNFOLD":"列をひろげる","TITLE_ACTION_FOLD_ROW":"行をたたむ","TITLE_ACTION_UNFOLD_ROW":"行をひろげる","FIELD_POINTS":"ポイント","ROW_UNASSIGED_TASKS_TITLE":"未アサイン タスク"},"CHARTS":{"XAXIS_LABEL":"日","YAXIS_LABEL":"ポイント","OPTIMAL":"Optimal pending points for day {{formattedDate}} should be {{roundedValue}}","REAL":"{{formattedDate}} の実際の保留ポイントは {{roundedValue}} です","DATE":"YYYY年MM月DD日"}},"TASK":{"PAGE_TITLE":"{{taskSubject}} - タスク {{taskRef}} - {{projectName}}","PAGE_DESCRIPTION":"ステータス: {{taskStatus }}. 説明: {{taskDescription}}","SECTION_NAME":"タスク","LINK_TASKBOARD":"タスクボード","TITLE_LINK_TASKBOARD":"タスクボードに移動","PLACEHOLDER_SUBJECT":"新しいタスク名を入力","TITLE_SELECT_STATUS":"ステータス名","OWNER_US":"このタスクはこちらに属しています。","TITLE_LINK_GO_OWNER":"ユーザーストーリーに移動","TITLE_DELETE_ACTION":"タスクを削除","LIGHTBOX_TITLE_BLOKING_TASK":"ブロックしているタスク","FIELDS":{"IS_IOCAINE":"Is iocaine"},"TITLE_ACTION_IOCAINE":"Feeling a bit overwhelmed by a task? Make sure others know about it by clicking on Iocaine when editing a task. It's possible to become immune to this (fictional) deadly poison by consuming small amounts over time just as it's possible to get better at what you do by occasionally taking on extra challenges!"},"NOTIFICATION":{"OK":"すべてOKです","WARNING":"おっと、何か問題があったようです","WARNING_TEXT":"あなたの変更がセーブされなかったことにウンパルンパたちは悲しんでいます!","SAVED":"ウンパルンパたちがすべての変更を保存しました。","CLOSE":"通知を閉じる","MAIL":"メールでの通知","DESKTOP":"Desktop notifications using browser alerts","ASK_DELETE":"本当に削除してもよろしいですか?"},"CANCEL_ACCOUNT":{"TITLE":"アカウントを解約する","SUBTITLE":"Taigaを脱会されてしまうのは残念です。楽しくご利用頂いていたことを祈ります。:)","PLACEHOLDER_INPUT_TOKEN":"アカウントトークンをキャンセル","ACTION_LEAVING":"はい、離脱します!","SUCCESS":"ウンパルンパたちがあなたのアカウントを削除しました。"},"CHANGE_EMAIL_FORM":{"TITLE":"メール変更","SUBTITLE":"あとはクリックだけであなたのメールアドレスが更新されます!","PLACEHOLDER_INPUT_TOKEN":"メールトークンを変更","ACTION_CHANGE_EMAIL":"メール変更","SUCCESS":"ウンパルンパたちがあなたのメールアドレスを更新しました"},"ISSUES":{"PAGE_TITLE":"課題 - {{projectName}}","PAGE_DESCRIPTION":"課題一覧パネル {{projectName}}: {{projectDescription}}","SECTION_NAME":"課題","ACTION_NEW_ISSUE":"+ 新規課題","ACTION_PROMOTE_TO_US":"ユーザーストーリーに変更する","PROMOTED":"この課題はこちらのユーザーストーリーへ発展:","EXTERNAL_REFERENCE":"課題の作成元: ","GO_TO_EXTERNAL_REFERENCE":"originへ移動","ACTION_DELETE":"課題を削除","LIGHTBOX_TITLE_BLOKING_ISSUE":"ブロックしている課題","FIELDS":{"PRIORITY":"優先度","SEVERITY":"深刻度","TYPE":"タイプ"},"CONFIRM_PROMOTE":{"TITLE":"この課題を新しいユーザーストーリーに変更","MESSAGE":"この課題から新しいユーザーストーリーを作成しますか?"},"TABLE":{"COLUMNS":{"TYPE":"タイプ","SEVERITY":"深刻度","PRIORITY":"優先度","SUBJECT":"題名","VOTES":"投票","STATUS":"ステータス","CREATED":"作成","ASSIGNED_TO":"担当者"},"TITLE_ACTION_CHANGE_STATUS":"ステータスを変更","TITLE_ACTION_ASSIGNED_TO":"担当者","BLOCKED":"ブロック中","EMPTY":{"TITLE":"レポートが必要な課題はありません :-)","SUBTITLE":"課題は見つかりましたか?"}}},"ISSUE":{"PAGE_TITLE":"{{issueSubject}} - 課題 {{issueRef}} - {{projectName}}","PAGE_DESCRIPTION":"ステータス: {{issueStatus }}. タイプ: {{issueType}}, 優先度: {{issuePriority}}. 深刻度: {{issueSeverity}}. 説明: {{issueDescription}}"},"KANBAN":{"PAGE_TITLE":"かんばん - {{projectName}}","PAGE_DESCRIPTION":"The kanban panel, with user stories of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"かんばん","TITLE_ACTION_FOLD":"列をたたむ","TITLE_ACTION_UNFOLD":"列をひろげる","TITLE_ACTION_ADD_US":"新規ユーザーストーリーを追加","TITLE_ACTION_ADD_BULK":"新規ユーザーストーリーを一括追加","ACTION_SHOW_ARCHIVED":"アーカイブ済を表示","ACTION_HIDE_ARCHIVED":"アーカイブ済を隠す","HIDDEN_USER_STORIES":"The user stories in this status are hidden by default","PLACEHOLDER_CARD_TITLE":"These are your User Stories","PLACEHOLDER_CARD_TEXT":"Stories might also have subtasks to separate requirements"},"SEARCH":{"PAGE_TITLE":"検索 - {{projectName}}","PAGE_DESCRIPTION":"ユーザーストーリー、課題、タスク、Wikiページ、その他何でもこのプロジェクトを検索 {{projectName}}: {{projectDescription}}","FILTER_EPICS":"エピック","FILTER_USER_STORIES":"User Stories","FILTER_ISSUES":"課題","FILTER_TASKS":"タスク","FILTER_WIKI":"Wikiページ","PLACEHOLDER_SEARCH":"検索...","TITLE_ACTION_SEARCH":"検索","EMPTY_TITLE":"It looks like nothing was found with your search criteria.","EMPTY_DESCRIPTION":"Maybe try one of the tabs above or search again"},"TEAM":{"PAGE_TITLE":"チーム - {{projectName}}","PAGE_DESCRIPTION":"The team panel to show all the members of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"チーム","PLACEHOLDER_INPUT_SEARCH":"フルネームで検索する","COLUMN_MR_WOLF":"Mr. Wolf","EXPLANATION_COLUMN_MR_WOLF":"完了した課題","COLUMN_IOCAINE":"Iocaine Drinker","EXPLANATION_COLUMN_IOCAINE":"Iocaine doses ingested","COLUMN_CERVANTES":"Cervantes","EXPLANATION_COLUMN_CERVANTES":"Wiki ページを編集しました","COLUMN_BUG_HUNTER":"バグハンター","EXPLANATION_COLUMN_BUG_HUNTER":"報告されている課題","COLUMN_NIGHT_SHIFT":"ナイトシフト","EXPLANATION_COLUMN_NIGHT_SHIFT":"完了タスク","COLUMN_TOTAL_POWER":"Total Power","EXPLANATION_COLUMN_TOTAL_POWER":"合計ポイント","SECTION_TITLE_TEAM":"チーム >","SECTION_FILTER_ALL":"すべて","CONFIRM_LEAVE_PROJECT":"本当にこのプロジェクトから脱退していいですか?","ACTION_LEAVE_PROJECT":"このプロジェクトから離脱する"},"USER_SETTINGS":{"AVATAR_MAX_SIZE":"[最大サイズ: {{maxFileSize}}]","MENU":{"SECTION_TITLE":"ユーザー設定","USER_PROFILE":"ユーザープロフィール","CHANGE_PASSWORD":"パスワード変更","EMAIL_NOTIFICATIONS":"メール通知","DESKTOP_NOTIFICATIONS":"Desktop notifications"},"NOTIFICATIONS":{"LIVE_SECTION_NAME":"Desktop Notifications","SECTION_NAME":"メール通知","COLUMN_PROJECT":"プロジェクト","COLUMN_RECEIVE_ALL":"すべて受信","COLUMN_ONLY_INVOLVED":"関連するものだけ","COLUMN_NO_NOTIFICATIONS":"通知なし","OPTION_ALL":"すべて","OPTION_INVOLVED":"Involved","OPTION_NONE":"なし"}},"USER_PROFILE":{"ACTION_USE_GRAVATAR":"デフォルトのイメージを使用する","ACTION_DELETE_ACCOUNT":"Taigaアカウントを削除","ACTION_DOWNLOAD_PROFILE":"Download Taiga profile","CHANGE_EMAIL_SUCCESS":"メールボックスを確認してください!
    新しいメールアドレスを設定するための手順を送信しました。","CHANGE_PHOTO":"写真を変更","FIELD":{"USERNAME":"ユーザー名","EMAIL":"メール","FULL_NAME":"フルネーム","PLACEHOLDER_FULL_NAME":"フルネームを入力 (例. Íñigo Montoya)","BIO":"自己紹介(最大で全角105文字まで)","PLACEHOLDER_BIO":"あなたについて教えてください","LANGUAGE":"言語","LANGUAGE_DEFAULT":"-- デフォルトの言語を使用 --","THEME":"テーマ","THEME_DEFAULT":"-- デフォルトのテーマを使用 --"}},"WIKI":{"PAGE_TITLE":"{{wikiPageName}} - Wiki - {{projectName}}","PAGE_DESCRIPTION":"{{lastModifiedDate}} に最後に編集がありました。(合計 {{totalEditions}} 件) 内容: {{ wikiPageContent }}","DATETIME":"YYYY年MM月DD日 HH時mm分","REMOVE":"このWikiページを削除","DELETE_LIGHTBOX_TITLE":"Wikiページを削除","DELETE_LINK_TITLE":"Wikiリンクを削除","NAVIGATION":{"HOME":"メインページ","SECTION_NAME":"ブックマーク","ACTION_ADD_LINK":"ブックマークを追加する","ALL_PAGES":"全Wikiページ"},"SUMMARY":{"TIMES_EDITED":"編集
    回数","LAST_EDIT":"最終
    編集","LAST_MODIFICATION":"最後の変更"},"SECTION_PAGES_LIST":"全ページ","PAGES_LIST_COLUMNS":{"TITLE":"タイトル","EDITIONS":"Editions","CREATED":"作成","MODIFIED":"変更済み","CREATOR":"作者","LAST_MODIFIER":"最後の変更者"}},"HINTS":{"SECTION_NAME":"ヒント","LINK":"利用方法を知りたい場合はサポートページを訪れてください","LINK_TITLE":"サポートページへ行く","HINT1_TITLE":"Did you know you can import and export projects?","HINT1_TEXT":"ひとつのTaigaアカウントの全てのデータを抽出し、別のアカウントへ移すことができます。","HINT2_TITLE":"カスタムフィールドが作れるのはご存知ですか?","HINT2_TEXT":"Teams can now create custom fields as a flexible means to enter specific data useful for their particular workflow.","HINT3_TITLE":"Reorder your projects to feature those most relevant to you.","HINT3_TEXT":"最上部にあるダイレクトアクセスバーに10プロジェクトまで表示されます。","HINT4_TITLE":"Did you forget what were you working on?","HINT4_TEXT":"ご心配なさらないでください。ダッシュボードではあなたが取り組んだ順番にオープンなタスク、課題、ユーザーストーリーが表示されます。"},"TIMELINE":{"UPLOAD_ATTACHMENT":"{{username}} さんが新しい添付ファイル {{obj_name}} をアップロードしました","US_CREATED":"{{username}} さんが新しいユーザーストーリー {{obj_name}} を作成しました( {{project_name}} )","ISSUE_CREATED":"{{username}} さんが新しい課題 {{obj_name}} を作成しました( {{project_name}} )","TASK_CREATED":"{{username}} さんが新しいタスク {{obj_name}} を作成しました( {{project_name}} )","TASK_CREATED_WITH_US":"{{username}} さんが新しいタスク {{obj_name}} をユーザーストーリー {{us_name}} に作成しました( {{project_name}} )","WIKI_CREATED":"{{username}} さんが新しいwikiページ {{obj_name}} を作成しました( {{project_name}} )","MILESTONE_CREATED":"{{username}} さんがスプリント {{obj_name}} を作成しました( {{project_name}} )","EPIC_CREATED":"{{username}} さんが {{project_name}} で新しいエピック {{obj_name}} を作成しました","EPIC_RELATED_USERSTORY_CREATED":"{{username}} さんが {{project_name}} でユーザーストーリー {{related_us_name}} をエピック {{epic_name}} に関連付けました","NEW_PROJECT":"{{username}} がプロジェクト {{project_name}} を作成しました","MILESTONE_UPDATED":"{{username}} がスプリント {{obj_name}} を更新しました","US_UPDATED":"{{username}} さんがユーザーストーリー {{obj_name}} の属性 \"{{field_name}}\" を更新しました ","US_UPDATED_WITH_NEW_VALUE":"{{username}} さんがユーザーストーリー {{obj_name}} の属性 \"{{field_name}}\" を {{new_value}} に更新しました","US_UPDATED_POINTS":"{{username}} さんがユーザーストーリー {{obj_name}} における役割 '{{role_name}}' のポイントを {{new_value}} に更新しました","ISSUE_UPDATED":"{{username}} さんが課題 {{obj_name}} の属性 \"{{field_name}}\" を更新しました","ISSUE_UPDATED_WITH_NEW_VALUE":"{{username}} さんが課題 {{obj_name}} の属性 \"{{field_name}}\" を {{new_value}} に更新しました","TASK_UPDATED":"{{username}} が {{obj_name}} の {{field_name}} を {{new_value}} に更新しました","TASK_UPDATED_WITH_NEW_VALUE":"{{username}} が {{obj_name}} の {{field_name}} を {{new_value}} に更新しました","TASK_UPDATED_WITH_US":"{{username}} さんがユーザーストーリー {{us_name}} のタスク {{obj_name}} の属性 \"{{field_name}}\" を更新しました","TASK_UPDATED_WITH_US_NEW_VALUE":"{{username}} さんがユーザーストーリー {{us_name}} のタスク {{obj_name}} における属性 \"{{field_name}}\" を {{new_value}} に更新しました","WIKI_UPDATED":"{{username}} さんがWikiページ {{obj_name}} を更新しました","EPIC_UPDATED":"{{username}} さんがエピック {{obj_name}} の属性 \"{{field_name}}\" を更新しました","EPIC_UPDATED_WITH_NEW_VALUE":"{{username}} さんがエピック {{obj_name}} の属性 \"{{field_name}}\" を {{new_value}} に更新しました","EPIC_UPDATED_WITH_NEW_COLOR":"{{username}} さんが エピック {{obj_name}} の \"{{field_name}}\" を に更新しました","NEW_COMMENT_US":"{{username}} さんがユーザーストーリー {{obj_name}} にコメントしました","NEW_COMMENT_ISSUE":"{{username}} さんが課題 {{obj_name}} にコメントしました","NEW_COMMENT_TASK":"{{username}} さんがタスク {{obj_name}} にコメントしました","NEW_COMMENT_EPIC":"{{username}} さんがエピック {{obj_name}} にコメントしました","NEW_MEMBER":"{{project_name}} に新規メンバーが追加されました","US_ADDED_MILESTONE":"{{username}} さんがユーザーストーリー {{obj_name}} に {{sprint_name}} を追加しました","US_MOVED":"{{username}} さんがユーザーストーリー {{obj_name}} を移動しました","US_REMOVED_FROM_MILESTONE":"{{username}} さんがユーザーストーリー {{obj_name}} をバックログに追加しました","BLOCKED":"{{username}} さんが {{obj_name}} をブロックしました","UNBLOCKED":"{{username}} さんが {{obj_name}} のブロックを解除しました","NEW_USER":"{{username}} さんが Taiga に参加しました"},"LEGAL":{"TERMS_OF_SERVICE_AND_PRIVACY_POLICY_AD":"When creating a new account, you agree to our terms of service and privacy policy.","GDPR_ANNOUNCEMENT_TITLE":"General Data Protection Regulation (GDPR)","GDPR_ANNOUNCEMENT_DESCRIPTION":"You saw this comming, right? Updates to our Terms of Service","GDPR_ANNOUNCEMENT_INFOLINK":"Please read our announcement here"},"EXTERNAL_APP":{"PAGE_TITLE":"An external app requires authentication","PAGE_DESCRIPTION":"An external app requires authentication","AUTHORIZATION_REQUEST":"{{application}} にあなたのTaigaアカウントを使用することを許可しますか?","LOGIN_WITH_ANOTHER_USER":"別のユーザーでログイン","AUTHORIZE_APP":"アプリを許可","CANCEL":"キャンセル"},"JOYRIDE":{"NAV":{"NEXT":"次へ","BACK":"戻る","SKIP":"スキップ","DONE":"完了"},"DASHBOARD":{"STEP1":{"TITLE":"あなたのプロジェクト","TEXT":"Welcome! Here you will find the projects you are involved on."},"STEP2":{"TITLE":"取り組んでいる作業","TEXT":"あなたが取り組んでいるユーザーストーリー、タスク、課題です。"},"STEP3":{"TITLE":"フォロー中","TEXT1":"And right here you will find the ones in your projects that you want to know about.","TEXT2":"You are already working with Taiga ;)"},"STEP4":{"TITLE":"さあ始めましょう","TEXT1":"最初のTaigaプロジェクトを作成して始めてみましょう。","TEXT2":"グッドラック!"}},"BACKLOG":{"STEP1":{"TITLE":"プロジェクト概要","TEXT1":"Here you will see the state of your project.","TEXT2":"管理でプロジェクトの全ての設定を変更できます。"},"STEP2":{"TITLE":"プロダクト バックログ","TEXT":"The backlog is the list of requirements (User Stories) for the project. Here is where you will plan your sprints."},"STEP3":{"TITLE":"スプリント","TEXT":"Sprints are short periods of time (usually 2 weeks) during which specific work has to be completed and delivered."},"STEP4":{"TITLE":"User Stories","TEXT":"Those are the requirements at high level. You can add them to the backlog and drag them to the sprint in which it should be delivered."}},"KANBAN":{"STEP1":{"TITLE":"ワークフローのカスタマイズ","TEXT":"Set up the columns you need to map your workflow statuses through the admin."},"STEP2":{"TITLE":"ユーザーストーリー&タスク","TEXT":"User Stories are the requirements at high level. You can drag them to different columns."},"STEP3":{"TITLE":"ユーザーストーリーを追加中","TEXT1":"You may want to add a single User Story (add US icon) or a group of them (bulk icon)","TEXT2":"グッドラック!"}}},"DISCOVER":{"PAGE_TITLE":"プロジェクトを探す - Taiga","PAGE_DESCRIPTION":"検索できるTaigaの公開プロジェクトディレクトリ。バックログ、タイムライン、課題、そしてチームを探してみてください。最も人気な、あるいは活気のあるプロジェクトも見つけられます。カンバンやスクラムでフィルターしてみるのも良いかもしれません。","DISCOVER_TITLE":"プロジェクトを探す","DISCOVER_SUBTITLE":"{projects, plural, one{One public project to discover} other{# 件のプロジェクトが見つかりました}}","MOST_ACTIVE":"最も活発なプロジェクト","MOST_ACTIVE_EMPTY":"アクティブなプロジェクトはまだありません。","MOST_LIKED":"最も好まれているプロジェクト","MOST_LIKED_EMPTY":"「いいね」されたプロジェクトはまだありません","VIEW_MORE":"もっと見る","FEATURED":"注目プロジェクト","EMPTY":"該当するプロジェクトがありませんでした。
    検索条件を変えて再度試してみてください!","FILTERS":{"ALL":"すべて","KANBAN":"かんばん","SCRUM":"スクラム","PEOPLE":"人","WEEK":"先週","MONTH":"先月","YEAR":"昨年","ALL_TIME":"すべて","CLEAR":"フィルターをクリア"},"SEARCH":{"PAGE_TITLE":"検索結果 - プロジェクトを探す - Taiga","PAGE_DESCRIPTION":"検索できるTaigaの公開プロジェクトディレクトリ。バックログ、タイムライン、課題、そしてチームを探してみてください。最も人気な、あるいは活気のあるプロジェクトも見つけられます。カンバンやスクラムでフィルターしてみるのも良いかもしれません。","INPUT_PLACEHOLDER":"入力してください","ACTION_TITLE":"検索","RESULTS":"検索結果"}}} \ No newline at end of file diff --git a/dist/v-1527758585938/styles/theme-high-contrast.css b/dist/v-1527758585938/styles/theme-high-contrast.css deleted file mode 100644 index d5c464c..0000000 --- a/dist/v-1527758585938/styles/theme-high-contrast.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8";.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;content:'';position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! - * Pikaday - * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.loader-active,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}.backlog-table-body .user-story-name span,h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#000}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal}h2{line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#212121}.pika-single .is-selected .pika-button{background:#000;border-radius:0!important;box-shadow:inset 0 1px 3px #000}.pika-single .is-today .pika-button{color:#000}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#212121!important;border-radius:0!important;box-shadow:inset 0 1px 3px #212121!important}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#212121;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#212121;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#757575;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#000;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #757575;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #c1c1c1}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#212121;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#212121;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(110,110,110,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#000;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);position:absolute;width:100%}.admin-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#757575;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#757575}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(../images/bg.png) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;overflow-y:auto;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{margin-left:.5rem;padding-bottom:1rem}.auth .login-text a,.auth .register-text a{text-decoration:underline}.auth .login-text a:hover,.auth .register-text a:hover{color:#212121}.auth .register-terms{margin:.5rem 0 .75rem}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(0,0,0,.9);stroke:#212121;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(33,33,33,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;overflow:hidden;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #757575;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#212121;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#212121;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff;font-size:.9rem;margin-left:.5rem;padding-bottom:1rem;text-align:left}.invitation-main .register-text a{color:#000}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#000}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#c1c1c1}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff}.error-main a{color:#212121}.taskboard{overflow:hidden}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden}.team h2{margin:1rem 0}.team h2 span:last-child{color:#000}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#212121}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#757575}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#757575}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #b7b7b7;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#757575;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#757575}.menu-button,.trans-button:visited{color:#212121}.trans-button .icon,.trans-button span{color:#212121;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#c1c1c1;color:#757575}.menu-button span,.menu-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#000}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#212121;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#212121;color:#fff}.button-blackish{background:#212121;color:#c1c1c1}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff0062}.button-red:hover{background:#ff2400;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#000;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.button-auth,.button-bulk:hover{background:#212121}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#000;display:inline-block;margin-top:.5rem}.button-filter{background:#c1c1c1;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#757575;fill:#c1c1c1}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#ff2400;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#bcbcbc;border:1px dashed #adadad;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#adadad;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#adadad;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#a8a8a8;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#757575;height:25px;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#212121;margin-left:50%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#757575}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#000}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff0062;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#212121;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#757575;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#000}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(117,117,117,.2);color:#757575;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(33,33,33,.9);color:#c1c1c1}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(0,0,0,.5);border-bottom:0;color:#c1c1c1}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;background:#212121;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#212121}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;left:10px;position:absolute;top:-5px;width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#212121;color:#fff}.ticket-estimation .popover.fix{color:#fff;display:none;left:-160px;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#212121;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#000}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#757575;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #212121;color:#212121}.history-tabs .order-comments{color:#212121}.level{background-color:#757575;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#000}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#757575}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #c1c1c1;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#000}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#757575}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#757575}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:#ff2400;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#000}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#757575}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#757575;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#757575;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#ffc107}.loading-bar .item-1{animation-delay:1s;background:#009688}.loading-bar .item-2{animation-delay:2s;background:#e91e63}.loading-bar .item-3{animation-delay:3s;background:#9c27b0}.loading-bar .item-4{animation-delay:4s;background:#cddc39}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#757575;margin-left:.25rem}.notification-message-success{background:rgba(33,33,33,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(255,36,0,.9);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(117,117,117,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.paginator .active span,.paginator a,.paginator a:hover{transition:all .3s linear;color:#fff}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(255,36,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#757575;padding:.5rem 1rem}.paginator .active span,.paginator a:hover,.select-color{background:#212121}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#757575;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;position:absolute;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#212121;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{background:#212121;content:'';height:15px;left:-7px;position:absolute;top:13px;transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#757575;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color .empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#c1c1c1;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#757575;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#212121;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#000}.summary .stats svg{height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#424242;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#212121;height:24px}.summary-progress-bar .defined-points{background:#ff0062;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#212121;height:24px;position:absolute}.large-summary{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #212121;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #757575;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#000;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#212121;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#212121}.large-summary .icon.icon-stats.active:hover{color:#000;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#000;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#000;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(33,33,33,.4)}.track-button.active .icon{fill:#000}.track-button.active .track-button-counter{background:rgba(33,33,33,.6)}.track-button.is-hover .track-inner{background:#ff5033;color:#c1c1c1;transition:background .2s}.track-button.is-hover .icon{fill:#ff0062}.track-icon,.watch-options .watch-check svg{fill:#212121}.track-button.is-hover .track-button-counter{background:#ff2400;color:#c1c1c1;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#c1c1c1;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#b4b4b4;transition:background .3s}.track-icon{margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#b4b4b4;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#c1c1c1;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#b4b4b4;transition:background .3s}.watch-options{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-assigned-users,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(117,117,117,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox}.watch-options .watch-check{height:1.25rem;width:1.25rem}.upvote-btn a.active svg,.upvote-btn a:hover path{fill:#000}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#757575;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#000;transition:background .3s}.upvote-btn a.active{background:rgba(33,33,33,.2);color:#000;transition:all .3s}.upvote-btn a.is-hover{background:#ff2400;color:#c1c1c1}.upvote-btn a.is-hover svg{fill:#ff0062;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#757575;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-assigned-users .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-multiple,.ticket-watchers .user-list-single{-ms-flex-line-pack:center;padding:.25rem 0;vertical-align:middle;align-content:center}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-multiple{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex}.assigned-to-list .user-list-multiple.selected,.assigned-to-list .user-list-multiple:hover,.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(110,110,110,.3);cursor:pointer}.assigned-to-list .user-list-multiple:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#212121;margin-left:.5rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#212121;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:#ff2400}.assigned-to-list .user-list-multiple:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-multiple.is-active{background:rgba(110,110,110,.3);cursor:pointer;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-multiple .remove-assigned-to{display:block;fill:#212121;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-multiple .remove-assigned-to:hover{fill:#ff2400}.ticket-watchers .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-multiple{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-assigned-users .user-list-multiple,.ticket-assigned-users .user-list-single{background:0 0;display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.ticket-watchers .user-list-multiple:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#212121;margin-left:.5rem;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:#ff2400;transition:color .3s ease-in}.ticket-assigned-users .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:flex}.ticket-assigned-users .user-list-single:last-child{border:0}.ticket-assigned-users .user-list-multiple{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:flex}.ticket-assigned-users .user-list-multiple:last-child{border:0}.ticket-assigned-users .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-assigned-users .user-list-single{-ms-flex-positive:1;flex-grow:1}.ticket-assigned-users .user-list-single:hover .remove-user{opacity:1;transition:opacity .2s ease-in}.ticket-assigned-users .user-list-name{color:#212121;margin-left:.5rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .remove-user{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-assigned-users .remove-user:hover{fill:#ff2400;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{margin-bottom:2rem}.admin-common .admin-subtitle a{color:#000}.admin-common .admin-subtitle a:hover{color:#212121}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#c1c1c1;color:#212121;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #c1c1c1}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(33,33,33,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#757575}.custom-fields-table .single-custom-field{border-bottom:1px solid #c1c1c1;color:#757575}.custom-fields-table .icon-drag{fill:#757575;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#757575;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#000;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff0062}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem;max-width:1rem}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#000;fill:#000}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#757575}.admin-functionalities .module-name{font-size:1.2rem;color:#757575;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#757575;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#757575}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#000}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff0062;display:inline-block;padding-left:.3rem}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#c1c1c1}.admin-membership-table .resend{background-color:#000;color:#fff}.admin-membership-table .resend:hover{background-color:#212121;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#757575;transition:fill .2s}.admin-membership-table .delete:hover{fill:#ff2400}.admin-membership-table .pending{color:#ff0062}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #a8a8a8}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#757575;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#757575;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:#ff2400}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #c1c1c1;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #c1c1c1;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#757575;margin-left:.5rem}.project-details .get-feedback-inner .check,.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#757575;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#212121;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(33,33,33,.4);color:#212121}.project-privacy-settings label:hover svg{fill:#212121}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#212121;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#212121;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#757575;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#757575}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#000}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff0062;border-radius:6px;color:#ff0062;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#000}.admin-project-profile-owner-actions a:hover{color:#212121;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#757575}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#212121}.admin-roles .icon:hover{fill:#000;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#757575;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#757575;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#c1c1c1;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:#ff2400;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#080808;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#1a1a1a;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#212121}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.admin-webhooks .table-body .webhook-service{color:#757575}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #c1c1c1}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#757575;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#000;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#212121}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#757575}.admin-webhooks .webhook-options svg:hover{fill:#000;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #c1c1c1;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(33,33,33,.1);transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#757575;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#212121}.admin-webhooks .history-response-icon.history-error{background:#ff2400}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#757575}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#212121;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{font-size:.9rem;color:#757575;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #c1c1c1;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#757575;opacity:0}.project-values-row .icon:hover{fill:#212121;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #c1c1c1}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#999;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff0062}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p{color:#212121;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#212121;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin:1rem 0;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#757575;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#757575}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#757575}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#212121;fill:#212121}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#757575;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#212121;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#212121;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#212121;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#212121;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;position:absolute;background:#212121}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#212121;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#212121;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#212121;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #757575;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#757575}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #b7b7b7;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#999;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#757575;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#c1c1c1}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#999;transition:background .2s ease-in}.backlog-table-body input:checked{color:#212121;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff0062;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:#ff2400;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#212121}.backlog-table-body .icon-drag{cursor:move;fill:#757575;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#000;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#212121}.sprints .add-sprint svg{fill:#c1c1c1;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon,.ticket-assigned-users .assign-to-me .icon,.ticket-assigned-users .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#757575}.sprints .sprint svg:hover{fill:#000;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#757575;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#212121;transition:color .2s}.sprints .sprint-progress-bar{background:#757575;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#000;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#b4b4b4;border:2px dashed #8f8f8f;color:#757575;padding:1rem;text-align:center}.sprints .sprint-table .row{border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(117,117,117,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#949494;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#828282}.sprints .sprint-table .us-name.blocked{color:#ff2400}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#828282}.sprints .sprint-table .column-points.blocked{color:#ff2400}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#757575}.sprint-closed .sprint-progress-bar .current-progress{background:#5c5c5c}.sprint-closed .button-gray{background:#757575}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#000}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.ticket-assigned-to,.ticket-assigned-users{-ms-flex-align:center;border-bottom:1px solid #757575;border-top:1px solid #757575}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,36,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,36,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.ticket-assigned-to .loading-spinner,.ticket-assigned-users .loading-spinner{transform-origin:32 32;max-height:2rem;max-width:2rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#757575}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#000}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{margin:1rem auto}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#212121;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#000;cursor:default}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .remove-user:hover,.ticket-assigned-to .user-assigned.editable:hover,.ticket-assigned-users .assign-to-me.editable:hover,.ticket-assigned-users .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#757575;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{fill:#ff2400;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#000}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#000}.ticket-assigned-users .assigned-title,.ticket-assigned-users .tg-add-assigned span{color:#757575;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-assigned-users{align-items:center;margin-bottom:1rem;padding:.5rem 0;position:relative}.ticket-assigned-users .loading-spinner{margin:1rem auto}.ticket-assigned-users .assigned-title{display:block;margin:.2rem 0 .25rem}.ticket-assigned-users .tg-assigned-users{-ms-flex-align:center;align-items:center;position:relative}.ticket-assigned-users .tg-add-assigned{margin-top:.25rem}.ticket-assigned-users .tg-add-assigned .add-assigned{fill:#757575;opacity:1;right:.5rem;top:2rem}.ticket-assigned-users .tg-add-assigned .add-assigned:hover{cursor:pointer;fill:#ff2400;transition:fill .2s}.ticket-assigned-users .tg-add-assigned span{margin:.2rem .5rem}.ticket-assigned-users .assigned-users-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .assigned-users-options a{margin-right:.2rem}.ticket-assigned-users .assign-to-me,.ticket-assigned-users .assign-to-me.editable,.ticket-assigned-users .user-assigned,.ticket-assigned-users .user-assigned.editable{color:#000}.ticket-assigned-users .not-assigned-users{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .not-assigned-users .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-users .not-assigned-users .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-to-options a{margin-right:.2rem}.ticket-assigned-users .not-assigned-users .assign-to-me,.ticket-assigned-users .not-assigned-users .user-assigned{color:#000;cursor:default}.colors-table .row.edition .current-color,.ticket-assigned-users .not-assigned-users .assign-to-me:hover,.ticket-assigned-users .not-assigned-users .user-assigned:hover{cursor:pointer}.ticket-assigned-users .not-assigned-users .assign-to-me .icon,.ticket-assigned-users .not-assigned-users .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-users .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-users .user-avatar img{width:100%}.ticket-assigned-users .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-users .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-users .user-avatar .iocaine-symbol svg{background:#212121;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.category-config{border-bottom:1px solid #757575}.category-config:first-child{border-top:1px solid #757575}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#757575;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#757575;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#000}.category-config .summary-role .role-summary-single.inactive{background:#757575}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#c1c1c1;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #c1c1c1}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(110,110,110,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#c1c1c1;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#757575;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#212121;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#000;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#000;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff0062}.colors-table .gu-mirror{background:#999;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#757575}.duty-custom-fields .custom-field-options svg:hover{fill:#000}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff0062}.external-reference{font-size:.9rem;color:#757575;margin-top:.5rem}.external-reference a{border-left:1px solid #757575;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#000}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#757575;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff0062}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#c1c1c1}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #757575;color:#212121;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#212121;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#212121;border:1px solid #000}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff0062;border:1px solid #ff2400}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#000;border:1px solid #000;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:#ff2400;border:1px solid #ff2400;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#757575;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:#ff2400}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-sprint-add-edit .delete-sprint{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:#ff2400;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .subtitle{white-space:pre-line}.lightbox-generic-ask .options{display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#b4b4b4;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#212121;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#b4b4b4;bottom:35px;color:#757575;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#000}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(110,110,110,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#757575;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff0062}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#757575;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-set-due-date .delete-due-date .icon,.lightbox-set-due-date .delete-due-date:hover .icon{fill:currentColor}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}.lightbox-set-due-date{z-index:9999}.lightbox-set-due-date form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-set-due-date .date{margin:2rem 0 1rem}.lightbox-set-due-date .reason textarea{margin-top:.5rem}.lightbox-set-due-date .due-date-suggestions{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:1rem 0 .5rem}.lightbox-set-due-date .suggestion{background:rgba(184,184,184,.2);color:#B8B8B8;-ms-flex-pack:start;justify-content:flex-start;margin:0 .5rem .5rem;min-height:2rem;padding:.5rem .75rem;position:relative}.lightbox-set-due-date .suggestion:first-child{margin-left:0}.lightbox-set-due-date .suggestion:nth-child(4n+4){margin-right:0}.lightbox-set-due-date .suggestion.clickable.active,.lightbox-set-due-date .suggestion.clickable:hover{background:rgba(33,33,33,.9);color:#fff}.lightbox-set-due-date .delete-due-date{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-set-due-date .delete-due-date:hover{color:#ff2400;transition:color .3s linear}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#212121;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .item{font-size:1.2rem}.main-nav .active{color:#212121}.main-nav .active svg path{fill:#212121;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#212121;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#212121}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .iocaine{background:rgba(33,33,33,.1);border-left:10px solid #212121}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#212121}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #c1c1c1;color:#c1c1c1}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#c1c1c1}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#c1c1c1;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#212121;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,0,98,.2);border-left:10px solid #ff0062}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#757575}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#212121}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#000}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff0062}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{width:.8rem;height:.8rem;fill:#757575;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #212121;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#212121;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(33,33,33,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#8e8e8e;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#a8a8a8;transition:background .2s ease-in}.ticket-status .type-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#212121;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#212121;position:absolute;width:0}.ticket-status .severity-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#212121;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#212121;position:absolute;width:0}.ticket-status .priority-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#212121;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#212121;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#757575;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#212121}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:#ff2400;color:#c1c1c1;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff0062}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#212121}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff0062}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#757575;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#757575}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff0062}.ticket-detail-settings .item-unblock:hover{background:#ff2400}.ticket-detail-settings .button-delete{background:#ff0062}.ticket-detail-settings .button-delete:hover{background:#ff2400}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(193,193,193,.2) 100%);background-color:#c1c1c1}.introjs-helperLayer{border:1px solid rgba(33,33,33,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(33,33,33,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#212121}.introjs-button{background-color:#000;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#212121;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#000;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#000}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#757575}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-ms-flex:1;flex:1;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#a6a6a6;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ff66a1}.issues-table .row.is-blocked .blocked-text{color:#ff2400;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#757575}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #b7b7b7}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#757575;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#212121;transition:all .2s linear}.issues-table .votes:hover svg{fill:#212121;transition:all .2s linear}.issues-table .votes.inactive{color:#757575}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#757575;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#212121;transition:all .2s linear}.issues-table .is-voted svg{fill:#212121;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff0062}.issues-table .is-voted:hover svg{fill:#ff0062;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#212121;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#757575;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#000}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#757575;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#212121}.kanban-table-body .task-column .kanban-wip-limit{background:#ff2400;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #212121,2px 2px 4px #a8a8a8}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#bcbcbc;border:1px dashed #adadad;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #c1c1c1}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#adadad}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#757575;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #c1c1c1;border-right:1px solid #c1c1c1;color:#212121;position:relative;top:1px}.search-filter a.active .icon{fill:#212121}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#212121;color:#fff}.search-in input::-webkit-input-placeholder{color:#757575}.search-in input::-moz-placeholder{color:#757575}.search-in input:-moz-placeholder{color:#757575}.search-in input:-ms-input-placeholder{color:#757575}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#757575}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#999;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon{font-size:1rem;color:#757575}.search-result-table .user-story-name .icon:hover{color:#212121;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #c1c1c1}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#212121;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#000;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#757575}.table-team .attribute .points{font-size:1.6rem;color:#212121}.table-team .attribute .top{fill:#212121;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff0062}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:#ff2400}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #c1c1c1;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .popover{font-size:.9rem;background:#212121;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#212121;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#212121;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #757575}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#000;transition:background .3s linear}.policy-table label{background:#757575;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#212121;cursor:pointer;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile{max-width:780px}.user-profile form{display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:#ff2400}.user-profile .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:.5rem}.user-profile .delete-account,.user-profile .download-profile{font-size:.9rem;display:block;-ms-flex:1;flex:1;margin-top:.5rem}.user-profile .delete-account{text-align:right}.wiki-nav{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#212121}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#757575;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #757575}.wiki-nav input[type=text]{background:#c1c1c1;color:#212121;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#757575}.wiki-nav input[type=text]::-moz-placeholder{color:#757575}.wiki-nav input[type=text]:-moz-placeholder{color:#757575}.wiki-nav input[type=text]:-ms-input-placeholder{color:#757575}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#757575;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:#ff2400}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#757575}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#757575;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff0062}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#757575}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff0062}.attachment-gallery .icon-delete:hover svg{color:#ff2400}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span,.attachment-list .editable-attachment-deprecated span,.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#757575}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-size{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#757575;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#000}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:#ff2400}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#212121}.attachment-list .percentage{background:rgba(0,0,0,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments{margin-bottom:4rem}.attachments .gu-transit{background:#c1c1c1;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#212121;line-height:36px;padding:0 1rem}.attachments-header .options{display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#757575;border:0;display:inline-block;padding:.5rem;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#212121}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#212121}.attachments-header button svg{fill:#757575;height:1.6rem;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #c1c1c1;color:#757575;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#757575;height:.9rem;margin-right:.25rem;width:.9rem}.single-attachment .attachment-size{color:#757575}.more-attachments{font-size:.9rem;border-bottom:1px solid #757575;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#000;margin-left:.5rem}.more-attachments:hover{background:#999;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#757575}.attachment-preview .attachment-preview-container svg:hover{fill:#212121;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #c1c1c1;cursor:pointer}.assignable-member-single:hover{background:rgba(33,33,33,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.05);border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff0062;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:#ff2400}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#212121;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#050505}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(33,33,33,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(33,33,33,.3)}.range-slider:focus::-ms-fill-lower{background:#c1c1c1}.range-slider:focus::-ms-fill-upper{background:#c6c6c6}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#c1c1c1;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#c1c1c1;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#bcbcbc;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#c1c1c1;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #a8a8a8;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #a8a8a8}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff0062}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,0,98,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-info.multiple .card-owner-avatar img{margin-right:.45rem}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#757575}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#212121}.card-owner-actions .card-actions{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:0 .5rem}.card-owner-actions .card-delete:hover{color:#ff0062}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem .5rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#757575;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-data .card-estimation.not-estimated{font-size:.8125rem}.card-statistics{font-size:.9rem;color:#b5b5b5;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#212121}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .statistic.card-votes{margin-left:.2rem}.card-statistics .statistic.card-due-date{margin-left:.1rem}.card-statistics .icon{width:.75rem;height:.75rem;fill:#b5b5b5;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#9c27b0}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#c1c1c1;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#212121;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#212121;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#c1c1c1}.card-tasks{border-top:1px solid #c1c1c1;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #c1c1c1}.card-task a{color:#757575;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff0062}.card-task a.closed-task{color:#757575;text-decoration:line-through}.card-task a:hover{color:#000}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(33,33,33,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #757575;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#212121;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:#ff2400;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#757575;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#757575;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg,.detail-title-wrapper .due-date-icon svg{width:1.3rem;height:1.3rem}.detail-title-wrapper.readonly .due-date-icon{margin-left:2.7rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.due-date-icon,.issue-nav a{display:inline-block}.edit-title-wrapper .edit-title-button:hover{fill:#000}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}.due-date-button,[disabled].due-date-button{background:#757575;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.due-date-button.closed,[disabled].due-date-button.closed{background:#B8B8B8}.due-date-button.due-set,[disabled].due-date-button.due-set{background:#9dce0a}.due-date-button.due-soon,[disabled].due-date-button.due-soon{background:#fcaf3e}.due-date-button.past-due,[disabled].due-date-button.past-due{background:#ff0062}.due-date-button:hover,[disabled].due-date-button:hover{background:#757575}.due-date-button.editable,[disabled].due-date-button.editable{cursor:pointer}.due-date-icon{margin:0 .25rem;position:relative}.due-date-icon svg{fill:#757575;transition:fill .2s ease-in}.due-date-icon.closed svg{fill:#B8B8B8}.due-date-icon.due-set svg{fill:#9dce0a}.due-date-icon.due-soon svg{fill:#fcaf3e}.due-date-icon.past-due svg{fill:#ff0062}.backlog-table-body .user-story-name .due-date-icon,.related-tasks .task-name .due-date-icon{top:.1rem}.issues-table .subject .due-date-icon{top:.25rem}.card-statistics .due-date-icon{margin:.1rem 0 0}.card-statistics .due-date-icon svg{height:.9rem;width:.9rem}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(0,0,0,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#212121;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#757575}tg-filter input::-moz-placeholder{color:#757575}tg-filter input:-moz-placeholder{color:#757575}tg-filter input:-ms-input-placeholder{color:#757575}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #757575;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#000}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#a8a8a8;color:#212121;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#b4b4b4;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#adadad;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#212121;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#8e8e8e;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#757575;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:#ff2400}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.add-tag-button .add-tag-text,.tag{font-size:.9rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#757575;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#212121;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#000}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #757575;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.tags-block,.terms-announcement{align-content:center;display:-ms-flexbox}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#a1a1a1;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#757575;cursor:pointer}.add-tag-button:hover,.tag{color:#212121}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-radius:0 5px 5px 0;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.terms-announcement-inner .title,.terms-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff0062;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.terms-announcement{-ms-flex-line-pack:center;background:#107a8a;display:flex;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.terms-announcement .terms-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.terms-announcement.visible{min-height:146px;pointer-events:auto;transition-delay:0s;width:100%}.terms-announcement.visible .terms-announcement-inner{opacity:1;transition:opacity .5s .5s}.terms-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.terms-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;height:auto;margin-right:1rem}.terms-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.terms-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.terms-announcement-inner .warning,.terms-announcement-inner .warning a{color:#0b525c}.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.terms-announcement-inner .close{display:block;position:absolute;right:.5rem;top:1rem}.terms-announcement-inner .close svg{width:2rem;height:2rem;fill:#f5f5f5;pointer-events:none;transition:fill .2s}.terms-announcement-inner .close svg:hover{fill:#0b525c}.terms-announcement-inner a{color:#f5f5f5}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(33,33,33,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff0062;transition:all .2s}.tribe-linked.is-active svg:hover{fill:#ff2400}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#000;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#000;cursor:pointer}.wysiwyg a:hover{color:#212121}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#c1c1c1;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #757575;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#757575 1px solid}.wysiwyg th{border-right:#757575 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#757575 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.wysiwyg hr{border:1px solid #c1c1c1}.medium-editor-mention-panel{background-color:#fff;border:1px solid #757575;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #757575;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#000;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:#ff2400}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#757575}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#757575;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#757575;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#757575;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #757575}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#212121}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#212121}.discover-header{background:url(../images/discover.png) bottom left repeat-x #c1c1c1;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#000}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#212121}.discover-header input[type=text]:-webkit-autofill{background:rgba(0,0,0,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#757575;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#000}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#757575;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#000}.filter-discover-search .discover-search-filter.active svg{fill:#000}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff0062;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:#ff2400}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#757575;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#212121;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#212121;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #c1c1c1;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#000}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#000}.featured-project .project-card-name a:hover{color:#212121}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#757575;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#757575;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#212121;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #c1c1c1;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#757575;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(33,33,33,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#000}.highlighted-project .project-title a:hover{color:#212121}.highlighted-project .project-description{font-size:.9rem;color:#757575;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#000}.highlighted-project .statistic.active svg{fill:#000}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#757575;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#212121;color:#fff}.discover-search .searchbox-filters label:hover{background:#c1c1c1;color:#757575}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#757575;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#000}.discover-results .statistic.active svg{fill:#000}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#000;border:1px solid #000;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:#ff2400;border:1px solid #ff2400;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #757575;color:#757575;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#212121;border:1px solid #000;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff0062;border:1px solid #ff2400}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(33,33,33,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,0,98,.5)}.epic-row.is-closed .name a{color:#9b9b9b;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#c1c1c1;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#212121;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#757575;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#212121;width:10vw}.epic-row .vote{color:#757575}.epic-row .vote.is-voter{color:#212121;fill:#212121}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#757575}.epic-row .epic-statuses{font-size:.9rem;background:rgba(33,33,33,.9);border-bottom:1px solid #212121;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#212121;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#000;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #c1c1c1;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;color:#757575}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(33,33,33,.05)}.story-row.is-blocked{background:rgba(255,0,98,.5)}.story-row.is-closed .name{color:#757575;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#212121;width:10vw}.story-row .vote.is-voter{color:#212121;fill:#212121}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#212121;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#212121}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(193,193,193,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(33,33,33,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#212121;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#212121;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#212121;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#212121;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#212121}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(33,33,33,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#c1c1c1;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #c1c1c1;color:#c1c1c1}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#c1c1c1}tg-related-userstory-row .closed .userstory-name a{color:#c1c1c1;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,0,98,.2);border-left:10px solid #ff0062}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#757575}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff0062}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-ms-flexbox;display:flex}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#F0EFD1;border:1px solid #000;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #757575;height:55px}.activity,.comment .comment-wrapper,.comment .deleted-comment-wrapper,.entry .entry-wrapper{border-bottom:1px solid #c1c1c1}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#000;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#757575}.comment .comment-edited{font-size:.9rem;background:#c1c1c1;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#000;fill:#000}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options .icon-close,.comment .comment-options .icon-edit{fill:#757575;margin-right:.5rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit:hover{fill:#757575}.comment .comment-options .icon-close:hover{fill:#ff2400}.comment .comment-options .icon-trash{fill:#ff0062}.comment .comment-options .icon-trash:hover{fill:#ff2400}.comment .deleted-comment-wrapper{padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#757575;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#000;fill:#000;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#000;fill:#000}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#000;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#757575}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#000;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#c1c1c1;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#757575;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(84,84,84,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,0,98,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#000;margin-right:.5rem}.activity .activity-date{color:#757575}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #c1c1c1;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(33,33,33,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,0,98,.2);color:#ff2400}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #c1c1c1;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#757575}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#000}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#000}.home-project .project-card-name a:hover{color:#212121}.home-project:hover{border:1px solid rgba(33,33,33,.2);box-shadow:0 0 5px #c1c1c1}.home-project.blocked-project{border:#c1c1c1}.home-project.blocked-project:hover{border:#c1c1c1;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#c1c1c1;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #c1c1c1;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#b4b4b4;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #c1c1c1;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff0062;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:#ff2400}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#212121;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#212121}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#757575;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#212121;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#212121}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(33,33,33,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(0,0,0,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#212121}.navbar a:hover svg{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.navbar-dropdown ul:after{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff0062;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#757575;display:block;padding:.8rem .5rem}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#212121}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#757575}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #c1c1c1}.profile-filter{-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#757575;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs{border-top:1px solid #c1c1c1}.profile-filter .searchbox input:focus{border-bottom:1px solid #757575;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#757575;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#212121}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{fill:#c1c1c1;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#757575;font-size:.9rem;margin:0}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#757575;transition:all .2s linear}.profile-bar .flag:hover path{fill:#ff2400;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .location,.profile-bar .username,.profile-bar h2{margin-bottom:1rem;color:#757575}.profile-bar h2{font-size:1.6rem;line-height:1.2}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#757575}.profile-bar .profile-stats{border-bottom:1px solid #c1c1c1;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#757575;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#212121}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #c1c1c1;border-right:1px solid #c1c1c1;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#000}.profile-content-tabs .icon{fill:#757575;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#757575;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#757575;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem}.profile-sidebar a{color:#000}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#000;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#757575;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-asana-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-asana-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#212121}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #c1c1c1;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(0,0,0,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(0,0,0,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#757575;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.create-project-import-type input:disabled+label .icon{color:#9b9b9b}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.create-project-privacity input:disabled+label .icon{color:#9b9b9b}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #c1c1c1}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#000;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#212121}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#000;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#757575;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-github-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-github-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#212121}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #c1c1c1;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(0,0,0,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(0,0,0,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;border-top:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#c1c1c1;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:#ff2400}.import-project-members-match{color:#757575}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #000;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(33,33,33,.3)}.import-project-members-match-true svg{fill:#000}.import-project-members-match-false{border:1px solid #ff2400;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(255,36,0,.3)}.import-project-members-match-false svg{fill:#ff2400}.import-project-members-choose{color:#000;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#212121}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #c1c1c1;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#757575;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(0,0,0,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #c1c1c1}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#000;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#000;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#212121;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#212121;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#757575;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-jira-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-jira-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#212121}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(0,0,0,.6);stroke:rgba(0,0,0,.1)}.create-project-type-issues-subform-radiogr svg{fill:#c1c1c1;stroke:#a8a8a8;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:#ff2400;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff0062;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#000}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#757575;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-trello-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-trello-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#212121}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #c1c1c1}.import-project-trello-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#212121}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#212121}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#757575;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(33,33,33,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#757575;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#c9c9c9;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#a1a1a1;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#757575;margin-right:.5rem}.transfer-project-statistics svg{fill:#757575;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#000;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#212121}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#757575}.transfer-project-comment-header .icon-close:hover{fill:#ff0062;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #c1c1c1;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#000}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.profile-timeline .activity-item a:hover{color:#212121}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#757575;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#757575}a:hover,body,h1 .date,h2 .date,h3 .date,h4 .date,h5 .date,h6 .date{color:#000}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#212121;margin-right:.5rem}.main-nav svg,.navbar a svg,.summary .stats svg{fill:#fff}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}body{background:#fff}.extrabar,.master,.menu-secondary,.menu-tertiary{background:#fff;border-left:1px solid #000;border-right:1px solid #000}.master,.menu-secondary{background:#fff}.menu-tertiary{background-color:#fff}.extrabar{background:#fff}h1,h2,h3,h4,h5,h6{color:#212121;font-family:Arial,Helvetica,sans-serif}a{color:#212121}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{background:#fff;border-color:#000;color:#000}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#000}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#000}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=url]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#000}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#000}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #ff2400}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);color:#fff}blockquote{border-left:5px solid #757575}.home-project-list li,.tag{border:1px solid #000}blockquote,blockquote p,cite{color:#000}.navbar a :hover,.summary{color:#fff}.button-gray{background:#000}.tag{background:#fff}.summary{background:#212121}.navbar{background:#000}.navbar::after{background:url(../images/menu-vert.png) top left}.home-project-list p,.watch-options a.active,.working-on-container .list-itemtype-ticket .ticket-project,.working-on-container .list-itemtype-ticket .ticket-status,.working-on-container .list-itemtype-ticket .ticket-type{color:#000}tg-project-menu{background-color:#000;background-image:none}.main-nav .active svg,.taskboard-table-header .task-colum-name .icon{fill:#000}.main-nav .active{background:#fff}.single-project .title{background:#c1c1c1;color:#000}.summary .data .number,.wiki-summary .username{color:#fff}.activity-item p,.drag-drop-help,.duty-custom-fields .custom-field-data .custom-field-description,.kanban-table-header .task-colum-name .icon,.points-per-role>li,.private path,.table-team .avatar .position,.us-created-by .created-by .created-date,.us-created-by .created-by .created-title,.watching .duty-id,.working-on .duty-id{color:#000}.wiki-content.editable:hover .wysiwyg{background:#fff;border:1px solid}.taskboard-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.taskboard-table-body .taskboard-tasks-box{background:#fff;border:1px solid #000}.kanban-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.kanban-table-body .kanban-uses-box{background:#fff}.us-detail-settings .button-gray{background:0 0;border:1px solid #000;color:#000}.us-detail-settings .button-gray.active,.us-detail-settings .button-gray:hover{color:#fff}.history-tabs a,.more-attachments span,.us-detail-settings .button-gray span,.us-story-main-data .us-title .us-name{color:#000}.us-story-main-data .us-title{background:#fff}.login-main,.login-main a{color:#fff}.profile-content-tabs .tab,.profile-sidebar p{color:#212121}.settings-nav .active{background:#000;color:#fff}.admin-submenu ul a{color:#000}.policy-table input:checked+label,.policy-table label:hover{color:#fff}.admin-common .admin-subtitle,.admin-membership-table .avatar .email,.admin-membership-table .delete,.home-wrapper .title-bar{color:#000}.admin-functionalities .functionality.active{background:#fff;border:1px solid #000} \ No newline at end of file diff --git a/dist/v-1527758585938/styles/theme-material-design.css b/dist/v-1527758585938/styles/theme-material-design.css deleted file mode 100644 index 1bcdd48..0000000 --- a/dist/v-1527758585938/styles/theme-material-design.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8";.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;content:'';position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! - * Pikaday - * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.loader-active,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#3f51b5}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal;color:#BDBDBD}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#424242}.pika-single .is-selected .pika-button{background:#3f51b5;border-radius:0!important;box-shadow:inset 0 1px 3px #3f51b5}.pika-single .is-today .pika-button{color:#3f51b5}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#8c9eff!important;border-radius:0!important;box-shadow:inset 0 1px 3px #8c9eff!important}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#8c9eff;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#8c9eff;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#757575;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#3f51b5;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #757575;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #EEE}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#8c9eff;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#212121;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(255,255,255,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#1a237e;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);position:absolute;width:100%}.admin-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#BDBDBD;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#BDBDBD}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(../images/bg.png) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;overflow-y:auto;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{margin-left:.5rem;padding-bottom:1rem}.auth .login-text a,.auth .register-text a{text-decoration:underline}.auth .login-text a:hover,.auth .register-text a:hover{color:#8c9eff}.auth .register-terms{margin:.5rem 0 .75rem}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(63,81,181,.9);stroke:#8c9eff;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(140,158,255,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;overflow:hidden;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #757575;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#8c9eff;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#BDBDBD;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#424242;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff;font-size:.9rem;margin-left:.5rem;padding-bottom:1rem;text-align:left}.invitation-main .register-text a{color:#3f51b5}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#3f51b5}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#EEE}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff}.error-main a{color:#8c9eff}.taskboard{overflow:hidden}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden}.team h2{margin:1rem 0}.team h2 span:last-child{color:#3f51b5}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#424242}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#BDBDBD}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#757575}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e4e4;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#BDBDBD;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#BDBDBD}.menu-button,.trans-button:visited{color:#212121}.trans-button .icon,.trans-button span{color:#212121;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#EEE;color:#757575}.menu-button span,.menu-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#3f51b5}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#8c9eff;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#8c9eff;color:#fff}.button-blackish{background:#212121;color:#EEE}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff5252}.button-red:hover{background:#f44336;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#3f51b5;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.button-bulk:hover{background:#8c9eff}.button-auth{background:#424242}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#3f51b5;display:inline-block;margin-top:.5rem}.button-filter{background:#EEE;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#BDBDBD;fill:#EEE}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#f44336;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#e9e9e9;border:1px dashed #dadada;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#dadada;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#dadada;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#d5d5d5;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#757575;height:25px;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#8c9eff;margin-left:50%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#BDBDBD}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#3f51b5}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff5252;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.drag-drop-help{color:#757575}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#8c9eff;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#BDBDBD;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#3f51b5}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(189,189,189,.2);color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(140,158,255,.9);color:#EEE}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(26,35,126,.5);border-bottom:0;color:#EEE}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#424242}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;left:10px;position:absolute;top:-5px;width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#8c9eff;color:#fff}.ticket-estimation .popover.fix{background:#212121;color:#fff;display:none;left:-160px;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#8c9eff;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#3f51b5}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#BDBDBD;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #424242;color:#424242}.history-tabs .order-comments{color:#424242}.level{background-color:#BDBDBD;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#BDBDBD}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #EEE;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#BDBDBD}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#BDBDBD}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:#f44336;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#BDBDBD}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#757575;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#757575;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#ffc107}.loading-bar .item-1{animation-delay:1s;background:#009688}.loading-bar .item-2{animation-delay:2s;background:#e91e63}.loading-bar .item-3{animation-delay:3s;background:#9c27b0}.loading-bar .item-4{animation-delay:4s;background:#cddc39}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#BDBDBD;margin-left:.25rem}.notification-message-success{background:rgba(140,158,255,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(244,67,54,.9);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(189,189,189,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(244,67,54,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#BDBDBD;color:#fff;padding:.5rem 1rem;transition:all .3s linear}.paginator a:hover{background:#212121;color:#fff;transition:all .3s linear}.paginator .active span{background:#8c9eff}.select-color,.select-color:after{background:#212121;position:absolute}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#BDBDBD;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#8c9eff;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#BDBDBD;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color .empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#EEE;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#BDBDBD;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#8c9eff}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#8c9eff;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#3f51b5}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#8a8a8a;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#8c9eff;height:24px}.summary-progress-bar .defined-points{background:#ff5252;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#8c9eff;height:24px;position:absolute}.large-summary{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #212121;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #757575;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#3f51b5;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#8c9eff;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#8c9eff}.large-summary .icon.icon-stats.active:hover{color:#3f51b5;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:rgba(26,35,126,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#1a237e;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#1a237e;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(140,158,255,.4)}.track-button.active .icon{fill:#3f51b5}.track-button.active .track-button-counter{background:rgba(140,158,255,.6)}.track-button.is-hover .track-inner{background:#f77066;color:#EEE;transition:background .2s}.track-button.is-hover .icon{fill:#ff5252}.track-button.is-hover .track-button-counter{background:#f44336;color:#EEE;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#EEE;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#e1e1e1;transition:background .3s}.track-icon{fill:#424242;margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#e1e1e1;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#EEE;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#e1e1e1;transition:background .3s}.watch-options{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-assigned-users,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(189,189,189,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox}.watch-options a.active{color:#8c9eff}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check svg{fill:#8c9eff}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#BDBDBD;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#1a237e;transition:background .3s}.upvote-btn a:hover path{fill:#1a237e}.upvote-btn a.active{background:rgba(140,158,255,.2);color:#3f51b5;transition:all .3s}.upvote-btn a.active svg{fill:#3f51b5}.upvote-btn a.is-hover{background:#f44336;color:#EEE}.upvote-btn a.is-hover svg{fill:#ff5252;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#BDBDBD;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-assigned-users .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-multiple,.ticket-watchers .user-list-single{-ms-flex-line-pack:center;padding:.25rem 0;vertical-align:middle;align-content:center}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-multiple{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex}.assigned-to-list .user-list-multiple.selected,.assigned-to-list .user-list-multiple:hover,.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(255,255,255,.3);cursor:pointer}.assigned-to-list .user-list-multiple:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#424242;margin-left:.5rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#424242;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:#f44336}.assigned-to-list .user-list-multiple:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-multiple.is-active{background:rgba(255,255,255,.3);cursor:pointer;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-multiple .remove-assigned-to{display:block;fill:#424242;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-multiple .remove-assigned-to:hover{fill:#f44336}.ticket-watchers .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-multiple{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-assigned-users .user-list-multiple,.ticket-assigned-users .user-list-single{background:0 0;display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.ticket-watchers .user-list-multiple:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#424242;margin-left:.5rem;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:#f44336;transition:color .3s ease-in}.ticket-assigned-users .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:flex}.ticket-assigned-users .user-list-single:last-child{border:0}.ticket-assigned-users .user-list-multiple{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:flex}.ticket-assigned-users .user-list-multiple:last-child{border:0}.ticket-assigned-users .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-assigned-users .user-list-single{-ms-flex-positive:1;flex-grow:1}.ticket-assigned-users .user-list-single:hover .remove-user{opacity:1;transition:opacity .2s ease-in}.ticket-assigned-users .user-list-name{color:#424242;margin-left:.5rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .remove-user{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-assigned-users .remove-user:hover{fill:#f44336;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#BDBDBD;margin-bottom:2rem}.admin-common .admin-subtitle a{color:#3f51b5}.admin-common .admin-subtitle a:hover{color:#8c9eff}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#EEE;color:#424242;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #EEE}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(140,158,255,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#BDBDBD}.custom-fields-table .single-custom-field{border-bottom:1px solid #EEE;color:#757575}.custom-fields-table .icon-drag{fill:#BDBDBD;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#BDBDBD;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#3f51b5;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff5252}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{max-height:1rem;max-width:1rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#3f51b5;fill:#3f51b5}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#BDBDBD}.admin-functionalities .module-name{font-size:1.2rem;color:#BDBDBD;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#BDBDBD;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#BDBDBD}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#3f51b5}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff5252;display:inline-block;padding-left:.3rem}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#EEE}.admin-membership-table .resend{background-color:#3f51b5;color:#fff}.admin-membership-table .resend:hover{background-color:#8c9eff;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#BDBDBD;transition:fill .2s}.admin-membership-table .delete:hover{fill:#f44336}.admin-membership-table .pending{color:#ff5252}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #d5d5d5}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#757575;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#BDBDBD;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:#f44336}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #EEE;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #EEE;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#BDBDBD;margin-left:.5rem}.project-details .get-feedback-inner .check,.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#BDBDBD;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#424242;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(140,158,255,.4);color:#424242}.project-privacy-settings label:hover svg{fill:#424242}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#424242;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#8c9eff;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#BDBDBD;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#BDBDBD}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#3f51b5}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff5252;border-radius:6px;color:#ff5252;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#3f51b5}.admin-project-profile-owner-actions a:hover{color:#8c9eff;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#BDBDBD}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#424242}.admin-roles .icon:hover{fill:#3f51b5;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#BDBDBD;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#BDBDBD;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#EEE;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:#f44336;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#1d278b;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#232fa8;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#212121}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.admin-webhooks .table-body .webhook-service{color:#757575}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #EEE}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#BDBDBD;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#3f51b5;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#8c9eff}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#BDBDBD}.admin-webhooks .webhook-options svg:hover{fill:#3f51b5;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #EEE;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(140,158,255,.1);transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#757575;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#8c9eff}.admin-webhooks .history-response-icon.history-error{background:#f44336}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#BDBDBD}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#BDBDBD}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#8c9eff;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{font-size:.9rem;color:#BDBDBD;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #EEE;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#BDBDBD;opacity:0}.project-values-row .icon:hover{fill:#424242;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #EEE}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#fff;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff5252}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p{color:#424242;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#424242;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin:1rem 0;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#757575;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#BDBDBD}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#BDBDBD}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#8c9eff;fill:#8c9eff}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#757575;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#212121;color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#212121;color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#8c9eff;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#8c9eff;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#212121;bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;background:#212121;position:absolute}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#8c9eff;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#8c9eff;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#8c9eff;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #BDBDBD;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#BDBDBD}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #e4e4e4;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#fff;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#BDBDBD;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#EEE}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#fff;transition:background .2s ease-in}.backlog-table-body input:checked{color:#8c9eff;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff5252;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:#f44336;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#8c9eff}.backlog-table-body .icon-drag{cursor:move;fill:#BDBDBD;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#3f51b5;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#8c9eff}.sprints .add-sprint svg{fill:#EEE;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon,.ticket-assigned-users .assign-to-me .icon,.ticket-assigned-users .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#BDBDBD}.sprints .sprint svg:hover{fill:#3f51b5;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#BDBDBD;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#8c9eff;transition:color .2s}.sprints .sprint-progress-bar{background:#BDBDBD;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#3f51b5;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#e1e1e1;border:2px dashed #d7d7d7;color:#757575;padding:1rem;text-align:center}.sprints .sprint-table .row{border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(189,189,189,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#dcdcdc;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#cacaca}.sprints .sprint-table .us-name.blocked{color:#f44336}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#cacaca}.sprints .sprint-table .column-points.blocked{color:#f44336}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#BDBDBD}.sprint-closed .sprint-progress-bar .current-progress{background:#a4a4a4}.sprint-closed .button-gray{background:#BDBDBD}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#3f51b5}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.ticket-assigned-to,.ticket-assigned-users{-ms-flex-align:center;border-bottom:1px solid #BDBDBD;border-top:1px solid #BDBDBD}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(244,67,54,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(244,67,54,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.ticket-assigned-to .loading-spinner,.ticket-assigned-users .loading-spinner{transform-origin:32 32;max-height:2rem;max-width:2rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#BDBDBD}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#3f51b5}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{margin:1rem auto}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#424242;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#3f51b5;cursor:default}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .remove-user:hover,.ticket-assigned-to .user-assigned.editable:hover,.ticket-assigned-users .assign-to-me.editable:hover,.ticket-assigned-users .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#757575;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{fill:#f44336;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#3f51b5}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#3f51b5}.ticket-assigned-users .assigned-title,.ticket-assigned-users .tg-add-assigned span{color:#757575;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-assigned-users{align-items:center;margin-bottom:1rem;padding:.5rem 0;position:relative}.ticket-assigned-users .loading-spinner{margin:1rem auto}.ticket-assigned-users .assigned-title{display:block;margin:.2rem 0 .25rem}.ticket-assigned-users .tg-assigned-users{-ms-flex-align:center;align-items:center;position:relative}.ticket-assigned-users .tg-add-assigned{margin-top:.25rem}.ticket-assigned-users .tg-add-assigned .add-assigned{fill:#757575;opacity:1;right:.5rem;top:2rem}.ticket-assigned-users .tg-add-assigned .add-assigned:hover{cursor:pointer;fill:#f44336;transition:fill .2s}.ticket-assigned-users .tg-add-assigned span{margin:.2rem .5rem}.ticket-assigned-users .assigned-users-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .assigned-users-options a{margin-right:.2rem}.ticket-assigned-users .assign-to-me,.ticket-assigned-users .assign-to-me.editable,.ticket-assigned-users .user-assigned,.ticket-assigned-users .user-assigned.editable{color:#3f51b5}.ticket-assigned-users .not-assigned-users{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .not-assigned-users .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-users .not-assigned-users .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-to-options a{margin-right:.2rem}.ticket-assigned-users .not-assigned-users .assign-to-me,.ticket-assigned-users .not-assigned-users .user-assigned{color:#3f51b5;cursor:default}.colors-table .row.edition .current-color,.ticket-assigned-users .not-assigned-users .assign-to-me:hover,.ticket-assigned-users .not-assigned-users .user-assigned:hover{cursor:pointer}.ticket-assigned-users .not-assigned-users .assign-to-me .icon,.ticket-assigned-users .not-assigned-users .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-users .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-users .user-avatar img{width:100%}.ticket-assigned-users .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-users .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-users .user-avatar .iocaine-symbol svg{background:#424242;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.category-config{border-bottom:1px solid #BDBDBD}.category-config:first-child{border-top:1px solid #BDBDBD}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#BDBDBD;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#BDBDBD;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#3f51b5}.category-config .summary-role .role-summary-single.inactive{background:#757575}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#EEE;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #EEE}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(255,255,255,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#EEE;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#BDBDBD;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#8c9eff;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#3f51b5;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#3f51b5;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff5252}.colors-table .gu-mirror{background:#fff;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#BDBDBD}.duty-custom-fields .custom-field-options svg:hover{fill:#3f51b5}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem;color:#a8a8a8;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff5252}.external-reference{font-size:.9rem;color:#BDBDBD;margin-top:.5rem}.external-reference a{border-left:1px solid #BDBDBD;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#3f51b5}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#757575;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff5252}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#EEE}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #BDBDBD;color:#424242;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#424242;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#8c9eff;border:1px solid #3f51b5}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff5252;border:1px solid #f44336}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#3f51b5;border:1px solid #3f51b5;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:#f44336;border:1px solid #f44336;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#BDBDBD;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:#f44336}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-sprint-add-edit .delete-sprint{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:#f44336;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .subtitle{white-space:pre-line}.lightbox-generic-ask .options{display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#e1e1e1;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#8c9eff;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e1e1e1;bottom:35px;color:#757575;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#3f51b5}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(255,255,255,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#757575;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff5252}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#BDBDBD;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-set-due-date .delete-due-date .icon,.lightbox-set-due-date .delete-due-date:hover .icon{fill:currentColor}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}.lightbox-set-due-date{z-index:9999}.lightbox-set-due-date form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-set-due-date .date{margin:2rem 0 1rem}.lightbox-set-due-date .reason textarea{margin-top:.5rem}.lightbox-set-due-date .due-date-suggestions{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:1rem 0 .5rem}.lightbox-set-due-date .suggestion{background:rgba(184,184,184,.2);color:#B8B8B8;-ms-flex-pack:start;justify-content:flex-start;margin:0 .5rem .5rem;min-height:2rem;padding:.5rem .75rem;position:relative}.lightbox-set-due-date .suggestion:first-child{margin-left:0}.lightbox-set-due-date .suggestion:nth-child(4n+4){margin-right:0}.lightbox-set-due-date .suggestion.clickable.active,.lightbox-set-due-date .suggestion.clickable:hover{background:rgba(140,158,255,.9);color:#fff}.lightbox-set-due-date .delete-due-date{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-set-due-date .delete-due-date:hover{color:#f44336;transition:color .3s linear}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#8c9eff;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);width:12px;z-index:98}.main-nav svg{fill:#fff;height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .item{font-size:1.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#8c9eff}.main-nav .active svg path{fill:#8c9eff;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#424242;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#8c9eff}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .iocaine{background:rgba(140,158,255,.1);border-left:10px solid #8c9eff}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#424242}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #EEE;color:#EEE}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#EEE}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#EEE;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,82,82,.2);border-left:10px solid #ff5252}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#757575}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#424242}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#3f51b5}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff5252}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{width:.8rem;height:.8rem;fill:#BDBDBD;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #424242;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(140,158,255,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#bbb;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#d5d5d5;transition:background .2s ease-in}.ticket-status .type-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#8c9eff;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#212121;position:absolute;width:0}.ticket-status .severity-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#8c9eff;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#212121;position:absolute;width:0}.ticket-status .priority-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#8c9eff;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#212121;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#BDBDBD;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#8c9eff}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:#f44336;color:#EEE;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff5252}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#8c9eff}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff5252}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#BDBDBD;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#757575}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff5252}.ticket-detail-settings .item-unblock:hover{background:#f44336}.ticket-detail-settings .button-delete{background:#ff5252}.ticket-detail-settings .button-delete:hover{background:#f44336}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(238,238,238,.2) 100%);background-color:#EEE}.introjs-helperLayer{border:1px solid rgba(140,158,255,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(66,66,66,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#8c9eff}.introjs-button{background-color:#3f51b5;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#8c9eff;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#3f51b5;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#3f51b5}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#BDBDBD}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-ms-flex:1;flex:1;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#fff;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ffb8b8}.issues-table .row.is-blocked .blocked-text{color:#f44336;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#757575}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #e4e4e4}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#757575;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#8c9eff;transition:all .2s linear}.issues-table .votes:hover svg{fill:#8c9eff;transition:all .2s linear}.issues-table .votes.inactive{color:#BDBDBD}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#BDBDBD;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#8c9eff;transition:all .2s linear}.issues-table .is-voted svg{fill:#8c9eff;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff5252}.issues-table .is-voted:hover svg{fill:#ff5252;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#BDBDBD;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#3f51b5}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#BDBDBD;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#212121}.kanban-table-body .task-column .kanban-wip-limit{background:#f44336;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #8c9eff,2px 2px 4px #d5d5d5}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#e9e9e9;border:1px dashed #dadada;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #EEE}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#dadada}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#BDBDBD;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #EEE;border-right:1px solid #EEE;color:#424242;position:relative;top:1px}.search-filter a.active .icon{fill:#8c9eff}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#424242;color:#fff}.search-in input::-webkit-input-placeholder{color:#BDBDBD}.search-in input::-moz-placeholder{color:#BDBDBD}.search-in input:-moz-placeholder{color:#BDBDBD}.search-in input:-ms-input-placeholder{color:#BDBDBD}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#BDBDBD}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#fff;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon{font-size:1rem;color:#BDBDBD}.search-result-table .user-story-name .icon:hover{color:#424242;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #EEE}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#212121;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#3f51b5;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#757575}.table-team .attribute .points{font-size:1.6rem;color:#424242}.table-team .attribute .top{fill:#8c9eff;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff5252}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:#f44336}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #EEE;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .avatar .position{color:#BDBDBD}.table-team .popover{font-size:.9rem;background:#212121;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#8c9eff;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#212121;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #BDBDBD}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#3f51b5;transition:background .3s linear}.policy-table label{background:#BDBDBD;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#8c9eff;cursor:pointer;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile{max-width:780px}.user-profile form{display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:#f44336}.user-profile .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:.5rem}.user-profile .delete-account,.user-profile .download-profile{font-size:.9rem;display:block;-ms-flex:1;flex:1;margin-top:.5rem}.user-profile .delete-account{text-align:right}.wiki-nav{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#8c9eff}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#BDBDBD;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #BDBDBD}.wiki-nav input[type=text]{background:#EEE;color:#424242;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#BDBDBD}.wiki-nav input[type=text]::-moz-placeholder{color:#BDBDBD}.wiki-nav input[type=text]:-moz-placeholder{color:#BDBDBD}.wiki-nav input[type=text]:-ms-input-placeholder{color:#BDBDBD}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#BDBDBD;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:#f44336}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#757575}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#BDBDBD;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff5252}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#BDBDBD}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff5252}.attachment-gallery .icon-delete:hover svg{color:#f44336}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#BDBDBD}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span{color:#757575}.attachment-list .attachment-size{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#BDBDBD;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#3f51b5}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:#f44336}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#BDBDBD}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#424242}.attachment-list .percentage{background:rgba(63,81,181,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments{margin-bottom:4rem}.attachments .gu-transit{background:#EEE;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#424242;line-height:36px;padding:0 1rem}.attachments-header .options{display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#757575;border:0;display:inline-block;padding:.5rem;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#8c9eff}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#8c9eff}.attachments-header button svg{fill:#BDBDBD;height:1.6rem;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.more-attachments span,.single-attachment .attachment-size{color:#BDBDBD}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #EEE;color:#BDBDBD;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#757575;height:.9rem;margin-right:.25rem;width:.9rem}.more-attachments{font-size:.9rem;border-bottom:1px solid #BDBDBD;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#3f51b5;margin-left:.5rem}.more-attachments:hover{background:#fff;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#BDBDBD}.attachment-preview .attachment-preview-container svg:hover{fill:#8c9eff;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #EEE;cursor:pointer}.assignable-member-single:hover{background:rgba(140,158,255,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(140,158,255,.05);border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff5252;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:#f44336}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#424242;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#1c2586}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(66,66,66,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(66,66,66,.3)}.range-slider:focus::-ms-fill-lower{background:#EEE}.range-slider:focus::-ms-fill-upper{background:#f3f3f3}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#EEE;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#EEE;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#e9e9e9;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#EEE;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #d5d5d5;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #d5d5d5}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff5252}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,82,82,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-info.multiple .card-owner-avatar img{margin-right:.45rem}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#BDBDBD}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#8c9eff}.card-owner-actions .card-actions{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:0 .5rem}.card-owner-actions .card-delete:hover{color:#ff5252}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem .5rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#BDBDBD;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-data .card-estimation.not-estimated{font-size:.8125rem}.card-statistics{font-size:.9rem;color:#fdfdfd;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#8c9eff}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .statistic.card-votes{margin-left:.2rem}.card-statistics .statistic.card-due-date{margin-left:.1rem}.card-statistics .icon{width:.75rem;height:.75rem;fill:#fdfdfd;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#9c27b0}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#EEE;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#8c9eff;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#212121;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#EEE}.card-tasks{border-top:1px solid #EEE;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #EEE}.card-task a{color:#BDBDBD;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff5252}.card-task a.closed-task{color:#BDBDBD;text-decoration:line-through}.card-task a:hover{color:#3f51b5}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(140,158,255,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #BDBDBD;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#212121;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #EEE;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:#f44336;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#BDBDBD;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#757575;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg,.detail-title-wrapper .due-date-icon svg{width:1.3rem;height:1.3rem}.detail-title-wrapper.readonly .due-date-icon{margin-left:2.7rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.due-date-icon,.issue-nav a{display:inline-block}.edit-title-wrapper .edit-title-button:hover{fill:#3f51b5}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}.due-date-button,[disabled].due-date-button{background:#BDBDBD;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.due-date-button.closed,[disabled].due-date-button.closed{background:#B8B8B8}.due-date-button.due-set,[disabled].due-date-button.due-set{background:#9dce0a}.due-date-button.due-soon,[disabled].due-date-button.due-soon{background:#fcaf3e}.due-date-button.past-due,[disabled].due-date-button.past-due{background:#ff5252}.due-date-button:hover,[disabled].due-date-button:hover{background:#757575}.due-date-button.editable,[disabled].due-date-button.editable{cursor:pointer}.due-date-icon{margin:0 .25rem;position:relative}.due-date-icon svg{fill:#BDBDBD;transition:fill .2s ease-in}.due-date-icon.closed svg{fill:#B8B8B8}.due-date-icon.due-set svg{fill:#9dce0a}.due-date-icon.due-soon svg{fill:#fcaf3e}.due-date-icon.past-due svg{fill:#ff5252}.backlog-table-body .user-story-name .due-date-icon,.related-tasks .task-name .due-date-icon{top:.1rem}.issues-table .subject .due-date-icon{top:.25rem}.card-statistics .due-date-icon{margin:.1rem 0 0}.card-statistics .due-date-icon svg{height:.9rem;width:.9rem}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(63,81,181,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#424242;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#BDBDBD}tg-filter input::-moz-placeholder{color:#BDBDBD}tg-filter input:-moz-placeholder{color:#BDBDBD}tg-filter input:-ms-input-placeholder{color:#BDBDBD}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #BDBDBD;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#3f51b5}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#424242;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#d5d5d5;color:#424242;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#e1e1e1;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#dadada;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#424242;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#bbb;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#757575;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:#f44336}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.add-tag-button .add-tag-text,.tag{font-size:.9rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#BDBDBD;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#424242;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#3f51b5}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #BDBDBD;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.tags-block,.terms-announcement{align-content:center;display:-ms-flexbox}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#fff;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#BDBDBD;cursor:pointer}.add-tag-button:hover{color:#8c9eff}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#424242;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.terms-announcement-inner .title,.terms-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff5252;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.terms-announcement{-ms-flex-line-pack:center;background:#107a8a;display:flex;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.terms-announcement .terms-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.terms-announcement.visible{min-height:146px;pointer-events:auto;transition-delay:0s;width:100%}.terms-announcement.visible .terms-announcement-inner{opacity:1;transition:opacity .5s .5s}.terms-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.terms-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;height:auto;margin-right:1rem}.terms-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.terms-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.terms-announcement-inner .warning,.terms-announcement-inner .warning a{color:#0b525c}.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.terms-announcement-inner .close{display:block;position:absolute;right:.5rem;top:1rem}.terms-announcement-inner .close svg{width:2rem;height:2rem;fill:#f5f5f5;pointer-events:none;transition:fill .2s}.terms-announcement-inner .close svg:hover{fill:#0b525c}.terms-announcement-inner a{color:#f5f5f5}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(66,66,66,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff5252;transition:all .2s}.tribe-linked.is-active svg:hover{fill:#f44336}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#3f51b5;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#3f51b5;cursor:pointer}.wysiwyg a:hover{color:#8c9eff}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#EEE;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #BDBDBD;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#BDBDBD 1px solid}.wysiwyg th{border-right:#BDBDBD 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#BDBDBD 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.wysiwyg hr{border:1px solid #EEE}.medium-editor-mention-panel{background-color:#fff;border:1px solid #BDBDBD;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #BDBDBD;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#1a237e;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:#f44336}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#BDBDBD}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#BDBDBD;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#BDBDBD;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#BDBDBD;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #BDBDBD}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#8c9eff}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#8c9eff}.discover-header{background:url(../images/discover.png) bottom left repeat-x #EEE;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#3f51b5}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#8c9eff}.discover-header input[type=text]:-webkit-autofill{background:rgba(26,35,126,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#BDBDBD;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#3f51b5}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#BDBDBD;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#3f51b5}.filter-discover-search .discover-search-filter.active svg{fill:#3f51b5}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff5252;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:#f44336}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#BDBDBD;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#8c9eff;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#424242;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #EEE;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#3f51b5}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#3f51b5}.featured-project .project-card-name a:hover{color:#8c9eff}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#BDBDBD;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#BDBDBD;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#424242;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #EEE;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#BDBDBD;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(140,158,255,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#3f51b5}.highlighted-project .project-title a:hover{color:#8c9eff}.highlighted-project .project-description{font-size:.9rem;color:#757575;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#BDBDBD;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#3f51b5}.highlighted-project .statistic.active svg{fill:#3f51b5}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#BDBDBD;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#8c9eff;color:#fff}.discover-search .searchbox-filters label:hover{background:#EEE;color:#757575}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#BDBDBD;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#3f51b5}.discover-results .statistic.active svg{fill:#3f51b5}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#3f51b5;border:1px solid #3f51b5;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:#f44336;border:1px solid #f44336;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #BDBDBD;color:#BDBDBD;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#8c9eff;border:1px solid #3f51b5;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff5252;border:1px solid #f44336}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(140,158,255,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,82,82,.5)}.epic-row.is-closed .name a{color:#e3e3e3;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#EEE;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#424242;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#BDBDBD;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#8c9eff;width:10vw}.epic-row .vote{color:#757575}.epic-row .vote.is-voter{color:#8c9eff;fill:#8c9eff}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#BDBDBD}.epic-row .epic-statuses{font-size:.9rem;background:rgba(33,33,33,.9);border-bottom:1px solid #424242;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#8c9eff;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#3f51b5;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #EEE;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(140,158,255,.05)}.story-row.is-blocked{background:rgba(255,82,82,.5)}.story-row.is-closed .name{color:#BDBDBD;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#8c9eff;width:10vw}.story-row .vote{color:#757575}.story-row .vote.is-voter{color:#8c9eff;fill:#8c9eff}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#8c9eff;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#8c9eff}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(238,238,238,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(140,158,255,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#8c9eff;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#424242;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#8c9eff;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#424242;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#8c9eff}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(140,158,255,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#EEE;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #EEE;color:#EEE}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#EEE}tg-related-userstory-row .closed .userstory-name a{color:#EEE;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,82,82,.2);border-left:10px solid #ff5252}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#757575}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff5252}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-ms-flexbox;display:flex}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #BDBDBD;height:55px}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#3f51b5;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#BDBDBD}.comment .comment-edited{font-size:.9rem;background:#EEE;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#3f51b5;fill:#3f51b5}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit{fill:#BDBDBD;margin-right:.5rem}.comment .comment-options .icon-edit:hover{fill:#757575}.comment .comment-options .icon-close{fill:#BDBDBD;margin-right:.5rem}.comment .comment-options .icon-close:hover{fill:#f44336}.comment .comment-options .icon-trash{fill:#ff5252}.comment .comment-options .icon-trash:hover{fill:#f44336}.comment .deleted-comment-wrapper{border-bottom:1px solid #EEE;padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#BDBDBD;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#3f51b5;fill:#3f51b5;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#3f51b5;fill:#3f51b5}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#3f51b5;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#BDBDBD}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#3f51b5;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#EEE;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#BDBDBD;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(242,244,255,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,82,82,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#3f51b5;margin-right:.5rem}.activity .activity-date{color:#BDBDBD}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #EEE;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(140,158,255,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,82,82,.2);color:#f44336}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #EEE;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#757575}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#3f51b5}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#3f51b5}.home-project .project-card-name a:hover{color:#8c9eff}.home-project:hover{border:1px solid rgba(140,158,255,.2);box-shadow:0 0 5px #EEE}.home-project.blocked-project{border:#EEE}.home-project.blocked-project:hover{border:#EEE;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#EEE;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #EEE;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e1e1e1;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #EEE;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff5252;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:#f44336}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#424242;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#8c9eff}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#BDBDBD;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#424242;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#212121}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(140,158,255,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(26,35,126,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#8c9eff}.navbar a:hover svg{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.navbar-dropdown ul:after{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff5252;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#BDBDBD;display:block;padding:.8rem .5rem}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#8c9eff}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#757575}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #EEE}.profile-filter{-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#757575;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-contacts,.profile-content-tabs{border-top:1px solid #EEE}.profile-filter .searchbox input:focus{border-bottom:1px solid #BDBDBD;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#BDBDBD;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#212121}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{fill:#EEE;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#BDBDBD;font-size:.9rem;margin:0}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#BDBDBD;transition:all .2s linear}.profile-bar .flag:hover path{fill:#f44336;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar h2{font-size:1.6rem;color:#757575;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#BDBDBD;margin-bottom:1rem}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#BDBDBD}.profile-bar .profile-stats{border-bottom:1px solid #EEE;border-top:1px solid #EEE;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#BDBDBD;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#757575;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#8c9eff}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #EEE;border-right:1px solid #EEE;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#3f51b5}.profile-content-tabs .icon{fill:#BDBDBD;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#757575;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#BDBDBD;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem;color:#BDBDBD}.profile-sidebar a{color:#3f51b5}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#3f51b5;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-asana-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-asana-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#8c9eff}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #EEE;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(63,81,181,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(63,81,181,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#BDBDBD;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.create-project-import-type input:disabled+label .icon{color:#e3e3e3}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.create-project-privacity input:disabled+label .icon{color:#e3e3e3}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #EEE}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#8c9eff}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-github-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-github-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #EEE}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#8c9eff}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #EEE;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(63,81,181,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(63,81,181,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;border-top:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#EEE;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:#f44336}.import-project-members-match{color:#BDBDBD}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #3f51b5;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(140,158,255,.3)}.import-project-members-match-true svg{fill:#3f51b5}.import-project-members-match-false{border:1px solid #f44336;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(244,67,54,.3)}.import-project-members-match-false svg{fill:#f44336}.import-project-members-choose{color:#3f51b5;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#8c9eff}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #EEE;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#757575;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(63,81,181,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #EEE}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#3f51b5;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#3f51b5;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#424242;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#424242;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-jira-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-jira-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #EEE}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#8c9eff}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(63,81,181,.6);stroke:rgba(63,81,181,.1)}.create-project-type-issues-subform-radiogr svg{fill:#EEE;stroke:#d5d5d5;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:#f44336;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff5252;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#3f51b5}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-trello-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-trello-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #EEE}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#8c9eff}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #EEE}.import-project-trello-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#424242}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#8c9eff}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#BDBDBD;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(140,158,255,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#BDBDBD;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#f6f6f6;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#fff;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.master,body{background:#fff}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#BDBDBD;margin-right:.5rem}.transfer-project-statistics svg{fill:#BDBDBD;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#3f51b5;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#8c9eff}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#BDBDBD}.transfer-project-comment-header .icon-close:hover{fill:#ff5252;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #EEE;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#3f51b5}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.profile-timeline .activity-item a:hover{color:#8c9eff}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-ms-flex-align:center;align-items:center;color:#BDBDBD;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#BDBDBD;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#BDBDBD}a,body{color:#424242}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#424242;margin-right:.5rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}.menu-secondary{background:#fcfdff}.menu-tertiary{background-color:#1a237e}.extrabar{background:#fcfdff}h1,h2,h3,h4,h5,h6{color:#212121}a:hover{color:#3f51b5}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#3f51b5;color:#424242}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a4a4a4}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#a4a4a4}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=url]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#a4a4a4}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a4a4a4}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #f44336}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);color:#fff}blockquote{border-left:5px solid #8c9eff}blockquote,blockquote p,cite{color:#757575}.summary{background:#424242;color:#fff}.navbar{background:rgba(233,30,99,.6)}.navbar::after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#0d113f;background-image:none}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #3f51b5}.taskboard-table-header .task-colum-name .icon{fill:#3f51b5}.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.kanban-table-header .task-colum-name{background:#fbfbfb;border-top:3px solid #3f51b5}.kanban-table-header .task-colum-name .icon{color:#3f51b5}.kanban-table-body .kanban-uses-box{background:#fbfbfb} \ No newline at end of file diff --git a/dist/v-1527758585938/styles/theme-taiga.css b/dist/v-1527758585938/styles/theme-taiga.css deleted file mode 100644 index 228bd23..0000000 --- a/dist/v-1527758585938/styles/theme-taiga.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8";.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;content:'';position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! - * Pikaday - * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.kanban .kanban-settings,.save-wiki{float:right}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.loader-active,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#5b8200}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal;color:#767676}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}hr{border:solid #050505;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#444}.pika-single .is-selected .pika-button{background:#5b8200;border-radius:0!important;box-shadow:inset 0 1px 3px #5b8200}.pika-single .is-today .pika-button{color:#5b8200}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#9dce0a!important;border-radius:0!important;box-shadow:inset 0 1px 3px #9dce0a!important}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#9dce0a;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#9dce0a;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#555;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#5b8200;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #555;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #e4e3e3}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#050505;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#9dce0a;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(216,248,121,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#879b89;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);position:absolute;width:100%}.admin-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#767676;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#767676}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(../images/bg.png) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;overflow-y:auto;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{margin-left:.5rem;padding-bottom:1rem}.auth .login-text a,.auth .register-text a{text-decoration:underline}.auth .login-text a:hover,.auth .register-text a:hover{color:#9dce0a}.auth .register-terms{margin:.5rem 0 .75rem}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(91,130,0,.9);stroke:#9dce0a;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(157,206,10,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;overflow:hidden;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#050505;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #555;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#9dce0a;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#767676;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#444;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff;font-size:.9rem;margin-left:.5rem;padding-bottom:1rem;text-align:left}.invitation-main .register-text a{color:#5b8200}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#5b8200}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#e4e3e3}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff}.error-main a{color:#9dce0a}.taskboard{overflow:hidden}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden}.team h2{margin:1rem 0}.team h2 span:last-child{color:#5b8200}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#444}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#767676}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#555}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #dad9d9;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#767676;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#767676}.menu-button,.trans-button:visited{color:#050505}.trans-button .icon,.trans-button span{color:#050505;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#e4e3e3;color:#555}.menu-button span,.menu-button:visited{color:#050505}.submit-button{width:100%}.button-green,a.button-green{background:#5b8200}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#9dce0a;color:#fff}.button-gray,a.button-gray{background:#555}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#9dce0a;color:#fff}.button-blackish{background:#050505;color:#e4e3e3}.button-blackish:hover{background:#050505;color:#fff}.button-red{background:#ff8282}.button-red:hover{background:red;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#5b8200;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.button-bulk:hover{background:#9dce0a}.button-auth{background:#444}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#5b8200;display:inline-block;margin-top:.5rem}.button-filter{background:#e4e3e3;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#767676;fill:#e4e3e3}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:red;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#dfdede;border:1px dashed #d0cece;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#d0cece;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#d0cece;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;margin:0}.check{background-color:#cbc9c9;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#555;height:25px;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#9dce0a;margin-left:50%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#767676}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#5b8200}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff8282;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.drag-drop-help{color:#555}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#9dce0a;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#767676;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#5b8200}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(118,118,118,.2);color:#767676;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(157,206,10,.9);color:#e4e3e3}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(135,155,137,.5);border-bottom:0;color:#e4e3e3}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#444}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{background:#050505;color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#050505;left:10px;position:absolute;top:-5px;width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#9dce0a;color:#fff}.ticket-estimation .popover.fix{background:#050505;color:#fff;display:none;left:-160px;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#9dce0a;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#050505;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#5b8200}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#767676;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #444;color:#444}.history-tabs .order-comments{color:#444}.level{background-color:#767676;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#767676}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #e4e3e3;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#767676}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#767676}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:red;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#767676}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#555;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#555;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#bbe831}.loading-bar .item-1{animation-delay:1s;background:#237400}.loading-bar .item-2{animation-delay:2s;background:#e43050}.loading-bar .item-3{animation-delay:3s;background:#810061}.loading-bar .item-4{animation-delay:4s;background:#618000}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#767676;margin-left:.25rem}.notification-message-success{background:rgba(157,206,10,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(255,0,0,.9);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(118,118,118,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(255,0,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#767676;color:#fff;padding:.5rem 1rem;transition:all .3s linear}.paginator a:hover{background:#050505;color:#fff;transition:all .3s linear}.paginator .active span{background:#9dce0a}.select-color,.select-color:after{background:#050505;position:absolute}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#767676;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#9dce0a;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#767676;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color .empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#e4e3e3;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.select-color input::-webkit-input-placeholder{color:#555}.select-color input::-moz-placeholder{color:#555}.select-color input:-moz-placeholder{color:#555}.select-color input:-ms-input-placeholder{color:#555}.select-color .selected-color{background:#767676;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#9dce0a}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#9dce0a;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#5b8200}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#434343;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#9dce0a;height:24px}.summary-progress-bar .defined-points{background:#ff8282;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#9dce0a;height:24px;position:absolute}.large-summary{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #050505;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #555;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#5b8200;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#9dce0a;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#9dce0a}.large-summary .icon.icon-stats.active:hover{color:#5b8200;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:rgba(135,155,137,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#879b89;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#879b89;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(157,206,10,.4)}.track-button.active .icon{fill:#5b8200}.track-button.active .track-button-counter{background:rgba(157,206,10,.6)}.track-button.is-hover .track-inner{background:#f33;color:#e4e3e3;transition:background .2s}.track-button.is-hover .icon{fill:#ff8282}.track-button.is-hover .track-button-counter{background:red;color:#e4e3e3;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#e4e3e3;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#d7d6d6;transition:background .3s}.track-icon{fill:#444;margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#d7d6d6;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#e4e3e3;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#d7d6d6;transition:background .3s}.watch-options{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-assigned-users,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(118,118,118,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox}.watch-options a.active{color:#9dce0a}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check svg{fill:#9dce0a}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#767676;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#879b89;transition:background .3s}.upvote-btn a:hover path{fill:#879b89}.upvote-btn a.active{background:rgba(157,206,10,.2);color:#5b8200;transition:all .3s}.upvote-btn a.active svg{fill:#5b8200}.upvote-btn a.is-hover{background:red;color:#e4e3e3}.upvote-btn a.is-hover svg{fill:#ff8282;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#767676;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-assigned-users .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-multiple,.ticket-watchers .user-list-single{-ms-flex-line-pack:center;padding:.25rem 0;vertical-align:middle;align-content:center}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-multiple{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex}.assigned-to-list .user-list-multiple.selected,.assigned-to-list .user-list-multiple:hover,.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(216,248,121,.3);cursor:pointer}.assigned-to-list .user-list-multiple:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#444;margin-left:.5rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#444;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:red}.assigned-to-list .user-list-multiple:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-multiple.is-active{background:rgba(216,248,121,.3);cursor:pointer;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-multiple .remove-assigned-to{display:block;fill:#444;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-multiple .remove-assigned-to:hover{fill:red}.ticket-watchers .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-multiple{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-assigned-users .user-list-multiple,.ticket-assigned-users .user-list-single{background:0 0;display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.ticket-watchers .user-list-multiple:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#444;margin-left:.5rem;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:red;transition:color .3s ease-in}.ticket-assigned-users .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:flex}.ticket-assigned-users .user-list-single:last-child{border:0}.ticket-assigned-users .user-list-multiple{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:flex}.ticket-assigned-users .user-list-multiple:last-child{border:0}.ticket-assigned-users .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-assigned-users .user-list-single{-ms-flex-positive:1;flex-grow:1}.ticket-assigned-users .user-list-single:hover .remove-user{opacity:1;transition:opacity .2s ease-in}.ticket-assigned-users .user-list-name{color:#444;margin-left:.5rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .remove-user{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-assigned-users .remove-user:hover{fill:red;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#767676;margin-bottom:2rem}.admin-common .admin-subtitle a{color:#5b8200}.admin-common .admin-subtitle a:hover{color:#9dce0a}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#e4e3e3;color:#444;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #e4e3e3}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#767676}.custom-fields-table .single-custom-field{border-bottom:1px solid #e4e3e3;color:#555}.custom-fields-table .icon-drag{fill:#767676;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#767676;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#5b8200;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff8282}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{max-height:1rem;max-width:1rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#5b8200;fill:#5b8200}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#767676}.admin-functionalities .module-name{font-size:1.2rem;color:#767676;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#767676;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#767676}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#5b8200}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff8282;display:inline-block;padding-left:.3rem}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#e4e3e3}.admin-membership-table .resend{background-color:#5b8200;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#767676;transition:fill .2s}.admin-membership-table .delete:hover{fill:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #cbc9c9}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#767676;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #e4e3e3;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #e4e3e3;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#767676;margin-left:.5rem}.project-details .get-feedback-inner .check,.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#767676;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(157,206,10,.4);color:#444}.project-privacy-settings label:hover svg{fill:#444}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#444;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#9dce0a;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#767676;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#767676}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#5b8200}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff8282;border-radius:6px;color:#ff8282;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#5b8200}.admin-project-profile-owner-actions a:hover{color:#9dce0a;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#767676}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .icon:hover{fill:#5b8200;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#767676;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#767676;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#e4e3e3;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #e4e3e3}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#767676;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#5b8200;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#767676}.admin-webhooks .webhook-options svg:hover{fill:#5b8200;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #e4e3e3;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#767676}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#767676}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{font-size:.9rem;color:#767676;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #e4e3e3;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#767676;opacity:0}.project-values-row .icon:hover{fill:#444;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #e4e3e3}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#e9ffb5;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff8282}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p{color:#444;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin:1rem 0;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#555;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#767676}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#767676}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#9dce0a;fill:#9dce0a}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#555;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;background:#050505;position:absolute}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #767676;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#767676}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #dad9d9;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#e9ffb5;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#767676;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#e4e3e3}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#e9ffb5;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#9dce0a}.backlog-table-body .icon-drag{cursor:move;fill:#767676;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#5b8200;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{fill:#e4e3e3;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon,.ticket-assigned-users .assign-to-me .icon,.ticket-assigned-users .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#767676}.sprints .sprint svg:hover{fill:#5b8200;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#767676;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#9dce0a;transition:color .2s}.sprints .sprint-progress-bar{background:#767676;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#5b8200;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#d7d6d6;border:2px dashed #909090;color:#555;padding:1rem;text-align:center}.sprints .sprint-table .row{border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(118,118,118,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#959595;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#838383}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#838383}.sprints .sprint-table .column-points.blocked{color:red}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#767676}.sprint-closed .sprint-progress-bar .current-progress{background:#5d5d5d}.sprint-closed .button-gray{background:#767676}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#5b8200}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#555;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.ticket-assigned-to,.ticket-assigned-users{-ms-flex-align:center;border-bottom:1px solid #767676;border-top:1px solid #767676}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.ticket-assigned-to .loading-spinner,.ticket-assigned-users .loading-spinner{transform-origin:32 32;max-height:2rem;max-width:2rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#767676}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#5b8200}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{margin:1rem auto}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#5b8200;cursor:default}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .remove-user:hover,.ticket-assigned-to .user-assigned.editable:hover,.ticket-assigned-users .assign-to-me.editable:hover,.ticket-assigned-users .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#555;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{fill:red;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#5b8200}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#5b8200}.ticket-assigned-users .assigned-title,.ticket-assigned-users .tg-add-assigned span{color:#555;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-assigned-users{align-items:center;margin-bottom:1rem;padding:.5rem 0;position:relative}.ticket-assigned-users .loading-spinner{margin:1rem auto}.ticket-assigned-users .assigned-title{display:block;margin:.2rem 0 .25rem}.ticket-assigned-users .tg-assigned-users{-ms-flex-align:center;align-items:center;position:relative}.ticket-assigned-users .tg-add-assigned{margin-top:.25rem}.ticket-assigned-users .tg-add-assigned .add-assigned{fill:#555;opacity:1;right:.5rem;top:2rem}.ticket-assigned-users .tg-add-assigned .add-assigned:hover{cursor:pointer;fill:red;transition:fill .2s}.ticket-assigned-users .tg-add-assigned span{margin:.2rem .5rem}.ticket-assigned-users .assigned-users-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .assigned-users-options a{margin-right:.2rem}.ticket-assigned-users .assign-to-me,.ticket-assigned-users .assign-to-me.editable,.ticket-assigned-users .user-assigned,.ticket-assigned-users .user-assigned.editable{color:#5b8200}.ticket-assigned-users .not-assigned-users{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .not-assigned-users .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-users .not-assigned-users .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-to-options a{margin-right:.2rem}.ticket-assigned-users .not-assigned-users .assign-to-me,.ticket-assigned-users .not-assigned-users .user-assigned{color:#5b8200;cursor:default}.colors-table .row.edition .current-color,.ticket-assigned-users .not-assigned-users .assign-to-me:hover,.ticket-assigned-users .not-assigned-users .user-assigned:hover{cursor:pointer}.ticket-assigned-users .not-assigned-users .assign-to-me .icon,.ticket-assigned-users .not-assigned-users .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-users .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-users .user-avatar img{width:100%}.ticket-assigned-users .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-users .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-users .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.category-config{border-bottom:1px solid #767676}.category-config:first-child{border-top:1px solid #767676}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#767676;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#767676;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#5b8200}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#e4e3e3;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #e4e3e3}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(216,248,121,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#e4e3e3;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#767676;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#9dce0a;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#5b8200;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#5b8200;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff8282}.colors-table .gu-mirror{background:#e9ffb5;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#767676}.duty-custom-fields .custom-field-options svg:hover{fill:#5b8200}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem;color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#767676;margin-top:.5rem}.external-reference a{border-left:1px solid #767676;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#5b8200}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#555;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff8282}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#e4e3e3}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #767676;color:#444;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #5b8200}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#5b8200;border:1px solid #5b8200;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#767676;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-sprint-add-edit .delete-sprint{font-size:.9rem;color:#555;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:red;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .subtitle{white-space:pre-line}.lightbox-generic-ask .options{display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#d7d6d6;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#d7d6d6;bottom:35px;color:#555;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#5b8200}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(216,248,121,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#555;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff8282}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#767676;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-set-due-date .delete-due-date .icon,.lightbox-set-due-date .delete-due-date:hover .icon{fill:currentColor}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}.lightbox-set-due-date{z-index:9999}.lightbox-set-due-date form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-set-due-date .date{margin:2rem 0 1rem}.lightbox-set-due-date .reason textarea{margin-top:.5rem}.lightbox-set-due-date .due-date-suggestions{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:1rem 0 .5rem}.lightbox-set-due-date .suggestion{background:rgba(184,184,184,.2);color:#B8B8B8;-ms-flex-pack:start;justify-content:flex-start;margin:0 .5rem .5rem;min-height:2rem;padding:.5rem .75rem;position:relative}.lightbox-set-due-date .suggestion:first-child{margin-left:0}.lightbox-set-due-date .suggestion:nth-child(4n+4){margin-right:0}.lightbox-set-due-date .suggestion.clickable.active,.lightbox-set-due-date .suggestion.clickable:hover{background:rgba(157,206,10,.9);color:#fff}.lightbox-set-due-date .delete-due-date{font-size:.9rem;color:#555;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-set-due-date .delete-due-date:hover{color:red;transition:color .3s linear}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#9dce0a;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .item{font-size:1.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#9dce0a}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .iocaine{background:rgba(157,206,10,.1);border-left:10px solid #9dce0a}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #e4e3e3;color:#e4e3e3}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#e4e3e3}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#e4e3e3;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#050505;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,130,130,.2);border-left:10px solid #ff8282}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#555}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#444}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#5b8200}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff8282}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{width:.8rem;height:.8rem;fill:#767676;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#050505;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#b2afaf;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#cbc9c9;transition:background .2s ease-in}.ticket-status .type-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;width:0}.ticket-status .severity-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;width:0}.ticket-status .priority-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#767676;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#9dce0a}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:red;color:#e4e3e3;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff8282}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#9dce0a}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff8282}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#767676;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#555}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff8282}.ticket-detail-settings .item-unblock:hover{background:red}.ticket-detail-settings .button-delete{background:#ff8282}.ticket-detail-settings .button-delete:hover{background:red}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(228,227,227,.2) 100%);background-color:#e4e3e3}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#5b8200;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#5b8200;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#5b8200}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#767676}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-ms-flex:1;flex:1;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f0ffcf;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #dad9d9}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#555;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#9dce0a;transition:all .2s linear}.issues-table .votes:hover svg{fill:#9dce0a;transition:all .2s linear}.issues-table .votes.inactive{color:#767676}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#767676;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#9dce0a;transition:all .2s linear}.issues-table .is-voted svg{fill:#9dce0a;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff8282}.issues-table .is-voted:hover svg{fill:#ff8282;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#555;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#767676;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#5b8200}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#767676;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #9dce0a,2px 2px 4px #cbc9c9}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#dfdede;border:1px dashed #d0cece;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #e4e3e3}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#d0cece}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#767676;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #e4e3e3;border-right:1px solid #e4e3e3;color:#444;position:relative;top:1px}.search-filter a.active .icon{fill:#9dce0a}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#767676}.search-in input::-moz-placeholder{color:#767676}.search-in input:-moz-placeholder{color:#767676}.search-in input:-ms-input-placeholder{color:#767676}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#767676}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#e9ffb5;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon{font-size:1rem;color:#767676}.search-result-table .user-story-name .icon:hover{color:#444;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #e4e3e3}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#050505;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#5b8200;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#555}.table-team .attribute .points{font-size:1.6rem;color:#444}.table-team .attribute .top{fill:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff8282}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:red}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #e4e3e3;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .avatar .position{color:#767676}.table-team .popover{font-size:.9rem;background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #767676}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#5b8200;transition:background .3s linear}.policy-table label{background:#767676;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile{max-width:780px}.user-profile form{display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:.5rem}.user-profile .delete-account,.user-profile .download-profile{font-size:.9rem;display:block;-ms-flex:1;flex:1;margin-top:.5rem}.user-profile .delete-account{text-align:right}.wiki-nav{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#9dce0a}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#767676;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #767676}.wiki-nav input[type=text]{background:#e4e3e3;color:#444;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#767676}.wiki-nav input[type=text]::-moz-placeholder{color:#767676}.wiki-nav input[type=text]:-moz-placeholder{color:#767676}.wiki-nav input[type=text]:-ms-input-placeholder{color:#767676}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#767676;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:red}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#555}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#767676;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff8282}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#767676}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff8282}.attachment-gallery .icon-delete:hover svg{color:red}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#767676}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span{color:#555}.attachment-list .attachment-size{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#767676;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#5b8200}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:red}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#767676}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#444}.attachment-list .percentage{background:rgba(91,130,0,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments{margin-bottom:4rem}.attachments .gu-transit{background:#e4e3e3;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#444;line-height:36px;padding:0 1rem}.attachments-header .options{display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#555;border:0;display:inline-block;padding:.5rem;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#9dce0a}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#9dce0a}.attachments-header button svg{fill:#767676;height:1.6rem;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.more-attachments span,.single-attachment .attachment-size{color:#767676}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #e4e3e3;color:#767676;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#555;height:.9rem;margin-right:.25rem;width:.9rem}.more-attachments{font-size:.9rem;border-bottom:1px solid #767676;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#5b8200;margin-left:.5rem}.more-attachments:hover{background:#e9ffb5;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#767676}.attachment-preview .attachment-preview-container svg:hover{fill:#9dce0a;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #e4e3e3;cursor:pointer}.assignable-member-single:hover{background:rgba(157,206,10,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(157,206,10,.05);border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff8282;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:red}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#444;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#8da08e}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(68,68,68,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(68,68,68,.3)}.range-slider:focus::-ms-fill-lower{background:#e4e3e3}.range-slider:focus::-ms-fill-upper{background:#e9e8e8}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#e4e3e3;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#e4e3e3;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#dfdede;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#e4e3e3;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #cbc9c9;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #cbc9c9}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff8282}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,130,130,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-info.multiple .card-owner-avatar img{margin-right:.45rem}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#767676}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#9dce0a}.card-owner-actions .card-actions{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:0 .5rem}.card-owner-actions .card-delete:hover{color:#ff8282}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem .5rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#767676;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-data .card-estimation.not-estimated{font-size:.8125rem}.card-statistics{font-size:.9rem;color:#b6b6b6;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#9dce0a}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .statistic.card-votes{margin-left:.2rem}.card-statistics .statistic.card-due-date{margin-left:.1rem}.card-statistics .icon{width:.75rem;height:.75rem;fill:#b6b6b6;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#810061}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#e4e3e3;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#9dce0a;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#050505;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#e4e3e3}.card-tasks{border-top:1px solid #e4e3e3;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #e4e3e3}.card-task a{color:#767676;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff8282}.card-task a.closed-task{color:#767676;text-decoration:line-through}.card-task a:hover{color:#5b8200}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(157,206,10,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #767676;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#050505;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:red;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#767676;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#555;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg,.detail-title-wrapper .due-date-icon svg{width:1.3rem;height:1.3rem}.detail-title-wrapper.readonly .due-date-icon{margin-left:2.7rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.due-date-icon,.issue-nav a{display:inline-block}.edit-title-wrapper .edit-title-button:hover{fill:#5b8200}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}.due-date-button,[disabled].due-date-button{background:#767676;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.due-date-button.closed,[disabled].due-date-button.closed{background:#B8B8B8}.due-date-button.due-set,[disabled].due-date-button.due-set{background:#9dce0a}.due-date-button.due-soon,[disabled].due-date-button.due-soon{background:#fcaf3e}.due-date-button.past-due,[disabled].due-date-button.past-due{background:#ff8282}.due-date-button:hover,[disabled].due-date-button:hover{background:#555}.due-date-button.editable,[disabled].due-date-button.editable{cursor:pointer}.due-date-icon{margin:0 .25rem;position:relative}.due-date-icon svg{fill:#767676;transition:fill .2s ease-in}.due-date-icon.closed svg{fill:#B8B8B8}.due-date-icon.due-set svg{fill:#9dce0a}.due-date-icon.due-soon svg{fill:#fcaf3e}.due-date-icon.past-due svg{fill:#ff8282}.backlog-table-body .user-story-name .due-date-icon,.related-tasks .task-name .due-date-icon{top:.1rem}.issues-table .subject .due-date-icon{top:.25rem}.card-statistics .due-date-icon{margin:.1rem 0 0}.card-statistics .due-date-icon svg{height:.9rem;width:.9rem}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(91,130,0,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#444;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#767676}tg-filter input::-moz-placeholder{color:#767676}tg-filter input:-moz-placeholder{color:#767676}tg-filter input:-ms-input-placeholder{color:#767676}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #767676;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#5b8200}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#444;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#cbc9c9;color:#444;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#d7d6d6;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#d0cece;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#444;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#b2afaf;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#555;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:red}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.add-tag-button .add-tag-text,.tag{font-size:.9rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#767676;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#444;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#5b8200}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #767676;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.tags-block,.terms-announcement{align-content:center;display:-ms-flexbox}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#f4fdda;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#767676;cursor:pointer}.add-tag-button:hover{color:#9dce0a}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#444;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.terms-announcement-inner .title,.terms-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff8282;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.terms-announcement{-ms-flex-line-pack:center;background:#107a8a;display:flex;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.terms-announcement .terms-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.terms-announcement.visible{min-height:146px;pointer-events:auto;transition-delay:0s;width:100%}.terms-announcement.visible .terms-announcement-inner{opacity:1;transition:opacity .5s .5s}.terms-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.terms-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;height:auto;margin-right:1rem}.terms-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.terms-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.terms-announcement-inner .warning,.terms-announcement-inner .warning a{color:#0b525c}.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.terms-announcement-inner .close{display:block;position:absolute;right:.5rem;top:1rem}.terms-announcement-inner .close svg{width:2rem;height:2rem;fill:#f5f5f5;pointer-events:none;transition:fill .2s}.terms-announcement-inner .close svg:hover{fill:#0b525c}.terms-announcement-inner a{color:#f5f5f5}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(68,68,68,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff8282;transition:all .2s}.tribe-linked.is-active svg:hover{fill:red}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#5b8200;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#5b8200;cursor:pointer}.wysiwyg a:hover{color:#9dce0a}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#e4e3e3;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #767676;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#767676 1px solid}.wysiwyg th{border-right:#767676 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#767676 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.wysiwyg hr{border:1px solid #e4e3e3}.medium-editor-mention-panel{background-color:#fff;border:1px solid #767676;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #767676;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#879b89;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:red}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#767676}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#767676;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#767676;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#767676;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #767676}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#9dce0a}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#9dce0a}.discover-header{background:url(../images/discover.png) bottom left repeat-x #e4e3e3;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#5b8200}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#9dce0a}.discover-header input[type=text]:-webkit-autofill{background:rgba(135,155,137,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#767676;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#5b8200}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#767676;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#5b8200}.filter-discover-search .discover-search-filter.active svg{fill:#5b8200}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff8282;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#767676;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#444;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #e4e3e3;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#5b8200}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#5b8200}.featured-project .project-card-name a:hover{color:#9dce0a}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#767676;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#767676;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#444;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #e4e3e3;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#767676;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#5b8200}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .project-description{font-size:.9rem;color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#767676;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#5b8200}.highlighted-project .statistic.active svg{fill:#5b8200}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#767676;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#e4e3e3;color:#555}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#767676;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#5b8200}.discover-results .statistic.active svg{fill:#5b8200}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#5b8200;border:1px solid #5b8200;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:red;border:1px solid red;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #767676;color:#767676;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#9dce0a;border:1px solid #5b8200;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff8282;border:1px solid red}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(157,206,10,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,130,130,.5)}.epic-row.is-closed .name a{color:#9c9c9c;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#e4e3e3;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#444;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#767676;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#9dce0a;width:10vw}.epic-row .vote{color:#555}.epic-row .vote.is-voter{color:#9dce0a;fill:#9dce0a}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#767676}.epic-row .epic-statuses{font-size:.9rem;background:rgba(5,5,5,.9);border-bottom:1px solid #444;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#9dce0a;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#5b8200;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #e4e3e3;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(157,206,10,.05)}.story-row.is-blocked{background:rgba(255,130,130,.5)}.story-row.is-closed .name{color:#767676;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#9dce0a;width:10vw}.story-row .vote{color:#555}.story-row .vote.is-voter{color:#9dce0a;fill:#9dce0a}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#9dce0a;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#9dce0a}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(228,227,227,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(157,206,10,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#9dce0a;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#444;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#9dce0a;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#9dce0a}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(157,206,10,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#e4e3e3;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #e4e3e3;color:#e4e3e3}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#e4e3e3}tg-related-userstory-row .closed .userstory-name a{color:#e4e3e3;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,130,130,.2);border-left:10px solid #ff8282}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#555}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff8282}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-ms-flexbox;display:flex}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #767676;height:55px}.activity,.comment .comment-wrapper,.comment .deleted-comment-wrapper,.entry .entry-wrapper{border-bottom:1px solid #e4e3e3}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#5b8200;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#767676}.comment .comment-edited{font-size:.9rem;background:#e4e3e3;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#5b8200;fill:#5b8200}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit{fill:#767676;margin-right:.5rem}.comment .comment-options .icon-edit:hover{fill:#555}.comment .comment-options .icon-close{fill:#767676;margin-right:.5rem}.comment .comment-options .icon-close:hover{fill:red}.comment .comment-options .icon-trash{fill:#ff8282}.comment .comment-options .icon-trash:hover{fill:red}.comment .deleted-comment-wrapper{padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#767676;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#5b8200;fill:#5b8200;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#5b8200;fill:#5b8200}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#5b8200;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#767676}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#5b8200;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e4e3e3;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#767676;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(203,246,72,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,130,130,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#5b8200;margin-right:.5rem}.activity .activity-date{color:#767676}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #e4e3e3;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,130,130,.2);color:red}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #e4e3e3;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#555}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#5b8200}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#5b8200}.home-project .project-card-name a:hover{color:#9dce0a}.home-project:hover{border:1px solid rgba(157,206,10,.2);box-shadow:0 0 5px #e4e3e3}.home-project.blocked-project{border:#e4e3e3}.home-project.blocked-project:hover{border:#e4e3e3;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#e4e3e3;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #e4e3e3;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#d7d6d6;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #e4e3e3;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff8282;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:red}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#444;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#9dce0a}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#767676;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#444;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#050505}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(157,206,10,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(135,155,137,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#9dce0a}.navbar a:hover svg{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#050505;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.navbar-dropdown ul:after{border-color:rgba(5,5,5,0);border-bottom-color:#050505;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(5,5,5,0);border-bottom-color:#050505;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff8282;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#767676;display:block;padding:.8rem .5rem}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#9dce0a}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#555}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #e4e3e3}.profile-filter{-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#555;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs{border-top:1px solid #e4e3e3}.profile-filter .searchbox input:focus{border-bottom:1px solid #767676;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#767676;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{fill:#e4e3e3;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#767676;font-size:.9rem;margin:0}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#767676;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar h2{font-size:1.6rem;color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#767676;margin-bottom:1rem}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#767676}.profile-bar .profile-stats{border-bottom:1px solid #e4e3e3;color:#555;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#767676;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#555;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#9dce0a}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #e4e3e3;border-right:1px solid #e4e3e3;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#5b8200}.profile-content-tabs .icon{fill:#767676;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#767676;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem;color:#767676}.profile-sidebar a{color:#5b8200}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#5b8200;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#767676;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-asana-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-asana-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#9dce0a}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #e4e3e3;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(91,130,0,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(91,130,0,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#767676;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.create-project-import-type input:disabled+label .icon{color:#9c9c9c}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.create-project-privacity input:disabled+label .icon{color:#9c9c9c}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #e4e3e3}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#9dce0a}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#767676;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-github-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-github-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#9dce0a}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #e4e3e3;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(91,130,0,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(91,130,0,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;border-top:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#e4e3e3;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:red}.import-project-members-match{color:#767676}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #5b8200;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(157,206,10,.3)}.import-project-members-match-true svg{fill:#5b8200}.import-project-members-match-false{border:1px solid red;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(255,0,0,.3)}.import-project-members-match-false svg{fill:red}.import-project-members-choose{color:#5b8200;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#9dce0a}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #e4e3e3;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#555;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(91,130,0,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #e4e3e3}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#5b8200;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#5b8200;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#444;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#444;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#767676;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-jira-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-jira-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#9dce0a}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(91,130,0,.6);stroke:rgba(91,130,0,.1)}.create-project-type-issues-subform-radiogr svg{fill:#e4e3e3;stroke:#cbc9c9;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:red;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff8282;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#5b8200}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#767676;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-trello-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-trello-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#9dce0a}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #e4e3e3}.import-project-trello-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#444}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#9dce0a}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#767676;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(157,206,10,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#767676;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#ecebeb;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#edffc4;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.master,body{background:#fff}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#767676;margin-right:.5rem}.transfer-project-statistics svg{fill:#767676;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#5b8200;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#9dce0a}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#767676}.transfer-project-comment-header .icon-close:hover{fill:#ff8282;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #e4e3e3;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#5b8200}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-ms-flex-align:center;align-items:center;color:#767676;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#767676;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#767676}a,body{color:#444}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#444;margin-right:.5rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}.menu-secondary{background:#f5f5f5}.menu-tertiary{background-color:#879b89}.extrabar{background:#f5f5f5}h1,h2,h3,h4,h5,h6{color:#050505}a:hover{color:#5b8200}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#767676;color:#444}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#909090}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#909090}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=url]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#909090}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#909090}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid red}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);color:#fff}blockquote{border-left:5px solid #f5f5f5}blockquote,blockquote p,cite{color:#555}.summary{background:#444;color:#fff}.navbar{background:rgba(0,0,0,.5)}.navbar::after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#879b89;background-image:url(../images/menu.png)}.kanban-table-body .kanban-uses-box,.kanban-table-header .task-colum-name,.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.main-nav svg{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #767676}.taskboard-table-header .task-colum-name .icon{fill:#767676}.kanban-table-header .task-colum-name{border-top:3px solid #767676}.kanban-table-header .task-colum-name .icon{color:#767676} \ No newline at end of file diff --git a/dist/v-1527758585938/emojis/0023-20e3.png b/dist/v-1528953702317/emojis/0023-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0023-20e3.png rename to dist/v-1528953702317/emojis/0023-20e3.png diff --git a/dist/v-1527758585938/emojis/002a-20e3.png b/dist/v-1528953702317/emojis/002a-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/002a-20e3.png rename to dist/v-1528953702317/emojis/002a-20e3.png diff --git a/dist/v-1527758585938/emojis/0030-20e3.png b/dist/v-1528953702317/emojis/0030-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0030-20e3.png rename to dist/v-1528953702317/emojis/0030-20e3.png diff --git a/dist/v-1527758585938/emojis/0031-20e3.png b/dist/v-1528953702317/emojis/0031-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0031-20e3.png rename to dist/v-1528953702317/emojis/0031-20e3.png diff --git a/dist/v-1527758585938/emojis/0032-20e3.png b/dist/v-1528953702317/emojis/0032-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0032-20e3.png rename to dist/v-1528953702317/emojis/0032-20e3.png diff --git a/dist/v-1527758585938/emojis/0033-20e3.png b/dist/v-1528953702317/emojis/0033-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0033-20e3.png rename to dist/v-1528953702317/emojis/0033-20e3.png diff --git a/dist/v-1527758585938/emojis/0034-20e3.png b/dist/v-1528953702317/emojis/0034-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0034-20e3.png rename to dist/v-1528953702317/emojis/0034-20e3.png diff --git a/dist/v-1527758585938/emojis/0035-20e3.png b/dist/v-1528953702317/emojis/0035-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0035-20e3.png rename to dist/v-1528953702317/emojis/0035-20e3.png diff --git a/dist/v-1527758585938/emojis/0036-20e3.png b/dist/v-1528953702317/emojis/0036-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0036-20e3.png rename to dist/v-1528953702317/emojis/0036-20e3.png diff --git a/dist/v-1527758585938/emojis/0037-20e3.png b/dist/v-1528953702317/emojis/0037-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0037-20e3.png rename to dist/v-1528953702317/emojis/0037-20e3.png diff --git a/dist/v-1527758585938/emojis/0038-20e3.png b/dist/v-1528953702317/emojis/0038-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0038-20e3.png rename to dist/v-1528953702317/emojis/0038-20e3.png diff --git a/dist/v-1527758585938/emojis/0039-20e3.png b/dist/v-1528953702317/emojis/0039-20e3.png similarity index 100% rename from dist/v-1527758585938/emojis/0039-20e3.png rename to dist/v-1528953702317/emojis/0039-20e3.png diff --git a/dist/v-1527758585938/emojis/1f004.png b/dist/v-1528953702317/emojis/1f004.png similarity index 100% rename from dist/v-1527758585938/emojis/1f004.png rename to dist/v-1528953702317/emojis/1f004.png diff --git a/dist/v-1527758585938/emojis/1f0cf.png b/dist/v-1528953702317/emojis/1f0cf.png similarity index 100% rename from dist/v-1527758585938/emojis/1f0cf.png rename to dist/v-1528953702317/emojis/1f0cf.png diff --git a/dist/v-1527758585938/emojis/1f170.png b/dist/v-1528953702317/emojis/1f170.png similarity index 100% rename from dist/v-1527758585938/emojis/1f170.png rename to dist/v-1528953702317/emojis/1f170.png diff --git a/dist/v-1527758585938/emojis/1f171.png b/dist/v-1528953702317/emojis/1f171.png similarity index 100% rename from dist/v-1527758585938/emojis/1f171.png rename to dist/v-1528953702317/emojis/1f171.png diff --git a/dist/v-1527758585938/emojis/1f17e.png b/dist/v-1528953702317/emojis/1f17e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f17e.png rename to dist/v-1528953702317/emojis/1f17e.png diff --git a/dist/v-1527758585938/emojis/1f17f.png b/dist/v-1528953702317/emojis/1f17f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f17f.png rename to dist/v-1528953702317/emojis/1f17f.png diff --git a/dist/v-1527758585938/emojis/1f18e.png b/dist/v-1528953702317/emojis/1f18e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f18e.png rename to dist/v-1528953702317/emojis/1f18e.png diff --git a/dist/v-1527758585938/emojis/1f191.png b/dist/v-1528953702317/emojis/1f191.png similarity index 100% rename from dist/v-1527758585938/emojis/1f191.png rename to dist/v-1528953702317/emojis/1f191.png diff --git a/dist/v-1527758585938/emojis/1f192.png b/dist/v-1528953702317/emojis/1f192.png similarity index 100% rename from dist/v-1527758585938/emojis/1f192.png rename to dist/v-1528953702317/emojis/1f192.png diff --git a/dist/v-1527758585938/emojis/1f193.png b/dist/v-1528953702317/emojis/1f193.png similarity index 100% rename from dist/v-1527758585938/emojis/1f193.png rename to dist/v-1528953702317/emojis/1f193.png diff --git a/dist/v-1527758585938/emojis/1f194.png b/dist/v-1528953702317/emojis/1f194.png similarity index 100% rename from dist/v-1527758585938/emojis/1f194.png rename to dist/v-1528953702317/emojis/1f194.png diff --git a/dist/v-1527758585938/emojis/1f195.png b/dist/v-1528953702317/emojis/1f195.png similarity index 100% rename from dist/v-1527758585938/emojis/1f195.png rename to dist/v-1528953702317/emojis/1f195.png diff --git a/dist/v-1527758585938/emojis/1f196.png b/dist/v-1528953702317/emojis/1f196.png similarity index 100% rename from dist/v-1527758585938/emojis/1f196.png rename to dist/v-1528953702317/emojis/1f196.png diff --git a/dist/v-1527758585938/emojis/1f197.png b/dist/v-1528953702317/emojis/1f197.png similarity index 100% rename from dist/v-1527758585938/emojis/1f197.png rename to dist/v-1528953702317/emojis/1f197.png diff --git a/dist/v-1527758585938/emojis/1f198.png b/dist/v-1528953702317/emojis/1f198.png similarity index 100% rename from dist/v-1527758585938/emojis/1f198.png rename to dist/v-1528953702317/emojis/1f198.png diff --git a/dist/v-1527758585938/emojis/1f199.png b/dist/v-1528953702317/emojis/1f199.png similarity index 100% rename from dist/v-1527758585938/emojis/1f199.png rename to dist/v-1528953702317/emojis/1f199.png diff --git a/dist/v-1527758585938/emojis/1f19a.png b/dist/v-1528953702317/emojis/1f19a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f19a.png rename to dist/v-1528953702317/emojis/1f19a.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1e8.png b/dist/v-1528953702317/emojis/1f1e6-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1e8.png rename to dist/v-1528953702317/emojis/1f1e6-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1e9.png b/dist/v-1528953702317/emojis/1f1e6-1f1e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1e9.png rename to dist/v-1528953702317/emojis/1f1e6-1f1e9.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1ea.png b/dist/v-1528953702317/emojis/1f1e6-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1ea.png rename to dist/v-1528953702317/emojis/1f1e6-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1eb.png b/dist/v-1528953702317/emojis/1f1e6-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1eb.png rename to dist/v-1528953702317/emojis/1f1e6-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1ec.png b/dist/v-1528953702317/emojis/1f1e6-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1ec.png rename to dist/v-1528953702317/emojis/1f1e6-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1ee.png b/dist/v-1528953702317/emojis/1f1e6-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1ee.png rename to dist/v-1528953702317/emojis/1f1e6-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1f1.png b/dist/v-1528953702317/emojis/1f1e6-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1f1.png rename to dist/v-1528953702317/emojis/1f1e6-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1f2.png b/dist/v-1528953702317/emojis/1f1e6-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1f2.png rename to dist/v-1528953702317/emojis/1f1e6-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1f4.png b/dist/v-1528953702317/emojis/1f1e6-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1f4.png rename to dist/v-1528953702317/emojis/1f1e6-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1f6.png b/dist/v-1528953702317/emojis/1f1e6-1f1f6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1f6.png rename to dist/v-1528953702317/emojis/1f1e6-1f1f6.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1f7.png b/dist/v-1528953702317/emojis/1f1e6-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1f7.png rename to dist/v-1528953702317/emojis/1f1e6-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1f8.png b/dist/v-1528953702317/emojis/1f1e6-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1f8.png rename to dist/v-1528953702317/emojis/1f1e6-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1f9.png b/dist/v-1528953702317/emojis/1f1e6-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1f9.png rename to dist/v-1528953702317/emojis/1f1e6-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1fa.png b/dist/v-1528953702317/emojis/1f1e6-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1fa.png rename to dist/v-1528953702317/emojis/1f1e6-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1fc.png b/dist/v-1528953702317/emojis/1f1e6-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1fc.png rename to dist/v-1528953702317/emojis/1f1e6-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1fd.png b/dist/v-1528953702317/emojis/1f1e6-1f1fd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1fd.png rename to dist/v-1528953702317/emojis/1f1e6-1f1fd.png diff --git a/dist/v-1527758585938/emojis/1f1e6-1f1ff.png b/dist/v-1528953702317/emojis/1f1e6-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e6-1f1ff.png rename to dist/v-1528953702317/emojis/1f1e6-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1e6.png b/dist/v-1528953702317/emojis/1f1e7-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1e6.png rename to dist/v-1528953702317/emojis/1f1e7-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1e7.png b/dist/v-1528953702317/emojis/1f1e7-1f1e7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1e7.png rename to dist/v-1528953702317/emojis/1f1e7-1f1e7.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1e9.png b/dist/v-1528953702317/emojis/1f1e7-1f1e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1e9.png rename to dist/v-1528953702317/emojis/1f1e7-1f1e9.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1ea.png b/dist/v-1528953702317/emojis/1f1e7-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1ea.png rename to dist/v-1528953702317/emojis/1f1e7-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1eb.png b/dist/v-1528953702317/emojis/1f1e7-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1eb.png rename to dist/v-1528953702317/emojis/1f1e7-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1ec.png b/dist/v-1528953702317/emojis/1f1e7-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1ec.png rename to dist/v-1528953702317/emojis/1f1e7-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1ed.png b/dist/v-1528953702317/emojis/1f1e7-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1ed.png rename to dist/v-1528953702317/emojis/1f1e7-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1ee.png b/dist/v-1528953702317/emojis/1f1e7-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1ee.png rename to dist/v-1528953702317/emojis/1f1e7-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1ef.png b/dist/v-1528953702317/emojis/1f1e7-1f1ef.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1ef.png rename to dist/v-1528953702317/emojis/1f1e7-1f1ef.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1f1.png b/dist/v-1528953702317/emojis/1f1e7-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1f1.png rename to dist/v-1528953702317/emojis/1f1e7-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1f2.png b/dist/v-1528953702317/emojis/1f1e7-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1f2.png rename to dist/v-1528953702317/emojis/1f1e7-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1f3.png b/dist/v-1528953702317/emojis/1f1e7-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1f3.png rename to dist/v-1528953702317/emojis/1f1e7-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1f4.png b/dist/v-1528953702317/emojis/1f1e7-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1f4.png rename to dist/v-1528953702317/emojis/1f1e7-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1f6.png b/dist/v-1528953702317/emojis/1f1e7-1f1f6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1f6.png rename to dist/v-1528953702317/emojis/1f1e7-1f1f6.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1f7.png b/dist/v-1528953702317/emojis/1f1e7-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1f7.png rename to dist/v-1528953702317/emojis/1f1e7-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1f8.png b/dist/v-1528953702317/emojis/1f1e7-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1f8.png rename to dist/v-1528953702317/emojis/1f1e7-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1f9.png b/dist/v-1528953702317/emojis/1f1e7-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1f9.png rename to dist/v-1528953702317/emojis/1f1e7-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1fb.png b/dist/v-1528953702317/emojis/1f1e7-1f1fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1fb.png rename to dist/v-1528953702317/emojis/1f1e7-1f1fb.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1fc.png b/dist/v-1528953702317/emojis/1f1e7-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1fc.png rename to dist/v-1528953702317/emojis/1f1e7-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1fe.png b/dist/v-1528953702317/emojis/1f1e7-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1fe.png rename to dist/v-1528953702317/emojis/1f1e7-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1e7-1f1ff.png b/dist/v-1528953702317/emojis/1f1e7-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e7-1f1ff.png rename to dist/v-1528953702317/emojis/1f1e7-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1e6.png b/dist/v-1528953702317/emojis/1f1e8-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1e6.png rename to dist/v-1528953702317/emojis/1f1e8-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1e8.png b/dist/v-1528953702317/emojis/1f1e8-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1e8.png rename to dist/v-1528953702317/emojis/1f1e8-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1e9.png b/dist/v-1528953702317/emojis/1f1e8-1f1e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1e9.png rename to dist/v-1528953702317/emojis/1f1e8-1f1e9.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1eb.png b/dist/v-1528953702317/emojis/1f1e8-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1eb.png rename to dist/v-1528953702317/emojis/1f1e8-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1ec.png b/dist/v-1528953702317/emojis/1f1e8-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1ec.png rename to dist/v-1528953702317/emojis/1f1e8-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1ed.png b/dist/v-1528953702317/emojis/1f1e8-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1ed.png rename to dist/v-1528953702317/emojis/1f1e8-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1ee.png b/dist/v-1528953702317/emojis/1f1e8-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1ee.png rename to dist/v-1528953702317/emojis/1f1e8-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1f0.png b/dist/v-1528953702317/emojis/1f1e8-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1f0.png rename to dist/v-1528953702317/emojis/1f1e8-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1f1.png b/dist/v-1528953702317/emojis/1f1e8-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1f1.png rename to dist/v-1528953702317/emojis/1f1e8-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1f2.png b/dist/v-1528953702317/emojis/1f1e8-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1f2.png rename to dist/v-1528953702317/emojis/1f1e8-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1f3.png b/dist/v-1528953702317/emojis/1f1e8-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1f3.png rename to dist/v-1528953702317/emojis/1f1e8-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1f4.png b/dist/v-1528953702317/emojis/1f1e8-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1f4.png rename to dist/v-1528953702317/emojis/1f1e8-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1f5.png b/dist/v-1528953702317/emojis/1f1e8-1f1f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1f5.png rename to dist/v-1528953702317/emojis/1f1e8-1f1f5.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1f7.png b/dist/v-1528953702317/emojis/1f1e8-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1f7.png rename to dist/v-1528953702317/emojis/1f1e8-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1fa.png b/dist/v-1528953702317/emojis/1f1e8-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1fa.png rename to dist/v-1528953702317/emojis/1f1e8-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1fb.png b/dist/v-1528953702317/emojis/1f1e8-1f1fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1fb.png rename to dist/v-1528953702317/emojis/1f1e8-1f1fb.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1fc.png b/dist/v-1528953702317/emojis/1f1e8-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1fc.png rename to dist/v-1528953702317/emojis/1f1e8-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1fd.png b/dist/v-1528953702317/emojis/1f1e8-1f1fd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1fd.png rename to dist/v-1528953702317/emojis/1f1e8-1f1fd.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1fe.png b/dist/v-1528953702317/emojis/1f1e8-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1fe.png rename to dist/v-1528953702317/emojis/1f1e8-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1e8-1f1ff.png b/dist/v-1528953702317/emojis/1f1e8-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e8-1f1ff.png rename to dist/v-1528953702317/emojis/1f1e8-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1e9-1f1ea.png b/dist/v-1528953702317/emojis/1f1e9-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e9-1f1ea.png rename to dist/v-1528953702317/emojis/1f1e9-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1e9-1f1ec.png b/dist/v-1528953702317/emojis/1f1e9-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e9-1f1ec.png rename to dist/v-1528953702317/emojis/1f1e9-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1e9-1f1ef.png b/dist/v-1528953702317/emojis/1f1e9-1f1ef.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e9-1f1ef.png rename to dist/v-1528953702317/emojis/1f1e9-1f1ef.png diff --git a/dist/v-1527758585938/emojis/1f1e9-1f1f0.png b/dist/v-1528953702317/emojis/1f1e9-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e9-1f1f0.png rename to dist/v-1528953702317/emojis/1f1e9-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1e9-1f1f2.png b/dist/v-1528953702317/emojis/1f1e9-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e9-1f1f2.png rename to dist/v-1528953702317/emojis/1f1e9-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1e9-1f1f4.png b/dist/v-1528953702317/emojis/1f1e9-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e9-1f1f4.png rename to dist/v-1528953702317/emojis/1f1e9-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1e9-1f1ff.png b/dist/v-1528953702317/emojis/1f1e9-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1e9-1f1ff.png rename to dist/v-1528953702317/emojis/1f1e9-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1e6.png b/dist/v-1528953702317/emojis/1f1ea-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1e6.png rename to dist/v-1528953702317/emojis/1f1ea-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1e8.png b/dist/v-1528953702317/emojis/1f1ea-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1e8.png rename to dist/v-1528953702317/emojis/1f1ea-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1ea.png b/dist/v-1528953702317/emojis/1f1ea-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1ea.png rename to dist/v-1528953702317/emojis/1f1ea-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1ec.png b/dist/v-1528953702317/emojis/1f1ea-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1ec.png rename to dist/v-1528953702317/emojis/1f1ea-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1ed.png b/dist/v-1528953702317/emojis/1f1ea-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1ed.png rename to dist/v-1528953702317/emojis/1f1ea-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1f7.png b/dist/v-1528953702317/emojis/1f1ea-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1f7.png rename to dist/v-1528953702317/emojis/1f1ea-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1f8.png b/dist/v-1528953702317/emojis/1f1ea-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1f8.png rename to dist/v-1528953702317/emojis/1f1ea-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1f9.png b/dist/v-1528953702317/emojis/1f1ea-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1f9.png rename to dist/v-1528953702317/emojis/1f1ea-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1ea-1f1fa.png b/dist/v-1528953702317/emojis/1f1ea-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ea-1f1fa.png rename to dist/v-1528953702317/emojis/1f1ea-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1eb-1f1ee.png b/dist/v-1528953702317/emojis/1f1eb-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1eb-1f1ee.png rename to dist/v-1528953702317/emojis/1f1eb-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1eb-1f1ef.png b/dist/v-1528953702317/emojis/1f1eb-1f1ef.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1eb-1f1ef.png rename to dist/v-1528953702317/emojis/1f1eb-1f1ef.png diff --git a/dist/v-1527758585938/emojis/1f1eb-1f1f0.png b/dist/v-1528953702317/emojis/1f1eb-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1eb-1f1f0.png rename to dist/v-1528953702317/emojis/1f1eb-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1eb-1f1f2.png b/dist/v-1528953702317/emojis/1f1eb-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1eb-1f1f2.png rename to dist/v-1528953702317/emojis/1f1eb-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1eb-1f1f4.png b/dist/v-1528953702317/emojis/1f1eb-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1eb-1f1f4.png rename to dist/v-1528953702317/emojis/1f1eb-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1eb-1f1f7.png b/dist/v-1528953702317/emojis/1f1eb-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1eb-1f1f7.png rename to dist/v-1528953702317/emojis/1f1eb-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1e6.png b/dist/v-1528953702317/emojis/1f1ec-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1e6.png rename to dist/v-1528953702317/emojis/1f1ec-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1e7.png b/dist/v-1528953702317/emojis/1f1ec-1f1e7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1e7.png rename to dist/v-1528953702317/emojis/1f1ec-1f1e7.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1e9.png b/dist/v-1528953702317/emojis/1f1ec-1f1e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1e9.png rename to dist/v-1528953702317/emojis/1f1ec-1f1e9.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1ea.png b/dist/v-1528953702317/emojis/1f1ec-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1ea.png rename to dist/v-1528953702317/emojis/1f1ec-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1eb.png b/dist/v-1528953702317/emojis/1f1ec-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1eb.png rename to dist/v-1528953702317/emojis/1f1ec-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1ec.png b/dist/v-1528953702317/emojis/1f1ec-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1ec.png rename to dist/v-1528953702317/emojis/1f1ec-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1ed.png b/dist/v-1528953702317/emojis/1f1ec-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1ed.png rename to dist/v-1528953702317/emojis/1f1ec-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1ee.png b/dist/v-1528953702317/emojis/1f1ec-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1ee.png rename to dist/v-1528953702317/emojis/1f1ec-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1f1.png b/dist/v-1528953702317/emojis/1f1ec-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1f1.png rename to dist/v-1528953702317/emojis/1f1ec-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1f2.png b/dist/v-1528953702317/emojis/1f1ec-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1f2.png rename to dist/v-1528953702317/emojis/1f1ec-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1f3.png b/dist/v-1528953702317/emojis/1f1ec-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1f3.png rename to dist/v-1528953702317/emojis/1f1ec-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1f5.png b/dist/v-1528953702317/emojis/1f1ec-1f1f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1f5.png rename to dist/v-1528953702317/emojis/1f1ec-1f1f5.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1f6.png b/dist/v-1528953702317/emojis/1f1ec-1f1f6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1f6.png rename to dist/v-1528953702317/emojis/1f1ec-1f1f6.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1f7.png b/dist/v-1528953702317/emojis/1f1ec-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1f7.png rename to dist/v-1528953702317/emojis/1f1ec-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1f8.png b/dist/v-1528953702317/emojis/1f1ec-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1f8.png rename to dist/v-1528953702317/emojis/1f1ec-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1f9.png b/dist/v-1528953702317/emojis/1f1ec-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1f9.png rename to dist/v-1528953702317/emojis/1f1ec-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1fa.png b/dist/v-1528953702317/emojis/1f1ec-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1fa.png rename to dist/v-1528953702317/emojis/1f1ec-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1fc.png b/dist/v-1528953702317/emojis/1f1ec-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1fc.png rename to dist/v-1528953702317/emojis/1f1ec-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1ec-1f1fe.png b/dist/v-1528953702317/emojis/1f1ec-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ec-1f1fe.png rename to dist/v-1528953702317/emojis/1f1ec-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1ed-1f1f0.png b/dist/v-1528953702317/emojis/1f1ed-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ed-1f1f0.png rename to dist/v-1528953702317/emojis/1f1ed-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1ed-1f1f2.png b/dist/v-1528953702317/emojis/1f1ed-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ed-1f1f2.png rename to dist/v-1528953702317/emojis/1f1ed-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1ed-1f1f3.png b/dist/v-1528953702317/emojis/1f1ed-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ed-1f1f3.png rename to dist/v-1528953702317/emojis/1f1ed-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1ed-1f1f7.png b/dist/v-1528953702317/emojis/1f1ed-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ed-1f1f7.png rename to dist/v-1528953702317/emojis/1f1ed-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1ed-1f1f9.png b/dist/v-1528953702317/emojis/1f1ed-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ed-1f1f9.png rename to dist/v-1528953702317/emojis/1f1ed-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1ed-1f1fa.png b/dist/v-1528953702317/emojis/1f1ed-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ed-1f1fa.png rename to dist/v-1528953702317/emojis/1f1ed-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1e8.png b/dist/v-1528953702317/emojis/1f1ee-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1e8.png rename to dist/v-1528953702317/emojis/1f1ee-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1e9.png b/dist/v-1528953702317/emojis/1f1ee-1f1e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1e9.png rename to dist/v-1528953702317/emojis/1f1ee-1f1e9.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1ea.png b/dist/v-1528953702317/emojis/1f1ee-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1ea.png rename to dist/v-1528953702317/emojis/1f1ee-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1f1.png b/dist/v-1528953702317/emojis/1f1ee-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1f1.png rename to dist/v-1528953702317/emojis/1f1ee-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1f2.png b/dist/v-1528953702317/emojis/1f1ee-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1f2.png rename to dist/v-1528953702317/emojis/1f1ee-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1f3.png b/dist/v-1528953702317/emojis/1f1ee-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1f3.png rename to dist/v-1528953702317/emojis/1f1ee-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1f4.png b/dist/v-1528953702317/emojis/1f1ee-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1f4.png rename to dist/v-1528953702317/emojis/1f1ee-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1f6.png b/dist/v-1528953702317/emojis/1f1ee-1f1f6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1f6.png rename to dist/v-1528953702317/emojis/1f1ee-1f1f6.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1f7.png b/dist/v-1528953702317/emojis/1f1ee-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1f7.png rename to dist/v-1528953702317/emojis/1f1ee-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1f8.png b/dist/v-1528953702317/emojis/1f1ee-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1f8.png rename to dist/v-1528953702317/emojis/1f1ee-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1ee-1f1f9.png b/dist/v-1528953702317/emojis/1f1ee-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ee-1f1f9.png rename to dist/v-1528953702317/emojis/1f1ee-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1ef-1f1ea.png b/dist/v-1528953702317/emojis/1f1ef-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ef-1f1ea.png rename to dist/v-1528953702317/emojis/1f1ef-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1ef-1f1f2.png b/dist/v-1528953702317/emojis/1f1ef-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ef-1f1f2.png rename to dist/v-1528953702317/emojis/1f1ef-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1ef-1f1f4.png b/dist/v-1528953702317/emojis/1f1ef-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ef-1f1f4.png rename to dist/v-1528953702317/emojis/1f1ef-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1ef-1f1f5.png b/dist/v-1528953702317/emojis/1f1ef-1f1f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ef-1f1f5.png rename to dist/v-1528953702317/emojis/1f1ef-1f1f5.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1ea.png b/dist/v-1528953702317/emojis/1f1f0-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1ea.png rename to dist/v-1528953702317/emojis/1f1f0-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1ec.png b/dist/v-1528953702317/emojis/1f1f0-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1ec.png rename to dist/v-1528953702317/emojis/1f1f0-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1ed.png b/dist/v-1528953702317/emojis/1f1f0-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1ed.png rename to dist/v-1528953702317/emojis/1f1f0-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1ee.png b/dist/v-1528953702317/emojis/1f1f0-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1ee.png rename to dist/v-1528953702317/emojis/1f1f0-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1f2.png b/dist/v-1528953702317/emojis/1f1f0-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1f2.png rename to dist/v-1528953702317/emojis/1f1f0-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1f3.png b/dist/v-1528953702317/emojis/1f1f0-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1f3.png rename to dist/v-1528953702317/emojis/1f1f0-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1f5.png b/dist/v-1528953702317/emojis/1f1f0-1f1f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1f5.png rename to dist/v-1528953702317/emojis/1f1f0-1f1f5.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1f7.png b/dist/v-1528953702317/emojis/1f1f0-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1f7.png rename to dist/v-1528953702317/emojis/1f1f0-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1fc.png b/dist/v-1528953702317/emojis/1f1f0-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1fc.png rename to dist/v-1528953702317/emojis/1f1f0-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1fe.png b/dist/v-1528953702317/emojis/1f1f0-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1fe.png rename to dist/v-1528953702317/emojis/1f1f0-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1f0-1f1ff.png b/dist/v-1528953702317/emojis/1f1f0-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f0-1f1ff.png rename to dist/v-1528953702317/emojis/1f1f0-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1e6.png b/dist/v-1528953702317/emojis/1f1f1-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1e6.png rename to dist/v-1528953702317/emojis/1f1f1-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1e7.png b/dist/v-1528953702317/emojis/1f1f1-1f1e7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1e7.png rename to dist/v-1528953702317/emojis/1f1f1-1f1e7.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1e8.png b/dist/v-1528953702317/emojis/1f1f1-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1e8.png rename to dist/v-1528953702317/emojis/1f1f1-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1ee.png b/dist/v-1528953702317/emojis/1f1f1-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1ee.png rename to dist/v-1528953702317/emojis/1f1f1-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1f0.png b/dist/v-1528953702317/emojis/1f1f1-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1f0.png rename to dist/v-1528953702317/emojis/1f1f1-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1f7.png b/dist/v-1528953702317/emojis/1f1f1-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1f7.png rename to dist/v-1528953702317/emojis/1f1f1-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1f8.png b/dist/v-1528953702317/emojis/1f1f1-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1f8.png rename to dist/v-1528953702317/emojis/1f1f1-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1f9.png b/dist/v-1528953702317/emojis/1f1f1-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1f9.png rename to dist/v-1528953702317/emojis/1f1f1-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1fa.png b/dist/v-1528953702317/emojis/1f1f1-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1fa.png rename to dist/v-1528953702317/emojis/1f1f1-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1fb.png b/dist/v-1528953702317/emojis/1f1f1-1f1fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1fb.png rename to dist/v-1528953702317/emojis/1f1f1-1f1fb.png diff --git a/dist/v-1527758585938/emojis/1f1f1-1f1fe.png b/dist/v-1528953702317/emojis/1f1f1-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f1-1f1fe.png rename to dist/v-1528953702317/emojis/1f1f1-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1e6.png b/dist/v-1528953702317/emojis/1f1f2-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1e6.png rename to dist/v-1528953702317/emojis/1f1f2-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1e8.png b/dist/v-1528953702317/emojis/1f1f2-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1e8.png rename to dist/v-1528953702317/emojis/1f1f2-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1e9.png b/dist/v-1528953702317/emojis/1f1f2-1f1e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1e9.png rename to dist/v-1528953702317/emojis/1f1f2-1f1e9.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1ea.png b/dist/v-1528953702317/emojis/1f1f2-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1ea.png rename to dist/v-1528953702317/emojis/1f1f2-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1eb.png b/dist/v-1528953702317/emojis/1f1f2-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1eb.png rename to dist/v-1528953702317/emojis/1f1f2-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1ec.png b/dist/v-1528953702317/emojis/1f1f2-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1ec.png rename to dist/v-1528953702317/emojis/1f1f2-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1ed.png b/dist/v-1528953702317/emojis/1f1f2-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1ed.png rename to dist/v-1528953702317/emojis/1f1f2-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f0.png b/dist/v-1528953702317/emojis/1f1f2-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f0.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f1.png b/dist/v-1528953702317/emojis/1f1f2-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f1.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f2.png b/dist/v-1528953702317/emojis/1f1f2-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f2.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f3.png b/dist/v-1528953702317/emojis/1f1f2-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f3.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f4.png b/dist/v-1528953702317/emojis/1f1f2-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f4.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f5.png b/dist/v-1528953702317/emojis/1f1f2-1f1f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f5.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f5.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f6.png b/dist/v-1528953702317/emojis/1f1f2-1f1f6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f6.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f6.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f7.png b/dist/v-1528953702317/emojis/1f1f2-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f7.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f8.png b/dist/v-1528953702317/emojis/1f1f2-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f8.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1f9.png b/dist/v-1528953702317/emojis/1f1f2-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1f9.png rename to dist/v-1528953702317/emojis/1f1f2-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1fa.png b/dist/v-1528953702317/emojis/1f1f2-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1fa.png rename to dist/v-1528953702317/emojis/1f1f2-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1fb.png b/dist/v-1528953702317/emojis/1f1f2-1f1fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1fb.png rename to dist/v-1528953702317/emojis/1f1f2-1f1fb.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1fc.png b/dist/v-1528953702317/emojis/1f1f2-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1fc.png rename to dist/v-1528953702317/emojis/1f1f2-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1fd.png b/dist/v-1528953702317/emojis/1f1f2-1f1fd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1fd.png rename to dist/v-1528953702317/emojis/1f1f2-1f1fd.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1fe.png b/dist/v-1528953702317/emojis/1f1f2-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1fe.png rename to dist/v-1528953702317/emojis/1f1f2-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1f2-1f1ff.png b/dist/v-1528953702317/emojis/1f1f2-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f2-1f1ff.png rename to dist/v-1528953702317/emojis/1f1f2-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1e6.png b/dist/v-1528953702317/emojis/1f1f3-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1e6.png rename to dist/v-1528953702317/emojis/1f1f3-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1e8.png b/dist/v-1528953702317/emojis/1f1f3-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1e8.png rename to dist/v-1528953702317/emojis/1f1f3-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1ea.png b/dist/v-1528953702317/emojis/1f1f3-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1ea.png rename to dist/v-1528953702317/emojis/1f1f3-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1eb.png b/dist/v-1528953702317/emojis/1f1f3-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1eb.png rename to dist/v-1528953702317/emojis/1f1f3-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1ec.png b/dist/v-1528953702317/emojis/1f1f3-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1ec.png rename to dist/v-1528953702317/emojis/1f1f3-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1ee.png b/dist/v-1528953702317/emojis/1f1f3-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1ee.png rename to dist/v-1528953702317/emojis/1f1f3-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1f1.png b/dist/v-1528953702317/emojis/1f1f3-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1f1.png rename to dist/v-1528953702317/emojis/1f1f3-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1f4.png b/dist/v-1528953702317/emojis/1f1f3-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1f4.png rename to dist/v-1528953702317/emojis/1f1f3-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1f5.png b/dist/v-1528953702317/emojis/1f1f3-1f1f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1f5.png rename to dist/v-1528953702317/emojis/1f1f3-1f1f5.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1f7.png b/dist/v-1528953702317/emojis/1f1f3-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1f7.png rename to dist/v-1528953702317/emojis/1f1f3-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1fa.png b/dist/v-1528953702317/emojis/1f1f3-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1fa.png rename to dist/v-1528953702317/emojis/1f1f3-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1f3-1f1ff.png b/dist/v-1528953702317/emojis/1f1f3-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f3-1f1ff.png rename to dist/v-1528953702317/emojis/1f1f3-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1f4-1f1f2.png b/dist/v-1528953702317/emojis/1f1f4-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f4-1f1f2.png rename to dist/v-1528953702317/emojis/1f1f4-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1e6.png b/dist/v-1528953702317/emojis/1f1f5-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1e6.png rename to dist/v-1528953702317/emojis/1f1f5-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1ea.png b/dist/v-1528953702317/emojis/1f1f5-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1ea.png rename to dist/v-1528953702317/emojis/1f1f5-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1eb.png b/dist/v-1528953702317/emojis/1f1f5-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1eb.png rename to dist/v-1528953702317/emojis/1f1f5-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1ec.png b/dist/v-1528953702317/emojis/1f1f5-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1ec.png rename to dist/v-1528953702317/emojis/1f1f5-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1ed.png b/dist/v-1528953702317/emojis/1f1f5-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1ed.png rename to dist/v-1528953702317/emojis/1f1f5-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1f0.png b/dist/v-1528953702317/emojis/1f1f5-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1f0.png rename to dist/v-1528953702317/emojis/1f1f5-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1f1.png b/dist/v-1528953702317/emojis/1f1f5-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1f1.png rename to dist/v-1528953702317/emojis/1f1f5-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1f2.png b/dist/v-1528953702317/emojis/1f1f5-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1f2.png rename to dist/v-1528953702317/emojis/1f1f5-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1f3.png b/dist/v-1528953702317/emojis/1f1f5-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1f3.png rename to dist/v-1528953702317/emojis/1f1f5-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1f7.png b/dist/v-1528953702317/emojis/1f1f5-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1f7.png rename to dist/v-1528953702317/emojis/1f1f5-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1f8.png b/dist/v-1528953702317/emojis/1f1f5-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1f8.png rename to dist/v-1528953702317/emojis/1f1f5-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1f9.png b/dist/v-1528953702317/emojis/1f1f5-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1f9.png rename to dist/v-1528953702317/emojis/1f1f5-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1fc.png b/dist/v-1528953702317/emojis/1f1f5-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1fc.png rename to dist/v-1528953702317/emojis/1f1f5-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1f5-1f1fe.png b/dist/v-1528953702317/emojis/1f1f5-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f5-1f1fe.png rename to dist/v-1528953702317/emojis/1f1f5-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1f6-1f1e6.png b/dist/v-1528953702317/emojis/1f1f6-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f6-1f1e6.png rename to dist/v-1528953702317/emojis/1f1f6-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1f7-1f1ea.png b/dist/v-1528953702317/emojis/1f1f7-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f7-1f1ea.png rename to dist/v-1528953702317/emojis/1f1f7-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1f7-1f1f4.png b/dist/v-1528953702317/emojis/1f1f7-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f7-1f1f4.png rename to dist/v-1528953702317/emojis/1f1f7-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1f7-1f1f8.png b/dist/v-1528953702317/emojis/1f1f7-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f7-1f1f8.png rename to dist/v-1528953702317/emojis/1f1f7-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1f7-1f1fa.png b/dist/v-1528953702317/emojis/1f1f7-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f7-1f1fa.png rename to dist/v-1528953702317/emojis/1f1f7-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1f7-1f1fc.png b/dist/v-1528953702317/emojis/1f1f7-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f7-1f1fc.png rename to dist/v-1528953702317/emojis/1f1f7-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1e6.png b/dist/v-1528953702317/emojis/1f1f8-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1e6.png rename to dist/v-1528953702317/emojis/1f1f8-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1e7.png b/dist/v-1528953702317/emojis/1f1f8-1f1e7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1e7.png rename to dist/v-1528953702317/emojis/1f1f8-1f1e7.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1e8.png b/dist/v-1528953702317/emojis/1f1f8-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1e8.png rename to dist/v-1528953702317/emojis/1f1f8-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1e9.png b/dist/v-1528953702317/emojis/1f1f8-1f1e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1e9.png rename to dist/v-1528953702317/emojis/1f1f8-1f1e9.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1ea.png b/dist/v-1528953702317/emojis/1f1f8-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1ea.png rename to dist/v-1528953702317/emojis/1f1f8-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1ec.png b/dist/v-1528953702317/emojis/1f1f8-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1ec.png rename to dist/v-1528953702317/emojis/1f1f8-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1ed.png b/dist/v-1528953702317/emojis/1f1f8-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1ed.png rename to dist/v-1528953702317/emojis/1f1f8-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1ee.png b/dist/v-1528953702317/emojis/1f1f8-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1ee.png rename to dist/v-1528953702317/emojis/1f1f8-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1ef.png b/dist/v-1528953702317/emojis/1f1f8-1f1ef.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1ef.png rename to dist/v-1528953702317/emojis/1f1f8-1f1ef.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1f0.png b/dist/v-1528953702317/emojis/1f1f8-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1f0.png rename to dist/v-1528953702317/emojis/1f1f8-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1f1.png b/dist/v-1528953702317/emojis/1f1f8-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1f1.png rename to dist/v-1528953702317/emojis/1f1f8-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1f2.png b/dist/v-1528953702317/emojis/1f1f8-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1f2.png rename to dist/v-1528953702317/emojis/1f1f8-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1f3.png b/dist/v-1528953702317/emojis/1f1f8-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1f3.png rename to dist/v-1528953702317/emojis/1f1f8-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1f4.png b/dist/v-1528953702317/emojis/1f1f8-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1f4.png rename to dist/v-1528953702317/emojis/1f1f8-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1f7.png b/dist/v-1528953702317/emojis/1f1f8-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1f7.png rename to dist/v-1528953702317/emojis/1f1f8-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1f8.png b/dist/v-1528953702317/emojis/1f1f8-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1f8.png rename to dist/v-1528953702317/emojis/1f1f8-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1f9.png b/dist/v-1528953702317/emojis/1f1f8-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1f9.png rename to dist/v-1528953702317/emojis/1f1f8-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1fb.png b/dist/v-1528953702317/emojis/1f1f8-1f1fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1fb.png rename to dist/v-1528953702317/emojis/1f1f8-1f1fb.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1fd.png b/dist/v-1528953702317/emojis/1f1f8-1f1fd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1fd.png rename to dist/v-1528953702317/emojis/1f1f8-1f1fd.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1fe.png b/dist/v-1528953702317/emojis/1f1f8-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1fe.png rename to dist/v-1528953702317/emojis/1f1f8-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1f8-1f1ff.png b/dist/v-1528953702317/emojis/1f1f8-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f8-1f1ff.png rename to dist/v-1528953702317/emojis/1f1f8-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1e6.png b/dist/v-1528953702317/emojis/1f1f9-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1e6.png rename to dist/v-1528953702317/emojis/1f1f9-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1e8.png b/dist/v-1528953702317/emojis/1f1f9-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1e8.png rename to dist/v-1528953702317/emojis/1f1f9-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1e9.png b/dist/v-1528953702317/emojis/1f1f9-1f1e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1e9.png rename to dist/v-1528953702317/emojis/1f1f9-1f1e9.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1eb.png b/dist/v-1528953702317/emojis/1f1f9-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1eb.png rename to dist/v-1528953702317/emojis/1f1f9-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1ec.png b/dist/v-1528953702317/emojis/1f1f9-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1ec.png rename to dist/v-1528953702317/emojis/1f1f9-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1ed.png b/dist/v-1528953702317/emojis/1f1f9-1f1ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1ed.png rename to dist/v-1528953702317/emojis/1f1f9-1f1ed.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1ef.png b/dist/v-1528953702317/emojis/1f1f9-1f1ef.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1ef.png rename to dist/v-1528953702317/emojis/1f1f9-1f1ef.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1f0.png b/dist/v-1528953702317/emojis/1f1f9-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1f0.png rename to dist/v-1528953702317/emojis/1f1f9-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1f1.png b/dist/v-1528953702317/emojis/1f1f9-1f1f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1f1.png rename to dist/v-1528953702317/emojis/1f1f9-1f1f1.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1f2.png b/dist/v-1528953702317/emojis/1f1f9-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1f2.png rename to dist/v-1528953702317/emojis/1f1f9-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1f3.png b/dist/v-1528953702317/emojis/1f1f9-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1f3.png rename to dist/v-1528953702317/emojis/1f1f9-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1f4.png b/dist/v-1528953702317/emojis/1f1f9-1f1f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1f4.png rename to dist/v-1528953702317/emojis/1f1f9-1f1f4.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1f7.png b/dist/v-1528953702317/emojis/1f1f9-1f1f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1f7.png rename to dist/v-1528953702317/emojis/1f1f9-1f1f7.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1f9.png b/dist/v-1528953702317/emojis/1f1f9-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1f9.png rename to dist/v-1528953702317/emojis/1f1f9-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1fb.png b/dist/v-1528953702317/emojis/1f1f9-1f1fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1fb.png rename to dist/v-1528953702317/emojis/1f1f9-1f1fb.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1fc.png b/dist/v-1528953702317/emojis/1f1f9-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1fc.png rename to dist/v-1528953702317/emojis/1f1f9-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f1f9-1f1ff.png b/dist/v-1528953702317/emojis/1f1f9-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1f9-1f1ff.png rename to dist/v-1528953702317/emojis/1f1f9-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1fa-1f1e6.png b/dist/v-1528953702317/emojis/1f1fa-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fa-1f1e6.png rename to dist/v-1528953702317/emojis/1f1fa-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1fa-1f1ec.png b/dist/v-1528953702317/emojis/1f1fa-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fa-1f1ec.png rename to dist/v-1528953702317/emojis/1f1fa-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1fa-1f1f2.png b/dist/v-1528953702317/emojis/1f1fa-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fa-1f1f2.png rename to dist/v-1528953702317/emojis/1f1fa-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1fa-1f1f3.png b/dist/v-1528953702317/emojis/1f1fa-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fa-1f1f3.png rename to dist/v-1528953702317/emojis/1f1fa-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1fa-1f1f8.png b/dist/v-1528953702317/emojis/1f1fa-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fa-1f1f8.png rename to dist/v-1528953702317/emojis/1f1fa-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1fa-1f1fe.png b/dist/v-1528953702317/emojis/1f1fa-1f1fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fa-1f1fe.png rename to dist/v-1528953702317/emojis/1f1fa-1f1fe.png diff --git a/dist/v-1527758585938/emojis/1f1fa-1f1ff.png b/dist/v-1528953702317/emojis/1f1fa-1f1ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fa-1f1ff.png rename to dist/v-1528953702317/emojis/1f1fa-1f1ff.png diff --git a/dist/v-1527758585938/emojis/1f1fb-1f1e6.png b/dist/v-1528953702317/emojis/1f1fb-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fb-1f1e6.png rename to dist/v-1528953702317/emojis/1f1fb-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1fb-1f1e8.png b/dist/v-1528953702317/emojis/1f1fb-1f1e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fb-1f1e8.png rename to dist/v-1528953702317/emojis/1f1fb-1f1e8.png diff --git a/dist/v-1527758585938/emojis/1f1fb-1f1ea.png b/dist/v-1528953702317/emojis/1f1fb-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fb-1f1ea.png rename to dist/v-1528953702317/emojis/1f1fb-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1fb-1f1ec.png b/dist/v-1528953702317/emojis/1f1fb-1f1ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fb-1f1ec.png rename to dist/v-1528953702317/emojis/1f1fb-1f1ec.png diff --git a/dist/v-1527758585938/emojis/1f1fb-1f1ee.png b/dist/v-1528953702317/emojis/1f1fb-1f1ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fb-1f1ee.png rename to dist/v-1528953702317/emojis/1f1fb-1f1ee.png diff --git a/dist/v-1527758585938/emojis/1f1fb-1f1f3.png b/dist/v-1528953702317/emojis/1f1fb-1f1f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fb-1f1f3.png rename to dist/v-1528953702317/emojis/1f1fb-1f1f3.png diff --git a/dist/v-1527758585938/emojis/1f1fb-1f1fa.png b/dist/v-1528953702317/emojis/1f1fb-1f1fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fb-1f1fa.png rename to dist/v-1528953702317/emojis/1f1fb-1f1fa.png diff --git a/dist/v-1527758585938/emojis/1f1fc-1f1eb.png b/dist/v-1528953702317/emojis/1f1fc-1f1eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fc-1f1eb.png rename to dist/v-1528953702317/emojis/1f1fc-1f1eb.png diff --git a/dist/v-1527758585938/emojis/1f1fc-1f1f8.png b/dist/v-1528953702317/emojis/1f1fc-1f1f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fc-1f1f8.png rename to dist/v-1528953702317/emojis/1f1fc-1f1f8.png diff --git a/dist/v-1527758585938/emojis/1f1fd-1f1f0.png b/dist/v-1528953702317/emojis/1f1fd-1f1f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fd-1f1f0.png rename to dist/v-1528953702317/emojis/1f1fd-1f1f0.png diff --git a/dist/v-1527758585938/emojis/1f1fe-1f1ea.png b/dist/v-1528953702317/emojis/1f1fe-1f1ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fe-1f1ea.png rename to dist/v-1528953702317/emojis/1f1fe-1f1ea.png diff --git a/dist/v-1527758585938/emojis/1f1fe-1f1f9.png b/dist/v-1528953702317/emojis/1f1fe-1f1f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1fe-1f1f9.png rename to dist/v-1528953702317/emojis/1f1fe-1f1f9.png diff --git a/dist/v-1527758585938/emojis/1f1ff-1f1e6.png b/dist/v-1528953702317/emojis/1f1ff-1f1e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ff-1f1e6.png rename to dist/v-1528953702317/emojis/1f1ff-1f1e6.png diff --git a/dist/v-1527758585938/emojis/1f1ff-1f1f2.png b/dist/v-1528953702317/emojis/1f1ff-1f1f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ff-1f1f2.png rename to dist/v-1528953702317/emojis/1f1ff-1f1f2.png diff --git a/dist/v-1527758585938/emojis/1f1ff-1f1fc.png b/dist/v-1528953702317/emojis/1f1ff-1f1fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f1ff-1f1fc.png rename to dist/v-1528953702317/emojis/1f1ff-1f1fc.png diff --git a/dist/v-1527758585938/emojis/1f201.png b/dist/v-1528953702317/emojis/1f201.png similarity index 100% rename from dist/v-1527758585938/emojis/1f201.png rename to dist/v-1528953702317/emojis/1f201.png diff --git a/dist/v-1527758585938/emojis/1f202.png b/dist/v-1528953702317/emojis/1f202.png similarity index 100% rename from dist/v-1527758585938/emojis/1f202.png rename to dist/v-1528953702317/emojis/1f202.png diff --git a/dist/v-1527758585938/emojis/1f21a.png b/dist/v-1528953702317/emojis/1f21a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f21a.png rename to dist/v-1528953702317/emojis/1f21a.png diff --git a/dist/v-1527758585938/emojis/1f22f.png b/dist/v-1528953702317/emojis/1f22f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f22f.png rename to dist/v-1528953702317/emojis/1f22f.png diff --git a/dist/v-1527758585938/emojis/1f232.png b/dist/v-1528953702317/emojis/1f232.png similarity index 100% rename from dist/v-1527758585938/emojis/1f232.png rename to dist/v-1528953702317/emojis/1f232.png diff --git a/dist/v-1527758585938/emojis/1f233.png b/dist/v-1528953702317/emojis/1f233.png similarity index 100% rename from dist/v-1527758585938/emojis/1f233.png rename to dist/v-1528953702317/emojis/1f233.png diff --git a/dist/v-1527758585938/emojis/1f234.png b/dist/v-1528953702317/emojis/1f234.png similarity index 100% rename from dist/v-1527758585938/emojis/1f234.png rename to dist/v-1528953702317/emojis/1f234.png diff --git a/dist/v-1527758585938/emojis/1f235.png b/dist/v-1528953702317/emojis/1f235.png similarity index 100% rename from dist/v-1527758585938/emojis/1f235.png rename to dist/v-1528953702317/emojis/1f235.png diff --git a/dist/v-1527758585938/emojis/1f236.png b/dist/v-1528953702317/emojis/1f236.png similarity index 100% rename from dist/v-1527758585938/emojis/1f236.png rename to dist/v-1528953702317/emojis/1f236.png diff --git a/dist/v-1527758585938/emojis/1f237.png b/dist/v-1528953702317/emojis/1f237.png similarity index 100% rename from dist/v-1527758585938/emojis/1f237.png rename to dist/v-1528953702317/emojis/1f237.png diff --git a/dist/v-1527758585938/emojis/1f238.png b/dist/v-1528953702317/emojis/1f238.png similarity index 100% rename from dist/v-1527758585938/emojis/1f238.png rename to dist/v-1528953702317/emojis/1f238.png diff --git a/dist/v-1527758585938/emojis/1f239.png b/dist/v-1528953702317/emojis/1f239.png similarity index 100% rename from dist/v-1527758585938/emojis/1f239.png rename to dist/v-1528953702317/emojis/1f239.png diff --git a/dist/v-1527758585938/emojis/1f23a.png b/dist/v-1528953702317/emojis/1f23a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f23a.png rename to dist/v-1528953702317/emojis/1f23a.png diff --git a/dist/v-1527758585938/emojis/1f250.png b/dist/v-1528953702317/emojis/1f250.png similarity index 100% rename from dist/v-1527758585938/emojis/1f250.png rename to dist/v-1528953702317/emojis/1f250.png diff --git a/dist/v-1527758585938/emojis/1f251.png b/dist/v-1528953702317/emojis/1f251.png similarity index 100% rename from dist/v-1527758585938/emojis/1f251.png rename to dist/v-1528953702317/emojis/1f251.png diff --git a/dist/v-1527758585938/emojis/1f300.png b/dist/v-1528953702317/emojis/1f300.png similarity index 100% rename from dist/v-1527758585938/emojis/1f300.png rename to dist/v-1528953702317/emojis/1f300.png diff --git a/dist/v-1527758585938/emojis/1f301.png b/dist/v-1528953702317/emojis/1f301.png similarity index 100% rename from dist/v-1527758585938/emojis/1f301.png rename to dist/v-1528953702317/emojis/1f301.png diff --git a/dist/v-1527758585938/emojis/1f302.png b/dist/v-1528953702317/emojis/1f302.png similarity index 100% rename from dist/v-1527758585938/emojis/1f302.png rename to dist/v-1528953702317/emojis/1f302.png diff --git a/dist/v-1527758585938/emojis/1f303.png b/dist/v-1528953702317/emojis/1f303.png similarity index 100% rename from dist/v-1527758585938/emojis/1f303.png rename to dist/v-1528953702317/emojis/1f303.png diff --git a/dist/v-1527758585938/emojis/1f304.png b/dist/v-1528953702317/emojis/1f304.png similarity index 100% rename from dist/v-1527758585938/emojis/1f304.png rename to dist/v-1528953702317/emojis/1f304.png diff --git a/dist/v-1527758585938/emojis/1f305.png b/dist/v-1528953702317/emojis/1f305.png similarity index 100% rename from dist/v-1527758585938/emojis/1f305.png rename to dist/v-1528953702317/emojis/1f305.png diff --git a/dist/v-1527758585938/emojis/1f306.png b/dist/v-1528953702317/emojis/1f306.png similarity index 100% rename from dist/v-1527758585938/emojis/1f306.png rename to dist/v-1528953702317/emojis/1f306.png diff --git a/dist/v-1527758585938/emojis/1f307.png b/dist/v-1528953702317/emojis/1f307.png similarity index 100% rename from dist/v-1527758585938/emojis/1f307.png rename to dist/v-1528953702317/emojis/1f307.png diff --git a/dist/v-1527758585938/emojis/1f308.png b/dist/v-1528953702317/emojis/1f308.png similarity index 100% rename from dist/v-1527758585938/emojis/1f308.png rename to dist/v-1528953702317/emojis/1f308.png diff --git a/dist/v-1527758585938/emojis/1f309.png b/dist/v-1528953702317/emojis/1f309.png similarity index 100% rename from dist/v-1527758585938/emojis/1f309.png rename to dist/v-1528953702317/emojis/1f309.png diff --git a/dist/v-1527758585938/emojis/1f30a.png b/dist/v-1528953702317/emojis/1f30a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f30a.png rename to dist/v-1528953702317/emojis/1f30a.png diff --git a/dist/v-1527758585938/emojis/1f30b.png b/dist/v-1528953702317/emojis/1f30b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f30b.png rename to dist/v-1528953702317/emojis/1f30b.png diff --git a/dist/v-1527758585938/emojis/1f30c.png b/dist/v-1528953702317/emojis/1f30c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f30c.png rename to dist/v-1528953702317/emojis/1f30c.png diff --git a/dist/v-1527758585938/emojis/1f30d.png b/dist/v-1528953702317/emojis/1f30d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f30d.png rename to dist/v-1528953702317/emojis/1f30d.png diff --git a/dist/v-1527758585938/emojis/1f30e.png b/dist/v-1528953702317/emojis/1f30e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f30e.png rename to dist/v-1528953702317/emojis/1f30e.png diff --git a/dist/v-1527758585938/emojis/1f30f.png b/dist/v-1528953702317/emojis/1f30f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f30f.png rename to dist/v-1528953702317/emojis/1f30f.png diff --git a/dist/v-1527758585938/emojis/1f310.png b/dist/v-1528953702317/emojis/1f310.png similarity index 100% rename from dist/v-1527758585938/emojis/1f310.png rename to dist/v-1528953702317/emojis/1f310.png diff --git a/dist/v-1527758585938/emojis/1f311.png b/dist/v-1528953702317/emojis/1f311.png similarity index 100% rename from dist/v-1527758585938/emojis/1f311.png rename to dist/v-1528953702317/emojis/1f311.png diff --git a/dist/v-1527758585938/emojis/1f312.png b/dist/v-1528953702317/emojis/1f312.png similarity index 100% rename from dist/v-1527758585938/emojis/1f312.png rename to dist/v-1528953702317/emojis/1f312.png diff --git a/dist/v-1527758585938/emojis/1f313.png b/dist/v-1528953702317/emojis/1f313.png similarity index 100% rename from dist/v-1527758585938/emojis/1f313.png rename to dist/v-1528953702317/emojis/1f313.png diff --git a/dist/v-1527758585938/emojis/1f314.png b/dist/v-1528953702317/emojis/1f314.png similarity index 100% rename from dist/v-1527758585938/emojis/1f314.png rename to dist/v-1528953702317/emojis/1f314.png diff --git a/dist/v-1527758585938/emojis/1f315.png b/dist/v-1528953702317/emojis/1f315.png similarity index 100% rename from dist/v-1527758585938/emojis/1f315.png rename to dist/v-1528953702317/emojis/1f315.png diff --git a/dist/v-1527758585938/emojis/1f316.png b/dist/v-1528953702317/emojis/1f316.png similarity index 100% rename from dist/v-1527758585938/emojis/1f316.png rename to dist/v-1528953702317/emojis/1f316.png diff --git a/dist/v-1527758585938/emojis/1f317.png b/dist/v-1528953702317/emojis/1f317.png similarity index 100% rename from dist/v-1527758585938/emojis/1f317.png rename to dist/v-1528953702317/emojis/1f317.png diff --git a/dist/v-1527758585938/emojis/1f318.png b/dist/v-1528953702317/emojis/1f318.png similarity index 100% rename from dist/v-1527758585938/emojis/1f318.png rename to dist/v-1528953702317/emojis/1f318.png diff --git a/dist/v-1527758585938/emojis/1f319.png b/dist/v-1528953702317/emojis/1f319.png similarity index 100% rename from dist/v-1527758585938/emojis/1f319.png rename to dist/v-1528953702317/emojis/1f319.png diff --git a/dist/v-1527758585938/emojis/1f31a.png b/dist/v-1528953702317/emojis/1f31a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f31a.png rename to dist/v-1528953702317/emojis/1f31a.png diff --git a/dist/v-1527758585938/emojis/1f31b.png b/dist/v-1528953702317/emojis/1f31b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f31b.png rename to dist/v-1528953702317/emojis/1f31b.png diff --git a/dist/v-1527758585938/emojis/1f31c.png b/dist/v-1528953702317/emojis/1f31c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f31c.png rename to dist/v-1528953702317/emojis/1f31c.png diff --git a/dist/v-1527758585938/emojis/1f31d.png b/dist/v-1528953702317/emojis/1f31d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f31d.png rename to dist/v-1528953702317/emojis/1f31d.png diff --git a/dist/v-1527758585938/emojis/1f31e.png b/dist/v-1528953702317/emojis/1f31e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f31e.png rename to dist/v-1528953702317/emojis/1f31e.png diff --git a/dist/v-1527758585938/emojis/1f31f.png b/dist/v-1528953702317/emojis/1f31f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f31f.png rename to dist/v-1528953702317/emojis/1f31f.png diff --git a/dist/v-1527758585938/emojis/1f320.png b/dist/v-1528953702317/emojis/1f320.png similarity index 100% rename from dist/v-1527758585938/emojis/1f320.png rename to dist/v-1528953702317/emojis/1f320.png diff --git a/dist/v-1527758585938/emojis/1f321.png b/dist/v-1528953702317/emojis/1f321.png similarity index 100% rename from dist/v-1527758585938/emojis/1f321.png rename to dist/v-1528953702317/emojis/1f321.png diff --git a/dist/v-1527758585938/emojis/1f324.png b/dist/v-1528953702317/emojis/1f324.png similarity index 100% rename from dist/v-1527758585938/emojis/1f324.png rename to dist/v-1528953702317/emojis/1f324.png diff --git a/dist/v-1527758585938/emojis/1f325.png b/dist/v-1528953702317/emojis/1f325.png similarity index 100% rename from dist/v-1527758585938/emojis/1f325.png rename to dist/v-1528953702317/emojis/1f325.png diff --git a/dist/v-1527758585938/emojis/1f326.png b/dist/v-1528953702317/emojis/1f326.png similarity index 100% rename from dist/v-1527758585938/emojis/1f326.png rename to dist/v-1528953702317/emojis/1f326.png diff --git a/dist/v-1527758585938/emojis/1f327.png b/dist/v-1528953702317/emojis/1f327.png similarity index 100% rename from dist/v-1527758585938/emojis/1f327.png rename to dist/v-1528953702317/emojis/1f327.png diff --git a/dist/v-1527758585938/emojis/1f328.png b/dist/v-1528953702317/emojis/1f328.png similarity index 100% rename from dist/v-1527758585938/emojis/1f328.png rename to dist/v-1528953702317/emojis/1f328.png diff --git a/dist/v-1527758585938/emojis/1f329.png b/dist/v-1528953702317/emojis/1f329.png similarity index 100% rename from dist/v-1527758585938/emojis/1f329.png rename to dist/v-1528953702317/emojis/1f329.png diff --git a/dist/v-1527758585938/emojis/1f32a.png b/dist/v-1528953702317/emojis/1f32a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f32a.png rename to dist/v-1528953702317/emojis/1f32a.png diff --git a/dist/v-1527758585938/emojis/1f32b.png b/dist/v-1528953702317/emojis/1f32b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f32b.png rename to dist/v-1528953702317/emojis/1f32b.png diff --git a/dist/v-1527758585938/emojis/1f32c.png b/dist/v-1528953702317/emojis/1f32c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f32c.png rename to dist/v-1528953702317/emojis/1f32c.png diff --git a/dist/v-1527758585938/emojis/1f32d.png b/dist/v-1528953702317/emojis/1f32d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f32d.png rename to dist/v-1528953702317/emojis/1f32d.png diff --git a/dist/v-1527758585938/emojis/1f32e.png b/dist/v-1528953702317/emojis/1f32e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f32e.png rename to dist/v-1528953702317/emojis/1f32e.png diff --git a/dist/v-1527758585938/emojis/1f32f.png b/dist/v-1528953702317/emojis/1f32f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f32f.png rename to dist/v-1528953702317/emojis/1f32f.png diff --git a/dist/v-1527758585938/emojis/1f330.png b/dist/v-1528953702317/emojis/1f330.png similarity index 100% rename from dist/v-1527758585938/emojis/1f330.png rename to dist/v-1528953702317/emojis/1f330.png diff --git a/dist/v-1527758585938/emojis/1f331.png b/dist/v-1528953702317/emojis/1f331.png similarity index 100% rename from dist/v-1527758585938/emojis/1f331.png rename to dist/v-1528953702317/emojis/1f331.png diff --git a/dist/v-1527758585938/emojis/1f332.png b/dist/v-1528953702317/emojis/1f332.png similarity index 100% rename from dist/v-1527758585938/emojis/1f332.png rename to dist/v-1528953702317/emojis/1f332.png diff --git a/dist/v-1527758585938/emojis/1f333.png b/dist/v-1528953702317/emojis/1f333.png similarity index 100% rename from dist/v-1527758585938/emojis/1f333.png rename to dist/v-1528953702317/emojis/1f333.png diff --git a/dist/v-1527758585938/emojis/1f334.png b/dist/v-1528953702317/emojis/1f334.png similarity index 100% rename from dist/v-1527758585938/emojis/1f334.png rename to dist/v-1528953702317/emojis/1f334.png diff --git a/dist/v-1527758585938/emojis/1f335.png b/dist/v-1528953702317/emojis/1f335.png similarity index 100% rename from dist/v-1527758585938/emojis/1f335.png rename to dist/v-1528953702317/emojis/1f335.png diff --git a/dist/v-1527758585938/emojis/1f336.png b/dist/v-1528953702317/emojis/1f336.png similarity index 100% rename from dist/v-1527758585938/emojis/1f336.png rename to dist/v-1528953702317/emojis/1f336.png diff --git a/dist/v-1527758585938/emojis/1f337.png b/dist/v-1528953702317/emojis/1f337.png similarity index 100% rename from dist/v-1527758585938/emojis/1f337.png rename to dist/v-1528953702317/emojis/1f337.png diff --git a/dist/v-1527758585938/emojis/1f338.png b/dist/v-1528953702317/emojis/1f338.png similarity index 100% rename from dist/v-1527758585938/emojis/1f338.png rename to dist/v-1528953702317/emojis/1f338.png diff --git a/dist/v-1527758585938/emojis/1f339.png b/dist/v-1528953702317/emojis/1f339.png similarity index 100% rename from dist/v-1527758585938/emojis/1f339.png rename to dist/v-1528953702317/emojis/1f339.png diff --git a/dist/v-1527758585938/emojis/1f33a.png b/dist/v-1528953702317/emojis/1f33a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f33a.png rename to dist/v-1528953702317/emojis/1f33a.png diff --git a/dist/v-1527758585938/emojis/1f33b.png b/dist/v-1528953702317/emojis/1f33b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f33b.png rename to dist/v-1528953702317/emojis/1f33b.png diff --git a/dist/v-1527758585938/emojis/1f33c.png b/dist/v-1528953702317/emojis/1f33c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f33c.png rename to dist/v-1528953702317/emojis/1f33c.png diff --git a/dist/v-1527758585938/emojis/1f33d.png b/dist/v-1528953702317/emojis/1f33d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f33d.png rename to dist/v-1528953702317/emojis/1f33d.png diff --git a/dist/v-1527758585938/emojis/1f33e.png b/dist/v-1528953702317/emojis/1f33e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f33e.png rename to dist/v-1528953702317/emojis/1f33e.png diff --git a/dist/v-1527758585938/emojis/1f33f.png b/dist/v-1528953702317/emojis/1f33f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f33f.png rename to dist/v-1528953702317/emojis/1f33f.png diff --git a/dist/v-1527758585938/emojis/1f340.png b/dist/v-1528953702317/emojis/1f340.png similarity index 100% rename from dist/v-1527758585938/emojis/1f340.png rename to dist/v-1528953702317/emojis/1f340.png diff --git a/dist/v-1527758585938/emojis/1f341.png b/dist/v-1528953702317/emojis/1f341.png similarity index 100% rename from dist/v-1527758585938/emojis/1f341.png rename to dist/v-1528953702317/emojis/1f341.png diff --git a/dist/v-1527758585938/emojis/1f342.png b/dist/v-1528953702317/emojis/1f342.png similarity index 100% rename from dist/v-1527758585938/emojis/1f342.png rename to dist/v-1528953702317/emojis/1f342.png diff --git a/dist/v-1527758585938/emojis/1f343.png b/dist/v-1528953702317/emojis/1f343.png similarity index 100% rename from dist/v-1527758585938/emojis/1f343.png rename to dist/v-1528953702317/emojis/1f343.png diff --git a/dist/v-1527758585938/emojis/1f344.png b/dist/v-1528953702317/emojis/1f344.png similarity index 100% rename from dist/v-1527758585938/emojis/1f344.png rename to dist/v-1528953702317/emojis/1f344.png diff --git a/dist/v-1527758585938/emojis/1f345.png b/dist/v-1528953702317/emojis/1f345.png similarity index 100% rename from dist/v-1527758585938/emojis/1f345.png rename to dist/v-1528953702317/emojis/1f345.png diff --git a/dist/v-1527758585938/emojis/1f346.png b/dist/v-1528953702317/emojis/1f346.png similarity index 100% rename from dist/v-1527758585938/emojis/1f346.png rename to dist/v-1528953702317/emojis/1f346.png diff --git a/dist/v-1527758585938/emojis/1f347.png b/dist/v-1528953702317/emojis/1f347.png similarity index 100% rename from dist/v-1527758585938/emojis/1f347.png rename to dist/v-1528953702317/emojis/1f347.png diff --git a/dist/v-1527758585938/emojis/1f348.png b/dist/v-1528953702317/emojis/1f348.png similarity index 100% rename from dist/v-1527758585938/emojis/1f348.png rename to dist/v-1528953702317/emojis/1f348.png diff --git a/dist/v-1527758585938/emojis/1f349.png b/dist/v-1528953702317/emojis/1f349.png similarity index 100% rename from dist/v-1527758585938/emojis/1f349.png rename to dist/v-1528953702317/emojis/1f349.png diff --git a/dist/v-1527758585938/emojis/1f34a.png b/dist/v-1528953702317/emojis/1f34a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f34a.png rename to dist/v-1528953702317/emojis/1f34a.png diff --git a/dist/v-1527758585938/emojis/1f34b.png b/dist/v-1528953702317/emojis/1f34b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f34b.png rename to dist/v-1528953702317/emojis/1f34b.png diff --git a/dist/v-1527758585938/emojis/1f34c.png b/dist/v-1528953702317/emojis/1f34c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f34c.png rename to dist/v-1528953702317/emojis/1f34c.png diff --git a/dist/v-1527758585938/emojis/1f34d.png b/dist/v-1528953702317/emojis/1f34d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f34d.png rename to dist/v-1528953702317/emojis/1f34d.png diff --git a/dist/v-1527758585938/emojis/1f34e.png b/dist/v-1528953702317/emojis/1f34e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f34e.png rename to dist/v-1528953702317/emojis/1f34e.png diff --git a/dist/v-1527758585938/emojis/1f34f.png b/dist/v-1528953702317/emojis/1f34f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f34f.png rename to dist/v-1528953702317/emojis/1f34f.png diff --git a/dist/v-1527758585938/emojis/1f350.png b/dist/v-1528953702317/emojis/1f350.png similarity index 100% rename from dist/v-1527758585938/emojis/1f350.png rename to dist/v-1528953702317/emojis/1f350.png diff --git a/dist/v-1527758585938/emojis/1f351.png b/dist/v-1528953702317/emojis/1f351.png similarity index 100% rename from dist/v-1527758585938/emojis/1f351.png rename to dist/v-1528953702317/emojis/1f351.png diff --git a/dist/v-1527758585938/emojis/1f352.png b/dist/v-1528953702317/emojis/1f352.png similarity index 100% rename from dist/v-1527758585938/emojis/1f352.png rename to dist/v-1528953702317/emojis/1f352.png diff --git a/dist/v-1527758585938/emojis/1f353.png b/dist/v-1528953702317/emojis/1f353.png similarity index 100% rename from dist/v-1527758585938/emojis/1f353.png rename to dist/v-1528953702317/emojis/1f353.png diff --git a/dist/v-1527758585938/emojis/1f354.png b/dist/v-1528953702317/emojis/1f354.png similarity index 100% rename from dist/v-1527758585938/emojis/1f354.png rename to dist/v-1528953702317/emojis/1f354.png diff --git a/dist/v-1527758585938/emojis/1f355.png b/dist/v-1528953702317/emojis/1f355.png similarity index 100% rename from dist/v-1527758585938/emojis/1f355.png rename to dist/v-1528953702317/emojis/1f355.png diff --git a/dist/v-1527758585938/emojis/1f356.png b/dist/v-1528953702317/emojis/1f356.png similarity index 100% rename from dist/v-1527758585938/emojis/1f356.png rename to dist/v-1528953702317/emojis/1f356.png diff --git a/dist/v-1527758585938/emojis/1f357.png b/dist/v-1528953702317/emojis/1f357.png similarity index 100% rename from dist/v-1527758585938/emojis/1f357.png rename to dist/v-1528953702317/emojis/1f357.png diff --git a/dist/v-1527758585938/emojis/1f358.png b/dist/v-1528953702317/emojis/1f358.png similarity index 100% rename from dist/v-1527758585938/emojis/1f358.png rename to dist/v-1528953702317/emojis/1f358.png diff --git a/dist/v-1527758585938/emojis/1f359.png b/dist/v-1528953702317/emojis/1f359.png similarity index 100% rename from dist/v-1527758585938/emojis/1f359.png rename to dist/v-1528953702317/emojis/1f359.png diff --git a/dist/v-1527758585938/emojis/1f35a.png b/dist/v-1528953702317/emojis/1f35a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f35a.png rename to dist/v-1528953702317/emojis/1f35a.png diff --git a/dist/v-1527758585938/emojis/1f35b.png b/dist/v-1528953702317/emojis/1f35b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f35b.png rename to dist/v-1528953702317/emojis/1f35b.png diff --git a/dist/v-1527758585938/emojis/1f35c.png b/dist/v-1528953702317/emojis/1f35c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f35c.png rename to dist/v-1528953702317/emojis/1f35c.png diff --git a/dist/v-1527758585938/emojis/1f35d.png b/dist/v-1528953702317/emojis/1f35d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f35d.png rename to dist/v-1528953702317/emojis/1f35d.png diff --git a/dist/v-1527758585938/emojis/1f35e.png b/dist/v-1528953702317/emojis/1f35e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f35e.png rename to dist/v-1528953702317/emojis/1f35e.png diff --git a/dist/v-1527758585938/emojis/1f35f.png b/dist/v-1528953702317/emojis/1f35f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f35f.png rename to dist/v-1528953702317/emojis/1f35f.png diff --git a/dist/v-1527758585938/emojis/1f360.png b/dist/v-1528953702317/emojis/1f360.png similarity index 100% rename from dist/v-1527758585938/emojis/1f360.png rename to dist/v-1528953702317/emojis/1f360.png diff --git a/dist/v-1527758585938/emojis/1f361.png b/dist/v-1528953702317/emojis/1f361.png similarity index 100% rename from dist/v-1527758585938/emojis/1f361.png rename to dist/v-1528953702317/emojis/1f361.png diff --git a/dist/v-1527758585938/emojis/1f362.png b/dist/v-1528953702317/emojis/1f362.png similarity index 100% rename from dist/v-1527758585938/emojis/1f362.png rename to dist/v-1528953702317/emojis/1f362.png diff --git a/dist/v-1527758585938/emojis/1f363.png b/dist/v-1528953702317/emojis/1f363.png similarity index 100% rename from dist/v-1527758585938/emojis/1f363.png rename to dist/v-1528953702317/emojis/1f363.png diff --git a/dist/v-1527758585938/emojis/1f364.png b/dist/v-1528953702317/emojis/1f364.png similarity index 100% rename from dist/v-1527758585938/emojis/1f364.png rename to dist/v-1528953702317/emojis/1f364.png diff --git a/dist/v-1527758585938/emojis/1f365.png b/dist/v-1528953702317/emojis/1f365.png similarity index 100% rename from dist/v-1527758585938/emojis/1f365.png rename to dist/v-1528953702317/emojis/1f365.png diff --git a/dist/v-1527758585938/emojis/1f366.png b/dist/v-1528953702317/emojis/1f366.png similarity index 100% rename from dist/v-1527758585938/emojis/1f366.png rename to dist/v-1528953702317/emojis/1f366.png diff --git a/dist/v-1527758585938/emojis/1f367.png b/dist/v-1528953702317/emojis/1f367.png similarity index 100% rename from dist/v-1527758585938/emojis/1f367.png rename to dist/v-1528953702317/emojis/1f367.png diff --git a/dist/v-1527758585938/emojis/1f368.png b/dist/v-1528953702317/emojis/1f368.png similarity index 100% rename from dist/v-1527758585938/emojis/1f368.png rename to dist/v-1528953702317/emojis/1f368.png diff --git a/dist/v-1527758585938/emojis/1f369.png b/dist/v-1528953702317/emojis/1f369.png similarity index 100% rename from dist/v-1527758585938/emojis/1f369.png rename to dist/v-1528953702317/emojis/1f369.png diff --git a/dist/v-1527758585938/emojis/1f36a.png b/dist/v-1528953702317/emojis/1f36a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f36a.png rename to dist/v-1528953702317/emojis/1f36a.png diff --git a/dist/v-1527758585938/emojis/1f36b.png b/dist/v-1528953702317/emojis/1f36b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f36b.png rename to dist/v-1528953702317/emojis/1f36b.png diff --git a/dist/v-1527758585938/emojis/1f36c.png b/dist/v-1528953702317/emojis/1f36c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f36c.png rename to dist/v-1528953702317/emojis/1f36c.png diff --git a/dist/v-1527758585938/emojis/1f36d.png b/dist/v-1528953702317/emojis/1f36d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f36d.png rename to dist/v-1528953702317/emojis/1f36d.png diff --git a/dist/v-1527758585938/emojis/1f36e.png b/dist/v-1528953702317/emojis/1f36e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f36e.png rename to dist/v-1528953702317/emojis/1f36e.png diff --git a/dist/v-1527758585938/emojis/1f36f.png b/dist/v-1528953702317/emojis/1f36f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f36f.png rename to dist/v-1528953702317/emojis/1f36f.png diff --git a/dist/v-1527758585938/emojis/1f370.png b/dist/v-1528953702317/emojis/1f370.png similarity index 100% rename from dist/v-1527758585938/emojis/1f370.png rename to dist/v-1528953702317/emojis/1f370.png diff --git a/dist/v-1527758585938/emojis/1f371.png b/dist/v-1528953702317/emojis/1f371.png similarity index 100% rename from dist/v-1527758585938/emojis/1f371.png rename to dist/v-1528953702317/emojis/1f371.png diff --git a/dist/v-1527758585938/emojis/1f372.png b/dist/v-1528953702317/emojis/1f372.png similarity index 100% rename from dist/v-1527758585938/emojis/1f372.png rename to dist/v-1528953702317/emojis/1f372.png diff --git a/dist/v-1527758585938/emojis/1f373.png b/dist/v-1528953702317/emojis/1f373.png similarity index 100% rename from dist/v-1527758585938/emojis/1f373.png rename to dist/v-1528953702317/emojis/1f373.png diff --git a/dist/v-1527758585938/emojis/1f374.png b/dist/v-1528953702317/emojis/1f374.png similarity index 100% rename from dist/v-1527758585938/emojis/1f374.png rename to dist/v-1528953702317/emojis/1f374.png diff --git a/dist/v-1527758585938/emojis/1f375.png b/dist/v-1528953702317/emojis/1f375.png similarity index 100% rename from dist/v-1527758585938/emojis/1f375.png rename to dist/v-1528953702317/emojis/1f375.png diff --git a/dist/v-1527758585938/emojis/1f376.png b/dist/v-1528953702317/emojis/1f376.png similarity index 100% rename from dist/v-1527758585938/emojis/1f376.png rename to dist/v-1528953702317/emojis/1f376.png diff --git a/dist/v-1527758585938/emojis/1f377.png b/dist/v-1528953702317/emojis/1f377.png similarity index 100% rename from dist/v-1527758585938/emojis/1f377.png rename to dist/v-1528953702317/emojis/1f377.png diff --git a/dist/v-1527758585938/emojis/1f378.png b/dist/v-1528953702317/emojis/1f378.png similarity index 100% rename from dist/v-1527758585938/emojis/1f378.png rename to dist/v-1528953702317/emojis/1f378.png diff --git a/dist/v-1527758585938/emojis/1f379.png b/dist/v-1528953702317/emojis/1f379.png similarity index 100% rename from dist/v-1527758585938/emojis/1f379.png rename to dist/v-1528953702317/emojis/1f379.png diff --git a/dist/v-1527758585938/emojis/1f37a.png b/dist/v-1528953702317/emojis/1f37a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f37a.png rename to dist/v-1528953702317/emojis/1f37a.png diff --git a/dist/v-1527758585938/emojis/1f37b.png b/dist/v-1528953702317/emojis/1f37b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f37b.png rename to dist/v-1528953702317/emojis/1f37b.png diff --git a/dist/v-1527758585938/emojis/1f37c.png b/dist/v-1528953702317/emojis/1f37c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f37c.png rename to dist/v-1528953702317/emojis/1f37c.png diff --git a/dist/v-1527758585938/emojis/1f37d.png b/dist/v-1528953702317/emojis/1f37d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f37d.png rename to dist/v-1528953702317/emojis/1f37d.png diff --git a/dist/v-1527758585938/emojis/1f37e.png b/dist/v-1528953702317/emojis/1f37e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f37e.png rename to dist/v-1528953702317/emojis/1f37e.png diff --git a/dist/v-1527758585938/emojis/1f37f.png b/dist/v-1528953702317/emojis/1f37f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f37f.png rename to dist/v-1528953702317/emojis/1f37f.png diff --git a/dist/v-1527758585938/emojis/1f380.png b/dist/v-1528953702317/emojis/1f380.png similarity index 100% rename from dist/v-1527758585938/emojis/1f380.png rename to dist/v-1528953702317/emojis/1f380.png diff --git a/dist/v-1527758585938/emojis/1f381.png b/dist/v-1528953702317/emojis/1f381.png similarity index 100% rename from dist/v-1527758585938/emojis/1f381.png rename to dist/v-1528953702317/emojis/1f381.png diff --git a/dist/v-1527758585938/emojis/1f382.png b/dist/v-1528953702317/emojis/1f382.png similarity index 100% rename from dist/v-1527758585938/emojis/1f382.png rename to dist/v-1528953702317/emojis/1f382.png diff --git a/dist/v-1527758585938/emojis/1f383.png b/dist/v-1528953702317/emojis/1f383.png similarity index 100% rename from dist/v-1527758585938/emojis/1f383.png rename to dist/v-1528953702317/emojis/1f383.png diff --git a/dist/v-1527758585938/emojis/1f384.png b/dist/v-1528953702317/emojis/1f384.png similarity index 100% rename from dist/v-1527758585938/emojis/1f384.png rename to dist/v-1528953702317/emojis/1f384.png diff --git a/dist/v-1527758585938/emojis/1f385.png b/dist/v-1528953702317/emojis/1f385.png similarity index 100% rename from dist/v-1527758585938/emojis/1f385.png rename to dist/v-1528953702317/emojis/1f385.png diff --git a/dist/v-1527758585938/emojis/1f386.png b/dist/v-1528953702317/emojis/1f386.png similarity index 100% rename from dist/v-1527758585938/emojis/1f386.png rename to dist/v-1528953702317/emojis/1f386.png diff --git a/dist/v-1527758585938/emojis/1f387.png b/dist/v-1528953702317/emojis/1f387.png similarity index 100% rename from dist/v-1527758585938/emojis/1f387.png rename to dist/v-1528953702317/emojis/1f387.png diff --git a/dist/v-1527758585938/emojis/1f388.png b/dist/v-1528953702317/emojis/1f388.png similarity index 100% rename from dist/v-1527758585938/emojis/1f388.png rename to dist/v-1528953702317/emojis/1f388.png diff --git a/dist/v-1527758585938/emojis/1f389.png b/dist/v-1528953702317/emojis/1f389.png similarity index 100% rename from dist/v-1527758585938/emojis/1f389.png rename to dist/v-1528953702317/emojis/1f389.png diff --git a/dist/v-1527758585938/emojis/1f38a.png b/dist/v-1528953702317/emojis/1f38a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f38a.png rename to dist/v-1528953702317/emojis/1f38a.png diff --git a/dist/v-1527758585938/emojis/1f38b.png b/dist/v-1528953702317/emojis/1f38b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f38b.png rename to dist/v-1528953702317/emojis/1f38b.png diff --git a/dist/v-1527758585938/emojis/1f38c.png b/dist/v-1528953702317/emojis/1f38c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f38c.png rename to dist/v-1528953702317/emojis/1f38c.png diff --git a/dist/v-1527758585938/emojis/1f38d.png b/dist/v-1528953702317/emojis/1f38d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f38d.png rename to dist/v-1528953702317/emojis/1f38d.png diff --git a/dist/v-1527758585938/emojis/1f38e.png b/dist/v-1528953702317/emojis/1f38e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f38e.png rename to dist/v-1528953702317/emojis/1f38e.png diff --git a/dist/v-1527758585938/emojis/1f38f.png b/dist/v-1528953702317/emojis/1f38f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f38f.png rename to dist/v-1528953702317/emojis/1f38f.png diff --git a/dist/v-1527758585938/emojis/1f390.png b/dist/v-1528953702317/emojis/1f390.png similarity index 100% rename from dist/v-1527758585938/emojis/1f390.png rename to dist/v-1528953702317/emojis/1f390.png diff --git a/dist/v-1527758585938/emojis/1f391.png b/dist/v-1528953702317/emojis/1f391.png similarity index 100% rename from dist/v-1527758585938/emojis/1f391.png rename to dist/v-1528953702317/emojis/1f391.png diff --git a/dist/v-1527758585938/emojis/1f392.png b/dist/v-1528953702317/emojis/1f392.png similarity index 100% rename from dist/v-1527758585938/emojis/1f392.png rename to dist/v-1528953702317/emojis/1f392.png diff --git a/dist/v-1527758585938/emojis/1f393.png b/dist/v-1528953702317/emojis/1f393.png similarity index 100% rename from dist/v-1527758585938/emojis/1f393.png rename to dist/v-1528953702317/emojis/1f393.png diff --git a/dist/v-1527758585938/emojis/1f396.png b/dist/v-1528953702317/emojis/1f396.png similarity index 100% rename from dist/v-1527758585938/emojis/1f396.png rename to dist/v-1528953702317/emojis/1f396.png diff --git a/dist/v-1527758585938/emojis/1f397.png b/dist/v-1528953702317/emojis/1f397.png similarity index 100% rename from dist/v-1527758585938/emojis/1f397.png rename to dist/v-1528953702317/emojis/1f397.png diff --git a/dist/v-1527758585938/emojis/1f399.png b/dist/v-1528953702317/emojis/1f399.png similarity index 100% rename from dist/v-1527758585938/emojis/1f399.png rename to dist/v-1528953702317/emojis/1f399.png diff --git a/dist/v-1527758585938/emojis/1f39a.png b/dist/v-1528953702317/emojis/1f39a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f39a.png rename to dist/v-1528953702317/emojis/1f39a.png diff --git a/dist/v-1527758585938/emojis/1f39b.png b/dist/v-1528953702317/emojis/1f39b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f39b.png rename to dist/v-1528953702317/emojis/1f39b.png diff --git a/dist/v-1527758585938/emojis/1f39e.png b/dist/v-1528953702317/emojis/1f39e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f39e.png rename to dist/v-1528953702317/emojis/1f39e.png diff --git a/dist/v-1527758585938/emojis/1f39f.png b/dist/v-1528953702317/emojis/1f39f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f39f.png rename to dist/v-1528953702317/emojis/1f39f.png diff --git a/dist/v-1527758585938/emojis/1f3a0.png b/dist/v-1528953702317/emojis/1f3a0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a0.png rename to dist/v-1528953702317/emojis/1f3a0.png diff --git a/dist/v-1527758585938/emojis/1f3a1.png b/dist/v-1528953702317/emojis/1f3a1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a1.png rename to dist/v-1528953702317/emojis/1f3a1.png diff --git a/dist/v-1527758585938/emojis/1f3a2.png b/dist/v-1528953702317/emojis/1f3a2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a2.png rename to dist/v-1528953702317/emojis/1f3a2.png diff --git a/dist/v-1527758585938/emojis/1f3a3.png b/dist/v-1528953702317/emojis/1f3a3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a3.png rename to dist/v-1528953702317/emojis/1f3a3.png diff --git a/dist/v-1527758585938/emojis/1f3a4.png b/dist/v-1528953702317/emojis/1f3a4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a4.png rename to dist/v-1528953702317/emojis/1f3a4.png diff --git a/dist/v-1527758585938/emojis/1f3a5.png b/dist/v-1528953702317/emojis/1f3a5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a5.png rename to dist/v-1528953702317/emojis/1f3a5.png diff --git a/dist/v-1527758585938/emojis/1f3a6.png b/dist/v-1528953702317/emojis/1f3a6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a6.png rename to dist/v-1528953702317/emojis/1f3a6.png diff --git a/dist/v-1527758585938/emojis/1f3a7.png b/dist/v-1528953702317/emojis/1f3a7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a7.png rename to dist/v-1528953702317/emojis/1f3a7.png diff --git a/dist/v-1527758585938/emojis/1f3a8.png b/dist/v-1528953702317/emojis/1f3a8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a8.png rename to dist/v-1528953702317/emojis/1f3a8.png diff --git a/dist/v-1527758585938/emojis/1f3a9.png b/dist/v-1528953702317/emojis/1f3a9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3a9.png rename to dist/v-1528953702317/emojis/1f3a9.png diff --git a/dist/v-1527758585938/emojis/1f3aa.png b/dist/v-1528953702317/emojis/1f3aa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3aa.png rename to dist/v-1528953702317/emojis/1f3aa.png diff --git a/dist/v-1527758585938/emojis/1f3ab.png b/dist/v-1528953702317/emojis/1f3ab.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ab.png rename to dist/v-1528953702317/emojis/1f3ab.png diff --git a/dist/v-1527758585938/emojis/1f3ac.png b/dist/v-1528953702317/emojis/1f3ac.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ac.png rename to dist/v-1528953702317/emojis/1f3ac.png diff --git a/dist/v-1527758585938/emojis/1f3ad.png b/dist/v-1528953702317/emojis/1f3ad.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ad.png rename to dist/v-1528953702317/emojis/1f3ad.png diff --git a/dist/v-1527758585938/emojis/1f3ae.png b/dist/v-1528953702317/emojis/1f3ae.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ae.png rename to dist/v-1528953702317/emojis/1f3ae.png diff --git a/dist/v-1527758585938/emojis/1f3af.png b/dist/v-1528953702317/emojis/1f3af.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3af.png rename to dist/v-1528953702317/emojis/1f3af.png diff --git a/dist/v-1527758585938/emojis/1f3b0.png b/dist/v-1528953702317/emojis/1f3b0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b0.png rename to dist/v-1528953702317/emojis/1f3b0.png diff --git a/dist/v-1527758585938/emojis/1f3b1.png b/dist/v-1528953702317/emojis/1f3b1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b1.png rename to dist/v-1528953702317/emojis/1f3b1.png diff --git a/dist/v-1527758585938/emojis/1f3b2.png b/dist/v-1528953702317/emojis/1f3b2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b2.png rename to dist/v-1528953702317/emojis/1f3b2.png diff --git a/dist/v-1527758585938/emojis/1f3b3.png b/dist/v-1528953702317/emojis/1f3b3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b3.png rename to dist/v-1528953702317/emojis/1f3b3.png diff --git a/dist/v-1527758585938/emojis/1f3b4.png b/dist/v-1528953702317/emojis/1f3b4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b4.png rename to dist/v-1528953702317/emojis/1f3b4.png diff --git a/dist/v-1527758585938/emojis/1f3b5.png b/dist/v-1528953702317/emojis/1f3b5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b5.png rename to dist/v-1528953702317/emojis/1f3b5.png diff --git a/dist/v-1527758585938/emojis/1f3b6.png b/dist/v-1528953702317/emojis/1f3b6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b6.png rename to dist/v-1528953702317/emojis/1f3b6.png diff --git a/dist/v-1527758585938/emojis/1f3b7.png b/dist/v-1528953702317/emojis/1f3b7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b7.png rename to dist/v-1528953702317/emojis/1f3b7.png diff --git a/dist/v-1527758585938/emojis/1f3b8.png b/dist/v-1528953702317/emojis/1f3b8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b8.png rename to dist/v-1528953702317/emojis/1f3b8.png diff --git a/dist/v-1527758585938/emojis/1f3b9.png b/dist/v-1528953702317/emojis/1f3b9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3b9.png rename to dist/v-1528953702317/emojis/1f3b9.png diff --git a/dist/v-1527758585938/emojis/1f3ba.png b/dist/v-1528953702317/emojis/1f3ba.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ba.png rename to dist/v-1528953702317/emojis/1f3ba.png diff --git a/dist/v-1527758585938/emojis/1f3bb.png b/dist/v-1528953702317/emojis/1f3bb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3bb.png rename to dist/v-1528953702317/emojis/1f3bb.png diff --git a/dist/v-1527758585938/emojis/1f3bc.png b/dist/v-1528953702317/emojis/1f3bc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3bc.png rename to dist/v-1528953702317/emojis/1f3bc.png diff --git a/dist/v-1527758585938/emojis/1f3bd.png b/dist/v-1528953702317/emojis/1f3bd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3bd.png rename to dist/v-1528953702317/emojis/1f3bd.png diff --git a/dist/v-1527758585938/emojis/1f3be.png b/dist/v-1528953702317/emojis/1f3be.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3be.png rename to dist/v-1528953702317/emojis/1f3be.png diff --git a/dist/v-1527758585938/emojis/1f3bf.png b/dist/v-1528953702317/emojis/1f3bf.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3bf.png rename to dist/v-1528953702317/emojis/1f3bf.png diff --git a/dist/v-1527758585938/emojis/1f3c0.png b/dist/v-1528953702317/emojis/1f3c0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c0.png rename to dist/v-1528953702317/emojis/1f3c0.png diff --git a/dist/v-1527758585938/emojis/1f3c1.png b/dist/v-1528953702317/emojis/1f3c1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c1.png rename to dist/v-1528953702317/emojis/1f3c1.png diff --git a/dist/v-1527758585938/emojis/1f3c2.png b/dist/v-1528953702317/emojis/1f3c2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c2.png rename to dist/v-1528953702317/emojis/1f3c2.png diff --git a/dist/v-1527758585938/emojis/1f3c3-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f3c3-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c3-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f3c3-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3c3-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f3c3-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c3-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f3c3-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3c3.png b/dist/v-1528953702317/emojis/1f3c3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c3.png rename to dist/v-1528953702317/emojis/1f3c3.png diff --git a/dist/v-1527758585938/emojis/1f3c4-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f3c4-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c4-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f3c4-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3c4-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f3c4-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c4-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f3c4-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3c4.png b/dist/v-1528953702317/emojis/1f3c4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c4.png rename to dist/v-1528953702317/emojis/1f3c4.png diff --git a/dist/v-1527758585938/emojis/1f3c5.png b/dist/v-1528953702317/emojis/1f3c5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c5.png rename to dist/v-1528953702317/emojis/1f3c5.png diff --git a/dist/v-1527758585938/emojis/1f3c6.png b/dist/v-1528953702317/emojis/1f3c6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c6.png rename to dist/v-1528953702317/emojis/1f3c6.png diff --git a/dist/v-1527758585938/emojis/1f3c7.png b/dist/v-1528953702317/emojis/1f3c7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c7.png rename to dist/v-1528953702317/emojis/1f3c7.png diff --git a/dist/v-1527758585938/emojis/1f3c8.png b/dist/v-1528953702317/emojis/1f3c8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c8.png rename to dist/v-1528953702317/emojis/1f3c8.png diff --git a/dist/v-1527758585938/emojis/1f3c9.png b/dist/v-1528953702317/emojis/1f3c9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3c9.png rename to dist/v-1528953702317/emojis/1f3c9.png diff --git a/dist/v-1527758585938/emojis/1f3ca-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f3ca-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ca-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f3ca-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3ca-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f3ca-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ca-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f3ca-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3ca.png b/dist/v-1528953702317/emojis/1f3ca.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ca.png rename to dist/v-1528953702317/emojis/1f3ca.png diff --git a/dist/v-1527758585938/emojis/1f3cb-fe0f-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f3cb-fe0f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3cb-fe0f-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f3cb-fe0f-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3cb-fe0f-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f3cb-fe0f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3cb-fe0f-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f3cb-fe0f-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3cb.png b/dist/v-1528953702317/emojis/1f3cb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3cb.png rename to dist/v-1528953702317/emojis/1f3cb.png diff --git a/dist/v-1527758585938/emojis/1f3cc-fe0f-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f3cc-fe0f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3cc-fe0f-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f3cc-fe0f-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3cc-fe0f-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f3cc-fe0f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3cc-fe0f-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f3cc-fe0f-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f3cc.png b/dist/v-1528953702317/emojis/1f3cc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3cc.png rename to dist/v-1528953702317/emojis/1f3cc.png diff --git a/dist/v-1527758585938/emojis/1f3cd.png b/dist/v-1528953702317/emojis/1f3cd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3cd.png rename to dist/v-1528953702317/emojis/1f3cd.png diff --git a/dist/v-1527758585938/emojis/1f3ce.png b/dist/v-1528953702317/emojis/1f3ce.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ce.png rename to dist/v-1528953702317/emojis/1f3ce.png diff --git a/dist/v-1527758585938/emojis/1f3cf.png b/dist/v-1528953702317/emojis/1f3cf.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3cf.png rename to dist/v-1528953702317/emojis/1f3cf.png diff --git a/dist/v-1527758585938/emojis/1f3d0.png b/dist/v-1528953702317/emojis/1f3d0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d0.png rename to dist/v-1528953702317/emojis/1f3d0.png diff --git a/dist/v-1527758585938/emojis/1f3d1.png b/dist/v-1528953702317/emojis/1f3d1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d1.png rename to dist/v-1528953702317/emojis/1f3d1.png diff --git a/dist/v-1527758585938/emojis/1f3d2.png b/dist/v-1528953702317/emojis/1f3d2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d2.png rename to dist/v-1528953702317/emojis/1f3d2.png diff --git a/dist/v-1527758585938/emojis/1f3d3.png b/dist/v-1528953702317/emojis/1f3d3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d3.png rename to dist/v-1528953702317/emojis/1f3d3.png diff --git a/dist/v-1527758585938/emojis/1f3d4.png b/dist/v-1528953702317/emojis/1f3d4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d4.png rename to dist/v-1528953702317/emojis/1f3d4.png diff --git a/dist/v-1527758585938/emojis/1f3d5.png b/dist/v-1528953702317/emojis/1f3d5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d5.png rename to dist/v-1528953702317/emojis/1f3d5.png diff --git a/dist/v-1527758585938/emojis/1f3d6.png b/dist/v-1528953702317/emojis/1f3d6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d6.png rename to dist/v-1528953702317/emojis/1f3d6.png diff --git a/dist/v-1527758585938/emojis/1f3d7.png b/dist/v-1528953702317/emojis/1f3d7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d7.png rename to dist/v-1528953702317/emojis/1f3d7.png diff --git a/dist/v-1527758585938/emojis/1f3d8.png b/dist/v-1528953702317/emojis/1f3d8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d8.png rename to dist/v-1528953702317/emojis/1f3d8.png diff --git a/dist/v-1527758585938/emojis/1f3d9.png b/dist/v-1528953702317/emojis/1f3d9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3d9.png rename to dist/v-1528953702317/emojis/1f3d9.png diff --git a/dist/v-1527758585938/emojis/1f3da.png b/dist/v-1528953702317/emojis/1f3da.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3da.png rename to dist/v-1528953702317/emojis/1f3da.png diff --git a/dist/v-1527758585938/emojis/1f3db.png b/dist/v-1528953702317/emojis/1f3db.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3db.png rename to dist/v-1528953702317/emojis/1f3db.png diff --git a/dist/v-1527758585938/emojis/1f3dc.png b/dist/v-1528953702317/emojis/1f3dc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3dc.png rename to dist/v-1528953702317/emojis/1f3dc.png diff --git a/dist/v-1527758585938/emojis/1f3dd.png b/dist/v-1528953702317/emojis/1f3dd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3dd.png rename to dist/v-1528953702317/emojis/1f3dd.png diff --git a/dist/v-1527758585938/emojis/1f3de.png b/dist/v-1528953702317/emojis/1f3de.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3de.png rename to dist/v-1528953702317/emojis/1f3de.png diff --git a/dist/v-1527758585938/emojis/1f3df.png b/dist/v-1528953702317/emojis/1f3df.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3df.png rename to dist/v-1528953702317/emojis/1f3df.png diff --git a/dist/v-1527758585938/emojis/1f3e0.png b/dist/v-1528953702317/emojis/1f3e0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e0.png rename to dist/v-1528953702317/emojis/1f3e0.png diff --git a/dist/v-1527758585938/emojis/1f3e1.png b/dist/v-1528953702317/emojis/1f3e1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e1.png rename to dist/v-1528953702317/emojis/1f3e1.png diff --git a/dist/v-1527758585938/emojis/1f3e2.png b/dist/v-1528953702317/emojis/1f3e2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e2.png rename to dist/v-1528953702317/emojis/1f3e2.png diff --git a/dist/v-1527758585938/emojis/1f3e3.png b/dist/v-1528953702317/emojis/1f3e3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e3.png rename to dist/v-1528953702317/emojis/1f3e3.png diff --git a/dist/v-1527758585938/emojis/1f3e4.png b/dist/v-1528953702317/emojis/1f3e4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e4.png rename to dist/v-1528953702317/emojis/1f3e4.png diff --git a/dist/v-1527758585938/emojis/1f3e5.png b/dist/v-1528953702317/emojis/1f3e5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e5.png rename to dist/v-1528953702317/emojis/1f3e5.png diff --git a/dist/v-1527758585938/emojis/1f3e6.png b/dist/v-1528953702317/emojis/1f3e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e6.png rename to dist/v-1528953702317/emojis/1f3e6.png diff --git a/dist/v-1527758585938/emojis/1f3e7.png b/dist/v-1528953702317/emojis/1f3e7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e7.png rename to dist/v-1528953702317/emojis/1f3e7.png diff --git a/dist/v-1527758585938/emojis/1f3e8.png b/dist/v-1528953702317/emojis/1f3e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e8.png rename to dist/v-1528953702317/emojis/1f3e8.png diff --git a/dist/v-1527758585938/emojis/1f3e9.png b/dist/v-1528953702317/emojis/1f3e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3e9.png rename to dist/v-1528953702317/emojis/1f3e9.png diff --git a/dist/v-1527758585938/emojis/1f3ea.png b/dist/v-1528953702317/emojis/1f3ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ea.png rename to dist/v-1528953702317/emojis/1f3ea.png diff --git a/dist/v-1527758585938/emojis/1f3eb.png b/dist/v-1528953702317/emojis/1f3eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3eb.png rename to dist/v-1528953702317/emojis/1f3eb.png diff --git a/dist/v-1527758585938/emojis/1f3ec.png b/dist/v-1528953702317/emojis/1f3ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ec.png rename to dist/v-1528953702317/emojis/1f3ec.png diff --git a/dist/v-1527758585938/emojis/1f3ed.png b/dist/v-1528953702317/emojis/1f3ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ed.png rename to dist/v-1528953702317/emojis/1f3ed.png diff --git a/dist/v-1527758585938/emojis/1f3ee.png b/dist/v-1528953702317/emojis/1f3ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ee.png rename to dist/v-1528953702317/emojis/1f3ee.png diff --git a/dist/v-1527758585938/emojis/1f3ef.png b/dist/v-1528953702317/emojis/1f3ef.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ef.png rename to dist/v-1528953702317/emojis/1f3ef.png diff --git a/dist/v-1527758585938/emojis/1f3f0.png b/dist/v-1528953702317/emojis/1f3f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3f0.png rename to dist/v-1528953702317/emojis/1f3f0.png diff --git a/dist/v-1527758585938/emojis/1f3f3-fe0f-200d-1f308.png b/dist/v-1528953702317/emojis/1f3f3-fe0f-200d-1f308.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3f3-fe0f-200d-1f308.png rename to dist/v-1528953702317/emojis/1f3f3-fe0f-200d-1f308.png diff --git a/dist/v-1527758585938/emojis/1f3f3.png b/dist/v-1528953702317/emojis/1f3f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3f3.png rename to dist/v-1528953702317/emojis/1f3f3.png diff --git a/dist/v-1527758585938/emojis/1f3f4.png b/dist/v-1528953702317/emojis/1f3f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3f4.png rename to dist/v-1528953702317/emojis/1f3f4.png diff --git a/dist/v-1527758585938/emojis/1f3f5.png b/dist/v-1528953702317/emojis/1f3f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3f5.png rename to dist/v-1528953702317/emojis/1f3f5.png diff --git a/dist/v-1527758585938/emojis/1f3f7.png b/dist/v-1528953702317/emojis/1f3f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3f7.png rename to dist/v-1528953702317/emojis/1f3f7.png diff --git a/dist/v-1527758585938/emojis/1f3f8.png b/dist/v-1528953702317/emojis/1f3f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3f8.png rename to dist/v-1528953702317/emojis/1f3f8.png diff --git a/dist/v-1527758585938/emojis/1f3f9.png b/dist/v-1528953702317/emojis/1f3f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3f9.png rename to dist/v-1528953702317/emojis/1f3f9.png diff --git a/dist/v-1527758585938/emojis/1f3fa.png b/dist/v-1528953702317/emojis/1f3fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3fa.png rename to dist/v-1528953702317/emojis/1f3fa.png diff --git a/dist/v-1527758585938/emojis/1f3fb.png b/dist/v-1528953702317/emojis/1f3fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3fb.png rename to dist/v-1528953702317/emojis/1f3fb.png diff --git a/dist/v-1527758585938/emojis/1f3fc.png b/dist/v-1528953702317/emojis/1f3fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3fc.png rename to dist/v-1528953702317/emojis/1f3fc.png diff --git a/dist/v-1527758585938/emojis/1f3fd.png b/dist/v-1528953702317/emojis/1f3fd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3fd.png rename to dist/v-1528953702317/emojis/1f3fd.png diff --git a/dist/v-1527758585938/emojis/1f3fe.png b/dist/v-1528953702317/emojis/1f3fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3fe.png rename to dist/v-1528953702317/emojis/1f3fe.png diff --git a/dist/v-1527758585938/emojis/1f3ff.png b/dist/v-1528953702317/emojis/1f3ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f3ff.png rename to dist/v-1528953702317/emojis/1f3ff.png diff --git a/dist/v-1527758585938/emojis/1f400.png b/dist/v-1528953702317/emojis/1f400.png similarity index 100% rename from dist/v-1527758585938/emojis/1f400.png rename to dist/v-1528953702317/emojis/1f400.png diff --git a/dist/v-1527758585938/emojis/1f401.png b/dist/v-1528953702317/emojis/1f401.png similarity index 100% rename from dist/v-1527758585938/emojis/1f401.png rename to dist/v-1528953702317/emojis/1f401.png diff --git a/dist/v-1527758585938/emojis/1f402.png b/dist/v-1528953702317/emojis/1f402.png similarity index 100% rename from dist/v-1527758585938/emojis/1f402.png rename to dist/v-1528953702317/emojis/1f402.png diff --git a/dist/v-1527758585938/emojis/1f403.png b/dist/v-1528953702317/emojis/1f403.png similarity index 100% rename from dist/v-1527758585938/emojis/1f403.png rename to dist/v-1528953702317/emojis/1f403.png diff --git a/dist/v-1527758585938/emojis/1f404.png b/dist/v-1528953702317/emojis/1f404.png similarity index 100% rename from dist/v-1527758585938/emojis/1f404.png rename to dist/v-1528953702317/emojis/1f404.png diff --git a/dist/v-1527758585938/emojis/1f405.png b/dist/v-1528953702317/emojis/1f405.png similarity index 100% rename from dist/v-1527758585938/emojis/1f405.png rename to dist/v-1528953702317/emojis/1f405.png diff --git a/dist/v-1527758585938/emojis/1f406.png b/dist/v-1528953702317/emojis/1f406.png similarity index 100% rename from dist/v-1527758585938/emojis/1f406.png rename to dist/v-1528953702317/emojis/1f406.png diff --git a/dist/v-1527758585938/emojis/1f407.png b/dist/v-1528953702317/emojis/1f407.png similarity index 100% rename from dist/v-1527758585938/emojis/1f407.png rename to dist/v-1528953702317/emojis/1f407.png diff --git a/dist/v-1527758585938/emojis/1f408.png b/dist/v-1528953702317/emojis/1f408.png similarity index 100% rename from dist/v-1527758585938/emojis/1f408.png rename to dist/v-1528953702317/emojis/1f408.png diff --git a/dist/v-1527758585938/emojis/1f409.png b/dist/v-1528953702317/emojis/1f409.png similarity index 100% rename from dist/v-1527758585938/emojis/1f409.png rename to dist/v-1528953702317/emojis/1f409.png diff --git a/dist/v-1527758585938/emojis/1f40a.png b/dist/v-1528953702317/emojis/1f40a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f40a.png rename to dist/v-1528953702317/emojis/1f40a.png diff --git a/dist/v-1527758585938/emojis/1f40b.png b/dist/v-1528953702317/emojis/1f40b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f40b.png rename to dist/v-1528953702317/emojis/1f40b.png diff --git a/dist/v-1527758585938/emojis/1f40c.png b/dist/v-1528953702317/emojis/1f40c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f40c.png rename to dist/v-1528953702317/emojis/1f40c.png diff --git a/dist/v-1527758585938/emojis/1f40d.png b/dist/v-1528953702317/emojis/1f40d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f40d.png rename to dist/v-1528953702317/emojis/1f40d.png diff --git a/dist/v-1527758585938/emojis/1f40e.png b/dist/v-1528953702317/emojis/1f40e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f40e.png rename to dist/v-1528953702317/emojis/1f40e.png diff --git a/dist/v-1527758585938/emojis/1f40f.png b/dist/v-1528953702317/emojis/1f40f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f40f.png rename to dist/v-1528953702317/emojis/1f40f.png diff --git a/dist/v-1527758585938/emojis/1f410.png b/dist/v-1528953702317/emojis/1f410.png similarity index 100% rename from dist/v-1527758585938/emojis/1f410.png rename to dist/v-1528953702317/emojis/1f410.png diff --git a/dist/v-1527758585938/emojis/1f411.png b/dist/v-1528953702317/emojis/1f411.png similarity index 100% rename from dist/v-1527758585938/emojis/1f411.png rename to dist/v-1528953702317/emojis/1f411.png diff --git a/dist/v-1527758585938/emojis/1f412.png b/dist/v-1528953702317/emojis/1f412.png similarity index 100% rename from dist/v-1527758585938/emojis/1f412.png rename to dist/v-1528953702317/emojis/1f412.png diff --git a/dist/v-1527758585938/emojis/1f413.png b/dist/v-1528953702317/emojis/1f413.png similarity index 100% rename from dist/v-1527758585938/emojis/1f413.png rename to dist/v-1528953702317/emojis/1f413.png diff --git a/dist/v-1527758585938/emojis/1f414.png b/dist/v-1528953702317/emojis/1f414.png similarity index 100% rename from dist/v-1527758585938/emojis/1f414.png rename to dist/v-1528953702317/emojis/1f414.png diff --git a/dist/v-1527758585938/emojis/1f415.png b/dist/v-1528953702317/emojis/1f415.png similarity index 100% rename from dist/v-1527758585938/emojis/1f415.png rename to dist/v-1528953702317/emojis/1f415.png diff --git a/dist/v-1527758585938/emojis/1f416.png b/dist/v-1528953702317/emojis/1f416.png similarity index 100% rename from dist/v-1527758585938/emojis/1f416.png rename to dist/v-1528953702317/emojis/1f416.png diff --git a/dist/v-1527758585938/emojis/1f417.png b/dist/v-1528953702317/emojis/1f417.png similarity index 100% rename from dist/v-1527758585938/emojis/1f417.png rename to dist/v-1528953702317/emojis/1f417.png diff --git a/dist/v-1527758585938/emojis/1f418.png b/dist/v-1528953702317/emojis/1f418.png similarity index 100% rename from dist/v-1527758585938/emojis/1f418.png rename to dist/v-1528953702317/emojis/1f418.png diff --git a/dist/v-1527758585938/emojis/1f419.png b/dist/v-1528953702317/emojis/1f419.png similarity index 100% rename from dist/v-1527758585938/emojis/1f419.png rename to dist/v-1528953702317/emojis/1f419.png diff --git a/dist/v-1527758585938/emojis/1f41a.png b/dist/v-1528953702317/emojis/1f41a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f41a.png rename to dist/v-1528953702317/emojis/1f41a.png diff --git a/dist/v-1527758585938/emojis/1f41b.png b/dist/v-1528953702317/emojis/1f41b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f41b.png rename to dist/v-1528953702317/emojis/1f41b.png diff --git a/dist/v-1527758585938/emojis/1f41c.png b/dist/v-1528953702317/emojis/1f41c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f41c.png rename to dist/v-1528953702317/emojis/1f41c.png diff --git a/dist/v-1527758585938/emojis/1f41d.png b/dist/v-1528953702317/emojis/1f41d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f41d.png rename to dist/v-1528953702317/emojis/1f41d.png diff --git a/dist/v-1527758585938/emojis/1f41e.png b/dist/v-1528953702317/emojis/1f41e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f41e.png rename to dist/v-1528953702317/emojis/1f41e.png diff --git a/dist/v-1527758585938/emojis/1f41f.png b/dist/v-1528953702317/emojis/1f41f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f41f.png rename to dist/v-1528953702317/emojis/1f41f.png diff --git a/dist/v-1527758585938/emojis/1f420.png b/dist/v-1528953702317/emojis/1f420.png similarity index 100% rename from dist/v-1527758585938/emojis/1f420.png rename to dist/v-1528953702317/emojis/1f420.png diff --git a/dist/v-1527758585938/emojis/1f421.png b/dist/v-1528953702317/emojis/1f421.png similarity index 100% rename from dist/v-1527758585938/emojis/1f421.png rename to dist/v-1528953702317/emojis/1f421.png diff --git a/dist/v-1527758585938/emojis/1f422.png b/dist/v-1528953702317/emojis/1f422.png similarity index 100% rename from dist/v-1527758585938/emojis/1f422.png rename to dist/v-1528953702317/emojis/1f422.png diff --git a/dist/v-1527758585938/emojis/1f423.png b/dist/v-1528953702317/emojis/1f423.png similarity index 100% rename from dist/v-1527758585938/emojis/1f423.png rename to dist/v-1528953702317/emojis/1f423.png diff --git a/dist/v-1527758585938/emojis/1f424.png b/dist/v-1528953702317/emojis/1f424.png similarity index 100% rename from dist/v-1527758585938/emojis/1f424.png rename to dist/v-1528953702317/emojis/1f424.png diff --git a/dist/v-1527758585938/emojis/1f425.png b/dist/v-1528953702317/emojis/1f425.png similarity index 100% rename from dist/v-1527758585938/emojis/1f425.png rename to dist/v-1528953702317/emojis/1f425.png diff --git a/dist/v-1527758585938/emojis/1f426.png b/dist/v-1528953702317/emojis/1f426.png similarity index 100% rename from dist/v-1527758585938/emojis/1f426.png rename to dist/v-1528953702317/emojis/1f426.png diff --git a/dist/v-1527758585938/emojis/1f427.png b/dist/v-1528953702317/emojis/1f427.png similarity index 100% rename from dist/v-1527758585938/emojis/1f427.png rename to dist/v-1528953702317/emojis/1f427.png diff --git a/dist/v-1527758585938/emojis/1f428.png b/dist/v-1528953702317/emojis/1f428.png similarity index 100% rename from dist/v-1527758585938/emojis/1f428.png rename to dist/v-1528953702317/emojis/1f428.png diff --git a/dist/v-1527758585938/emojis/1f429.png b/dist/v-1528953702317/emojis/1f429.png similarity index 100% rename from dist/v-1527758585938/emojis/1f429.png rename to dist/v-1528953702317/emojis/1f429.png diff --git a/dist/v-1527758585938/emojis/1f42a.png b/dist/v-1528953702317/emojis/1f42a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f42a.png rename to dist/v-1528953702317/emojis/1f42a.png diff --git a/dist/v-1527758585938/emojis/1f42b.png b/dist/v-1528953702317/emojis/1f42b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f42b.png rename to dist/v-1528953702317/emojis/1f42b.png diff --git a/dist/v-1527758585938/emojis/1f42c.png b/dist/v-1528953702317/emojis/1f42c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f42c.png rename to dist/v-1528953702317/emojis/1f42c.png diff --git a/dist/v-1527758585938/emojis/1f42d.png b/dist/v-1528953702317/emojis/1f42d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f42d.png rename to dist/v-1528953702317/emojis/1f42d.png diff --git a/dist/v-1527758585938/emojis/1f42e.png b/dist/v-1528953702317/emojis/1f42e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f42e.png rename to dist/v-1528953702317/emojis/1f42e.png diff --git a/dist/v-1527758585938/emojis/1f42f.png b/dist/v-1528953702317/emojis/1f42f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f42f.png rename to dist/v-1528953702317/emojis/1f42f.png diff --git a/dist/v-1527758585938/emojis/1f430.png b/dist/v-1528953702317/emojis/1f430.png similarity index 100% rename from dist/v-1527758585938/emojis/1f430.png rename to dist/v-1528953702317/emojis/1f430.png diff --git a/dist/v-1527758585938/emojis/1f431.png b/dist/v-1528953702317/emojis/1f431.png similarity index 100% rename from dist/v-1527758585938/emojis/1f431.png rename to dist/v-1528953702317/emojis/1f431.png diff --git a/dist/v-1527758585938/emojis/1f432.png b/dist/v-1528953702317/emojis/1f432.png similarity index 100% rename from dist/v-1527758585938/emojis/1f432.png rename to dist/v-1528953702317/emojis/1f432.png diff --git a/dist/v-1527758585938/emojis/1f433.png b/dist/v-1528953702317/emojis/1f433.png similarity index 100% rename from dist/v-1527758585938/emojis/1f433.png rename to dist/v-1528953702317/emojis/1f433.png diff --git a/dist/v-1527758585938/emojis/1f434.png b/dist/v-1528953702317/emojis/1f434.png similarity index 100% rename from dist/v-1527758585938/emojis/1f434.png rename to dist/v-1528953702317/emojis/1f434.png diff --git a/dist/v-1527758585938/emojis/1f435.png b/dist/v-1528953702317/emojis/1f435.png similarity index 100% rename from dist/v-1527758585938/emojis/1f435.png rename to dist/v-1528953702317/emojis/1f435.png diff --git a/dist/v-1527758585938/emojis/1f436.png b/dist/v-1528953702317/emojis/1f436.png similarity index 100% rename from dist/v-1527758585938/emojis/1f436.png rename to dist/v-1528953702317/emojis/1f436.png diff --git a/dist/v-1527758585938/emojis/1f437.png b/dist/v-1528953702317/emojis/1f437.png similarity index 100% rename from dist/v-1527758585938/emojis/1f437.png rename to dist/v-1528953702317/emojis/1f437.png diff --git a/dist/v-1527758585938/emojis/1f438.png b/dist/v-1528953702317/emojis/1f438.png similarity index 100% rename from dist/v-1527758585938/emojis/1f438.png rename to dist/v-1528953702317/emojis/1f438.png diff --git a/dist/v-1527758585938/emojis/1f439.png b/dist/v-1528953702317/emojis/1f439.png similarity index 100% rename from dist/v-1527758585938/emojis/1f439.png rename to dist/v-1528953702317/emojis/1f439.png diff --git a/dist/v-1527758585938/emojis/1f43a.png b/dist/v-1528953702317/emojis/1f43a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f43a.png rename to dist/v-1528953702317/emojis/1f43a.png diff --git a/dist/v-1527758585938/emojis/1f43b.png b/dist/v-1528953702317/emojis/1f43b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f43b.png rename to dist/v-1528953702317/emojis/1f43b.png diff --git a/dist/v-1527758585938/emojis/1f43c.png b/dist/v-1528953702317/emojis/1f43c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f43c.png rename to dist/v-1528953702317/emojis/1f43c.png diff --git a/dist/v-1527758585938/emojis/1f43d.png b/dist/v-1528953702317/emojis/1f43d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f43d.png rename to dist/v-1528953702317/emojis/1f43d.png diff --git a/dist/v-1527758585938/emojis/1f43e.png b/dist/v-1528953702317/emojis/1f43e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f43e.png rename to dist/v-1528953702317/emojis/1f43e.png diff --git a/dist/v-1527758585938/emojis/1f43f.png b/dist/v-1528953702317/emojis/1f43f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f43f.png rename to dist/v-1528953702317/emojis/1f43f.png diff --git a/dist/v-1527758585938/emojis/1f440.png b/dist/v-1528953702317/emojis/1f440.png similarity index 100% rename from dist/v-1527758585938/emojis/1f440.png rename to dist/v-1528953702317/emojis/1f440.png diff --git a/dist/v-1527758585938/emojis/1f441.png b/dist/v-1528953702317/emojis/1f441.png similarity index 100% rename from dist/v-1527758585938/emojis/1f441.png rename to dist/v-1528953702317/emojis/1f441.png diff --git a/dist/v-1527758585938/emojis/1f442.png b/dist/v-1528953702317/emojis/1f442.png similarity index 100% rename from dist/v-1527758585938/emojis/1f442.png rename to dist/v-1528953702317/emojis/1f442.png diff --git a/dist/v-1527758585938/emojis/1f443.png b/dist/v-1528953702317/emojis/1f443.png similarity index 100% rename from dist/v-1527758585938/emojis/1f443.png rename to dist/v-1528953702317/emojis/1f443.png diff --git a/dist/v-1527758585938/emojis/1f444.png b/dist/v-1528953702317/emojis/1f444.png similarity index 100% rename from dist/v-1527758585938/emojis/1f444.png rename to dist/v-1528953702317/emojis/1f444.png diff --git a/dist/v-1527758585938/emojis/1f445.png b/dist/v-1528953702317/emojis/1f445.png similarity index 100% rename from dist/v-1527758585938/emojis/1f445.png rename to dist/v-1528953702317/emojis/1f445.png diff --git a/dist/v-1527758585938/emojis/1f446.png b/dist/v-1528953702317/emojis/1f446.png similarity index 100% rename from dist/v-1527758585938/emojis/1f446.png rename to dist/v-1528953702317/emojis/1f446.png diff --git a/dist/v-1527758585938/emojis/1f447.png b/dist/v-1528953702317/emojis/1f447.png similarity index 100% rename from dist/v-1527758585938/emojis/1f447.png rename to dist/v-1528953702317/emojis/1f447.png diff --git a/dist/v-1527758585938/emojis/1f448.png b/dist/v-1528953702317/emojis/1f448.png similarity index 100% rename from dist/v-1527758585938/emojis/1f448.png rename to dist/v-1528953702317/emojis/1f448.png diff --git a/dist/v-1527758585938/emojis/1f449.png b/dist/v-1528953702317/emojis/1f449.png similarity index 100% rename from dist/v-1527758585938/emojis/1f449.png rename to dist/v-1528953702317/emojis/1f449.png diff --git a/dist/v-1527758585938/emojis/1f44a.png b/dist/v-1528953702317/emojis/1f44a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f44a.png rename to dist/v-1528953702317/emojis/1f44a.png diff --git a/dist/v-1527758585938/emojis/1f44b.png b/dist/v-1528953702317/emojis/1f44b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f44b.png rename to dist/v-1528953702317/emojis/1f44b.png diff --git a/dist/v-1527758585938/emojis/1f44c.png b/dist/v-1528953702317/emojis/1f44c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f44c.png rename to dist/v-1528953702317/emojis/1f44c.png diff --git a/dist/v-1527758585938/emojis/1f44d.png b/dist/v-1528953702317/emojis/1f44d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f44d.png rename to dist/v-1528953702317/emojis/1f44d.png diff --git a/dist/v-1527758585938/emojis/1f44e.png b/dist/v-1528953702317/emojis/1f44e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f44e.png rename to dist/v-1528953702317/emojis/1f44e.png diff --git a/dist/v-1527758585938/emojis/1f44f.png b/dist/v-1528953702317/emojis/1f44f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f44f.png rename to dist/v-1528953702317/emojis/1f44f.png diff --git a/dist/v-1527758585938/emojis/1f450.png b/dist/v-1528953702317/emojis/1f450.png similarity index 100% rename from dist/v-1527758585938/emojis/1f450.png rename to dist/v-1528953702317/emojis/1f450.png diff --git a/dist/v-1527758585938/emojis/1f451.png b/dist/v-1528953702317/emojis/1f451.png similarity index 100% rename from dist/v-1527758585938/emojis/1f451.png rename to dist/v-1528953702317/emojis/1f451.png diff --git a/dist/v-1527758585938/emojis/1f452.png b/dist/v-1528953702317/emojis/1f452.png similarity index 100% rename from dist/v-1527758585938/emojis/1f452.png rename to dist/v-1528953702317/emojis/1f452.png diff --git a/dist/v-1527758585938/emojis/1f453.png b/dist/v-1528953702317/emojis/1f453.png similarity index 100% rename from dist/v-1527758585938/emojis/1f453.png rename to dist/v-1528953702317/emojis/1f453.png diff --git a/dist/v-1527758585938/emojis/1f454.png b/dist/v-1528953702317/emojis/1f454.png similarity index 100% rename from dist/v-1527758585938/emojis/1f454.png rename to dist/v-1528953702317/emojis/1f454.png diff --git a/dist/v-1527758585938/emojis/1f455.png b/dist/v-1528953702317/emojis/1f455.png similarity index 100% rename from dist/v-1527758585938/emojis/1f455.png rename to dist/v-1528953702317/emojis/1f455.png diff --git a/dist/v-1527758585938/emojis/1f456.png b/dist/v-1528953702317/emojis/1f456.png similarity index 100% rename from dist/v-1527758585938/emojis/1f456.png rename to dist/v-1528953702317/emojis/1f456.png diff --git a/dist/v-1527758585938/emojis/1f457.png b/dist/v-1528953702317/emojis/1f457.png similarity index 100% rename from dist/v-1527758585938/emojis/1f457.png rename to dist/v-1528953702317/emojis/1f457.png diff --git a/dist/v-1527758585938/emojis/1f458.png b/dist/v-1528953702317/emojis/1f458.png similarity index 100% rename from dist/v-1527758585938/emojis/1f458.png rename to dist/v-1528953702317/emojis/1f458.png diff --git a/dist/v-1527758585938/emojis/1f459.png b/dist/v-1528953702317/emojis/1f459.png similarity index 100% rename from dist/v-1527758585938/emojis/1f459.png rename to dist/v-1528953702317/emojis/1f459.png diff --git a/dist/v-1527758585938/emojis/1f45a.png b/dist/v-1528953702317/emojis/1f45a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f45a.png rename to dist/v-1528953702317/emojis/1f45a.png diff --git a/dist/v-1527758585938/emojis/1f45b.png b/dist/v-1528953702317/emojis/1f45b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f45b.png rename to dist/v-1528953702317/emojis/1f45b.png diff --git a/dist/v-1527758585938/emojis/1f45c.png b/dist/v-1528953702317/emojis/1f45c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f45c.png rename to dist/v-1528953702317/emojis/1f45c.png diff --git a/dist/v-1527758585938/emojis/1f45d.png b/dist/v-1528953702317/emojis/1f45d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f45d.png rename to dist/v-1528953702317/emojis/1f45d.png diff --git a/dist/v-1527758585938/emojis/1f45e.png b/dist/v-1528953702317/emojis/1f45e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f45e.png rename to dist/v-1528953702317/emojis/1f45e.png diff --git a/dist/v-1527758585938/emojis/1f45f.png b/dist/v-1528953702317/emojis/1f45f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f45f.png rename to dist/v-1528953702317/emojis/1f45f.png diff --git a/dist/v-1527758585938/emojis/1f460.png b/dist/v-1528953702317/emojis/1f460.png similarity index 100% rename from dist/v-1527758585938/emojis/1f460.png rename to dist/v-1528953702317/emojis/1f460.png diff --git a/dist/v-1527758585938/emojis/1f461.png b/dist/v-1528953702317/emojis/1f461.png similarity index 100% rename from dist/v-1527758585938/emojis/1f461.png rename to dist/v-1528953702317/emojis/1f461.png diff --git a/dist/v-1527758585938/emojis/1f462.png b/dist/v-1528953702317/emojis/1f462.png similarity index 100% rename from dist/v-1527758585938/emojis/1f462.png rename to dist/v-1528953702317/emojis/1f462.png diff --git a/dist/v-1527758585938/emojis/1f463.png b/dist/v-1528953702317/emojis/1f463.png similarity index 100% rename from dist/v-1527758585938/emojis/1f463.png rename to dist/v-1528953702317/emojis/1f463.png diff --git a/dist/v-1527758585938/emojis/1f464.png b/dist/v-1528953702317/emojis/1f464.png similarity index 100% rename from dist/v-1527758585938/emojis/1f464.png rename to dist/v-1528953702317/emojis/1f464.png diff --git a/dist/v-1527758585938/emojis/1f465.png b/dist/v-1528953702317/emojis/1f465.png similarity index 100% rename from dist/v-1527758585938/emojis/1f465.png rename to dist/v-1528953702317/emojis/1f465.png diff --git a/dist/v-1527758585938/emojis/1f466.png b/dist/v-1528953702317/emojis/1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f466.png rename to dist/v-1528953702317/emojis/1f466.png diff --git a/dist/v-1527758585938/emojis/1f467.png b/dist/v-1528953702317/emojis/1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f467.png rename to dist/v-1528953702317/emojis/1f467.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f33e.png b/dist/v-1528953702317/emojis/1f468-200d-1f33e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f33e.png rename to dist/v-1528953702317/emojis/1f468-200d-1f33e.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f373.png b/dist/v-1528953702317/emojis/1f468-200d-1f373.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f373.png rename to dist/v-1528953702317/emojis/1f468-200d-1f373.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f393.png b/dist/v-1528953702317/emojis/1f468-200d-1f393.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f393.png rename to dist/v-1528953702317/emojis/1f468-200d-1f393.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f3a4.png b/dist/v-1528953702317/emojis/1f468-200d-1f3a4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f3a4.png rename to dist/v-1528953702317/emojis/1f468-200d-1f3a4.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f3a8.png b/dist/v-1528953702317/emojis/1f468-200d-1f3a8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f3a8.png rename to dist/v-1528953702317/emojis/1f468-200d-1f3a8.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f3eb.png b/dist/v-1528953702317/emojis/1f468-200d-1f3eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f3eb.png rename to dist/v-1528953702317/emojis/1f468-200d-1f3eb.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f3ed.png b/dist/v-1528953702317/emojis/1f468-200d-1f3ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f3ed.png rename to dist/v-1528953702317/emojis/1f468-200d-1f3ed.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f466-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f466-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f466-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f467-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f467-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f467-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f467-200d-1f467.png b/dist/v-1528953702317/emojis/1f468-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f467-200d-1f467.png rename to dist/v-1528953702317/emojis/1f468-200d-1f467-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f467.png b/dist/v-1528953702317/emojis/1f468-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f467.png rename to dist/v-1528953702317/emojis/1f468-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png b/dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png rename to dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f467.png b/dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f468-200d-1f467.png rename to dist/v-1528953702317/emojis/1f468-200d-1f468-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png b/dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png rename to dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png b/dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png rename to dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f467.png b/dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f469-200d-1f467.png rename to dist/v-1528953702317/emojis/1f468-200d-1f469-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f4bb.png b/dist/v-1528953702317/emojis/1f468-200d-1f4bb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f4bb.png rename to dist/v-1528953702317/emojis/1f468-200d-1f4bb.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f4bc.png b/dist/v-1528953702317/emojis/1f468-200d-1f4bc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f4bc.png rename to dist/v-1528953702317/emojis/1f468-200d-1f4bc.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f527.png b/dist/v-1528953702317/emojis/1f468-200d-1f527.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f527.png rename to dist/v-1528953702317/emojis/1f468-200d-1f527.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f52c.png b/dist/v-1528953702317/emojis/1f468-200d-1f52c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f52c.png rename to dist/v-1528953702317/emojis/1f468-200d-1f52c.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f680.png b/dist/v-1528953702317/emojis/1f468-200d-1f680.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f680.png rename to dist/v-1528953702317/emojis/1f468-200d-1f680.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-1f692.png b/dist/v-1528953702317/emojis/1f468-200d-1f692.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-1f692.png rename to dist/v-1528953702317/emojis/1f468-200d-1f692.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-2695-fe0f.png b/dist/v-1528953702317/emojis/1f468-200d-2695-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-2695-fe0f.png rename to dist/v-1528953702317/emojis/1f468-200d-2695-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-2696-fe0f.png b/dist/v-1528953702317/emojis/1f468-200d-2696-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-2696-fe0f.png rename to dist/v-1528953702317/emojis/1f468-200d-2696-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-2708-fe0f.png b/dist/v-1528953702317/emojis/1f468-200d-2708-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-2708-fe0f.png rename to dist/v-1528953702317/emojis/1f468-200d-2708-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-2764-fe0f-200d-1f468.png b/dist/v-1528953702317/emojis/1f468-200d-2764-fe0f-200d-1f468.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-2764-fe0f-200d-1f468.png rename to dist/v-1528953702317/emojis/1f468-200d-2764-fe0f-200d-1f468.png diff --git a/dist/v-1527758585938/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png b/dist/v-1528953702317/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png rename to dist/v-1528953702317/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png diff --git a/dist/v-1527758585938/emojis/1f468.png b/dist/v-1528953702317/emojis/1f468.png similarity index 100% rename from dist/v-1527758585938/emojis/1f468.png rename to dist/v-1528953702317/emojis/1f468.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f33e.png b/dist/v-1528953702317/emojis/1f469-200d-1f33e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f33e.png rename to dist/v-1528953702317/emojis/1f469-200d-1f33e.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f373.png b/dist/v-1528953702317/emojis/1f469-200d-1f373.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f373.png rename to dist/v-1528953702317/emojis/1f469-200d-1f373.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f393.png b/dist/v-1528953702317/emojis/1f469-200d-1f393.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f393.png rename to dist/v-1528953702317/emojis/1f469-200d-1f393.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f3a4.png b/dist/v-1528953702317/emojis/1f469-200d-1f3a4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f3a4.png rename to dist/v-1528953702317/emojis/1f469-200d-1f3a4.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f3a8.png b/dist/v-1528953702317/emojis/1f469-200d-1f3a8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f3a8.png rename to dist/v-1528953702317/emojis/1f469-200d-1f3a8.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f3eb.png b/dist/v-1528953702317/emojis/1f469-200d-1f3eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f3eb.png rename to dist/v-1528953702317/emojis/1f469-200d-1f3eb.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f3ed.png b/dist/v-1528953702317/emojis/1f469-200d-1f3ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f3ed.png rename to dist/v-1528953702317/emojis/1f469-200d-1f3ed.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f466-200d-1f466.png b/dist/v-1528953702317/emojis/1f469-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f466-200d-1f466.png rename to dist/v-1528953702317/emojis/1f469-200d-1f466-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f466.png b/dist/v-1528953702317/emojis/1f469-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f466.png rename to dist/v-1528953702317/emojis/1f469-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f467-200d-1f466.png b/dist/v-1528953702317/emojis/1f469-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f467-200d-1f466.png rename to dist/v-1528953702317/emojis/1f469-200d-1f467-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f467-200d-1f467.png b/dist/v-1528953702317/emojis/1f469-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f467-200d-1f467.png rename to dist/v-1528953702317/emojis/1f469-200d-1f467-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f467.png b/dist/v-1528953702317/emojis/1f469-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f467.png rename to dist/v-1528953702317/emojis/1f469-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png b/dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png rename to dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f466.png b/dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f466.png rename to dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png b/dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png rename to dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png b/dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png rename to dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f467.png b/dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f467.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f469-200d-1f467.png rename to dist/v-1528953702317/emojis/1f469-200d-1f469-200d-1f467.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f4bb.png b/dist/v-1528953702317/emojis/1f469-200d-1f4bb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f4bb.png rename to dist/v-1528953702317/emojis/1f469-200d-1f4bb.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f4bc.png b/dist/v-1528953702317/emojis/1f469-200d-1f4bc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f4bc.png rename to dist/v-1528953702317/emojis/1f469-200d-1f4bc.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f527.png b/dist/v-1528953702317/emojis/1f469-200d-1f527.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f527.png rename to dist/v-1528953702317/emojis/1f469-200d-1f527.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f52c.png b/dist/v-1528953702317/emojis/1f469-200d-1f52c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f52c.png rename to dist/v-1528953702317/emojis/1f469-200d-1f52c.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f680.png b/dist/v-1528953702317/emojis/1f469-200d-1f680.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f680.png rename to dist/v-1528953702317/emojis/1f469-200d-1f680.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-1f692.png b/dist/v-1528953702317/emojis/1f469-200d-1f692.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-1f692.png rename to dist/v-1528953702317/emojis/1f469-200d-1f692.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-2695-fe0f.png b/dist/v-1528953702317/emojis/1f469-200d-2695-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-2695-fe0f.png rename to dist/v-1528953702317/emojis/1f469-200d-2695-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-2696-fe0f.png b/dist/v-1528953702317/emojis/1f469-200d-2696-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-2696-fe0f.png rename to dist/v-1528953702317/emojis/1f469-200d-2696-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-2708-fe0f.png b/dist/v-1528953702317/emojis/1f469-200d-2708-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-2708-fe0f.png rename to dist/v-1528953702317/emojis/1f469-200d-2708-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-2764-fe0f-200d-1f468.png b/dist/v-1528953702317/emojis/1f469-200d-2764-fe0f-200d-1f468.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-2764-fe0f-200d-1f468.png rename to dist/v-1528953702317/emojis/1f469-200d-2764-fe0f-200d-1f468.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-2764-fe0f-200d-1f469.png b/dist/v-1528953702317/emojis/1f469-200d-2764-fe0f-200d-1f469.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-2764-fe0f-200d-1f469.png rename to dist/v-1528953702317/emojis/1f469-200d-2764-fe0f-200d-1f469.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png b/dist/v-1528953702317/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png rename to dist/v-1528953702317/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f468.png diff --git a/dist/v-1527758585938/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png b/dist/v-1528953702317/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png rename to dist/v-1528953702317/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png diff --git a/dist/v-1527758585938/emojis/1f469.png b/dist/v-1528953702317/emojis/1f469.png similarity index 100% rename from dist/v-1527758585938/emojis/1f469.png rename to dist/v-1528953702317/emojis/1f469.png diff --git a/dist/v-1527758585938/emojis/1f46a.png b/dist/v-1528953702317/emojis/1f46a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46a.png rename to dist/v-1528953702317/emojis/1f46a.png diff --git a/dist/v-1527758585938/emojis/1f46b.png b/dist/v-1528953702317/emojis/1f46b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46b.png rename to dist/v-1528953702317/emojis/1f46b.png diff --git a/dist/v-1527758585938/emojis/1f46c.png b/dist/v-1528953702317/emojis/1f46c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46c.png rename to dist/v-1528953702317/emojis/1f46c.png diff --git a/dist/v-1527758585938/emojis/1f46d.png b/dist/v-1528953702317/emojis/1f46d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46d.png rename to dist/v-1528953702317/emojis/1f46d.png diff --git a/dist/v-1527758585938/emojis/1f46e-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f46e-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46e-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f46e-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f46e-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f46e-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46e-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f46e-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f46e.png b/dist/v-1528953702317/emojis/1f46e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46e.png rename to dist/v-1528953702317/emojis/1f46e.png diff --git a/dist/v-1527758585938/emojis/1f46f-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f46f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46f-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f46f-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f46f-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f46f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46f-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f46f-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f46f.png b/dist/v-1528953702317/emojis/1f46f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f46f.png rename to dist/v-1528953702317/emojis/1f46f.png diff --git a/dist/v-1527758585938/emojis/1f470.png b/dist/v-1528953702317/emojis/1f470.png similarity index 100% rename from dist/v-1527758585938/emojis/1f470.png rename to dist/v-1528953702317/emojis/1f470.png diff --git a/dist/v-1527758585938/emojis/1f471-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f471-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f471-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f471-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f471-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f471-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f471-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f471-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f471.png b/dist/v-1528953702317/emojis/1f471.png similarity index 100% rename from dist/v-1527758585938/emojis/1f471.png rename to dist/v-1528953702317/emojis/1f471.png diff --git a/dist/v-1527758585938/emojis/1f472.png b/dist/v-1528953702317/emojis/1f472.png similarity index 100% rename from dist/v-1527758585938/emojis/1f472.png rename to dist/v-1528953702317/emojis/1f472.png diff --git a/dist/v-1527758585938/emojis/1f473-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f473-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f473-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f473-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f473-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f473-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f473-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f473-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f473.png b/dist/v-1528953702317/emojis/1f473.png similarity index 100% rename from dist/v-1527758585938/emojis/1f473.png rename to dist/v-1528953702317/emojis/1f473.png diff --git a/dist/v-1527758585938/emojis/1f474.png b/dist/v-1528953702317/emojis/1f474.png similarity index 100% rename from dist/v-1527758585938/emojis/1f474.png rename to dist/v-1528953702317/emojis/1f474.png diff --git a/dist/v-1527758585938/emojis/1f475.png b/dist/v-1528953702317/emojis/1f475.png similarity index 100% rename from dist/v-1527758585938/emojis/1f475.png rename to dist/v-1528953702317/emojis/1f475.png diff --git a/dist/v-1527758585938/emojis/1f476.png b/dist/v-1528953702317/emojis/1f476.png similarity index 100% rename from dist/v-1527758585938/emojis/1f476.png rename to dist/v-1528953702317/emojis/1f476.png diff --git a/dist/v-1527758585938/emojis/1f477-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f477-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f477-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f477-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f477-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f477-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f477-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f477-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f477.png b/dist/v-1528953702317/emojis/1f477.png similarity index 100% rename from dist/v-1527758585938/emojis/1f477.png rename to dist/v-1528953702317/emojis/1f477.png diff --git a/dist/v-1527758585938/emojis/1f478.png b/dist/v-1528953702317/emojis/1f478.png similarity index 100% rename from dist/v-1527758585938/emojis/1f478.png rename to dist/v-1528953702317/emojis/1f478.png diff --git a/dist/v-1527758585938/emojis/1f479.png b/dist/v-1528953702317/emojis/1f479.png similarity index 100% rename from dist/v-1527758585938/emojis/1f479.png rename to dist/v-1528953702317/emojis/1f479.png diff --git a/dist/v-1527758585938/emojis/1f47a.png b/dist/v-1528953702317/emojis/1f47a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f47a.png rename to dist/v-1528953702317/emojis/1f47a.png diff --git a/dist/v-1527758585938/emojis/1f47b.png b/dist/v-1528953702317/emojis/1f47b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f47b.png rename to dist/v-1528953702317/emojis/1f47b.png diff --git a/dist/v-1527758585938/emojis/1f47c.png b/dist/v-1528953702317/emojis/1f47c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f47c.png rename to dist/v-1528953702317/emojis/1f47c.png diff --git a/dist/v-1527758585938/emojis/1f47d.png b/dist/v-1528953702317/emojis/1f47d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f47d.png rename to dist/v-1528953702317/emojis/1f47d.png diff --git a/dist/v-1527758585938/emojis/1f47e.png b/dist/v-1528953702317/emojis/1f47e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f47e.png rename to dist/v-1528953702317/emojis/1f47e.png diff --git a/dist/v-1527758585938/emojis/1f47f.png b/dist/v-1528953702317/emojis/1f47f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f47f.png rename to dist/v-1528953702317/emojis/1f47f.png diff --git a/dist/v-1527758585938/emojis/1f480.png b/dist/v-1528953702317/emojis/1f480.png similarity index 100% rename from dist/v-1527758585938/emojis/1f480.png rename to dist/v-1528953702317/emojis/1f480.png diff --git a/dist/v-1527758585938/emojis/1f481-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f481-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f481-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f481-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f481-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f481-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f481-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f481-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f481.png b/dist/v-1528953702317/emojis/1f481.png similarity index 100% rename from dist/v-1527758585938/emojis/1f481.png rename to dist/v-1528953702317/emojis/1f481.png diff --git a/dist/v-1527758585938/emojis/1f482-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f482-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f482-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f482-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f482-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f482-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f482-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f482-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f482.png b/dist/v-1528953702317/emojis/1f482.png similarity index 100% rename from dist/v-1527758585938/emojis/1f482.png rename to dist/v-1528953702317/emojis/1f482.png diff --git a/dist/v-1527758585938/emojis/1f483.png b/dist/v-1528953702317/emojis/1f483.png similarity index 100% rename from dist/v-1527758585938/emojis/1f483.png rename to dist/v-1528953702317/emojis/1f483.png diff --git a/dist/v-1527758585938/emojis/1f484.png b/dist/v-1528953702317/emojis/1f484.png similarity index 100% rename from dist/v-1527758585938/emojis/1f484.png rename to dist/v-1528953702317/emojis/1f484.png diff --git a/dist/v-1527758585938/emojis/1f485.png b/dist/v-1528953702317/emojis/1f485.png similarity index 100% rename from dist/v-1527758585938/emojis/1f485.png rename to dist/v-1528953702317/emojis/1f485.png diff --git a/dist/v-1527758585938/emojis/1f486-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f486-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f486-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f486-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f486-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f486-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f486-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f486-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f486.png b/dist/v-1528953702317/emojis/1f486.png similarity index 100% rename from dist/v-1527758585938/emojis/1f486.png rename to dist/v-1528953702317/emojis/1f486.png diff --git a/dist/v-1527758585938/emojis/1f487-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f487-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f487-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f487-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f487-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f487-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f487-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f487-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f487.png b/dist/v-1528953702317/emojis/1f487.png similarity index 100% rename from dist/v-1527758585938/emojis/1f487.png rename to dist/v-1528953702317/emojis/1f487.png diff --git a/dist/v-1527758585938/emojis/1f488.png b/dist/v-1528953702317/emojis/1f488.png similarity index 100% rename from dist/v-1527758585938/emojis/1f488.png rename to dist/v-1528953702317/emojis/1f488.png diff --git a/dist/v-1527758585938/emojis/1f489.png b/dist/v-1528953702317/emojis/1f489.png similarity index 100% rename from dist/v-1527758585938/emojis/1f489.png rename to dist/v-1528953702317/emojis/1f489.png diff --git a/dist/v-1527758585938/emojis/1f48a.png b/dist/v-1528953702317/emojis/1f48a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f48a.png rename to dist/v-1528953702317/emojis/1f48a.png diff --git a/dist/v-1527758585938/emojis/1f48b.png b/dist/v-1528953702317/emojis/1f48b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f48b.png rename to dist/v-1528953702317/emojis/1f48b.png diff --git a/dist/v-1527758585938/emojis/1f48c.png b/dist/v-1528953702317/emojis/1f48c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f48c.png rename to dist/v-1528953702317/emojis/1f48c.png diff --git a/dist/v-1527758585938/emojis/1f48d.png b/dist/v-1528953702317/emojis/1f48d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f48d.png rename to dist/v-1528953702317/emojis/1f48d.png diff --git a/dist/v-1527758585938/emojis/1f48e.png b/dist/v-1528953702317/emojis/1f48e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f48e.png rename to dist/v-1528953702317/emojis/1f48e.png diff --git a/dist/v-1527758585938/emojis/1f48f.png b/dist/v-1528953702317/emojis/1f48f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f48f.png rename to dist/v-1528953702317/emojis/1f48f.png diff --git a/dist/v-1527758585938/emojis/1f490.png b/dist/v-1528953702317/emojis/1f490.png similarity index 100% rename from dist/v-1527758585938/emojis/1f490.png rename to dist/v-1528953702317/emojis/1f490.png diff --git a/dist/v-1527758585938/emojis/1f491.png b/dist/v-1528953702317/emojis/1f491.png similarity index 100% rename from dist/v-1527758585938/emojis/1f491.png rename to dist/v-1528953702317/emojis/1f491.png diff --git a/dist/v-1527758585938/emojis/1f492.png b/dist/v-1528953702317/emojis/1f492.png similarity index 100% rename from dist/v-1527758585938/emojis/1f492.png rename to dist/v-1528953702317/emojis/1f492.png diff --git a/dist/v-1527758585938/emojis/1f493.png b/dist/v-1528953702317/emojis/1f493.png similarity index 100% rename from dist/v-1527758585938/emojis/1f493.png rename to dist/v-1528953702317/emojis/1f493.png diff --git a/dist/v-1527758585938/emojis/1f494.png b/dist/v-1528953702317/emojis/1f494.png similarity index 100% rename from dist/v-1527758585938/emojis/1f494.png rename to dist/v-1528953702317/emojis/1f494.png diff --git a/dist/v-1527758585938/emojis/1f495.png b/dist/v-1528953702317/emojis/1f495.png similarity index 100% rename from dist/v-1527758585938/emojis/1f495.png rename to dist/v-1528953702317/emojis/1f495.png diff --git a/dist/v-1527758585938/emojis/1f496.png b/dist/v-1528953702317/emojis/1f496.png similarity index 100% rename from dist/v-1527758585938/emojis/1f496.png rename to dist/v-1528953702317/emojis/1f496.png diff --git a/dist/v-1527758585938/emojis/1f497.png b/dist/v-1528953702317/emojis/1f497.png similarity index 100% rename from dist/v-1527758585938/emojis/1f497.png rename to dist/v-1528953702317/emojis/1f497.png diff --git a/dist/v-1527758585938/emojis/1f498.png b/dist/v-1528953702317/emojis/1f498.png similarity index 100% rename from dist/v-1527758585938/emojis/1f498.png rename to dist/v-1528953702317/emojis/1f498.png diff --git a/dist/v-1527758585938/emojis/1f499.png b/dist/v-1528953702317/emojis/1f499.png similarity index 100% rename from dist/v-1527758585938/emojis/1f499.png rename to dist/v-1528953702317/emojis/1f499.png diff --git a/dist/v-1527758585938/emojis/1f49a.png b/dist/v-1528953702317/emojis/1f49a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f49a.png rename to dist/v-1528953702317/emojis/1f49a.png diff --git a/dist/v-1527758585938/emojis/1f49b.png b/dist/v-1528953702317/emojis/1f49b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f49b.png rename to dist/v-1528953702317/emojis/1f49b.png diff --git a/dist/v-1527758585938/emojis/1f49c.png b/dist/v-1528953702317/emojis/1f49c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f49c.png rename to dist/v-1528953702317/emojis/1f49c.png diff --git a/dist/v-1527758585938/emojis/1f49d.png b/dist/v-1528953702317/emojis/1f49d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f49d.png rename to dist/v-1528953702317/emojis/1f49d.png diff --git a/dist/v-1527758585938/emojis/1f49e.png b/dist/v-1528953702317/emojis/1f49e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f49e.png rename to dist/v-1528953702317/emojis/1f49e.png diff --git a/dist/v-1527758585938/emojis/1f49f.png b/dist/v-1528953702317/emojis/1f49f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f49f.png rename to dist/v-1528953702317/emojis/1f49f.png diff --git a/dist/v-1527758585938/emojis/1f4a0.png b/dist/v-1528953702317/emojis/1f4a0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a0.png rename to dist/v-1528953702317/emojis/1f4a0.png diff --git a/dist/v-1527758585938/emojis/1f4a1.png b/dist/v-1528953702317/emojis/1f4a1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a1.png rename to dist/v-1528953702317/emojis/1f4a1.png diff --git a/dist/v-1527758585938/emojis/1f4a2.png b/dist/v-1528953702317/emojis/1f4a2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a2.png rename to dist/v-1528953702317/emojis/1f4a2.png diff --git a/dist/v-1527758585938/emojis/1f4a3.png b/dist/v-1528953702317/emojis/1f4a3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a3.png rename to dist/v-1528953702317/emojis/1f4a3.png diff --git a/dist/v-1527758585938/emojis/1f4a4.png b/dist/v-1528953702317/emojis/1f4a4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a4.png rename to dist/v-1528953702317/emojis/1f4a4.png diff --git a/dist/v-1527758585938/emojis/1f4a5.png b/dist/v-1528953702317/emojis/1f4a5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a5.png rename to dist/v-1528953702317/emojis/1f4a5.png diff --git a/dist/v-1527758585938/emojis/1f4a6.png b/dist/v-1528953702317/emojis/1f4a6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a6.png rename to dist/v-1528953702317/emojis/1f4a6.png diff --git a/dist/v-1527758585938/emojis/1f4a7.png b/dist/v-1528953702317/emojis/1f4a7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a7.png rename to dist/v-1528953702317/emojis/1f4a7.png diff --git a/dist/v-1527758585938/emojis/1f4a8.png b/dist/v-1528953702317/emojis/1f4a8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a8.png rename to dist/v-1528953702317/emojis/1f4a8.png diff --git a/dist/v-1527758585938/emojis/1f4a9.png b/dist/v-1528953702317/emojis/1f4a9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4a9.png rename to dist/v-1528953702317/emojis/1f4a9.png diff --git a/dist/v-1527758585938/emojis/1f4aa.png b/dist/v-1528953702317/emojis/1f4aa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4aa.png rename to dist/v-1528953702317/emojis/1f4aa.png diff --git a/dist/v-1527758585938/emojis/1f4ab.png b/dist/v-1528953702317/emojis/1f4ab.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ab.png rename to dist/v-1528953702317/emojis/1f4ab.png diff --git a/dist/v-1527758585938/emojis/1f4ac.png b/dist/v-1528953702317/emojis/1f4ac.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ac.png rename to dist/v-1528953702317/emojis/1f4ac.png diff --git a/dist/v-1527758585938/emojis/1f4ad.png b/dist/v-1528953702317/emojis/1f4ad.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ad.png rename to dist/v-1528953702317/emojis/1f4ad.png diff --git a/dist/v-1527758585938/emojis/1f4ae.png b/dist/v-1528953702317/emojis/1f4ae.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ae.png rename to dist/v-1528953702317/emojis/1f4ae.png diff --git a/dist/v-1527758585938/emojis/1f4af.png b/dist/v-1528953702317/emojis/1f4af.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4af.png rename to dist/v-1528953702317/emojis/1f4af.png diff --git a/dist/v-1527758585938/emojis/1f4b0.png b/dist/v-1528953702317/emojis/1f4b0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b0.png rename to dist/v-1528953702317/emojis/1f4b0.png diff --git a/dist/v-1527758585938/emojis/1f4b1.png b/dist/v-1528953702317/emojis/1f4b1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b1.png rename to dist/v-1528953702317/emojis/1f4b1.png diff --git a/dist/v-1527758585938/emojis/1f4b2.png b/dist/v-1528953702317/emojis/1f4b2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b2.png rename to dist/v-1528953702317/emojis/1f4b2.png diff --git a/dist/v-1527758585938/emojis/1f4b3.png b/dist/v-1528953702317/emojis/1f4b3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b3.png rename to dist/v-1528953702317/emojis/1f4b3.png diff --git a/dist/v-1527758585938/emojis/1f4b4.png b/dist/v-1528953702317/emojis/1f4b4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b4.png rename to dist/v-1528953702317/emojis/1f4b4.png diff --git a/dist/v-1527758585938/emojis/1f4b5.png b/dist/v-1528953702317/emojis/1f4b5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b5.png rename to dist/v-1528953702317/emojis/1f4b5.png diff --git a/dist/v-1527758585938/emojis/1f4b6.png b/dist/v-1528953702317/emojis/1f4b6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b6.png rename to dist/v-1528953702317/emojis/1f4b6.png diff --git a/dist/v-1527758585938/emojis/1f4b7.png b/dist/v-1528953702317/emojis/1f4b7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b7.png rename to dist/v-1528953702317/emojis/1f4b7.png diff --git a/dist/v-1527758585938/emojis/1f4b8.png b/dist/v-1528953702317/emojis/1f4b8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b8.png rename to dist/v-1528953702317/emojis/1f4b8.png diff --git a/dist/v-1527758585938/emojis/1f4b9.png b/dist/v-1528953702317/emojis/1f4b9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4b9.png rename to dist/v-1528953702317/emojis/1f4b9.png diff --git a/dist/v-1527758585938/emojis/1f4ba.png b/dist/v-1528953702317/emojis/1f4ba.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ba.png rename to dist/v-1528953702317/emojis/1f4ba.png diff --git a/dist/v-1527758585938/emojis/1f4bb.png b/dist/v-1528953702317/emojis/1f4bb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4bb.png rename to dist/v-1528953702317/emojis/1f4bb.png diff --git a/dist/v-1527758585938/emojis/1f4bc.png b/dist/v-1528953702317/emojis/1f4bc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4bc.png rename to dist/v-1528953702317/emojis/1f4bc.png diff --git a/dist/v-1527758585938/emojis/1f4bd.png b/dist/v-1528953702317/emojis/1f4bd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4bd.png rename to dist/v-1528953702317/emojis/1f4bd.png diff --git a/dist/v-1527758585938/emojis/1f4be.png b/dist/v-1528953702317/emojis/1f4be.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4be.png rename to dist/v-1528953702317/emojis/1f4be.png diff --git a/dist/v-1527758585938/emojis/1f4bf.png b/dist/v-1528953702317/emojis/1f4bf.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4bf.png rename to dist/v-1528953702317/emojis/1f4bf.png diff --git a/dist/v-1527758585938/emojis/1f4c0.png b/dist/v-1528953702317/emojis/1f4c0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c0.png rename to dist/v-1528953702317/emojis/1f4c0.png diff --git a/dist/v-1527758585938/emojis/1f4c1.png b/dist/v-1528953702317/emojis/1f4c1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c1.png rename to dist/v-1528953702317/emojis/1f4c1.png diff --git a/dist/v-1527758585938/emojis/1f4c2.png b/dist/v-1528953702317/emojis/1f4c2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c2.png rename to dist/v-1528953702317/emojis/1f4c2.png diff --git a/dist/v-1527758585938/emojis/1f4c3.png b/dist/v-1528953702317/emojis/1f4c3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c3.png rename to dist/v-1528953702317/emojis/1f4c3.png diff --git a/dist/v-1527758585938/emojis/1f4c4.png b/dist/v-1528953702317/emojis/1f4c4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c4.png rename to dist/v-1528953702317/emojis/1f4c4.png diff --git a/dist/v-1527758585938/emojis/1f4c5.png b/dist/v-1528953702317/emojis/1f4c5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c5.png rename to dist/v-1528953702317/emojis/1f4c5.png diff --git a/dist/v-1527758585938/emojis/1f4c6.png b/dist/v-1528953702317/emojis/1f4c6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c6.png rename to dist/v-1528953702317/emojis/1f4c6.png diff --git a/dist/v-1527758585938/emojis/1f4c7.png b/dist/v-1528953702317/emojis/1f4c7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c7.png rename to dist/v-1528953702317/emojis/1f4c7.png diff --git a/dist/v-1527758585938/emojis/1f4c8.png b/dist/v-1528953702317/emojis/1f4c8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c8.png rename to dist/v-1528953702317/emojis/1f4c8.png diff --git a/dist/v-1527758585938/emojis/1f4c9.png b/dist/v-1528953702317/emojis/1f4c9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4c9.png rename to dist/v-1528953702317/emojis/1f4c9.png diff --git a/dist/v-1527758585938/emojis/1f4ca.png b/dist/v-1528953702317/emojis/1f4ca.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ca.png rename to dist/v-1528953702317/emojis/1f4ca.png diff --git a/dist/v-1527758585938/emojis/1f4cb.png b/dist/v-1528953702317/emojis/1f4cb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4cb.png rename to dist/v-1528953702317/emojis/1f4cb.png diff --git a/dist/v-1527758585938/emojis/1f4cc.png b/dist/v-1528953702317/emojis/1f4cc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4cc.png rename to dist/v-1528953702317/emojis/1f4cc.png diff --git a/dist/v-1527758585938/emojis/1f4cd.png b/dist/v-1528953702317/emojis/1f4cd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4cd.png rename to dist/v-1528953702317/emojis/1f4cd.png diff --git a/dist/v-1527758585938/emojis/1f4ce.png b/dist/v-1528953702317/emojis/1f4ce.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ce.png rename to dist/v-1528953702317/emojis/1f4ce.png diff --git a/dist/v-1527758585938/emojis/1f4cf.png b/dist/v-1528953702317/emojis/1f4cf.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4cf.png rename to dist/v-1528953702317/emojis/1f4cf.png diff --git a/dist/v-1527758585938/emojis/1f4d0.png b/dist/v-1528953702317/emojis/1f4d0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d0.png rename to dist/v-1528953702317/emojis/1f4d0.png diff --git a/dist/v-1527758585938/emojis/1f4d1.png b/dist/v-1528953702317/emojis/1f4d1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d1.png rename to dist/v-1528953702317/emojis/1f4d1.png diff --git a/dist/v-1527758585938/emojis/1f4d2.png b/dist/v-1528953702317/emojis/1f4d2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d2.png rename to dist/v-1528953702317/emojis/1f4d2.png diff --git a/dist/v-1527758585938/emojis/1f4d3.png b/dist/v-1528953702317/emojis/1f4d3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d3.png rename to dist/v-1528953702317/emojis/1f4d3.png diff --git a/dist/v-1527758585938/emojis/1f4d4.png b/dist/v-1528953702317/emojis/1f4d4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d4.png rename to dist/v-1528953702317/emojis/1f4d4.png diff --git a/dist/v-1527758585938/emojis/1f4d5.png b/dist/v-1528953702317/emojis/1f4d5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d5.png rename to dist/v-1528953702317/emojis/1f4d5.png diff --git a/dist/v-1527758585938/emojis/1f4d6.png b/dist/v-1528953702317/emojis/1f4d6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d6.png rename to dist/v-1528953702317/emojis/1f4d6.png diff --git a/dist/v-1527758585938/emojis/1f4d7.png b/dist/v-1528953702317/emojis/1f4d7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d7.png rename to dist/v-1528953702317/emojis/1f4d7.png diff --git a/dist/v-1527758585938/emojis/1f4d8.png b/dist/v-1528953702317/emojis/1f4d8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d8.png rename to dist/v-1528953702317/emojis/1f4d8.png diff --git a/dist/v-1527758585938/emojis/1f4d9.png b/dist/v-1528953702317/emojis/1f4d9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4d9.png rename to dist/v-1528953702317/emojis/1f4d9.png diff --git a/dist/v-1527758585938/emojis/1f4da.png b/dist/v-1528953702317/emojis/1f4da.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4da.png rename to dist/v-1528953702317/emojis/1f4da.png diff --git a/dist/v-1527758585938/emojis/1f4db.png b/dist/v-1528953702317/emojis/1f4db.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4db.png rename to dist/v-1528953702317/emojis/1f4db.png diff --git a/dist/v-1527758585938/emojis/1f4dc.png b/dist/v-1528953702317/emojis/1f4dc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4dc.png rename to dist/v-1528953702317/emojis/1f4dc.png diff --git a/dist/v-1527758585938/emojis/1f4dd.png b/dist/v-1528953702317/emojis/1f4dd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4dd.png rename to dist/v-1528953702317/emojis/1f4dd.png diff --git a/dist/v-1527758585938/emojis/1f4de.png b/dist/v-1528953702317/emojis/1f4de.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4de.png rename to dist/v-1528953702317/emojis/1f4de.png diff --git a/dist/v-1527758585938/emojis/1f4df.png b/dist/v-1528953702317/emojis/1f4df.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4df.png rename to dist/v-1528953702317/emojis/1f4df.png diff --git a/dist/v-1527758585938/emojis/1f4e0.png b/dist/v-1528953702317/emojis/1f4e0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e0.png rename to dist/v-1528953702317/emojis/1f4e0.png diff --git a/dist/v-1527758585938/emojis/1f4e1.png b/dist/v-1528953702317/emojis/1f4e1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e1.png rename to dist/v-1528953702317/emojis/1f4e1.png diff --git a/dist/v-1527758585938/emojis/1f4e2.png b/dist/v-1528953702317/emojis/1f4e2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e2.png rename to dist/v-1528953702317/emojis/1f4e2.png diff --git a/dist/v-1527758585938/emojis/1f4e3.png b/dist/v-1528953702317/emojis/1f4e3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e3.png rename to dist/v-1528953702317/emojis/1f4e3.png diff --git a/dist/v-1527758585938/emojis/1f4e4.png b/dist/v-1528953702317/emojis/1f4e4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e4.png rename to dist/v-1528953702317/emojis/1f4e4.png diff --git a/dist/v-1527758585938/emojis/1f4e5.png b/dist/v-1528953702317/emojis/1f4e5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e5.png rename to dist/v-1528953702317/emojis/1f4e5.png diff --git a/dist/v-1527758585938/emojis/1f4e6.png b/dist/v-1528953702317/emojis/1f4e6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e6.png rename to dist/v-1528953702317/emojis/1f4e6.png diff --git a/dist/v-1527758585938/emojis/1f4e7.png b/dist/v-1528953702317/emojis/1f4e7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e7.png rename to dist/v-1528953702317/emojis/1f4e7.png diff --git a/dist/v-1527758585938/emojis/1f4e8.png b/dist/v-1528953702317/emojis/1f4e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e8.png rename to dist/v-1528953702317/emojis/1f4e8.png diff --git a/dist/v-1527758585938/emojis/1f4e9.png b/dist/v-1528953702317/emojis/1f4e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4e9.png rename to dist/v-1528953702317/emojis/1f4e9.png diff --git a/dist/v-1527758585938/emojis/1f4ea.png b/dist/v-1528953702317/emojis/1f4ea.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ea.png rename to dist/v-1528953702317/emojis/1f4ea.png diff --git a/dist/v-1527758585938/emojis/1f4eb.png b/dist/v-1528953702317/emojis/1f4eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4eb.png rename to dist/v-1528953702317/emojis/1f4eb.png diff --git a/dist/v-1527758585938/emojis/1f4ec.png b/dist/v-1528953702317/emojis/1f4ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ec.png rename to dist/v-1528953702317/emojis/1f4ec.png diff --git a/dist/v-1527758585938/emojis/1f4ed.png b/dist/v-1528953702317/emojis/1f4ed.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ed.png rename to dist/v-1528953702317/emojis/1f4ed.png diff --git a/dist/v-1527758585938/emojis/1f4ee.png b/dist/v-1528953702317/emojis/1f4ee.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ee.png rename to dist/v-1528953702317/emojis/1f4ee.png diff --git a/dist/v-1527758585938/emojis/1f4ef.png b/dist/v-1528953702317/emojis/1f4ef.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ef.png rename to dist/v-1528953702317/emojis/1f4ef.png diff --git a/dist/v-1527758585938/emojis/1f4f0.png b/dist/v-1528953702317/emojis/1f4f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f0.png rename to dist/v-1528953702317/emojis/1f4f0.png diff --git a/dist/v-1527758585938/emojis/1f4f1.png b/dist/v-1528953702317/emojis/1f4f1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f1.png rename to dist/v-1528953702317/emojis/1f4f1.png diff --git a/dist/v-1527758585938/emojis/1f4f2.png b/dist/v-1528953702317/emojis/1f4f2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f2.png rename to dist/v-1528953702317/emojis/1f4f2.png diff --git a/dist/v-1527758585938/emojis/1f4f3.png b/dist/v-1528953702317/emojis/1f4f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f3.png rename to dist/v-1528953702317/emojis/1f4f3.png diff --git a/dist/v-1527758585938/emojis/1f4f4.png b/dist/v-1528953702317/emojis/1f4f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f4.png rename to dist/v-1528953702317/emojis/1f4f4.png diff --git a/dist/v-1527758585938/emojis/1f4f5.png b/dist/v-1528953702317/emojis/1f4f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f5.png rename to dist/v-1528953702317/emojis/1f4f5.png diff --git a/dist/v-1527758585938/emojis/1f4f6.png b/dist/v-1528953702317/emojis/1f4f6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f6.png rename to dist/v-1528953702317/emojis/1f4f6.png diff --git a/dist/v-1527758585938/emojis/1f4f7.png b/dist/v-1528953702317/emojis/1f4f7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f7.png rename to dist/v-1528953702317/emojis/1f4f7.png diff --git a/dist/v-1527758585938/emojis/1f4f8.png b/dist/v-1528953702317/emojis/1f4f8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f8.png rename to dist/v-1528953702317/emojis/1f4f8.png diff --git a/dist/v-1527758585938/emojis/1f4f9.png b/dist/v-1528953702317/emojis/1f4f9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4f9.png rename to dist/v-1528953702317/emojis/1f4f9.png diff --git a/dist/v-1527758585938/emojis/1f4fa.png b/dist/v-1528953702317/emojis/1f4fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4fa.png rename to dist/v-1528953702317/emojis/1f4fa.png diff --git a/dist/v-1527758585938/emojis/1f4fb.png b/dist/v-1528953702317/emojis/1f4fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4fb.png rename to dist/v-1528953702317/emojis/1f4fb.png diff --git a/dist/v-1527758585938/emojis/1f4fc.png b/dist/v-1528953702317/emojis/1f4fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4fc.png rename to dist/v-1528953702317/emojis/1f4fc.png diff --git a/dist/v-1527758585938/emojis/1f4fd.png b/dist/v-1528953702317/emojis/1f4fd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4fd.png rename to dist/v-1528953702317/emojis/1f4fd.png diff --git a/dist/v-1527758585938/emojis/1f4ff.png b/dist/v-1528953702317/emojis/1f4ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f4ff.png rename to dist/v-1528953702317/emojis/1f4ff.png diff --git a/dist/v-1527758585938/emojis/1f500.png b/dist/v-1528953702317/emojis/1f500.png similarity index 100% rename from dist/v-1527758585938/emojis/1f500.png rename to dist/v-1528953702317/emojis/1f500.png diff --git a/dist/v-1527758585938/emojis/1f501.png b/dist/v-1528953702317/emojis/1f501.png similarity index 100% rename from dist/v-1527758585938/emojis/1f501.png rename to dist/v-1528953702317/emojis/1f501.png diff --git a/dist/v-1527758585938/emojis/1f502.png b/dist/v-1528953702317/emojis/1f502.png similarity index 100% rename from dist/v-1527758585938/emojis/1f502.png rename to dist/v-1528953702317/emojis/1f502.png diff --git a/dist/v-1527758585938/emojis/1f503.png b/dist/v-1528953702317/emojis/1f503.png similarity index 100% rename from dist/v-1527758585938/emojis/1f503.png rename to dist/v-1528953702317/emojis/1f503.png diff --git a/dist/v-1527758585938/emojis/1f504.png b/dist/v-1528953702317/emojis/1f504.png similarity index 100% rename from dist/v-1527758585938/emojis/1f504.png rename to dist/v-1528953702317/emojis/1f504.png diff --git a/dist/v-1527758585938/emojis/1f505.png b/dist/v-1528953702317/emojis/1f505.png similarity index 100% rename from dist/v-1527758585938/emojis/1f505.png rename to dist/v-1528953702317/emojis/1f505.png diff --git a/dist/v-1527758585938/emojis/1f506.png b/dist/v-1528953702317/emojis/1f506.png similarity index 100% rename from dist/v-1527758585938/emojis/1f506.png rename to dist/v-1528953702317/emojis/1f506.png diff --git a/dist/v-1527758585938/emojis/1f507.png b/dist/v-1528953702317/emojis/1f507.png similarity index 100% rename from dist/v-1527758585938/emojis/1f507.png rename to dist/v-1528953702317/emojis/1f507.png diff --git a/dist/v-1527758585938/emojis/1f508.png b/dist/v-1528953702317/emojis/1f508.png similarity index 100% rename from dist/v-1527758585938/emojis/1f508.png rename to dist/v-1528953702317/emojis/1f508.png diff --git a/dist/v-1527758585938/emojis/1f509.png b/dist/v-1528953702317/emojis/1f509.png similarity index 100% rename from dist/v-1527758585938/emojis/1f509.png rename to dist/v-1528953702317/emojis/1f509.png diff --git a/dist/v-1527758585938/emojis/1f50a.png b/dist/v-1528953702317/emojis/1f50a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f50a.png rename to dist/v-1528953702317/emojis/1f50a.png diff --git a/dist/v-1527758585938/emojis/1f50b.png b/dist/v-1528953702317/emojis/1f50b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f50b.png rename to dist/v-1528953702317/emojis/1f50b.png diff --git a/dist/v-1527758585938/emojis/1f50c.png b/dist/v-1528953702317/emojis/1f50c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f50c.png rename to dist/v-1528953702317/emojis/1f50c.png diff --git a/dist/v-1527758585938/emojis/1f50d.png b/dist/v-1528953702317/emojis/1f50d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f50d.png rename to dist/v-1528953702317/emojis/1f50d.png diff --git a/dist/v-1527758585938/emojis/1f50e.png b/dist/v-1528953702317/emojis/1f50e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f50e.png rename to dist/v-1528953702317/emojis/1f50e.png diff --git a/dist/v-1527758585938/emojis/1f50f.png b/dist/v-1528953702317/emojis/1f50f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f50f.png rename to dist/v-1528953702317/emojis/1f50f.png diff --git a/dist/v-1527758585938/emojis/1f510.png b/dist/v-1528953702317/emojis/1f510.png similarity index 100% rename from dist/v-1527758585938/emojis/1f510.png rename to dist/v-1528953702317/emojis/1f510.png diff --git a/dist/v-1527758585938/emojis/1f511.png b/dist/v-1528953702317/emojis/1f511.png similarity index 100% rename from dist/v-1527758585938/emojis/1f511.png rename to dist/v-1528953702317/emojis/1f511.png diff --git a/dist/v-1527758585938/emojis/1f512.png b/dist/v-1528953702317/emojis/1f512.png similarity index 100% rename from dist/v-1527758585938/emojis/1f512.png rename to dist/v-1528953702317/emojis/1f512.png diff --git a/dist/v-1527758585938/emojis/1f513.png b/dist/v-1528953702317/emojis/1f513.png similarity index 100% rename from dist/v-1527758585938/emojis/1f513.png rename to dist/v-1528953702317/emojis/1f513.png diff --git a/dist/v-1527758585938/emojis/1f514.png b/dist/v-1528953702317/emojis/1f514.png similarity index 100% rename from dist/v-1527758585938/emojis/1f514.png rename to dist/v-1528953702317/emojis/1f514.png diff --git a/dist/v-1527758585938/emojis/1f515.png b/dist/v-1528953702317/emojis/1f515.png similarity index 100% rename from dist/v-1527758585938/emojis/1f515.png rename to dist/v-1528953702317/emojis/1f515.png diff --git a/dist/v-1527758585938/emojis/1f516.png b/dist/v-1528953702317/emojis/1f516.png similarity index 100% rename from dist/v-1527758585938/emojis/1f516.png rename to dist/v-1528953702317/emojis/1f516.png diff --git a/dist/v-1527758585938/emojis/1f517.png b/dist/v-1528953702317/emojis/1f517.png similarity index 100% rename from dist/v-1527758585938/emojis/1f517.png rename to dist/v-1528953702317/emojis/1f517.png diff --git a/dist/v-1527758585938/emojis/1f518.png b/dist/v-1528953702317/emojis/1f518.png similarity index 100% rename from dist/v-1527758585938/emojis/1f518.png rename to dist/v-1528953702317/emojis/1f518.png diff --git a/dist/v-1527758585938/emojis/1f519.png b/dist/v-1528953702317/emojis/1f519.png similarity index 100% rename from dist/v-1527758585938/emojis/1f519.png rename to dist/v-1528953702317/emojis/1f519.png diff --git a/dist/v-1527758585938/emojis/1f51a.png b/dist/v-1528953702317/emojis/1f51a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f51a.png rename to dist/v-1528953702317/emojis/1f51a.png diff --git a/dist/v-1527758585938/emojis/1f51b.png b/dist/v-1528953702317/emojis/1f51b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f51b.png rename to dist/v-1528953702317/emojis/1f51b.png diff --git a/dist/v-1527758585938/emojis/1f51c.png b/dist/v-1528953702317/emojis/1f51c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f51c.png rename to dist/v-1528953702317/emojis/1f51c.png diff --git a/dist/v-1527758585938/emojis/1f51d.png b/dist/v-1528953702317/emojis/1f51d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f51d.png rename to dist/v-1528953702317/emojis/1f51d.png diff --git a/dist/v-1527758585938/emojis/1f51e.png b/dist/v-1528953702317/emojis/1f51e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f51e.png rename to dist/v-1528953702317/emojis/1f51e.png diff --git a/dist/v-1527758585938/emojis/1f51f.png b/dist/v-1528953702317/emojis/1f51f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f51f.png rename to dist/v-1528953702317/emojis/1f51f.png diff --git a/dist/v-1527758585938/emojis/1f520.png b/dist/v-1528953702317/emojis/1f520.png similarity index 100% rename from dist/v-1527758585938/emojis/1f520.png rename to dist/v-1528953702317/emojis/1f520.png diff --git a/dist/v-1527758585938/emojis/1f521.png b/dist/v-1528953702317/emojis/1f521.png similarity index 100% rename from dist/v-1527758585938/emojis/1f521.png rename to dist/v-1528953702317/emojis/1f521.png diff --git a/dist/v-1527758585938/emojis/1f522.png b/dist/v-1528953702317/emojis/1f522.png similarity index 100% rename from dist/v-1527758585938/emojis/1f522.png rename to dist/v-1528953702317/emojis/1f522.png diff --git a/dist/v-1527758585938/emojis/1f523.png b/dist/v-1528953702317/emojis/1f523.png similarity index 100% rename from dist/v-1527758585938/emojis/1f523.png rename to dist/v-1528953702317/emojis/1f523.png diff --git a/dist/v-1527758585938/emojis/1f524.png b/dist/v-1528953702317/emojis/1f524.png similarity index 100% rename from dist/v-1527758585938/emojis/1f524.png rename to dist/v-1528953702317/emojis/1f524.png diff --git a/dist/v-1527758585938/emojis/1f525.png b/dist/v-1528953702317/emojis/1f525.png similarity index 100% rename from dist/v-1527758585938/emojis/1f525.png rename to dist/v-1528953702317/emojis/1f525.png diff --git a/dist/v-1527758585938/emojis/1f526.png b/dist/v-1528953702317/emojis/1f526.png similarity index 100% rename from dist/v-1527758585938/emojis/1f526.png rename to dist/v-1528953702317/emojis/1f526.png diff --git a/dist/v-1527758585938/emojis/1f527.png b/dist/v-1528953702317/emojis/1f527.png similarity index 100% rename from dist/v-1527758585938/emojis/1f527.png rename to dist/v-1528953702317/emojis/1f527.png diff --git a/dist/v-1527758585938/emojis/1f528.png b/dist/v-1528953702317/emojis/1f528.png similarity index 100% rename from dist/v-1527758585938/emojis/1f528.png rename to dist/v-1528953702317/emojis/1f528.png diff --git a/dist/v-1527758585938/emojis/1f529.png b/dist/v-1528953702317/emojis/1f529.png similarity index 100% rename from dist/v-1527758585938/emojis/1f529.png rename to dist/v-1528953702317/emojis/1f529.png diff --git a/dist/v-1527758585938/emojis/1f52a.png b/dist/v-1528953702317/emojis/1f52a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f52a.png rename to dist/v-1528953702317/emojis/1f52a.png diff --git a/dist/v-1527758585938/emojis/1f52b.png b/dist/v-1528953702317/emojis/1f52b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f52b.png rename to dist/v-1528953702317/emojis/1f52b.png diff --git a/dist/v-1527758585938/emojis/1f52c.png b/dist/v-1528953702317/emojis/1f52c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f52c.png rename to dist/v-1528953702317/emojis/1f52c.png diff --git a/dist/v-1527758585938/emojis/1f52d.png b/dist/v-1528953702317/emojis/1f52d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f52d.png rename to dist/v-1528953702317/emojis/1f52d.png diff --git a/dist/v-1527758585938/emojis/1f52e.png b/dist/v-1528953702317/emojis/1f52e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f52e.png rename to dist/v-1528953702317/emojis/1f52e.png diff --git a/dist/v-1527758585938/emojis/1f52f.png b/dist/v-1528953702317/emojis/1f52f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f52f.png rename to dist/v-1528953702317/emojis/1f52f.png diff --git a/dist/v-1527758585938/emojis/1f530.png b/dist/v-1528953702317/emojis/1f530.png similarity index 100% rename from dist/v-1527758585938/emojis/1f530.png rename to dist/v-1528953702317/emojis/1f530.png diff --git a/dist/v-1527758585938/emojis/1f531.png b/dist/v-1528953702317/emojis/1f531.png similarity index 100% rename from dist/v-1527758585938/emojis/1f531.png rename to dist/v-1528953702317/emojis/1f531.png diff --git a/dist/v-1527758585938/emojis/1f532.png b/dist/v-1528953702317/emojis/1f532.png similarity index 100% rename from dist/v-1527758585938/emojis/1f532.png rename to dist/v-1528953702317/emojis/1f532.png diff --git a/dist/v-1527758585938/emojis/1f533.png b/dist/v-1528953702317/emojis/1f533.png similarity index 100% rename from dist/v-1527758585938/emojis/1f533.png rename to dist/v-1528953702317/emojis/1f533.png diff --git a/dist/v-1527758585938/emojis/1f534.png b/dist/v-1528953702317/emojis/1f534.png similarity index 100% rename from dist/v-1527758585938/emojis/1f534.png rename to dist/v-1528953702317/emojis/1f534.png diff --git a/dist/v-1527758585938/emojis/1f535.png b/dist/v-1528953702317/emojis/1f535.png similarity index 100% rename from dist/v-1527758585938/emojis/1f535.png rename to dist/v-1528953702317/emojis/1f535.png diff --git a/dist/v-1527758585938/emojis/1f536.png b/dist/v-1528953702317/emojis/1f536.png similarity index 100% rename from dist/v-1527758585938/emojis/1f536.png rename to dist/v-1528953702317/emojis/1f536.png diff --git a/dist/v-1527758585938/emojis/1f537.png b/dist/v-1528953702317/emojis/1f537.png similarity index 100% rename from dist/v-1527758585938/emojis/1f537.png rename to dist/v-1528953702317/emojis/1f537.png diff --git a/dist/v-1527758585938/emojis/1f538.png b/dist/v-1528953702317/emojis/1f538.png similarity index 100% rename from dist/v-1527758585938/emojis/1f538.png rename to dist/v-1528953702317/emojis/1f538.png diff --git a/dist/v-1527758585938/emojis/1f539.png b/dist/v-1528953702317/emojis/1f539.png similarity index 100% rename from dist/v-1527758585938/emojis/1f539.png rename to dist/v-1528953702317/emojis/1f539.png diff --git a/dist/v-1527758585938/emojis/1f53a.png b/dist/v-1528953702317/emojis/1f53a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f53a.png rename to dist/v-1528953702317/emojis/1f53a.png diff --git a/dist/v-1527758585938/emojis/1f53b.png b/dist/v-1528953702317/emojis/1f53b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f53b.png rename to dist/v-1528953702317/emojis/1f53b.png diff --git a/dist/v-1527758585938/emojis/1f53c.png b/dist/v-1528953702317/emojis/1f53c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f53c.png rename to dist/v-1528953702317/emojis/1f53c.png diff --git a/dist/v-1527758585938/emojis/1f53d.png b/dist/v-1528953702317/emojis/1f53d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f53d.png rename to dist/v-1528953702317/emojis/1f53d.png diff --git a/dist/v-1527758585938/emojis/1f549.png b/dist/v-1528953702317/emojis/1f549.png similarity index 100% rename from dist/v-1527758585938/emojis/1f549.png rename to dist/v-1528953702317/emojis/1f549.png diff --git a/dist/v-1527758585938/emojis/1f54a.png b/dist/v-1528953702317/emojis/1f54a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f54a.png rename to dist/v-1528953702317/emojis/1f54a.png diff --git a/dist/v-1527758585938/emojis/1f54b.png b/dist/v-1528953702317/emojis/1f54b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f54b.png rename to dist/v-1528953702317/emojis/1f54b.png diff --git a/dist/v-1527758585938/emojis/1f54c.png b/dist/v-1528953702317/emojis/1f54c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f54c.png rename to dist/v-1528953702317/emojis/1f54c.png diff --git a/dist/v-1527758585938/emojis/1f54d.png b/dist/v-1528953702317/emojis/1f54d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f54d.png rename to dist/v-1528953702317/emojis/1f54d.png diff --git a/dist/v-1527758585938/emojis/1f54e.png b/dist/v-1528953702317/emojis/1f54e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f54e.png rename to dist/v-1528953702317/emojis/1f54e.png diff --git a/dist/v-1527758585938/emojis/1f550.png b/dist/v-1528953702317/emojis/1f550.png similarity index 100% rename from dist/v-1527758585938/emojis/1f550.png rename to dist/v-1528953702317/emojis/1f550.png diff --git a/dist/v-1527758585938/emojis/1f551.png b/dist/v-1528953702317/emojis/1f551.png similarity index 100% rename from dist/v-1527758585938/emojis/1f551.png rename to dist/v-1528953702317/emojis/1f551.png diff --git a/dist/v-1527758585938/emojis/1f552.png b/dist/v-1528953702317/emojis/1f552.png similarity index 100% rename from dist/v-1527758585938/emojis/1f552.png rename to dist/v-1528953702317/emojis/1f552.png diff --git a/dist/v-1527758585938/emojis/1f553.png b/dist/v-1528953702317/emojis/1f553.png similarity index 100% rename from dist/v-1527758585938/emojis/1f553.png rename to dist/v-1528953702317/emojis/1f553.png diff --git a/dist/v-1527758585938/emojis/1f554.png b/dist/v-1528953702317/emojis/1f554.png similarity index 100% rename from dist/v-1527758585938/emojis/1f554.png rename to dist/v-1528953702317/emojis/1f554.png diff --git a/dist/v-1527758585938/emojis/1f555.png b/dist/v-1528953702317/emojis/1f555.png similarity index 100% rename from dist/v-1527758585938/emojis/1f555.png rename to dist/v-1528953702317/emojis/1f555.png diff --git a/dist/v-1527758585938/emojis/1f556.png b/dist/v-1528953702317/emojis/1f556.png similarity index 100% rename from dist/v-1527758585938/emojis/1f556.png rename to dist/v-1528953702317/emojis/1f556.png diff --git a/dist/v-1527758585938/emojis/1f557.png b/dist/v-1528953702317/emojis/1f557.png similarity index 100% rename from dist/v-1527758585938/emojis/1f557.png rename to dist/v-1528953702317/emojis/1f557.png diff --git a/dist/v-1527758585938/emojis/1f558.png b/dist/v-1528953702317/emojis/1f558.png similarity index 100% rename from dist/v-1527758585938/emojis/1f558.png rename to dist/v-1528953702317/emojis/1f558.png diff --git a/dist/v-1527758585938/emojis/1f559.png b/dist/v-1528953702317/emojis/1f559.png similarity index 100% rename from dist/v-1527758585938/emojis/1f559.png rename to dist/v-1528953702317/emojis/1f559.png diff --git a/dist/v-1527758585938/emojis/1f55a.png b/dist/v-1528953702317/emojis/1f55a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f55a.png rename to dist/v-1528953702317/emojis/1f55a.png diff --git a/dist/v-1527758585938/emojis/1f55b.png b/dist/v-1528953702317/emojis/1f55b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f55b.png rename to dist/v-1528953702317/emojis/1f55b.png diff --git a/dist/v-1527758585938/emojis/1f55c.png b/dist/v-1528953702317/emojis/1f55c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f55c.png rename to dist/v-1528953702317/emojis/1f55c.png diff --git a/dist/v-1527758585938/emojis/1f55d.png b/dist/v-1528953702317/emojis/1f55d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f55d.png rename to dist/v-1528953702317/emojis/1f55d.png diff --git a/dist/v-1527758585938/emojis/1f55e.png b/dist/v-1528953702317/emojis/1f55e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f55e.png rename to dist/v-1528953702317/emojis/1f55e.png diff --git a/dist/v-1527758585938/emojis/1f55f.png b/dist/v-1528953702317/emojis/1f55f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f55f.png rename to dist/v-1528953702317/emojis/1f55f.png diff --git a/dist/v-1527758585938/emojis/1f560.png b/dist/v-1528953702317/emojis/1f560.png similarity index 100% rename from dist/v-1527758585938/emojis/1f560.png rename to dist/v-1528953702317/emojis/1f560.png diff --git a/dist/v-1527758585938/emojis/1f561.png b/dist/v-1528953702317/emojis/1f561.png similarity index 100% rename from dist/v-1527758585938/emojis/1f561.png rename to dist/v-1528953702317/emojis/1f561.png diff --git a/dist/v-1527758585938/emojis/1f562.png b/dist/v-1528953702317/emojis/1f562.png similarity index 100% rename from dist/v-1527758585938/emojis/1f562.png rename to dist/v-1528953702317/emojis/1f562.png diff --git a/dist/v-1527758585938/emojis/1f563.png b/dist/v-1528953702317/emojis/1f563.png similarity index 100% rename from dist/v-1527758585938/emojis/1f563.png rename to dist/v-1528953702317/emojis/1f563.png diff --git a/dist/v-1527758585938/emojis/1f564.png b/dist/v-1528953702317/emojis/1f564.png similarity index 100% rename from dist/v-1527758585938/emojis/1f564.png rename to dist/v-1528953702317/emojis/1f564.png diff --git a/dist/v-1527758585938/emojis/1f565.png b/dist/v-1528953702317/emojis/1f565.png similarity index 100% rename from dist/v-1527758585938/emojis/1f565.png rename to dist/v-1528953702317/emojis/1f565.png diff --git a/dist/v-1527758585938/emojis/1f566.png b/dist/v-1528953702317/emojis/1f566.png similarity index 100% rename from dist/v-1527758585938/emojis/1f566.png rename to dist/v-1528953702317/emojis/1f566.png diff --git a/dist/v-1527758585938/emojis/1f567.png b/dist/v-1528953702317/emojis/1f567.png similarity index 100% rename from dist/v-1527758585938/emojis/1f567.png rename to dist/v-1528953702317/emojis/1f567.png diff --git a/dist/v-1527758585938/emojis/1f56f.png b/dist/v-1528953702317/emojis/1f56f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f56f.png rename to dist/v-1528953702317/emojis/1f56f.png diff --git a/dist/v-1527758585938/emojis/1f570.png b/dist/v-1528953702317/emojis/1f570.png similarity index 100% rename from dist/v-1527758585938/emojis/1f570.png rename to dist/v-1528953702317/emojis/1f570.png diff --git a/dist/v-1527758585938/emojis/1f573.png b/dist/v-1528953702317/emojis/1f573.png similarity index 100% rename from dist/v-1527758585938/emojis/1f573.png rename to dist/v-1528953702317/emojis/1f573.png diff --git a/dist/v-1527758585938/emojis/1f574.png b/dist/v-1528953702317/emojis/1f574.png similarity index 100% rename from dist/v-1527758585938/emojis/1f574.png rename to dist/v-1528953702317/emojis/1f574.png diff --git a/dist/v-1527758585938/emojis/1f575-fe0f-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f575-fe0f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f575-fe0f-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f575-fe0f-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f575-fe0f-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f575-fe0f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f575-fe0f-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f575-fe0f-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f575.png b/dist/v-1528953702317/emojis/1f575.png similarity index 100% rename from dist/v-1527758585938/emojis/1f575.png rename to dist/v-1528953702317/emojis/1f575.png diff --git a/dist/v-1527758585938/emojis/1f576.png b/dist/v-1528953702317/emojis/1f576.png similarity index 100% rename from dist/v-1527758585938/emojis/1f576.png rename to dist/v-1528953702317/emojis/1f576.png diff --git a/dist/v-1527758585938/emojis/1f577.png b/dist/v-1528953702317/emojis/1f577.png similarity index 100% rename from dist/v-1527758585938/emojis/1f577.png rename to dist/v-1528953702317/emojis/1f577.png diff --git a/dist/v-1527758585938/emojis/1f578.png b/dist/v-1528953702317/emojis/1f578.png similarity index 100% rename from dist/v-1527758585938/emojis/1f578.png rename to dist/v-1528953702317/emojis/1f578.png diff --git a/dist/v-1527758585938/emojis/1f579.png b/dist/v-1528953702317/emojis/1f579.png similarity index 100% rename from dist/v-1527758585938/emojis/1f579.png rename to dist/v-1528953702317/emojis/1f579.png diff --git a/dist/v-1527758585938/emojis/1f57a.png b/dist/v-1528953702317/emojis/1f57a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f57a.png rename to dist/v-1528953702317/emojis/1f57a.png diff --git a/dist/v-1527758585938/emojis/1f587.png b/dist/v-1528953702317/emojis/1f587.png similarity index 100% rename from dist/v-1527758585938/emojis/1f587.png rename to dist/v-1528953702317/emojis/1f587.png diff --git a/dist/v-1527758585938/emojis/1f58a.png b/dist/v-1528953702317/emojis/1f58a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f58a.png rename to dist/v-1528953702317/emojis/1f58a.png diff --git a/dist/v-1527758585938/emojis/1f58b.png b/dist/v-1528953702317/emojis/1f58b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f58b.png rename to dist/v-1528953702317/emojis/1f58b.png diff --git a/dist/v-1527758585938/emojis/1f58c.png b/dist/v-1528953702317/emojis/1f58c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f58c.png rename to dist/v-1528953702317/emojis/1f58c.png diff --git a/dist/v-1527758585938/emojis/1f58d.png b/dist/v-1528953702317/emojis/1f58d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f58d.png rename to dist/v-1528953702317/emojis/1f58d.png diff --git a/dist/v-1527758585938/emojis/1f590.png b/dist/v-1528953702317/emojis/1f590.png similarity index 100% rename from dist/v-1527758585938/emojis/1f590.png rename to dist/v-1528953702317/emojis/1f590.png diff --git a/dist/v-1527758585938/emojis/1f595.png b/dist/v-1528953702317/emojis/1f595.png similarity index 100% rename from dist/v-1527758585938/emojis/1f595.png rename to dist/v-1528953702317/emojis/1f595.png diff --git a/dist/v-1527758585938/emojis/1f596.png b/dist/v-1528953702317/emojis/1f596.png similarity index 100% rename from dist/v-1527758585938/emojis/1f596.png rename to dist/v-1528953702317/emojis/1f596.png diff --git a/dist/v-1527758585938/emojis/1f5a4.png b/dist/v-1528953702317/emojis/1f5a4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5a4.png rename to dist/v-1528953702317/emojis/1f5a4.png diff --git a/dist/v-1527758585938/emojis/1f5a5.png b/dist/v-1528953702317/emojis/1f5a5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5a5.png rename to dist/v-1528953702317/emojis/1f5a5.png diff --git a/dist/v-1527758585938/emojis/1f5a8.png b/dist/v-1528953702317/emojis/1f5a8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5a8.png rename to dist/v-1528953702317/emojis/1f5a8.png diff --git a/dist/v-1527758585938/emojis/1f5b1.png b/dist/v-1528953702317/emojis/1f5b1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5b1.png rename to dist/v-1528953702317/emojis/1f5b1.png diff --git a/dist/v-1527758585938/emojis/1f5b2.png b/dist/v-1528953702317/emojis/1f5b2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5b2.png rename to dist/v-1528953702317/emojis/1f5b2.png diff --git a/dist/v-1527758585938/emojis/1f5bc.png b/dist/v-1528953702317/emojis/1f5bc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5bc.png rename to dist/v-1528953702317/emojis/1f5bc.png diff --git a/dist/v-1527758585938/emojis/1f5c2.png b/dist/v-1528953702317/emojis/1f5c2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5c2.png rename to dist/v-1528953702317/emojis/1f5c2.png diff --git a/dist/v-1527758585938/emojis/1f5c3.png b/dist/v-1528953702317/emojis/1f5c3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5c3.png rename to dist/v-1528953702317/emojis/1f5c3.png diff --git a/dist/v-1527758585938/emojis/1f5c4.png b/dist/v-1528953702317/emojis/1f5c4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5c4.png rename to dist/v-1528953702317/emojis/1f5c4.png diff --git a/dist/v-1527758585938/emojis/1f5d1.png b/dist/v-1528953702317/emojis/1f5d1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5d1.png rename to dist/v-1528953702317/emojis/1f5d1.png diff --git a/dist/v-1527758585938/emojis/1f5d2.png b/dist/v-1528953702317/emojis/1f5d2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5d2.png rename to dist/v-1528953702317/emojis/1f5d2.png diff --git a/dist/v-1527758585938/emojis/1f5d3.png b/dist/v-1528953702317/emojis/1f5d3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5d3.png rename to dist/v-1528953702317/emojis/1f5d3.png diff --git a/dist/v-1527758585938/emojis/1f5dc.png b/dist/v-1528953702317/emojis/1f5dc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5dc.png rename to dist/v-1528953702317/emojis/1f5dc.png diff --git a/dist/v-1527758585938/emojis/1f5dd.png b/dist/v-1528953702317/emojis/1f5dd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5dd.png rename to dist/v-1528953702317/emojis/1f5dd.png diff --git a/dist/v-1527758585938/emojis/1f5de.png b/dist/v-1528953702317/emojis/1f5de.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5de.png rename to dist/v-1528953702317/emojis/1f5de.png diff --git a/dist/v-1527758585938/emojis/1f5e1.png b/dist/v-1528953702317/emojis/1f5e1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5e1.png rename to dist/v-1528953702317/emojis/1f5e1.png diff --git a/dist/v-1527758585938/emojis/1f5e3.png b/dist/v-1528953702317/emojis/1f5e3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5e3.png rename to dist/v-1528953702317/emojis/1f5e3.png diff --git a/dist/v-1527758585938/emojis/1f5e8.png b/dist/v-1528953702317/emojis/1f5e8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5e8.png rename to dist/v-1528953702317/emojis/1f5e8.png diff --git a/dist/v-1527758585938/emojis/1f5ef.png b/dist/v-1528953702317/emojis/1f5ef.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5ef.png rename to dist/v-1528953702317/emojis/1f5ef.png diff --git a/dist/v-1527758585938/emojis/1f5f3.png b/dist/v-1528953702317/emojis/1f5f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5f3.png rename to dist/v-1528953702317/emojis/1f5f3.png diff --git a/dist/v-1527758585938/emojis/1f5fa.png b/dist/v-1528953702317/emojis/1f5fa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5fa.png rename to dist/v-1528953702317/emojis/1f5fa.png diff --git a/dist/v-1527758585938/emojis/1f5fb.png b/dist/v-1528953702317/emojis/1f5fb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5fb.png rename to dist/v-1528953702317/emojis/1f5fb.png diff --git a/dist/v-1527758585938/emojis/1f5fc.png b/dist/v-1528953702317/emojis/1f5fc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5fc.png rename to dist/v-1528953702317/emojis/1f5fc.png diff --git a/dist/v-1527758585938/emojis/1f5fd.png b/dist/v-1528953702317/emojis/1f5fd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5fd.png rename to dist/v-1528953702317/emojis/1f5fd.png diff --git a/dist/v-1527758585938/emojis/1f5fe.png b/dist/v-1528953702317/emojis/1f5fe.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5fe.png rename to dist/v-1528953702317/emojis/1f5fe.png diff --git a/dist/v-1527758585938/emojis/1f5ff.png b/dist/v-1528953702317/emojis/1f5ff.png similarity index 100% rename from dist/v-1527758585938/emojis/1f5ff.png rename to dist/v-1528953702317/emojis/1f5ff.png diff --git a/dist/v-1527758585938/emojis/1f600.png b/dist/v-1528953702317/emojis/1f600.png similarity index 100% rename from dist/v-1527758585938/emojis/1f600.png rename to dist/v-1528953702317/emojis/1f600.png diff --git a/dist/v-1527758585938/emojis/1f601.png b/dist/v-1528953702317/emojis/1f601.png similarity index 100% rename from dist/v-1527758585938/emojis/1f601.png rename to dist/v-1528953702317/emojis/1f601.png diff --git a/dist/v-1527758585938/emojis/1f602.png b/dist/v-1528953702317/emojis/1f602.png similarity index 100% rename from dist/v-1527758585938/emojis/1f602.png rename to dist/v-1528953702317/emojis/1f602.png diff --git a/dist/v-1527758585938/emojis/1f603.png b/dist/v-1528953702317/emojis/1f603.png similarity index 100% rename from dist/v-1527758585938/emojis/1f603.png rename to dist/v-1528953702317/emojis/1f603.png diff --git a/dist/v-1527758585938/emojis/1f604.png b/dist/v-1528953702317/emojis/1f604.png similarity index 100% rename from dist/v-1527758585938/emojis/1f604.png rename to dist/v-1528953702317/emojis/1f604.png diff --git a/dist/v-1527758585938/emojis/1f605.png b/dist/v-1528953702317/emojis/1f605.png similarity index 100% rename from dist/v-1527758585938/emojis/1f605.png rename to dist/v-1528953702317/emojis/1f605.png diff --git a/dist/v-1527758585938/emojis/1f606.png b/dist/v-1528953702317/emojis/1f606.png similarity index 100% rename from dist/v-1527758585938/emojis/1f606.png rename to dist/v-1528953702317/emojis/1f606.png diff --git a/dist/v-1527758585938/emojis/1f607.png b/dist/v-1528953702317/emojis/1f607.png similarity index 100% rename from dist/v-1527758585938/emojis/1f607.png rename to dist/v-1528953702317/emojis/1f607.png diff --git a/dist/v-1527758585938/emojis/1f608.png b/dist/v-1528953702317/emojis/1f608.png similarity index 100% rename from dist/v-1527758585938/emojis/1f608.png rename to dist/v-1528953702317/emojis/1f608.png diff --git a/dist/v-1527758585938/emojis/1f609.png b/dist/v-1528953702317/emojis/1f609.png similarity index 100% rename from dist/v-1527758585938/emojis/1f609.png rename to dist/v-1528953702317/emojis/1f609.png diff --git a/dist/v-1527758585938/emojis/1f60a.png b/dist/v-1528953702317/emojis/1f60a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f60a.png rename to dist/v-1528953702317/emojis/1f60a.png diff --git a/dist/v-1527758585938/emojis/1f60b.png b/dist/v-1528953702317/emojis/1f60b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f60b.png rename to dist/v-1528953702317/emojis/1f60b.png diff --git a/dist/v-1527758585938/emojis/1f60c.png b/dist/v-1528953702317/emojis/1f60c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f60c.png rename to dist/v-1528953702317/emojis/1f60c.png diff --git a/dist/v-1527758585938/emojis/1f60d.png b/dist/v-1528953702317/emojis/1f60d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f60d.png rename to dist/v-1528953702317/emojis/1f60d.png diff --git a/dist/v-1527758585938/emojis/1f60e.png b/dist/v-1528953702317/emojis/1f60e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f60e.png rename to dist/v-1528953702317/emojis/1f60e.png diff --git a/dist/v-1527758585938/emojis/1f60f.png b/dist/v-1528953702317/emojis/1f60f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f60f.png rename to dist/v-1528953702317/emojis/1f60f.png diff --git a/dist/v-1527758585938/emojis/1f610.png b/dist/v-1528953702317/emojis/1f610.png similarity index 100% rename from dist/v-1527758585938/emojis/1f610.png rename to dist/v-1528953702317/emojis/1f610.png diff --git a/dist/v-1527758585938/emojis/1f611.png b/dist/v-1528953702317/emojis/1f611.png similarity index 100% rename from dist/v-1527758585938/emojis/1f611.png rename to dist/v-1528953702317/emojis/1f611.png diff --git a/dist/v-1527758585938/emojis/1f612.png b/dist/v-1528953702317/emojis/1f612.png similarity index 100% rename from dist/v-1527758585938/emojis/1f612.png rename to dist/v-1528953702317/emojis/1f612.png diff --git a/dist/v-1527758585938/emojis/1f613.png b/dist/v-1528953702317/emojis/1f613.png similarity index 100% rename from dist/v-1527758585938/emojis/1f613.png rename to dist/v-1528953702317/emojis/1f613.png diff --git a/dist/v-1527758585938/emojis/1f614.png b/dist/v-1528953702317/emojis/1f614.png similarity index 100% rename from dist/v-1527758585938/emojis/1f614.png rename to dist/v-1528953702317/emojis/1f614.png diff --git a/dist/v-1527758585938/emojis/1f615.png b/dist/v-1528953702317/emojis/1f615.png similarity index 100% rename from dist/v-1527758585938/emojis/1f615.png rename to dist/v-1528953702317/emojis/1f615.png diff --git a/dist/v-1527758585938/emojis/1f616.png b/dist/v-1528953702317/emojis/1f616.png similarity index 100% rename from dist/v-1527758585938/emojis/1f616.png rename to dist/v-1528953702317/emojis/1f616.png diff --git a/dist/v-1527758585938/emojis/1f617.png b/dist/v-1528953702317/emojis/1f617.png similarity index 100% rename from dist/v-1527758585938/emojis/1f617.png rename to dist/v-1528953702317/emojis/1f617.png diff --git a/dist/v-1527758585938/emojis/1f618.png b/dist/v-1528953702317/emojis/1f618.png similarity index 100% rename from dist/v-1527758585938/emojis/1f618.png rename to dist/v-1528953702317/emojis/1f618.png diff --git a/dist/v-1527758585938/emojis/1f619.png b/dist/v-1528953702317/emojis/1f619.png similarity index 100% rename from dist/v-1527758585938/emojis/1f619.png rename to dist/v-1528953702317/emojis/1f619.png diff --git a/dist/v-1527758585938/emojis/1f61a.png b/dist/v-1528953702317/emojis/1f61a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f61a.png rename to dist/v-1528953702317/emojis/1f61a.png diff --git a/dist/v-1527758585938/emojis/1f61b.png b/dist/v-1528953702317/emojis/1f61b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f61b.png rename to dist/v-1528953702317/emojis/1f61b.png diff --git a/dist/v-1527758585938/emojis/1f61c.png b/dist/v-1528953702317/emojis/1f61c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f61c.png rename to dist/v-1528953702317/emojis/1f61c.png diff --git a/dist/v-1527758585938/emojis/1f61d.png b/dist/v-1528953702317/emojis/1f61d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f61d.png rename to dist/v-1528953702317/emojis/1f61d.png diff --git a/dist/v-1527758585938/emojis/1f61e.png b/dist/v-1528953702317/emojis/1f61e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f61e.png rename to dist/v-1528953702317/emojis/1f61e.png diff --git a/dist/v-1527758585938/emojis/1f61f.png b/dist/v-1528953702317/emojis/1f61f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f61f.png rename to dist/v-1528953702317/emojis/1f61f.png diff --git a/dist/v-1527758585938/emojis/1f620.png b/dist/v-1528953702317/emojis/1f620.png similarity index 100% rename from dist/v-1527758585938/emojis/1f620.png rename to dist/v-1528953702317/emojis/1f620.png diff --git a/dist/v-1527758585938/emojis/1f621.png b/dist/v-1528953702317/emojis/1f621.png similarity index 100% rename from dist/v-1527758585938/emojis/1f621.png rename to dist/v-1528953702317/emojis/1f621.png diff --git a/dist/v-1527758585938/emojis/1f622.png b/dist/v-1528953702317/emojis/1f622.png similarity index 100% rename from dist/v-1527758585938/emojis/1f622.png rename to dist/v-1528953702317/emojis/1f622.png diff --git a/dist/v-1527758585938/emojis/1f623.png b/dist/v-1528953702317/emojis/1f623.png similarity index 100% rename from dist/v-1527758585938/emojis/1f623.png rename to dist/v-1528953702317/emojis/1f623.png diff --git a/dist/v-1527758585938/emojis/1f624.png b/dist/v-1528953702317/emojis/1f624.png similarity index 100% rename from dist/v-1527758585938/emojis/1f624.png rename to dist/v-1528953702317/emojis/1f624.png diff --git a/dist/v-1527758585938/emojis/1f625.png b/dist/v-1528953702317/emojis/1f625.png similarity index 100% rename from dist/v-1527758585938/emojis/1f625.png rename to dist/v-1528953702317/emojis/1f625.png diff --git a/dist/v-1527758585938/emojis/1f626.png b/dist/v-1528953702317/emojis/1f626.png similarity index 100% rename from dist/v-1527758585938/emojis/1f626.png rename to dist/v-1528953702317/emojis/1f626.png diff --git a/dist/v-1527758585938/emojis/1f627.png b/dist/v-1528953702317/emojis/1f627.png similarity index 100% rename from dist/v-1527758585938/emojis/1f627.png rename to dist/v-1528953702317/emojis/1f627.png diff --git a/dist/v-1527758585938/emojis/1f628.png b/dist/v-1528953702317/emojis/1f628.png similarity index 100% rename from dist/v-1527758585938/emojis/1f628.png rename to dist/v-1528953702317/emojis/1f628.png diff --git a/dist/v-1527758585938/emojis/1f629.png b/dist/v-1528953702317/emojis/1f629.png similarity index 100% rename from dist/v-1527758585938/emojis/1f629.png rename to dist/v-1528953702317/emojis/1f629.png diff --git a/dist/v-1527758585938/emojis/1f62a.png b/dist/v-1528953702317/emojis/1f62a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f62a.png rename to dist/v-1528953702317/emojis/1f62a.png diff --git a/dist/v-1527758585938/emojis/1f62b.png b/dist/v-1528953702317/emojis/1f62b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f62b.png rename to dist/v-1528953702317/emojis/1f62b.png diff --git a/dist/v-1527758585938/emojis/1f62c.png b/dist/v-1528953702317/emojis/1f62c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f62c.png rename to dist/v-1528953702317/emojis/1f62c.png diff --git a/dist/v-1527758585938/emojis/1f62d.png b/dist/v-1528953702317/emojis/1f62d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f62d.png rename to dist/v-1528953702317/emojis/1f62d.png diff --git a/dist/v-1527758585938/emojis/1f62e.png b/dist/v-1528953702317/emojis/1f62e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f62e.png rename to dist/v-1528953702317/emojis/1f62e.png diff --git a/dist/v-1527758585938/emojis/1f62f.png b/dist/v-1528953702317/emojis/1f62f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f62f.png rename to dist/v-1528953702317/emojis/1f62f.png diff --git a/dist/v-1527758585938/emojis/1f630.png b/dist/v-1528953702317/emojis/1f630.png similarity index 100% rename from dist/v-1527758585938/emojis/1f630.png rename to dist/v-1528953702317/emojis/1f630.png diff --git a/dist/v-1527758585938/emojis/1f631.png b/dist/v-1528953702317/emojis/1f631.png similarity index 100% rename from dist/v-1527758585938/emojis/1f631.png rename to dist/v-1528953702317/emojis/1f631.png diff --git a/dist/v-1527758585938/emojis/1f632.png b/dist/v-1528953702317/emojis/1f632.png similarity index 100% rename from dist/v-1527758585938/emojis/1f632.png rename to dist/v-1528953702317/emojis/1f632.png diff --git a/dist/v-1527758585938/emojis/1f633.png b/dist/v-1528953702317/emojis/1f633.png similarity index 100% rename from dist/v-1527758585938/emojis/1f633.png rename to dist/v-1528953702317/emojis/1f633.png diff --git a/dist/v-1527758585938/emojis/1f634.png b/dist/v-1528953702317/emojis/1f634.png similarity index 100% rename from dist/v-1527758585938/emojis/1f634.png rename to dist/v-1528953702317/emojis/1f634.png diff --git a/dist/v-1527758585938/emojis/1f635.png b/dist/v-1528953702317/emojis/1f635.png similarity index 100% rename from dist/v-1527758585938/emojis/1f635.png rename to dist/v-1528953702317/emojis/1f635.png diff --git a/dist/v-1527758585938/emojis/1f636.png b/dist/v-1528953702317/emojis/1f636.png similarity index 100% rename from dist/v-1527758585938/emojis/1f636.png rename to dist/v-1528953702317/emojis/1f636.png diff --git a/dist/v-1527758585938/emojis/1f637.png b/dist/v-1528953702317/emojis/1f637.png similarity index 100% rename from dist/v-1527758585938/emojis/1f637.png rename to dist/v-1528953702317/emojis/1f637.png diff --git a/dist/v-1527758585938/emojis/1f638.png b/dist/v-1528953702317/emojis/1f638.png similarity index 100% rename from dist/v-1527758585938/emojis/1f638.png rename to dist/v-1528953702317/emojis/1f638.png diff --git a/dist/v-1527758585938/emojis/1f639.png b/dist/v-1528953702317/emojis/1f639.png similarity index 100% rename from dist/v-1527758585938/emojis/1f639.png rename to dist/v-1528953702317/emojis/1f639.png diff --git a/dist/v-1527758585938/emojis/1f63a.png b/dist/v-1528953702317/emojis/1f63a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f63a.png rename to dist/v-1528953702317/emojis/1f63a.png diff --git a/dist/v-1527758585938/emojis/1f63b.png b/dist/v-1528953702317/emojis/1f63b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f63b.png rename to dist/v-1528953702317/emojis/1f63b.png diff --git a/dist/v-1527758585938/emojis/1f63c.png b/dist/v-1528953702317/emojis/1f63c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f63c.png rename to dist/v-1528953702317/emojis/1f63c.png diff --git a/dist/v-1527758585938/emojis/1f63d.png b/dist/v-1528953702317/emojis/1f63d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f63d.png rename to dist/v-1528953702317/emojis/1f63d.png diff --git a/dist/v-1527758585938/emojis/1f63e.png b/dist/v-1528953702317/emojis/1f63e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f63e.png rename to dist/v-1528953702317/emojis/1f63e.png diff --git a/dist/v-1527758585938/emojis/1f63f.png b/dist/v-1528953702317/emojis/1f63f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f63f.png rename to dist/v-1528953702317/emojis/1f63f.png diff --git a/dist/v-1527758585938/emojis/1f640.png b/dist/v-1528953702317/emojis/1f640.png similarity index 100% rename from dist/v-1527758585938/emojis/1f640.png rename to dist/v-1528953702317/emojis/1f640.png diff --git a/dist/v-1527758585938/emojis/1f641.png b/dist/v-1528953702317/emojis/1f641.png similarity index 100% rename from dist/v-1527758585938/emojis/1f641.png rename to dist/v-1528953702317/emojis/1f641.png diff --git a/dist/v-1527758585938/emojis/1f642.png b/dist/v-1528953702317/emojis/1f642.png similarity index 100% rename from dist/v-1527758585938/emojis/1f642.png rename to dist/v-1528953702317/emojis/1f642.png diff --git a/dist/v-1527758585938/emojis/1f643.png b/dist/v-1528953702317/emojis/1f643.png similarity index 100% rename from dist/v-1527758585938/emojis/1f643.png rename to dist/v-1528953702317/emojis/1f643.png diff --git a/dist/v-1527758585938/emojis/1f644.png b/dist/v-1528953702317/emojis/1f644.png similarity index 100% rename from dist/v-1527758585938/emojis/1f644.png rename to dist/v-1528953702317/emojis/1f644.png diff --git a/dist/v-1527758585938/emojis/1f645-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f645-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f645-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f645-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f645-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f645-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f645-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f645-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f645.png b/dist/v-1528953702317/emojis/1f645.png similarity index 100% rename from dist/v-1527758585938/emojis/1f645.png rename to dist/v-1528953702317/emojis/1f645.png diff --git a/dist/v-1527758585938/emojis/1f646-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f646-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f646-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f646-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f646-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f646-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f646-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f646-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f646.png b/dist/v-1528953702317/emojis/1f646.png similarity index 100% rename from dist/v-1527758585938/emojis/1f646.png rename to dist/v-1528953702317/emojis/1f646.png diff --git a/dist/v-1527758585938/emojis/1f647-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f647-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f647-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f647-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f647-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f647-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f647-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f647-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f647.png b/dist/v-1528953702317/emojis/1f647.png similarity index 100% rename from dist/v-1527758585938/emojis/1f647.png rename to dist/v-1528953702317/emojis/1f647.png diff --git a/dist/v-1527758585938/emojis/1f648.png b/dist/v-1528953702317/emojis/1f648.png similarity index 100% rename from dist/v-1527758585938/emojis/1f648.png rename to dist/v-1528953702317/emojis/1f648.png diff --git a/dist/v-1527758585938/emojis/1f649.png b/dist/v-1528953702317/emojis/1f649.png similarity index 100% rename from dist/v-1527758585938/emojis/1f649.png rename to dist/v-1528953702317/emojis/1f649.png diff --git a/dist/v-1527758585938/emojis/1f64a.png b/dist/v-1528953702317/emojis/1f64a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64a.png rename to dist/v-1528953702317/emojis/1f64a.png diff --git a/dist/v-1527758585938/emojis/1f64b-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f64b-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64b-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f64b-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f64b-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f64b-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64b-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f64b-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f64b.png b/dist/v-1528953702317/emojis/1f64b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64b.png rename to dist/v-1528953702317/emojis/1f64b.png diff --git a/dist/v-1527758585938/emojis/1f64c.png b/dist/v-1528953702317/emojis/1f64c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64c.png rename to dist/v-1528953702317/emojis/1f64c.png diff --git a/dist/v-1527758585938/emojis/1f64d-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f64d-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64d-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f64d-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f64d-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f64d-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64d-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f64d-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f64d.png b/dist/v-1528953702317/emojis/1f64d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64d.png rename to dist/v-1528953702317/emojis/1f64d.png diff --git a/dist/v-1527758585938/emojis/1f64e-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f64e-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64e-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f64e-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f64e-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f64e-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64e-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f64e-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f64e.png b/dist/v-1528953702317/emojis/1f64e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64e.png rename to dist/v-1528953702317/emojis/1f64e.png diff --git a/dist/v-1527758585938/emojis/1f64f.png b/dist/v-1528953702317/emojis/1f64f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f64f.png rename to dist/v-1528953702317/emojis/1f64f.png diff --git a/dist/v-1527758585938/emojis/1f680.png b/dist/v-1528953702317/emojis/1f680.png similarity index 100% rename from dist/v-1527758585938/emojis/1f680.png rename to dist/v-1528953702317/emojis/1f680.png diff --git a/dist/v-1527758585938/emojis/1f681.png b/dist/v-1528953702317/emojis/1f681.png similarity index 100% rename from dist/v-1527758585938/emojis/1f681.png rename to dist/v-1528953702317/emojis/1f681.png diff --git a/dist/v-1527758585938/emojis/1f682.png b/dist/v-1528953702317/emojis/1f682.png similarity index 100% rename from dist/v-1527758585938/emojis/1f682.png rename to dist/v-1528953702317/emojis/1f682.png diff --git a/dist/v-1527758585938/emojis/1f683.png b/dist/v-1528953702317/emojis/1f683.png similarity index 100% rename from dist/v-1527758585938/emojis/1f683.png rename to dist/v-1528953702317/emojis/1f683.png diff --git a/dist/v-1527758585938/emojis/1f684.png b/dist/v-1528953702317/emojis/1f684.png similarity index 100% rename from dist/v-1527758585938/emojis/1f684.png rename to dist/v-1528953702317/emojis/1f684.png diff --git a/dist/v-1527758585938/emojis/1f685.png b/dist/v-1528953702317/emojis/1f685.png similarity index 100% rename from dist/v-1527758585938/emojis/1f685.png rename to dist/v-1528953702317/emojis/1f685.png diff --git a/dist/v-1527758585938/emojis/1f686.png b/dist/v-1528953702317/emojis/1f686.png similarity index 100% rename from dist/v-1527758585938/emojis/1f686.png rename to dist/v-1528953702317/emojis/1f686.png diff --git a/dist/v-1527758585938/emojis/1f687.png b/dist/v-1528953702317/emojis/1f687.png similarity index 100% rename from dist/v-1527758585938/emojis/1f687.png rename to dist/v-1528953702317/emojis/1f687.png diff --git a/dist/v-1527758585938/emojis/1f688.png b/dist/v-1528953702317/emojis/1f688.png similarity index 100% rename from dist/v-1527758585938/emojis/1f688.png rename to dist/v-1528953702317/emojis/1f688.png diff --git a/dist/v-1527758585938/emojis/1f689.png b/dist/v-1528953702317/emojis/1f689.png similarity index 100% rename from dist/v-1527758585938/emojis/1f689.png rename to dist/v-1528953702317/emojis/1f689.png diff --git a/dist/v-1527758585938/emojis/1f68a.png b/dist/v-1528953702317/emojis/1f68a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f68a.png rename to dist/v-1528953702317/emojis/1f68a.png diff --git a/dist/v-1527758585938/emojis/1f68b.png b/dist/v-1528953702317/emojis/1f68b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f68b.png rename to dist/v-1528953702317/emojis/1f68b.png diff --git a/dist/v-1527758585938/emojis/1f68c.png b/dist/v-1528953702317/emojis/1f68c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f68c.png rename to dist/v-1528953702317/emojis/1f68c.png diff --git a/dist/v-1527758585938/emojis/1f68d.png b/dist/v-1528953702317/emojis/1f68d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f68d.png rename to dist/v-1528953702317/emojis/1f68d.png diff --git a/dist/v-1527758585938/emojis/1f68e.png b/dist/v-1528953702317/emojis/1f68e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f68e.png rename to dist/v-1528953702317/emojis/1f68e.png diff --git a/dist/v-1527758585938/emojis/1f68f.png b/dist/v-1528953702317/emojis/1f68f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f68f.png rename to dist/v-1528953702317/emojis/1f68f.png diff --git a/dist/v-1527758585938/emojis/1f690.png b/dist/v-1528953702317/emojis/1f690.png similarity index 100% rename from dist/v-1527758585938/emojis/1f690.png rename to dist/v-1528953702317/emojis/1f690.png diff --git a/dist/v-1527758585938/emojis/1f691.png b/dist/v-1528953702317/emojis/1f691.png similarity index 100% rename from dist/v-1527758585938/emojis/1f691.png rename to dist/v-1528953702317/emojis/1f691.png diff --git a/dist/v-1527758585938/emojis/1f692.png b/dist/v-1528953702317/emojis/1f692.png similarity index 100% rename from dist/v-1527758585938/emojis/1f692.png rename to dist/v-1528953702317/emojis/1f692.png diff --git a/dist/v-1527758585938/emojis/1f693.png b/dist/v-1528953702317/emojis/1f693.png similarity index 100% rename from dist/v-1527758585938/emojis/1f693.png rename to dist/v-1528953702317/emojis/1f693.png diff --git a/dist/v-1527758585938/emojis/1f694.png b/dist/v-1528953702317/emojis/1f694.png similarity index 100% rename from dist/v-1527758585938/emojis/1f694.png rename to dist/v-1528953702317/emojis/1f694.png diff --git a/dist/v-1527758585938/emojis/1f695.png b/dist/v-1528953702317/emojis/1f695.png similarity index 100% rename from dist/v-1527758585938/emojis/1f695.png rename to dist/v-1528953702317/emojis/1f695.png diff --git a/dist/v-1527758585938/emojis/1f696.png b/dist/v-1528953702317/emojis/1f696.png similarity index 100% rename from dist/v-1527758585938/emojis/1f696.png rename to dist/v-1528953702317/emojis/1f696.png diff --git a/dist/v-1527758585938/emojis/1f697.png b/dist/v-1528953702317/emojis/1f697.png similarity index 100% rename from dist/v-1527758585938/emojis/1f697.png rename to dist/v-1528953702317/emojis/1f697.png diff --git a/dist/v-1527758585938/emojis/1f698.png b/dist/v-1528953702317/emojis/1f698.png similarity index 100% rename from dist/v-1527758585938/emojis/1f698.png rename to dist/v-1528953702317/emojis/1f698.png diff --git a/dist/v-1527758585938/emojis/1f699.png b/dist/v-1528953702317/emojis/1f699.png similarity index 100% rename from dist/v-1527758585938/emojis/1f699.png rename to dist/v-1528953702317/emojis/1f699.png diff --git a/dist/v-1527758585938/emojis/1f69a.png b/dist/v-1528953702317/emojis/1f69a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f69a.png rename to dist/v-1528953702317/emojis/1f69a.png diff --git a/dist/v-1527758585938/emojis/1f69b.png b/dist/v-1528953702317/emojis/1f69b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f69b.png rename to dist/v-1528953702317/emojis/1f69b.png diff --git a/dist/v-1527758585938/emojis/1f69c.png b/dist/v-1528953702317/emojis/1f69c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f69c.png rename to dist/v-1528953702317/emojis/1f69c.png diff --git a/dist/v-1527758585938/emojis/1f69d.png b/dist/v-1528953702317/emojis/1f69d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f69d.png rename to dist/v-1528953702317/emojis/1f69d.png diff --git a/dist/v-1527758585938/emojis/1f69e.png b/dist/v-1528953702317/emojis/1f69e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f69e.png rename to dist/v-1528953702317/emojis/1f69e.png diff --git a/dist/v-1527758585938/emojis/1f69f.png b/dist/v-1528953702317/emojis/1f69f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f69f.png rename to dist/v-1528953702317/emojis/1f69f.png diff --git a/dist/v-1527758585938/emojis/1f6a0.png b/dist/v-1528953702317/emojis/1f6a0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a0.png rename to dist/v-1528953702317/emojis/1f6a0.png diff --git a/dist/v-1527758585938/emojis/1f6a1.png b/dist/v-1528953702317/emojis/1f6a1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a1.png rename to dist/v-1528953702317/emojis/1f6a1.png diff --git a/dist/v-1527758585938/emojis/1f6a2.png b/dist/v-1528953702317/emojis/1f6a2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a2.png rename to dist/v-1528953702317/emojis/1f6a2.png diff --git a/dist/v-1527758585938/emojis/1f6a3-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f6a3-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a3-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f6a3-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f6a3-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f6a3-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a3-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f6a3-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f6a3.png b/dist/v-1528953702317/emojis/1f6a3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a3.png rename to dist/v-1528953702317/emojis/1f6a3.png diff --git a/dist/v-1527758585938/emojis/1f6a4.png b/dist/v-1528953702317/emojis/1f6a4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a4.png rename to dist/v-1528953702317/emojis/1f6a4.png diff --git a/dist/v-1527758585938/emojis/1f6a5.png b/dist/v-1528953702317/emojis/1f6a5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a5.png rename to dist/v-1528953702317/emojis/1f6a5.png diff --git a/dist/v-1527758585938/emojis/1f6a6.png b/dist/v-1528953702317/emojis/1f6a6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a6.png rename to dist/v-1528953702317/emojis/1f6a6.png diff --git a/dist/v-1527758585938/emojis/1f6a7.png b/dist/v-1528953702317/emojis/1f6a7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a7.png rename to dist/v-1528953702317/emojis/1f6a7.png diff --git a/dist/v-1527758585938/emojis/1f6a8.png b/dist/v-1528953702317/emojis/1f6a8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a8.png rename to dist/v-1528953702317/emojis/1f6a8.png diff --git a/dist/v-1527758585938/emojis/1f6a9.png b/dist/v-1528953702317/emojis/1f6a9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6a9.png rename to dist/v-1528953702317/emojis/1f6a9.png diff --git a/dist/v-1527758585938/emojis/1f6aa.png b/dist/v-1528953702317/emojis/1f6aa.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6aa.png rename to dist/v-1528953702317/emojis/1f6aa.png diff --git a/dist/v-1527758585938/emojis/1f6ab.png b/dist/v-1528953702317/emojis/1f6ab.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6ab.png rename to dist/v-1528953702317/emojis/1f6ab.png diff --git a/dist/v-1527758585938/emojis/1f6ac.png b/dist/v-1528953702317/emojis/1f6ac.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6ac.png rename to dist/v-1528953702317/emojis/1f6ac.png diff --git a/dist/v-1527758585938/emojis/1f6ad.png b/dist/v-1528953702317/emojis/1f6ad.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6ad.png rename to dist/v-1528953702317/emojis/1f6ad.png diff --git a/dist/v-1527758585938/emojis/1f6ae.png b/dist/v-1528953702317/emojis/1f6ae.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6ae.png rename to dist/v-1528953702317/emojis/1f6ae.png diff --git a/dist/v-1527758585938/emojis/1f6af.png b/dist/v-1528953702317/emojis/1f6af.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6af.png rename to dist/v-1528953702317/emojis/1f6af.png diff --git a/dist/v-1527758585938/emojis/1f6b0.png b/dist/v-1528953702317/emojis/1f6b0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b0.png rename to dist/v-1528953702317/emojis/1f6b0.png diff --git a/dist/v-1527758585938/emojis/1f6b1.png b/dist/v-1528953702317/emojis/1f6b1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b1.png rename to dist/v-1528953702317/emojis/1f6b1.png diff --git a/dist/v-1527758585938/emojis/1f6b2.png b/dist/v-1528953702317/emojis/1f6b2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b2.png rename to dist/v-1528953702317/emojis/1f6b2.png diff --git a/dist/v-1527758585938/emojis/1f6b3.png b/dist/v-1528953702317/emojis/1f6b3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b3.png rename to dist/v-1528953702317/emojis/1f6b3.png diff --git a/dist/v-1527758585938/emojis/1f6b4-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f6b4-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b4-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f6b4-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f6b4-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f6b4-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b4-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f6b4-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f6b4.png b/dist/v-1528953702317/emojis/1f6b4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b4.png rename to dist/v-1528953702317/emojis/1f6b4.png diff --git a/dist/v-1527758585938/emojis/1f6b5-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f6b5-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b5-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f6b5-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f6b5-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f6b5-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b5-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f6b5-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f6b5.png b/dist/v-1528953702317/emojis/1f6b5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b5.png rename to dist/v-1528953702317/emojis/1f6b5.png diff --git a/dist/v-1527758585938/emojis/1f6b6-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f6b6-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b6-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f6b6-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f6b6-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f6b6-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b6-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f6b6-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f6b6.png b/dist/v-1528953702317/emojis/1f6b6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b6.png rename to dist/v-1528953702317/emojis/1f6b6.png diff --git a/dist/v-1527758585938/emojis/1f6b7.png b/dist/v-1528953702317/emojis/1f6b7.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b7.png rename to dist/v-1528953702317/emojis/1f6b7.png diff --git a/dist/v-1527758585938/emojis/1f6b8.png b/dist/v-1528953702317/emojis/1f6b8.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b8.png rename to dist/v-1528953702317/emojis/1f6b8.png diff --git a/dist/v-1527758585938/emojis/1f6b9.png b/dist/v-1528953702317/emojis/1f6b9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6b9.png rename to dist/v-1528953702317/emojis/1f6b9.png diff --git a/dist/v-1527758585938/emojis/1f6ba.png b/dist/v-1528953702317/emojis/1f6ba.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6ba.png rename to dist/v-1528953702317/emojis/1f6ba.png diff --git a/dist/v-1527758585938/emojis/1f6bb.png b/dist/v-1528953702317/emojis/1f6bb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6bb.png rename to dist/v-1528953702317/emojis/1f6bb.png diff --git a/dist/v-1527758585938/emojis/1f6bc.png b/dist/v-1528953702317/emojis/1f6bc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6bc.png rename to dist/v-1528953702317/emojis/1f6bc.png diff --git a/dist/v-1527758585938/emojis/1f6bd.png b/dist/v-1528953702317/emojis/1f6bd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6bd.png rename to dist/v-1528953702317/emojis/1f6bd.png diff --git a/dist/v-1527758585938/emojis/1f6be.png b/dist/v-1528953702317/emojis/1f6be.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6be.png rename to dist/v-1528953702317/emojis/1f6be.png diff --git a/dist/v-1527758585938/emojis/1f6bf.png b/dist/v-1528953702317/emojis/1f6bf.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6bf.png rename to dist/v-1528953702317/emojis/1f6bf.png diff --git a/dist/v-1527758585938/emojis/1f6c0.png b/dist/v-1528953702317/emojis/1f6c0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6c0.png rename to dist/v-1528953702317/emojis/1f6c0.png diff --git a/dist/v-1527758585938/emojis/1f6c1.png b/dist/v-1528953702317/emojis/1f6c1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6c1.png rename to dist/v-1528953702317/emojis/1f6c1.png diff --git a/dist/v-1527758585938/emojis/1f6c2.png b/dist/v-1528953702317/emojis/1f6c2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6c2.png rename to dist/v-1528953702317/emojis/1f6c2.png diff --git a/dist/v-1527758585938/emojis/1f6c3.png b/dist/v-1528953702317/emojis/1f6c3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6c3.png rename to dist/v-1528953702317/emojis/1f6c3.png diff --git a/dist/v-1527758585938/emojis/1f6c4.png b/dist/v-1528953702317/emojis/1f6c4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6c4.png rename to dist/v-1528953702317/emojis/1f6c4.png diff --git a/dist/v-1527758585938/emojis/1f6c5.png b/dist/v-1528953702317/emojis/1f6c5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6c5.png rename to dist/v-1528953702317/emojis/1f6c5.png diff --git a/dist/v-1527758585938/emojis/1f6cb.png b/dist/v-1528953702317/emojis/1f6cb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6cb.png rename to dist/v-1528953702317/emojis/1f6cb.png diff --git a/dist/v-1527758585938/emojis/1f6cc.png b/dist/v-1528953702317/emojis/1f6cc.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6cc.png rename to dist/v-1528953702317/emojis/1f6cc.png diff --git a/dist/v-1527758585938/emojis/1f6cd.png b/dist/v-1528953702317/emojis/1f6cd.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6cd.png rename to dist/v-1528953702317/emojis/1f6cd.png diff --git a/dist/v-1527758585938/emojis/1f6ce.png b/dist/v-1528953702317/emojis/1f6ce.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6ce.png rename to dist/v-1528953702317/emojis/1f6ce.png diff --git a/dist/v-1527758585938/emojis/1f6cf.png b/dist/v-1528953702317/emojis/1f6cf.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6cf.png rename to dist/v-1528953702317/emojis/1f6cf.png diff --git a/dist/v-1527758585938/emojis/1f6d0.png b/dist/v-1528953702317/emojis/1f6d0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6d0.png rename to dist/v-1528953702317/emojis/1f6d0.png diff --git a/dist/v-1527758585938/emojis/1f6d1.png b/dist/v-1528953702317/emojis/1f6d1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6d1.png rename to dist/v-1528953702317/emojis/1f6d1.png diff --git a/dist/v-1527758585938/emojis/1f6d2.png b/dist/v-1528953702317/emojis/1f6d2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6d2.png rename to dist/v-1528953702317/emojis/1f6d2.png diff --git a/dist/v-1527758585938/emojis/1f6e0.png b/dist/v-1528953702317/emojis/1f6e0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6e0.png rename to dist/v-1528953702317/emojis/1f6e0.png diff --git a/dist/v-1527758585938/emojis/1f6e1.png b/dist/v-1528953702317/emojis/1f6e1.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6e1.png rename to dist/v-1528953702317/emojis/1f6e1.png diff --git a/dist/v-1527758585938/emojis/1f6e2.png b/dist/v-1528953702317/emojis/1f6e2.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6e2.png rename to dist/v-1528953702317/emojis/1f6e2.png diff --git a/dist/v-1527758585938/emojis/1f6e3.png b/dist/v-1528953702317/emojis/1f6e3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6e3.png rename to dist/v-1528953702317/emojis/1f6e3.png diff --git a/dist/v-1527758585938/emojis/1f6e4.png b/dist/v-1528953702317/emojis/1f6e4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6e4.png rename to dist/v-1528953702317/emojis/1f6e4.png diff --git a/dist/v-1527758585938/emojis/1f6e5.png b/dist/v-1528953702317/emojis/1f6e5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6e5.png rename to dist/v-1528953702317/emojis/1f6e5.png diff --git a/dist/v-1527758585938/emojis/1f6e9.png b/dist/v-1528953702317/emojis/1f6e9.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6e9.png rename to dist/v-1528953702317/emojis/1f6e9.png diff --git a/dist/v-1527758585938/emojis/1f6eb.png b/dist/v-1528953702317/emojis/1f6eb.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6eb.png rename to dist/v-1528953702317/emojis/1f6eb.png diff --git a/dist/v-1527758585938/emojis/1f6ec.png b/dist/v-1528953702317/emojis/1f6ec.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6ec.png rename to dist/v-1528953702317/emojis/1f6ec.png diff --git a/dist/v-1527758585938/emojis/1f6f0.png b/dist/v-1528953702317/emojis/1f6f0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6f0.png rename to dist/v-1528953702317/emojis/1f6f0.png diff --git a/dist/v-1527758585938/emojis/1f6f3.png b/dist/v-1528953702317/emojis/1f6f3.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6f3.png rename to dist/v-1528953702317/emojis/1f6f3.png diff --git a/dist/v-1527758585938/emojis/1f6f4.png b/dist/v-1528953702317/emojis/1f6f4.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6f4.png rename to dist/v-1528953702317/emojis/1f6f4.png diff --git a/dist/v-1527758585938/emojis/1f6f5.png b/dist/v-1528953702317/emojis/1f6f5.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6f5.png rename to dist/v-1528953702317/emojis/1f6f5.png diff --git a/dist/v-1527758585938/emojis/1f6f6.png b/dist/v-1528953702317/emojis/1f6f6.png similarity index 100% rename from dist/v-1527758585938/emojis/1f6f6.png rename to dist/v-1528953702317/emojis/1f6f6.png diff --git a/dist/v-1527758585938/emojis/1f910.png b/dist/v-1528953702317/emojis/1f910.png similarity index 100% rename from dist/v-1527758585938/emojis/1f910.png rename to dist/v-1528953702317/emojis/1f910.png diff --git a/dist/v-1527758585938/emojis/1f911.png b/dist/v-1528953702317/emojis/1f911.png similarity index 100% rename from dist/v-1527758585938/emojis/1f911.png rename to dist/v-1528953702317/emojis/1f911.png diff --git a/dist/v-1527758585938/emojis/1f912.png b/dist/v-1528953702317/emojis/1f912.png similarity index 100% rename from dist/v-1527758585938/emojis/1f912.png rename to dist/v-1528953702317/emojis/1f912.png diff --git a/dist/v-1527758585938/emojis/1f913.png b/dist/v-1528953702317/emojis/1f913.png similarity index 100% rename from dist/v-1527758585938/emojis/1f913.png rename to dist/v-1528953702317/emojis/1f913.png diff --git a/dist/v-1527758585938/emojis/1f914.png b/dist/v-1528953702317/emojis/1f914.png similarity index 100% rename from dist/v-1527758585938/emojis/1f914.png rename to dist/v-1528953702317/emojis/1f914.png diff --git a/dist/v-1527758585938/emojis/1f915.png b/dist/v-1528953702317/emojis/1f915.png similarity index 100% rename from dist/v-1527758585938/emojis/1f915.png rename to dist/v-1528953702317/emojis/1f915.png diff --git a/dist/v-1527758585938/emojis/1f916.png b/dist/v-1528953702317/emojis/1f916.png similarity index 100% rename from dist/v-1527758585938/emojis/1f916.png rename to dist/v-1528953702317/emojis/1f916.png diff --git a/dist/v-1527758585938/emojis/1f917.png b/dist/v-1528953702317/emojis/1f917.png similarity index 100% rename from dist/v-1527758585938/emojis/1f917.png rename to dist/v-1528953702317/emojis/1f917.png diff --git a/dist/v-1527758585938/emojis/1f918.png b/dist/v-1528953702317/emojis/1f918.png similarity index 100% rename from dist/v-1527758585938/emojis/1f918.png rename to dist/v-1528953702317/emojis/1f918.png diff --git a/dist/v-1527758585938/emojis/1f919.png b/dist/v-1528953702317/emojis/1f919.png similarity index 100% rename from dist/v-1527758585938/emojis/1f919.png rename to dist/v-1528953702317/emojis/1f919.png diff --git a/dist/v-1527758585938/emojis/1f91a.png b/dist/v-1528953702317/emojis/1f91a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f91a.png rename to dist/v-1528953702317/emojis/1f91a.png diff --git a/dist/v-1527758585938/emojis/1f91b.png b/dist/v-1528953702317/emojis/1f91b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f91b.png rename to dist/v-1528953702317/emojis/1f91b.png diff --git a/dist/v-1527758585938/emojis/1f91c.png b/dist/v-1528953702317/emojis/1f91c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f91c.png rename to dist/v-1528953702317/emojis/1f91c.png diff --git a/dist/v-1527758585938/emojis/1f91d.png b/dist/v-1528953702317/emojis/1f91d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f91d.png rename to dist/v-1528953702317/emojis/1f91d.png diff --git a/dist/v-1527758585938/emojis/1f91e.png b/dist/v-1528953702317/emojis/1f91e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f91e.png rename to dist/v-1528953702317/emojis/1f91e.png diff --git a/dist/v-1527758585938/emojis/1f920.png b/dist/v-1528953702317/emojis/1f920.png similarity index 100% rename from dist/v-1527758585938/emojis/1f920.png rename to dist/v-1528953702317/emojis/1f920.png diff --git a/dist/v-1527758585938/emojis/1f921.png b/dist/v-1528953702317/emojis/1f921.png similarity index 100% rename from dist/v-1527758585938/emojis/1f921.png rename to dist/v-1528953702317/emojis/1f921.png diff --git a/dist/v-1527758585938/emojis/1f922.png b/dist/v-1528953702317/emojis/1f922.png similarity index 100% rename from dist/v-1527758585938/emojis/1f922.png rename to dist/v-1528953702317/emojis/1f922.png diff --git a/dist/v-1527758585938/emojis/1f923.png b/dist/v-1528953702317/emojis/1f923.png similarity index 100% rename from dist/v-1527758585938/emojis/1f923.png rename to dist/v-1528953702317/emojis/1f923.png diff --git a/dist/v-1527758585938/emojis/1f924.png b/dist/v-1528953702317/emojis/1f924.png similarity index 100% rename from dist/v-1527758585938/emojis/1f924.png rename to dist/v-1528953702317/emojis/1f924.png diff --git a/dist/v-1527758585938/emojis/1f925.png b/dist/v-1528953702317/emojis/1f925.png similarity index 100% rename from dist/v-1527758585938/emojis/1f925.png rename to dist/v-1528953702317/emojis/1f925.png diff --git a/dist/v-1527758585938/emojis/1f926-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f926-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f926-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f926-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f926-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f926-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f926-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f926-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f926.png b/dist/v-1528953702317/emojis/1f926.png similarity index 100% rename from dist/v-1527758585938/emojis/1f926.png rename to dist/v-1528953702317/emojis/1f926.png diff --git a/dist/v-1527758585938/emojis/1f927.png b/dist/v-1528953702317/emojis/1f927.png similarity index 100% rename from dist/v-1527758585938/emojis/1f927.png rename to dist/v-1528953702317/emojis/1f927.png diff --git a/dist/v-1527758585938/emojis/1f930.png b/dist/v-1528953702317/emojis/1f930.png similarity index 100% rename from dist/v-1527758585938/emojis/1f930.png rename to dist/v-1528953702317/emojis/1f930.png diff --git a/dist/v-1527758585938/emojis/1f933.png b/dist/v-1528953702317/emojis/1f933.png similarity index 100% rename from dist/v-1527758585938/emojis/1f933.png rename to dist/v-1528953702317/emojis/1f933.png diff --git a/dist/v-1527758585938/emojis/1f934.png b/dist/v-1528953702317/emojis/1f934.png similarity index 100% rename from dist/v-1527758585938/emojis/1f934.png rename to dist/v-1528953702317/emojis/1f934.png diff --git a/dist/v-1527758585938/emojis/1f935.png b/dist/v-1528953702317/emojis/1f935.png similarity index 100% rename from dist/v-1527758585938/emojis/1f935.png rename to dist/v-1528953702317/emojis/1f935.png diff --git a/dist/v-1527758585938/emojis/1f936.png b/dist/v-1528953702317/emojis/1f936.png similarity index 100% rename from dist/v-1527758585938/emojis/1f936.png rename to dist/v-1528953702317/emojis/1f936.png diff --git a/dist/v-1527758585938/emojis/1f937-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f937-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f937-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f937-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f937-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f937-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f937-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f937-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f937.png b/dist/v-1528953702317/emojis/1f937.png similarity index 100% rename from dist/v-1527758585938/emojis/1f937.png rename to dist/v-1528953702317/emojis/1f937.png diff --git a/dist/v-1527758585938/emojis/1f938-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f938-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f938-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f938-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f938-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f938-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f938-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f938-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f938.png b/dist/v-1528953702317/emojis/1f938.png similarity index 100% rename from dist/v-1527758585938/emojis/1f938.png rename to dist/v-1528953702317/emojis/1f938.png diff --git a/dist/v-1527758585938/emojis/1f939-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f939-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f939-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f939-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f939-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f939-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f939-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f939-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f939.png b/dist/v-1528953702317/emojis/1f939.png similarity index 100% rename from dist/v-1527758585938/emojis/1f939.png rename to dist/v-1528953702317/emojis/1f939.png diff --git a/dist/v-1527758585938/emojis/1f93a.png b/dist/v-1528953702317/emojis/1f93a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93a.png rename to dist/v-1528953702317/emojis/1f93a.png diff --git a/dist/v-1527758585938/emojis/1f93c-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f93c-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93c-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f93c-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f93c-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f93c-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93c-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f93c-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f93c.png b/dist/v-1528953702317/emojis/1f93c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93c.png rename to dist/v-1528953702317/emojis/1f93c.png diff --git a/dist/v-1527758585938/emojis/1f93d-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f93d-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93d-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f93d-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f93d-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f93d-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93d-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f93d-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f93d.png b/dist/v-1528953702317/emojis/1f93d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93d.png rename to dist/v-1528953702317/emojis/1f93d.png diff --git a/dist/v-1527758585938/emojis/1f93e-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/1f93e-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93e-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/1f93e-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f93e-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/1f93e-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93e-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/1f93e-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/1f93e.png b/dist/v-1528953702317/emojis/1f93e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f93e.png rename to dist/v-1528953702317/emojis/1f93e.png diff --git a/dist/v-1527758585938/emojis/1f940.png b/dist/v-1528953702317/emojis/1f940.png similarity index 100% rename from dist/v-1527758585938/emojis/1f940.png rename to dist/v-1528953702317/emojis/1f940.png diff --git a/dist/v-1527758585938/emojis/1f941.png b/dist/v-1528953702317/emojis/1f941.png similarity index 100% rename from dist/v-1527758585938/emojis/1f941.png rename to dist/v-1528953702317/emojis/1f941.png diff --git a/dist/v-1527758585938/emojis/1f942.png b/dist/v-1528953702317/emojis/1f942.png similarity index 100% rename from dist/v-1527758585938/emojis/1f942.png rename to dist/v-1528953702317/emojis/1f942.png diff --git a/dist/v-1527758585938/emojis/1f943.png b/dist/v-1528953702317/emojis/1f943.png similarity index 100% rename from dist/v-1527758585938/emojis/1f943.png rename to dist/v-1528953702317/emojis/1f943.png diff --git a/dist/v-1527758585938/emojis/1f944.png b/dist/v-1528953702317/emojis/1f944.png similarity index 100% rename from dist/v-1527758585938/emojis/1f944.png rename to dist/v-1528953702317/emojis/1f944.png diff --git a/dist/v-1527758585938/emojis/1f945.png b/dist/v-1528953702317/emojis/1f945.png similarity index 100% rename from dist/v-1527758585938/emojis/1f945.png rename to dist/v-1528953702317/emojis/1f945.png diff --git a/dist/v-1527758585938/emojis/1f947.png b/dist/v-1528953702317/emojis/1f947.png similarity index 100% rename from dist/v-1527758585938/emojis/1f947.png rename to dist/v-1528953702317/emojis/1f947.png diff --git a/dist/v-1527758585938/emojis/1f948.png b/dist/v-1528953702317/emojis/1f948.png similarity index 100% rename from dist/v-1527758585938/emojis/1f948.png rename to dist/v-1528953702317/emojis/1f948.png diff --git a/dist/v-1527758585938/emojis/1f949.png b/dist/v-1528953702317/emojis/1f949.png similarity index 100% rename from dist/v-1527758585938/emojis/1f949.png rename to dist/v-1528953702317/emojis/1f949.png diff --git a/dist/v-1527758585938/emojis/1f94a.png b/dist/v-1528953702317/emojis/1f94a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f94a.png rename to dist/v-1528953702317/emojis/1f94a.png diff --git a/dist/v-1527758585938/emojis/1f94b.png b/dist/v-1528953702317/emojis/1f94b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f94b.png rename to dist/v-1528953702317/emojis/1f94b.png diff --git a/dist/v-1527758585938/emojis/1f950.png b/dist/v-1528953702317/emojis/1f950.png similarity index 100% rename from dist/v-1527758585938/emojis/1f950.png rename to dist/v-1528953702317/emojis/1f950.png diff --git a/dist/v-1527758585938/emojis/1f951.png b/dist/v-1528953702317/emojis/1f951.png similarity index 100% rename from dist/v-1527758585938/emojis/1f951.png rename to dist/v-1528953702317/emojis/1f951.png diff --git a/dist/v-1527758585938/emojis/1f952.png b/dist/v-1528953702317/emojis/1f952.png similarity index 100% rename from dist/v-1527758585938/emojis/1f952.png rename to dist/v-1528953702317/emojis/1f952.png diff --git a/dist/v-1527758585938/emojis/1f953.png b/dist/v-1528953702317/emojis/1f953.png similarity index 100% rename from dist/v-1527758585938/emojis/1f953.png rename to dist/v-1528953702317/emojis/1f953.png diff --git a/dist/v-1527758585938/emojis/1f954.png b/dist/v-1528953702317/emojis/1f954.png similarity index 100% rename from dist/v-1527758585938/emojis/1f954.png rename to dist/v-1528953702317/emojis/1f954.png diff --git a/dist/v-1527758585938/emojis/1f955.png b/dist/v-1528953702317/emojis/1f955.png similarity index 100% rename from dist/v-1527758585938/emojis/1f955.png rename to dist/v-1528953702317/emojis/1f955.png diff --git a/dist/v-1527758585938/emojis/1f956.png b/dist/v-1528953702317/emojis/1f956.png similarity index 100% rename from dist/v-1527758585938/emojis/1f956.png rename to dist/v-1528953702317/emojis/1f956.png diff --git a/dist/v-1527758585938/emojis/1f957.png b/dist/v-1528953702317/emojis/1f957.png similarity index 100% rename from dist/v-1527758585938/emojis/1f957.png rename to dist/v-1528953702317/emojis/1f957.png diff --git a/dist/v-1527758585938/emojis/1f958.png b/dist/v-1528953702317/emojis/1f958.png similarity index 100% rename from dist/v-1527758585938/emojis/1f958.png rename to dist/v-1528953702317/emojis/1f958.png diff --git a/dist/v-1527758585938/emojis/1f959.png b/dist/v-1528953702317/emojis/1f959.png similarity index 100% rename from dist/v-1527758585938/emojis/1f959.png rename to dist/v-1528953702317/emojis/1f959.png diff --git a/dist/v-1527758585938/emojis/1f95a.png b/dist/v-1528953702317/emojis/1f95a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f95a.png rename to dist/v-1528953702317/emojis/1f95a.png diff --git a/dist/v-1527758585938/emojis/1f95b.png b/dist/v-1528953702317/emojis/1f95b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f95b.png rename to dist/v-1528953702317/emojis/1f95b.png diff --git a/dist/v-1527758585938/emojis/1f95c.png b/dist/v-1528953702317/emojis/1f95c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f95c.png rename to dist/v-1528953702317/emojis/1f95c.png diff --git a/dist/v-1527758585938/emojis/1f95d.png b/dist/v-1528953702317/emojis/1f95d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f95d.png rename to dist/v-1528953702317/emojis/1f95d.png diff --git a/dist/v-1527758585938/emojis/1f95e.png b/dist/v-1528953702317/emojis/1f95e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f95e.png rename to dist/v-1528953702317/emojis/1f95e.png diff --git a/dist/v-1527758585938/emojis/1f980.png b/dist/v-1528953702317/emojis/1f980.png similarity index 100% rename from dist/v-1527758585938/emojis/1f980.png rename to dist/v-1528953702317/emojis/1f980.png diff --git a/dist/v-1527758585938/emojis/1f981.png b/dist/v-1528953702317/emojis/1f981.png similarity index 100% rename from dist/v-1527758585938/emojis/1f981.png rename to dist/v-1528953702317/emojis/1f981.png diff --git a/dist/v-1527758585938/emojis/1f982.png b/dist/v-1528953702317/emojis/1f982.png similarity index 100% rename from dist/v-1527758585938/emojis/1f982.png rename to dist/v-1528953702317/emojis/1f982.png diff --git a/dist/v-1527758585938/emojis/1f983.png b/dist/v-1528953702317/emojis/1f983.png similarity index 100% rename from dist/v-1527758585938/emojis/1f983.png rename to dist/v-1528953702317/emojis/1f983.png diff --git a/dist/v-1527758585938/emojis/1f984.png b/dist/v-1528953702317/emojis/1f984.png similarity index 100% rename from dist/v-1527758585938/emojis/1f984.png rename to dist/v-1528953702317/emojis/1f984.png diff --git a/dist/v-1527758585938/emojis/1f985.png b/dist/v-1528953702317/emojis/1f985.png similarity index 100% rename from dist/v-1527758585938/emojis/1f985.png rename to dist/v-1528953702317/emojis/1f985.png diff --git a/dist/v-1527758585938/emojis/1f986.png b/dist/v-1528953702317/emojis/1f986.png similarity index 100% rename from dist/v-1527758585938/emojis/1f986.png rename to dist/v-1528953702317/emojis/1f986.png diff --git a/dist/v-1527758585938/emojis/1f987.png b/dist/v-1528953702317/emojis/1f987.png similarity index 100% rename from dist/v-1527758585938/emojis/1f987.png rename to dist/v-1528953702317/emojis/1f987.png diff --git a/dist/v-1527758585938/emojis/1f988.png b/dist/v-1528953702317/emojis/1f988.png similarity index 100% rename from dist/v-1527758585938/emojis/1f988.png rename to dist/v-1528953702317/emojis/1f988.png diff --git a/dist/v-1527758585938/emojis/1f989.png b/dist/v-1528953702317/emojis/1f989.png similarity index 100% rename from dist/v-1527758585938/emojis/1f989.png rename to dist/v-1528953702317/emojis/1f989.png diff --git a/dist/v-1527758585938/emojis/1f98a.png b/dist/v-1528953702317/emojis/1f98a.png similarity index 100% rename from dist/v-1527758585938/emojis/1f98a.png rename to dist/v-1528953702317/emojis/1f98a.png diff --git a/dist/v-1527758585938/emojis/1f98b.png b/dist/v-1528953702317/emojis/1f98b.png similarity index 100% rename from dist/v-1527758585938/emojis/1f98b.png rename to dist/v-1528953702317/emojis/1f98b.png diff --git a/dist/v-1527758585938/emojis/1f98c.png b/dist/v-1528953702317/emojis/1f98c.png similarity index 100% rename from dist/v-1527758585938/emojis/1f98c.png rename to dist/v-1528953702317/emojis/1f98c.png diff --git a/dist/v-1527758585938/emojis/1f98d.png b/dist/v-1528953702317/emojis/1f98d.png similarity index 100% rename from dist/v-1527758585938/emojis/1f98d.png rename to dist/v-1528953702317/emojis/1f98d.png diff --git a/dist/v-1527758585938/emojis/1f98e.png b/dist/v-1528953702317/emojis/1f98e.png similarity index 100% rename from dist/v-1527758585938/emojis/1f98e.png rename to dist/v-1528953702317/emojis/1f98e.png diff --git a/dist/v-1527758585938/emojis/1f98f.png b/dist/v-1528953702317/emojis/1f98f.png similarity index 100% rename from dist/v-1527758585938/emojis/1f98f.png rename to dist/v-1528953702317/emojis/1f98f.png diff --git a/dist/v-1527758585938/emojis/1f990.png b/dist/v-1528953702317/emojis/1f990.png similarity index 100% rename from dist/v-1527758585938/emojis/1f990.png rename to dist/v-1528953702317/emojis/1f990.png diff --git a/dist/v-1527758585938/emojis/1f991.png b/dist/v-1528953702317/emojis/1f991.png similarity index 100% rename from dist/v-1527758585938/emojis/1f991.png rename to dist/v-1528953702317/emojis/1f991.png diff --git a/dist/v-1527758585938/emojis/1f9c0.png b/dist/v-1528953702317/emojis/1f9c0.png similarity index 100% rename from dist/v-1527758585938/emojis/1f9c0.png rename to dist/v-1528953702317/emojis/1f9c0.png diff --git a/dist/v-1527758585938/emojis/203c.png b/dist/v-1528953702317/emojis/203c.png similarity index 100% rename from dist/v-1527758585938/emojis/203c.png rename to dist/v-1528953702317/emojis/203c.png diff --git a/dist/v-1527758585938/emojis/2049.png b/dist/v-1528953702317/emojis/2049.png similarity index 100% rename from dist/v-1527758585938/emojis/2049.png rename to dist/v-1528953702317/emojis/2049.png diff --git a/dist/v-1527758585938/emojis/2122.png b/dist/v-1528953702317/emojis/2122.png similarity index 100% rename from dist/v-1527758585938/emojis/2122.png rename to dist/v-1528953702317/emojis/2122.png diff --git a/dist/v-1527758585938/emojis/2139.png b/dist/v-1528953702317/emojis/2139.png similarity index 100% rename from dist/v-1527758585938/emojis/2139.png rename to dist/v-1528953702317/emojis/2139.png diff --git a/dist/v-1527758585938/emojis/2194.png b/dist/v-1528953702317/emojis/2194.png similarity index 100% rename from dist/v-1527758585938/emojis/2194.png rename to dist/v-1528953702317/emojis/2194.png diff --git a/dist/v-1527758585938/emojis/2195.png b/dist/v-1528953702317/emojis/2195.png similarity index 100% rename from dist/v-1527758585938/emojis/2195.png rename to dist/v-1528953702317/emojis/2195.png diff --git a/dist/v-1527758585938/emojis/2196.png b/dist/v-1528953702317/emojis/2196.png similarity index 100% rename from dist/v-1527758585938/emojis/2196.png rename to dist/v-1528953702317/emojis/2196.png diff --git a/dist/v-1527758585938/emojis/2197.png b/dist/v-1528953702317/emojis/2197.png similarity index 100% rename from dist/v-1527758585938/emojis/2197.png rename to dist/v-1528953702317/emojis/2197.png diff --git a/dist/v-1527758585938/emojis/2198.png b/dist/v-1528953702317/emojis/2198.png similarity index 100% rename from dist/v-1527758585938/emojis/2198.png rename to dist/v-1528953702317/emojis/2198.png diff --git a/dist/v-1527758585938/emojis/2199.png b/dist/v-1528953702317/emojis/2199.png similarity index 100% rename from dist/v-1527758585938/emojis/2199.png rename to dist/v-1528953702317/emojis/2199.png diff --git a/dist/v-1527758585938/emojis/21a9.png b/dist/v-1528953702317/emojis/21a9.png similarity index 100% rename from dist/v-1527758585938/emojis/21a9.png rename to dist/v-1528953702317/emojis/21a9.png diff --git a/dist/v-1527758585938/emojis/21aa.png b/dist/v-1528953702317/emojis/21aa.png similarity index 100% rename from dist/v-1527758585938/emojis/21aa.png rename to dist/v-1528953702317/emojis/21aa.png diff --git a/dist/v-1527758585938/emojis/231a.png b/dist/v-1528953702317/emojis/231a.png similarity index 100% rename from dist/v-1527758585938/emojis/231a.png rename to dist/v-1528953702317/emojis/231a.png diff --git a/dist/v-1527758585938/emojis/231b.png b/dist/v-1528953702317/emojis/231b.png similarity index 100% rename from dist/v-1527758585938/emojis/231b.png rename to dist/v-1528953702317/emojis/231b.png diff --git a/dist/v-1527758585938/emojis/2328.png b/dist/v-1528953702317/emojis/2328.png similarity index 100% rename from dist/v-1527758585938/emojis/2328.png rename to dist/v-1528953702317/emojis/2328.png diff --git a/dist/v-1527758585938/emojis/23cf.png b/dist/v-1528953702317/emojis/23cf.png similarity index 100% rename from dist/v-1527758585938/emojis/23cf.png rename to dist/v-1528953702317/emojis/23cf.png diff --git a/dist/v-1527758585938/emojis/23e9.png b/dist/v-1528953702317/emojis/23e9.png similarity index 100% rename from dist/v-1527758585938/emojis/23e9.png rename to dist/v-1528953702317/emojis/23e9.png diff --git a/dist/v-1527758585938/emojis/23ea.png b/dist/v-1528953702317/emojis/23ea.png similarity index 100% rename from dist/v-1527758585938/emojis/23ea.png rename to dist/v-1528953702317/emojis/23ea.png diff --git a/dist/v-1527758585938/emojis/23eb.png b/dist/v-1528953702317/emojis/23eb.png similarity index 100% rename from dist/v-1527758585938/emojis/23eb.png rename to dist/v-1528953702317/emojis/23eb.png diff --git a/dist/v-1527758585938/emojis/23ec.png b/dist/v-1528953702317/emojis/23ec.png similarity index 100% rename from dist/v-1527758585938/emojis/23ec.png rename to dist/v-1528953702317/emojis/23ec.png diff --git a/dist/v-1527758585938/emojis/23ed.png b/dist/v-1528953702317/emojis/23ed.png similarity index 100% rename from dist/v-1527758585938/emojis/23ed.png rename to dist/v-1528953702317/emojis/23ed.png diff --git a/dist/v-1527758585938/emojis/23ee.png b/dist/v-1528953702317/emojis/23ee.png similarity index 100% rename from dist/v-1527758585938/emojis/23ee.png rename to dist/v-1528953702317/emojis/23ee.png diff --git a/dist/v-1527758585938/emojis/23ef.png b/dist/v-1528953702317/emojis/23ef.png similarity index 100% rename from dist/v-1527758585938/emojis/23ef.png rename to dist/v-1528953702317/emojis/23ef.png diff --git a/dist/v-1527758585938/emojis/23f0.png b/dist/v-1528953702317/emojis/23f0.png similarity index 100% rename from dist/v-1527758585938/emojis/23f0.png rename to dist/v-1528953702317/emojis/23f0.png diff --git a/dist/v-1527758585938/emojis/23f1.png b/dist/v-1528953702317/emojis/23f1.png similarity index 100% rename from dist/v-1527758585938/emojis/23f1.png rename to dist/v-1528953702317/emojis/23f1.png diff --git a/dist/v-1527758585938/emojis/23f2.png b/dist/v-1528953702317/emojis/23f2.png similarity index 100% rename from dist/v-1527758585938/emojis/23f2.png rename to dist/v-1528953702317/emojis/23f2.png diff --git a/dist/v-1527758585938/emojis/23f3.png b/dist/v-1528953702317/emojis/23f3.png similarity index 100% rename from dist/v-1527758585938/emojis/23f3.png rename to dist/v-1528953702317/emojis/23f3.png diff --git a/dist/v-1527758585938/emojis/23f8.png b/dist/v-1528953702317/emojis/23f8.png similarity index 100% rename from dist/v-1527758585938/emojis/23f8.png rename to dist/v-1528953702317/emojis/23f8.png diff --git a/dist/v-1527758585938/emojis/23f9.png b/dist/v-1528953702317/emojis/23f9.png similarity index 100% rename from dist/v-1527758585938/emojis/23f9.png rename to dist/v-1528953702317/emojis/23f9.png diff --git a/dist/v-1527758585938/emojis/23fa.png b/dist/v-1528953702317/emojis/23fa.png similarity index 100% rename from dist/v-1527758585938/emojis/23fa.png rename to dist/v-1528953702317/emojis/23fa.png diff --git a/dist/v-1527758585938/emojis/24c2.png b/dist/v-1528953702317/emojis/24c2.png similarity index 100% rename from dist/v-1527758585938/emojis/24c2.png rename to dist/v-1528953702317/emojis/24c2.png diff --git a/dist/v-1527758585938/emojis/25aa.png b/dist/v-1528953702317/emojis/25aa.png similarity index 100% rename from dist/v-1527758585938/emojis/25aa.png rename to dist/v-1528953702317/emojis/25aa.png diff --git a/dist/v-1527758585938/emojis/25ab.png b/dist/v-1528953702317/emojis/25ab.png similarity index 100% rename from dist/v-1527758585938/emojis/25ab.png rename to dist/v-1528953702317/emojis/25ab.png diff --git a/dist/v-1527758585938/emojis/25b6.png b/dist/v-1528953702317/emojis/25b6.png similarity index 100% rename from dist/v-1527758585938/emojis/25b6.png rename to dist/v-1528953702317/emojis/25b6.png diff --git a/dist/v-1527758585938/emojis/25c0.png b/dist/v-1528953702317/emojis/25c0.png similarity index 100% rename from dist/v-1527758585938/emojis/25c0.png rename to dist/v-1528953702317/emojis/25c0.png diff --git a/dist/v-1527758585938/emojis/25fb.png b/dist/v-1528953702317/emojis/25fb.png similarity index 100% rename from dist/v-1527758585938/emojis/25fb.png rename to dist/v-1528953702317/emojis/25fb.png diff --git a/dist/v-1527758585938/emojis/25fc.png b/dist/v-1528953702317/emojis/25fc.png similarity index 100% rename from dist/v-1527758585938/emojis/25fc.png rename to dist/v-1528953702317/emojis/25fc.png diff --git a/dist/v-1527758585938/emojis/25fd.png b/dist/v-1528953702317/emojis/25fd.png similarity index 100% rename from dist/v-1527758585938/emojis/25fd.png rename to dist/v-1528953702317/emojis/25fd.png diff --git a/dist/v-1527758585938/emojis/25fe.png b/dist/v-1528953702317/emojis/25fe.png similarity index 100% rename from dist/v-1527758585938/emojis/25fe.png rename to dist/v-1528953702317/emojis/25fe.png diff --git a/dist/v-1527758585938/emojis/2600.png b/dist/v-1528953702317/emojis/2600.png similarity index 100% rename from dist/v-1527758585938/emojis/2600.png rename to dist/v-1528953702317/emojis/2600.png diff --git a/dist/v-1527758585938/emojis/2601.png b/dist/v-1528953702317/emojis/2601.png similarity index 100% rename from dist/v-1527758585938/emojis/2601.png rename to dist/v-1528953702317/emojis/2601.png diff --git a/dist/v-1527758585938/emojis/2602.png b/dist/v-1528953702317/emojis/2602.png similarity index 100% rename from dist/v-1527758585938/emojis/2602.png rename to dist/v-1528953702317/emojis/2602.png diff --git a/dist/v-1527758585938/emojis/2603.png b/dist/v-1528953702317/emojis/2603.png similarity index 100% rename from dist/v-1527758585938/emojis/2603.png rename to dist/v-1528953702317/emojis/2603.png diff --git a/dist/v-1527758585938/emojis/2604.png b/dist/v-1528953702317/emojis/2604.png similarity index 100% rename from dist/v-1527758585938/emojis/2604.png rename to dist/v-1528953702317/emojis/2604.png diff --git a/dist/v-1527758585938/emojis/260e.png b/dist/v-1528953702317/emojis/260e.png similarity index 100% rename from dist/v-1527758585938/emojis/260e.png rename to dist/v-1528953702317/emojis/260e.png diff --git a/dist/v-1527758585938/emojis/2611.png b/dist/v-1528953702317/emojis/2611.png similarity index 100% rename from dist/v-1527758585938/emojis/2611.png rename to dist/v-1528953702317/emojis/2611.png diff --git a/dist/v-1527758585938/emojis/2614.png b/dist/v-1528953702317/emojis/2614.png similarity index 100% rename from dist/v-1527758585938/emojis/2614.png rename to dist/v-1528953702317/emojis/2614.png diff --git a/dist/v-1527758585938/emojis/2615.png b/dist/v-1528953702317/emojis/2615.png similarity index 100% rename from dist/v-1527758585938/emojis/2615.png rename to dist/v-1528953702317/emojis/2615.png diff --git a/dist/v-1527758585938/emojis/2618.png b/dist/v-1528953702317/emojis/2618.png similarity index 100% rename from dist/v-1527758585938/emojis/2618.png rename to dist/v-1528953702317/emojis/2618.png diff --git a/dist/v-1527758585938/emojis/261d.png b/dist/v-1528953702317/emojis/261d.png similarity index 100% rename from dist/v-1527758585938/emojis/261d.png rename to dist/v-1528953702317/emojis/261d.png diff --git a/dist/v-1527758585938/emojis/2620.png b/dist/v-1528953702317/emojis/2620.png similarity index 100% rename from dist/v-1527758585938/emojis/2620.png rename to dist/v-1528953702317/emojis/2620.png diff --git a/dist/v-1527758585938/emojis/2622.png b/dist/v-1528953702317/emojis/2622.png similarity index 100% rename from dist/v-1527758585938/emojis/2622.png rename to dist/v-1528953702317/emojis/2622.png diff --git a/dist/v-1527758585938/emojis/2623.png b/dist/v-1528953702317/emojis/2623.png similarity index 100% rename from dist/v-1527758585938/emojis/2623.png rename to dist/v-1528953702317/emojis/2623.png diff --git a/dist/v-1527758585938/emojis/2626.png b/dist/v-1528953702317/emojis/2626.png similarity index 100% rename from dist/v-1527758585938/emojis/2626.png rename to dist/v-1528953702317/emojis/2626.png diff --git a/dist/v-1527758585938/emojis/262a.png b/dist/v-1528953702317/emojis/262a.png similarity index 100% rename from dist/v-1527758585938/emojis/262a.png rename to dist/v-1528953702317/emojis/262a.png diff --git a/dist/v-1527758585938/emojis/262e.png b/dist/v-1528953702317/emojis/262e.png similarity index 100% rename from dist/v-1527758585938/emojis/262e.png rename to dist/v-1528953702317/emojis/262e.png diff --git a/dist/v-1527758585938/emojis/262f.png b/dist/v-1528953702317/emojis/262f.png similarity index 100% rename from dist/v-1527758585938/emojis/262f.png rename to dist/v-1528953702317/emojis/262f.png diff --git a/dist/v-1527758585938/emojis/2638.png b/dist/v-1528953702317/emojis/2638.png similarity index 100% rename from dist/v-1527758585938/emojis/2638.png rename to dist/v-1528953702317/emojis/2638.png diff --git a/dist/v-1527758585938/emojis/2639.png b/dist/v-1528953702317/emojis/2639.png similarity index 100% rename from dist/v-1527758585938/emojis/2639.png rename to dist/v-1528953702317/emojis/2639.png diff --git a/dist/v-1527758585938/emojis/263a.png b/dist/v-1528953702317/emojis/263a.png similarity index 100% rename from dist/v-1527758585938/emojis/263a.png rename to dist/v-1528953702317/emojis/263a.png diff --git a/dist/v-1527758585938/emojis/2640.png b/dist/v-1528953702317/emojis/2640.png similarity index 100% rename from dist/v-1527758585938/emojis/2640.png rename to dist/v-1528953702317/emojis/2640.png diff --git a/dist/v-1527758585938/emojis/2642.png b/dist/v-1528953702317/emojis/2642.png similarity index 100% rename from dist/v-1527758585938/emojis/2642.png rename to dist/v-1528953702317/emojis/2642.png diff --git a/dist/v-1527758585938/emojis/2648.png b/dist/v-1528953702317/emojis/2648.png similarity index 100% rename from dist/v-1527758585938/emojis/2648.png rename to dist/v-1528953702317/emojis/2648.png diff --git a/dist/v-1527758585938/emojis/2649.png b/dist/v-1528953702317/emojis/2649.png similarity index 100% rename from dist/v-1527758585938/emojis/2649.png rename to dist/v-1528953702317/emojis/2649.png diff --git a/dist/v-1527758585938/emojis/264a.png b/dist/v-1528953702317/emojis/264a.png similarity index 100% rename from dist/v-1527758585938/emojis/264a.png rename to dist/v-1528953702317/emojis/264a.png diff --git a/dist/v-1527758585938/emojis/264b.png b/dist/v-1528953702317/emojis/264b.png similarity index 100% rename from dist/v-1527758585938/emojis/264b.png rename to dist/v-1528953702317/emojis/264b.png diff --git a/dist/v-1527758585938/emojis/264c.png b/dist/v-1528953702317/emojis/264c.png similarity index 100% rename from dist/v-1527758585938/emojis/264c.png rename to dist/v-1528953702317/emojis/264c.png diff --git a/dist/v-1527758585938/emojis/264d.png b/dist/v-1528953702317/emojis/264d.png similarity index 100% rename from dist/v-1527758585938/emojis/264d.png rename to dist/v-1528953702317/emojis/264d.png diff --git a/dist/v-1527758585938/emojis/264e.png b/dist/v-1528953702317/emojis/264e.png similarity index 100% rename from dist/v-1527758585938/emojis/264e.png rename to dist/v-1528953702317/emojis/264e.png diff --git a/dist/v-1527758585938/emojis/264f.png b/dist/v-1528953702317/emojis/264f.png similarity index 100% rename from dist/v-1527758585938/emojis/264f.png rename to dist/v-1528953702317/emojis/264f.png diff --git a/dist/v-1527758585938/emojis/2650.png b/dist/v-1528953702317/emojis/2650.png similarity index 100% rename from dist/v-1527758585938/emojis/2650.png rename to dist/v-1528953702317/emojis/2650.png diff --git a/dist/v-1527758585938/emojis/2651.png b/dist/v-1528953702317/emojis/2651.png similarity index 100% rename from dist/v-1527758585938/emojis/2651.png rename to dist/v-1528953702317/emojis/2651.png diff --git a/dist/v-1527758585938/emojis/2652.png b/dist/v-1528953702317/emojis/2652.png similarity index 100% rename from dist/v-1527758585938/emojis/2652.png rename to dist/v-1528953702317/emojis/2652.png diff --git a/dist/v-1527758585938/emojis/2653.png b/dist/v-1528953702317/emojis/2653.png similarity index 100% rename from dist/v-1527758585938/emojis/2653.png rename to dist/v-1528953702317/emojis/2653.png diff --git a/dist/v-1527758585938/emojis/2660.png b/dist/v-1528953702317/emojis/2660.png similarity index 100% rename from dist/v-1527758585938/emojis/2660.png rename to dist/v-1528953702317/emojis/2660.png diff --git a/dist/v-1527758585938/emojis/2663.png b/dist/v-1528953702317/emojis/2663.png similarity index 100% rename from dist/v-1527758585938/emojis/2663.png rename to dist/v-1528953702317/emojis/2663.png diff --git a/dist/v-1527758585938/emojis/2665.png b/dist/v-1528953702317/emojis/2665.png similarity index 100% rename from dist/v-1527758585938/emojis/2665.png rename to dist/v-1528953702317/emojis/2665.png diff --git a/dist/v-1527758585938/emojis/2666.png b/dist/v-1528953702317/emojis/2666.png similarity index 100% rename from dist/v-1527758585938/emojis/2666.png rename to dist/v-1528953702317/emojis/2666.png diff --git a/dist/v-1527758585938/emojis/2668.png b/dist/v-1528953702317/emojis/2668.png similarity index 100% rename from dist/v-1527758585938/emojis/2668.png rename to dist/v-1528953702317/emojis/2668.png diff --git a/dist/v-1527758585938/emojis/267b.png b/dist/v-1528953702317/emojis/267b.png similarity index 100% rename from dist/v-1527758585938/emojis/267b.png rename to dist/v-1528953702317/emojis/267b.png diff --git a/dist/v-1527758585938/emojis/267f.png b/dist/v-1528953702317/emojis/267f.png similarity index 100% rename from dist/v-1527758585938/emojis/267f.png rename to dist/v-1528953702317/emojis/267f.png diff --git a/dist/v-1527758585938/emojis/2692.png b/dist/v-1528953702317/emojis/2692.png similarity index 100% rename from dist/v-1527758585938/emojis/2692.png rename to dist/v-1528953702317/emojis/2692.png diff --git a/dist/v-1527758585938/emojis/2693.png b/dist/v-1528953702317/emojis/2693.png similarity index 100% rename from dist/v-1527758585938/emojis/2693.png rename to dist/v-1528953702317/emojis/2693.png diff --git a/dist/v-1527758585938/emojis/2694.png b/dist/v-1528953702317/emojis/2694.png similarity index 100% rename from dist/v-1527758585938/emojis/2694.png rename to dist/v-1528953702317/emojis/2694.png diff --git a/dist/v-1527758585938/emojis/2695.png b/dist/v-1528953702317/emojis/2695.png similarity index 100% rename from dist/v-1527758585938/emojis/2695.png rename to dist/v-1528953702317/emojis/2695.png diff --git a/dist/v-1527758585938/emojis/2696.png b/dist/v-1528953702317/emojis/2696.png similarity index 100% rename from dist/v-1527758585938/emojis/2696.png rename to dist/v-1528953702317/emojis/2696.png diff --git a/dist/v-1527758585938/emojis/2697.png b/dist/v-1528953702317/emojis/2697.png similarity index 100% rename from dist/v-1527758585938/emojis/2697.png rename to dist/v-1528953702317/emojis/2697.png diff --git a/dist/v-1527758585938/emojis/2699.png b/dist/v-1528953702317/emojis/2699.png similarity index 100% rename from dist/v-1527758585938/emojis/2699.png rename to dist/v-1528953702317/emojis/2699.png diff --git a/dist/v-1527758585938/emojis/269b.png b/dist/v-1528953702317/emojis/269b.png similarity index 100% rename from dist/v-1527758585938/emojis/269b.png rename to dist/v-1528953702317/emojis/269b.png diff --git a/dist/v-1527758585938/emojis/269c.png b/dist/v-1528953702317/emojis/269c.png similarity index 100% rename from dist/v-1527758585938/emojis/269c.png rename to dist/v-1528953702317/emojis/269c.png diff --git a/dist/v-1527758585938/emojis/26a0.png b/dist/v-1528953702317/emojis/26a0.png similarity index 100% rename from dist/v-1527758585938/emojis/26a0.png rename to dist/v-1528953702317/emojis/26a0.png diff --git a/dist/v-1527758585938/emojis/26a1.png b/dist/v-1528953702317/emojis/26a1.png similarity index 100% rename from dist/v-1527758585938/emojis/26a1.png rename to dist/v-1528953702317/emojis/26a1.png diff --git a/dist/v-1527758585938/emojis/26aa.png b/dist/v-1528953702317/emojis/26aa.png similarity index 100% rename from dist/v-1527758585938/emojis/26aa.png rename to dist/v-1528953702317/emojis/26aa.png diff --git a/dist/v-1527758585938/emojis/26ab.png b/dist/v-1528953702317/emojis/26ab.png similarity index 100% rename from dist/v-1527758585938/emojis/26ab.png rename to dist/v-1528953702317/emojis/26ab.png diff --git a/dist/v-1527758585938/emojis/26b0.png b/dist/v-1528953702317/emojis/26b0.png similarity index 100% rename from dist/v-1527758585938/emojis/26b0.png rename to dist/v-1528953702317/emojis/26b0.png diff --git a/dist/v-1527758585938/emojis/26b1.png b/dist/v-1528953702317/emojis/26b1.png similarity index 100% rename from dist/v-1527758585938/emojis/26b1.png rename to dist/v-1528953702317/emojis/26b1.png diff --git a/dist/v-1527758585938/emojis/26bd.png b/dist/v-1528953702317/emojis/26bd.png similarity index 100% rename from dist/v-1527758585938/emojis/26bd.png rename to dist/v-1528953702317/emojis/26bd.png diff --git a/dist/v-1527758585938/emojis/26be.png b/dist/v-1528953702317/emojis/26be.png similarity index 100% rename from dist/v-1527758585938/emojis/26be.png rename to dist/v-1528953702317/emojis/26be.png diff --git a/dist/v-1527758585938/emojis/26c4.png b/dist/v-1528953702317/emojis/26c4.png similarity index 100% rename from dist/v-1527758585938/emojis/26c4.png rename to dist/v-1528953702317/emojis/26c4.png diff --git a/dist/v-1527758585938/emojis/26c5.png b/dist/v-1528953702317/emojis/26c5.png similarity index 100% rename from dist/v-1527758585938/emojis/26c5.png rename to dist/v-1528953702317/emojis/26c5.png diff --git a/dist/v-1527758585938/emojis/26c8.png b/dist/v-1528953702317/emojis/26c8.png similarity index 100% rename from dist/v-1527758585938/emojis/26c8.png rename to dist/v-1528953702317/emojis/26c8.png diff --git a/dist/v-1527758585938/emojis/26ce.png b/dist/v-1528953702317/emojis/26ce.png similarity index 100% rename from dist/v-1527758585938/emojis/26ce.png rename to dist/v-1528953702317/emojis/26ce.png diff --git a/dist/v-1527758585938/emojis/26cf.png b/dist/v-1528953702317/emojis/26cf.png similarity index 100% rename from dist/v-1527758585938/emojis/26cf.png rename to dist/v-1528953702317/emojis/26cf.png diff --git a/dist/v-1527758585938/emojis/26d1.png b/dist/v-1528953702317/emojis/26d1.png similarity index 100% rename from dist/v-1527758585938/emojis/26d1.png rename to dist/v-1528953702317/emojis/26d1.png diff --git a/dist/v-1527758585938/emojis/26d3.png b/dist/v-1528953702317/emojis/26d3.png similarity index 100% rename from dist/v-1527758585938/emojis/26d3.png rename to dist/v-1528953702317/emojis/26d3.png diff --git a/dist/v-1527758585938/emojis/26d4.png b/dist/v-1528953702317/emojis/26d4.png similarity index 100% rename from dist/v-1527758585938/emojis/26d4.png rename to dist/v-1528953702317/emojis/26d4.png diff --git a/dist/v-1527758585938/emojis/26e9.png b/dist/v-1528953702317/emojis/26e9.png similarity index 100% rename from dist/v-1527758585938/emojis/26e9.png rename to dist/v-1528953702317/emojis/26e9.png diff --git a/dist/v-1527758585938/emojis/26ea.png b/dist/v-1528953702317/emojis/26ea.png similarity index 100% rename from dist/v-1527758585938/emojis/26ea.png rename to dist/v-1528953702317/emojis/26ea.png diff --git a/dist/v-1527758585938/emojis/26f0.png b/dist/v-1528953702317/emojis/26f0.png similarity index 100% rename from dist/v-1527758585938/emojis/26f0.png rename to dist/v-1528953702317/emojis/26f0.png diff --git a/dist/v-1527758585938/emojis/26f1.png b/dist/v-1528953702317/emojis/26f1.png similarity index 100% rename from dist/v-1527758585938/emojis/26f1.png rename to dist/v-1528953702317/emojis/26f1.png diff --git a/dist/v-1527758585938/emojis/26f2.png b/dist/v-1528953702317/emojis/26f2.png similarity index 100% rename from dist/v-1527758585938/emojis/26f2.png rename to dist/v-1528953702317/emojis/26f2.png diff --git a/dist/v-1527758585938/emojis/26f3.png b/dist/v-1528953702317/emojis/26f3.png similarity index 100% rename from dist/v-1527758585938/emojis/26f3.png rename to dist/v-1528953702317/emojis/26f3.png diff --git a/dist/v-1527758585938/emojis/26f4.png b/dist/v-1528953702317/emojis/26f4.png similarity index 100% rename from dist/v-1527758585938/emojis/26f4.png rename to dist/v-1528953702317/emojis/26f4.png diff --git a/dist/v-1527758585938/emojis/26f5.png b/dist/v-1528953702317/emojis/26f5.png similarity index 100% rename from dist/v-1527758585938/emojis/26f5.png rename to dist/v-1528953702317/emojis/26f5.png diff --git a/dist/v-1527758585938/emojis/26f7.png b/dist/v-1528953702317/emojis/26f7.png similarity index 100% rename from dist/v-1527758585938/emojis/26f7.png rename to dist/v-1528953702317/emojis/26f7.png diff --git a/dist/v-1527758585938/emojis/26f8.png b/dist/v-1528953702317/emojis/26f8.png similarity index 100% rename from dist/v-1527758585938/emojis/26f8.png rename to dist/v-1528953702317/emojis/26f8.png diff --git a/dist/v-1527758585938/emojis/26f9-fe0f-200d-2640-fe0f.png b/dist/v-1528953702317/emojis/26f9-fe0f-200d-2640-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/26f9-fe0f-200d-2640-fe0f.png rename to dist/v-1528953702317/emojis/26f9-fe0f-200d-2640-fe0f.png diff --git a/dist/v-1527758585938/emojis/26f9-fe0f-200d-2642-fe0f.png b/dist/v-1528953702317/emojis/26f9-fe0f-200d-2642-fe0f.png similarity index 100% rename from dist/v-1527758585938/emojis/26f9-fe0f-200d-2642-fe0f.png rename to dist/v-1528953702317/emojis/26f9-fe0f-200d-2642-fe0f.png diff --git a/dist/v-1527758585938/emojis/26f9.png b/dist/v-1528953702317/emojis/26f9.png similarity index 100% rename from dist/v-1527758585938/emojis/26f9.png rename to dist/v-1528953702317/emojis/26f9.png diff --git a/dist/v-1527758585938/emojis/26fa.png b/dist/v-1528953702317/emojis/26fa.png similarity index 100% rename from dist/v-1527758585938/emojis/26fa.png rename to dist/v-1528953702317/emojis/26fa.png diff --git a/dist/v-1527758585938/emojis/26fd.png b/dist/v-1528953702317/emojis/26fd.png similarity index 100% rename from dist/v-1527758585938/emojis/26fd.png rename to dist/v-1528953702317/emojis/26fd.png diff --git a/dist/v-1527758585938/emojis/2702.png b/dist/v-1528953702317/emojis/2702.png similarity index 100% rename from dist/v-1527758585938/emojis/2702.png rename to dist/v-1528953702317/emojis/2702.png diff --git a/dist/v-1527758585938/emojis/2705.png b/dist/v-1528953702317/emojis/2705.png similarity index 100% rename from dist/v-1527758585938/emojis/2705.png rename to dist/v-1528953702317/emojis/2705.png diff --git a/dist/v-1527758585938/emojis/2708.png b/dist/v-1528953702317/emojis/2708.png similarity index 100% rename from dist/v-1527758585938/emojis/2708.png rename to dist/v-1528953702317/emojis/2708.png diff --git a/dist/v-1527758585938/emojis/2709.png b/dist/v-1528953702317/emojis/2709.png similarity index 100% rename from dist/v-1527758585938/emojis/2709.png rename to dist/v-1528953702317/emojis/2709.png diff --git a/dist/v-1527758585938/emojis/270a.png b/dist/v-1528953702317/emojis/270a.png similarity index 100% rename from dist/v-1527758585938/emojis/270a.png rename to dist/v-1528953702317/emojis/270a.png diff --git a/dist/v-1527758585938/emojis/270b.png b/dist/v-1528953702317/emojis/270b.png similarity index 100% rename from dist/v-1527758585938/emojis/270b.png rename to dist/v-1528953702317/emojis/270b.png diff --git a/dist/v-1527758585938/emojis/270c.png b/dist/v-1528953702317/emojis/270c.png similarity index 100% rename from dist/v-1527758585938/emojis/270c.png rename to dist/v-1528953702317/emojis/270c.png diff --git a/dist/v-1527758585938/emojis/270d.png b/dist/v-1528953702317/emojis/270d.png similarity index 100% rename from dist/v-1527758585938/emojis/270d.png rename to dist/v-1528953702317/emojis/270d.png diff --git a/dist/v-1527758585938/emojis/270f.png b/dist/v-1528953702317/emojis/270f.png similarity index 100% rename from dist/v-1527758585938/emojis/270f.png rename to dist/v-1528953702317/emojis/270f.png diff --git a/dist/v-1527758585938/emojis/2712.png b/dist/v-1528953702317/emojis/2712.png similarity index 100% rename from dist/v-1527758585938/emojis/2712.png rename to dist/v-1528953702317/emojis/2712.png diff --git a/dist/v-1527758585938/emojis/2714.png b/dist/v-1528953702317/emojis/2714.png similarity index 100% rename from dist/v-1527758585938/emojis/2714.png rename to dist/v-1528953702317/emojis/2714.png diff --git a/dist/v-1527758585938/emojis/2716.png b/dist/v-1528953702317/emojis/2716.png similarity index 100% rename from dist/v-1527758585938/emojis/2716.png rename to dist/v-1528953702317/emojis/2716.png diff --git a/dist/v-1527758585938/emojis/271d.png b/dist/v-1528953702317/emojis/271d.png similarity index 100% rename from dist/v-1527758585938/emojis/271d.png rename to dist/v-1528953702317/emojis/271d.png diff --git a/dist/v-1527758585938/emojis/2721.png b/dist/v-1528953702317/emojis/2721.png similarity index 100% rename from dist/v-1527758585938/emojis/2721.png rename to dist/v-1528953702317/emojis/2721.png diff --git a/dist/v-1527758585938/emojis/2728.png b/dist/v-1528953702317/emojis/2728.png similarity index 100% rename from dist/v-1527758585938/emojis/2728.png rename to dist/v-1528953702317/emojis/2728.png diff --git a/dist/v-1527758585938/emojis/2733.png b/dist/v-1528953702317/emojis/2733.png similarity index 100% rename from dist/v-1527758585938/emojis/2733.png rename to dist/v-1528953702317/emojis/2733.png diff --git a/dist/v-1527758585938/emojis/2734.png b/dist/v-1528953702317/emojis/2734.png similarity index 100% rename from dist/v-1527758585938/emojis/2734.png rename to dist/v-1528953702317/emojis/2734.png diff --git a/dist/v-1527758585938/emojis/2744.png b/dist/v-1528953702317/emojis/2744.png similarity index 100% rename from dist/v-1527758585938/emojis/2744.png rename to dist/v-1528953702317/emojis/2744.png diff --git a/dist/v-1527758585938/emojis/2747.png b/dist/v-1528953702317/emojis/2747.png similarity index 100% rename from dist/v-1527758585938/emojis/2747.png rename to dist/v-1528953702317/emojis/2747.png diff --git a/dist/v-1527758585938/emojis/274c.png b/dist/v-1528953702317/emojis/274c.png similarity index 100% rename from dist/v-1527758585938/emojis/274c.png rename to dist/v-1528953702317/emojis/274c.png diff --git a/dist/v-1527758585938/emojis/274e.png b/dist/v-1528953702317/emojis/274e.png similarity index 100% rename from dist/v-1527758585938/emojis/274e.png rename to dist/v-1528953702317/emojis/274e.png diff --git a/dist/v-1527758585938/emojis/2753.png b/dist/v-1528953702317/emojis/2753.png similarity index 100% rename from dist/v-1527758585938/emojis/2753.png rename to dist/v-1528953702317/emojis/2753.png diff --git a/dist/v-1527758585938/emojis/2754.png b/dist/v-1528953702317/emojis/2754.png similarity index 100% rename from dist/v-1527758585938/emojis/2754.png rename to dist/v-1528953702317/emojis/2754.png diff --git a/dist/v-1527758585938/emojis/2755.png b/dist/v-1528953702317/emojis/2755.png similarity index 100% rename from dist/v-1527758585938/emojis/2755.png rename to dist/v-1528953702317/emojis/2755.png diff --git a/dist/v-1527758585938/emojis/2757.png b/dist/v-1528953702317/emojis/2757.png similarity index 100% rename from dist/v-1527758585938/emojis/2757.png rename to dist/v-1528953702317/emojis/2757.png diff --git a/dist/v-1527758585938/emojis/2763.png b/dist/v-1528953702317/emojis/2763.png similarity index 100% rename from dist/v-1527758585938/emojis/2763.png rename to dist/v-1528953702317/emojis/2763.png diff --git a/dist/v-1527758585938/emojis/2764.png b/dist/v-1528953702317/emojis/2764.png similarity index 100% rename from dist/v-1527758585938/emojis/2764.png rename to dist/v-1528953702317/emojis/2764.png diff --git a/dist/v-1527758585938/emojis/2795.png b/dist/v-1528953702317/emojis/2795.png similarity index 100% rename from dist/v-1527758585938/emojis/2795.png rename to dist/v-1528953702317/emojis/2795.png diff --git a/dist/v-1527758585938/emojis/2796.png b/dist/v-1528953702317/emojis/2796.png similarity index 100% rename from dist/v-1527758585938/emojis/2796.png rename to dist/v-1528953702317/emojis/2796.png diff --git a/dist/v-1527758585938/emojis/2797.png b/dist/v-1528953702317/emojis/2797.png similarity index 100% rename from dist/v-1527758585938/emojis/2797.png rename to dist/v-1528953702317/emojis/2797.png diff --git a/dist/v-1527758585938/emojis/27a1.png b/dist/v-1528953702317/emojis/27a1.png similarity index 100% rename from dist/v-1527758585938/emojis/27a1.png rename to dist/v-1528953702317/emojis/27a1.png diff --git a/dist/v-1527758585938/emojis/27b0.png b/dist/v-1528953702317/emojis/27b0.png similarity index 100% rename from dist/v-1527758585938/emojis/27b0.png rename to dist/v-1528953702317/emojis/27b0.png diff --git a/dist/v-1527758585938/emojis/27bf.png b/dist/v-1528953702317/emojis/27bf.png similarity index 100% rename from dist/v-1527758585938/emojis/27bf.png rename to dist/v-1528953702317/emojis/27bf.png diff --git a/dist/v-1527758585938/emojis/2934.png b/dist/v-1528953702317/emojis/2934.png similarity index 100% rename from dist/v-1527758585938/emojis/2934.png rename to dist/v-1528953702317/emojis/2934.png diff --git a/dist/v-1527758585938/emojis/2935.png b/dist/v-1528953702317/emojis/2935.png similarity index 100% rename from dist/v-1527758585938/emojis/2935.png rename to dist/v-1528953702317/emojis/2935.png diff --git a/dist/v-1527758585938/emojis/2b05.png b/dist/v-1528953702317/emojis/2b05.png similarity index 100% rename from dist/v-1527758585938/emojis/2b05.png rename to dist/v-1528953702317/emojis/2b05.png diff --git a/dist/v-1527758585938/emojis/2b06.png b/dist/v-1528953702317/emojis/2b06.png similarity index 100% rename from dist/v-1527758585938/emojis/2b06.png rename to dist/v-1528953702317/emojis/2b06.png diff --git a/dist/v-1527758585938/emojis/2b07.png b/dist/v-1528953702317/emojis/2b07.png similarity index 100% rename from dist/v-1527758585938/emojis/2b07.png rename to dist/v-1528953702317/emojis/2b07.png diff --git a/dist/v-1527758585938/emojis/2b1b.png b/dist/v-1528953702317/emojis/2b1b.png similarity index 100% rename from dist/v-1527758585938/emojis/2b1b.png rename to dist/v-1528953702317/emojis/2b1b.png diff --git a/dist/v-1527758585938/emojis/2b1c.png b/dist/v-1528953702317/emojis/2b1c.png similarity index 100% rename from dist/v-1527758585938/emojis/2b1c.png rename to dist/v-1528953702317/emojis/2b1c.png diff --git a/dist/v-1527758585938/emojis/2b50.png b/dist/v-1528953702317/emojis/2b50.png similarity index 100% rename from dist/v-1527758585938/emojis/2b50.png rename to dist/v-1528953702317/emojis/2b50.png diff --git a/dist/v-1527758585938/emojis/2b55.png b/dist/v-1528953702317/emojis/2b55.png similarity index 100% rename from dist/v-1527758585938/emojis/2b55.png rename to dist/v-1528953702317/emojis/2b55.png diff --git a/dist/v-1527758585938/emojis/3030.png b/dist/v-1528953702317/emojis/3030.png similarity index 100% rename from dist/v-1527758585938/emojis/3030.png rename to dist/v-1528953702317/emojis/3030.png diff --git a/dist/v-1527758585938/emojis/303d.png b/dist/v-1528953702317/emojis/303d.png similarity index 100% rename from dist/v-1527758585938/emojis/303d.png rename to dist/v-1528953702317/emojis/303d.png diff --git a/dist/v-1527758585938/emojis/3297.png b/dist/v-1528953702317/emojis/3297.png similarity index 100% rename from dist/v-1527758585938/emojis/3297.png rename to dist/v-1528953702317/emojis/3297.png diff --git a/dist/v-1527758585938/emojis/3299.png b/dist/v-1528953702317/emojis/3299.png similarity index 100% rename from dist/v-1527758585938/emojis/3299.png rename to dist/v-1528953702317/emojis/3299.png diff --git a/dist/v-1527758585938/emojis/emojis-data.json b/dist/v-1528953702317/emojis/emojis-data.json similarity index 100% rename from dist/v-1527758585938/emojis/emojis-data.json rename to dist/v-1528953702317/emojis/emojis-data.json diff --git a/dist/v-1527758585938/fonts/OpenSans-Bold.ttf b/dist/v-1528953702317/fonts/OpenSans-Bold.ttf similarity index 100% rename from dist/v-1527758585938/fonts/OpenSans-Bold.ttf rename to dist/v-1528953702317/fonts/OpenSans-Bold.ttf diff --git a/dist/v-1527758585938/fonts/OpenSans-CondLight.eot b/dist/v-1528953702317/fonts/OpenSans-CondLight.eot similarity index 100% rename from dist/v-1527758585938/fonts/OpenSans-CondLight.eot rename to dist/v-1528953702317/fonts/OpenSans-CondLight.eot diff --git a/dist/v-1527758585938/fonts/OpenSans-CondLight.svg b/dist/v-1528953702317/fonts/OpenSans-CondLight.svg similarity index 100% rename from dist/v-1527758585938/fonts/OpenSans-CondLight.svg rename to dist/v-1528953702317/fonts/OpenSans-CondLight.svg diff --git a/dist/v-1527758585938/fonts/OpenSans-CondLight.ttf b/dist/v-1528953702317/fonts/OpenSans-CondLight.ttf similarity index 100% rename from dist/v-1527758585938/fonts/OpenSans-CondLight.ttf rename to dist/v-1528953702317/fonts/OpenSans-CondLight.ttf diff --git a/dist/v-1527758585938/fonts/OpenSans-CondLight.woff b/dist/v-1528953702317/fonts/OpenSans-CondLight.woff similarity index 100% rename from dist/v-1527758585938/fonts/OpenSans-CondLight.woff rename to dist/v-1528953702317/fonts/OpenSans-CondLight.woff diff --git a/dist/v-1527758585938/fonts/OpenSans-Light.ttf b/dist/v-1528953702317/fonts/OpenSans-Light.ttf similarity index 100% rename from dist/v-1527758585938/fonts/OpenSans-Light.ttf rename to dist/v-1528953702317/fonts/OpenSans-Light.ttf diff --git a/dist/v-1527758585938/fonts/OpenSans-Regular.ttf b/dist/v-1528953702317/fonts/OpenSans-Regular.ttf similarity index 100% rename from dist/v-1527758585938/fonts/OpenSans-Regular.ttf rename to dist/v-1528953702317/fonts/OpenSans-Regular.ttf diff --git a/dist/v-1527758585938/fonts/OpenSans-Semibold.ttf b/dist/v-1528953702317/fonts/OpenSans-Semibold.ttf similarity index 100% rename from dist/v-1527758585938/fonts/OpenSans-Semibold.ttf rename to dist/v-1528953702317/fonts/OpenSans-Semibold.ttf diff --git a/dist/v-1527758585938/fonts/taiga.eot b/dist/v-1528953702317/fonts/taiga.eot similarity index 100% rename from dist/v-1527758585938/fonts/taiga.eot rename to dist/v-1528953702317/fonts/taiga.eot diff --git a/dist/v-1527758585938/fonts/taiga.svg b/dist/v-1528953702317/fonts/taiga.svg similarity index 100% rename from dist/v-1527758585938/fonts/taiga.svg rename to dist/v-1528953702317/fonts/taiga.svg diff --git a/dist/v-1527758585938/fonts/taiga.ttf b/dist/v-1528953702317/fonts/taiga.ttf similarity index 100% rename from dist/v-1527758585938/fonts/taiga.ttf rename to dist/v-1528953702317/fonts/taiga.ttf diff --git a/dist/v-1527758585938/fonts/taiga.woff b/dist/v-1528953702317/fonts/taiga.woff similarity index 100% rename from dist/v-1527758585938/fonts/taiga.woff rename to dist/v-1528953702317/fonts/taiga.woff diff --git a/dist/v-1527758585938/images/attachment-gallery.png b/dist/v-1528953702317/images/attachment-gallery.png similarity index 100% rename from dist/v-1527758585938/images/attachment-gallery.png rename to dist/v-1528953702317/images/attachment-gallery.png diff --git a/dist/v-1527758585938/images/bg.png b/dist/v-1528953702317/images/bg.png similarity index 100% rename from dist/v-1527758585938/images/bg.png rename to dist/v-1528953702317/images/bg.png diff --git a/dist/v-1527758585938/images/discover.png b/dist/v-1528953702317/images/discover.png similarity index 100% rename from dist/v-1527758585938/images/discover.png rename to dist/v-1528953702317/images/discover.png diff --git a/dist/v-1527758585938/images/empty/empty_contact.png b/dist/v-1528953702317/images/empty/empty_contact.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_contact.png rename to dist/v-1528953702317/images/empty/empty_contact.png diff --git a/dist/v-1527758585938/images/empty/empty_des.png b/dist/v-1528953702317/images/empty/empty_des.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_des.png rename to dist/v-1528953702317/images/empty/empty_des.png diff --git a/dist/v-1527758585938/images/empty/empty_field.png b/dist/v-1528953702317/images/empty/empty_field.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_field.png rename to dist/v-1528953702317/images/empty/empty_field.png diff --git a/dist/v-1527758585938/images/empty/empty_like.png b/dist/v-1528953702317/images/empty/empty_like.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_like.png rename to dist/v-1528953702317/images/empty/empty_like.png diff --git a/dist/v-1527758585938/images/empty/empty_mex.png b/dist/v-1528953702317/images/empty/empty_mex.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_mex.png rename to dist/v-1528953702317/images/empty/empty_mex.png diff --git a/dist/v-1527758585938/images/empty/empty_moon.png b/dist/v-1528953702317/images/empty/empty_moon.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_moon.png rename to dist/v-1528953702317/images/empty/empty_moon.png diff --git a/dist/v-1527758585938/images/empty/empty_sprint.png b/dist/v-1528953702317/images/empty/empty_sprint.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_sprint.png rename to dist/v-1528953702317/images/empty/empty_sprint.png diff --git a/dist/v-1527758585938/images/empty/empty_tex.png b/dist/v-1528953702317/images/empty/empty_tex.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_tex.png rename to dist/v-1528953702317/images/empty/empty_tex.png diff --git a/dist/v-1527758585938/images/empty/empty_upvote.png b/dist/v-1528953702317/images/empty/empty_upvote.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_upvote.png rename to dist/v-1528953702317/images/empty/empty_upvote.png diff --git a/dist/v-1527758585938/images/empty/empty_watch.png b/dist/v-1528953702317/images/empty/empty_watch.png similarity index 100% rename from dist/v-1527758585938/images/empty/empty_watch.png rename to dist/v-1528953702317/images/empty/empty_watch.png diff --git a/dist/v-1527758585938/images/epics-empty.png b/dist/v-1528953702317/images/epics-empty.png similarity index 100% rename from dist/v-1527758585938/images/epics-empty.png rename to dist/v-1528953702317/images/epics-empty.png diff --git a/dist/v-1527758585938/images/favicon.png b/dist/v-1528953702317/images/favicon.png similarity index 100% rename from dist/v-1527758585938/images/favicon.png rename to dist/v-1528953702317/images/favicon.png diff --git a/dist/v-1527758585938/images/import-logos/asana.png b/dist/v-1528953702317/images/import-logos/asana.png similarity index 100% rename from dist/v-1527758585938/images/import-logos/asana.png rename to dist/v-1528953702317/images/import-logos/asana.png diff --git a/dist/v-1527758585938/images/import-logos/github.png b/dist/v-1528953702317/images/import-logos/github.png similarity index 100% rename from dist/v-1527758585938/images/import-logos/github.png rename to dist/v-1528953702317/images/import-logos/github.png diff --git a/dist/v-1527758585938/images/import-logos/jira.png b/dist/v-1528953702317/images/import-logos/jira.png similarity index 100% rename from dist/v-1527758585938/images/import-logos/jira.png rename to dist/v-1528953702317/images/import-logos/jira.png diff --git a/dist/v-1527758585938/images/import-logos/trello.png b/dist/v-1528953702317/images/import-logos/trello.png similarity index 100% rename from dist/v-1527758585938/images/import-logos/trello.png rename to dist/v-1528953702317/images/import-logos/trello.png diff --git a/dist/v-1527758585938/images/invitation_bg.jpg b/dist/v-1528953702317/images/invitation_bg.jpg similarity index 100% rename from dist/v-1527758585938/images/invitation_bg.jpg rename to dist/v-1528953702317/images/invitation_bg.jpg diff --git a/dist/v-1527758585938/images/logo-color.png b/dist/v-1528953702317/images/logo-color.png similarity index 100% rename from dist/v-1527758585938/images/logo-color.png rename to dist/v-1528953702317/images/logo-color.png diff --git a/dist/v-1527758585938/images/logo.png b/dist/v-1528953702317/images/logo.png similarity index 100% rename from dist/v-1527758585938/images/logo.png rename to dist/v-1528953702317/images/logo.png diff --git a/dist/v-1527758585938/images/looking-for-people.png b/dist/v-1528953702317/images/looking-for-people.png similarity index 100% rename from dist/v-1527758585938/images/looking-for-people.png rename to dist/v-1528953702317/images/looking-for-people.png diff --git a/dist/v-1527758585938/images/markitup/bg-container.png b/dist/v-1528953702317/images/markitup/bg-container.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-container.png rename to dist/v-1528953702317/images/markitup/bg-container.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor-bbcode.png b/dist/v-1528953702317/images/markitup/bg-editor-bbcode.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor-bbcode.png rename to dist/v-1528953702317/images/markitup/bg-editor-bbcode.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor-dotclear.png b/dist/v-1528953702317/images/markitup/bg-editor-dotclear.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor-dotclear.png rename to dist/v-1528953702317/images/markitup/bg-editor-dotclear.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor-html.png b/dist/v-1528953702317/images/markitup/bg-editor-html.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor-html.png rename to dist/v-1528953702317/images/markitup/bg-editor-html.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor-json.png b/dist/v-1528953702317/images/markitup/bg-editor-json.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor-json.png rename to dist/v-1528953702317/images/markitup/bg-editor-json.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor-markdown.png b/dist/v-1528953702317/images/markitup/bg-editor-markdown.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor-markdown.png rename to dist/v-1528953702317/images/markitup/bg-editor-markdown.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor-textile.png b/dist/v-1528953702317/images/markitup/bg-editor-textile.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor-textile.png rename to dist/v-1528953702317/images/markitup/bg-editor-textile.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor-wiki.png b/dist/v-1528953702317/images/markitup/bg-editor-wiki.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor-wiki.png rename to dist/v-1528953702317/images/markitup/bg-editor-wiki.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor-xml.png b/dist/v-1528953702317/images/markitup/bg-editor-xml.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor-xml.png rename to dist/v-1528953702317/images/markitup/bg-editor-xml.png diff --git a/dist/v-1527758585938/images/markitup/bg-editor.png b/dist/v-1528953702317/images/markitup/bg-editor.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bg-editor.png rename to dist/v-1528953702317/images/markitup/bg-editor.png diff --git a/dist/v-1527758585938/images/markitup/body.png b/dist/v-1528953702317/images/markitup/body.png similarity index 100% rename from dist/v-1527758585938/images/markitup/body.png rename to dist/v-1528953702317/images/markitup/body.png diff --git a/dist/v-1527758585938/images/markitup/bold.png b/dist/v-1528953702317/images/markitup/bold.png similarity index 100% rename from dist/v-1527758585938/images/markitup/bold.png rename to dist/v-1528953702317/images/markitup/bold.png diff --git a/dist/v-1527758585938/images/markitup/clean.png b/dist/v-1528953702317/images/markitup/clean.png similarity index 100% rename from dist/v-1527758585938/images/markitup/clean.png rename to dist/v-1528953702317/images/markitup/clean.png diff --git a/dist/v-1527758585938/images/markitup/code.png b/dist/v-1528953702317/images/markitup/code.png similarity index 100% rename from dist/v-1527758585938/images/markitup/code.png rename to dist/v-1528953702317/images/markitup/code.png diff --git a/dist/v-1527758585938/images/markitup/h1.png b/dist/v-1528953702317/images/markitup/h1.png similarity index 100% rename from dist/v-1527758585938/images/markitup/h1.png rename to dist/v-1528953702317/images/markitup/h1.png diff --git a/dist/v-1527758585938/images/markitup/h2.png b/dist/v-1528953702317/images/markitup/h2.png similarity index 100% rename from dist/v-1527758585938/images/markitup/h2.png rename to dist/v-1528953702317/images/markitup/h2.png diff --git a/dist/v-1527758585938/images/markitup/h3.png b/dist/v-1528953702317/images/markitup/h3.png similarity index 100% rename from dist/v-1527758585938/images/markitup/h3.png rename to dist/v-1528953702317/images/markitup/h3.png diff --git a/dist/v-1527758585938/images/markitup/h4.png b/dist/v-1528953702317/images/markitup/h4.png similarity index 100% rename from dist/v-1527758585938/images/markitup/h4.png rename to dist/v-1528953702317/images/markitup/h4.png diff --git a/dist/v-1527758585938/images/markitup/h5.png b/dist/v-1528953702317/images/markitup/h5.png similarity index 100% rename from dist/v-1527758585938/images/markitup/h5.png rename to dist/v-1528953702317/images/markitup/h5.png diff --git a/dist/v-1527758585938/images/markitup/h6.png b/dist/v-1528953702317/images/markitup/h6.png similarity index 100% rename from dist/v-1527758585938/images/markitup/h6.png rename to dist/v-1528953702317/images/markitup/h6.png diff --git a/dist/v-1527758585938/images/markitup/handle.png b/dist/v-1528953702317/images/markitup/handle.png similarity index 100% rename from dist/v-1527758585938/images/markitup/handle.png rename to dist/v-1528953702317/images/markitup/handle.png diff --git a/dist/v-1527758585938/images/markitup/help.png b/dist/v-1528953702317/images/markitup/help.png similarity index 100% rename from dist/v-1527758585938/images/markitup/help.png rename to dist/v-1528953702317/images/markitup/help.png diff --git a/dist/v-1527758585938/images/markitup/image.png b/dist/v-1528953702317/images/markitup/image.png similarity index 100% rename from dist/v-1527758585938/images/markitup/image.png rename to dist/v-1528953702317/images/markitup/image.png diff --git a/dist/v-1527758585938/images/markitup/italic.png b/dist/v-1528953702317/images/markitup/italic.png similarity index 100% rename from dist/v-1527758585938/images/markitup/italic.png rename to dist/v-1528953702317/images/markitup/italic.png diff --git a/dist/v-1527758585938/images/markitup/jaysalvat.png b/dist/v-1528953702317/images/markitup/jaysalvat.png similarity index 100% rename from dist/v-1527758585938/images/markitup/jaysalvat.png rename to dist/v-1528953702317/images/markitup/jaysalvat.png diff --git a/dist/v-1527758585938/images/markitup/link.png b/dist/v-1528953702317/images/markitup/link.png similarity index 100% rename from dist/v-1527758585938/images/markitup/link.png rename to dist/v-1528953702317/images/markitup/link.png diff --git a/dist/v-1527758585938/images/markitup/list-bullet.png b/dist/v-1528953702317/images/markitup/list-bullet.png similarity index 100% rename from dist/v-1527758585938/images/markitup/list-bullet.png rename to dist/v-1528953702317/images/markitup/list-bullet.png diff --git a/dist/v-1527758585938/images/markitup/list-numeric.png b/dist/v-1528953702317/images/markitup/list-numeric.png similarity index 100% rename from dist/v-1527758585938/images/markitup/list-numeric.png rename to dist/v-1528953702317/images/markitup/list-numeric.png diff --git a/dist/v-1527758585938/images/markitup/markitup.png b/dist/v-1528953702317/images/markitup/markitup.png similarity index 100% rename from dist/v-1527758585938/images/markitup/markitup.png rename to dist/v-1528953702317/images/markitup/markitup.png diff --git a/dist/v-1527758585938/images/markitup/menu.png b/dist/v-1528953702317/images/markitup/menu.png similarity index 100% rename from dist/v-1527758585938/images/markitup/menu.png rename to dist/v-1528953702317/images/markitup/menu.png diff --git a/dist/v-1527758585938/images/markitup/picture.png b/dist/v-1528953702317/images/markitup/picture.png similarity index 100% rename from dist/v-1527758585938/images/markitup/picture.png rename to dist/v-1528953702317/images/markitup/picture.png diff --git a/dist/v-1527758585938/images/markitup/preview.png b/dist/v-1528953702317/images/markitup/preview.png similarity index 100% rename from dist/v-1527758585938/images/markitup/preview.png rename to dist/v-1528953702317/images/markitup/preview.png diff --git a/dist/v-1527758585938/images/markitup/preview_ico.png b/dist/v-1528953702317/images/markitup/preview_ico.png similarity index 100% rename from dist/v-1527758585938/images/markitup/preview_ico.png rename to dist/v-1528953702317/images/markitup/preview_ico.png diff --git a/dist/v-1527758585938/images/markitup/quotes.png b/dist/v-1528953702317/images/markitup/quotes.png similarity index 100% rename from dist/v-1527758585938/images/markitup/quotes.png rename to dist/v-1528953702317/images/markitup/quotes.png diff --git a/dist/v-1527758585938/images/markitup/stroke.png b/dist/v-1528953702317/images/markitup/stroke.png similarity index 100% rename from dist/v-1527758585938/images/markitup/stroke.png rename to dist/v-1528953702317/images/markitup/stroke.png diff --git a/dist/v-1527758585938/images/markitup/submenu.png b/dist/v-1528953702317/images/markitup/submenu.png similarity index 100% rename from dist/v-1527758585938/images/markitup/submenu.png rename to dist/v-1528953702317/images/markitup/submenu.png diff --git a/dist/v-1527758585938/images/menu-vert.png b/dist/v-1528953702317/images/menu-vert.png similarity index 100% rename from dist/v-1527758585938/images/menu-vert.png rename to dist/v-1528953702317/images/menu-vert.png diff --git a/dist/v-1527758585938/images/menu.png b/dist/v-1528953702317/images/menu.png similarity index 100% rename from dist/v-1527758585938/images/menu.png rename to dist/v-1528953702317/images/menu.png diff --git a/dist/v-1527758585938/images/monster-fight.png b/dist/v-1528953702317/images/monster-fight.png similarity index 100% rename from dist/v-1527758585938/images/monster-fight.png rename to dist/v-1528953702317/images/monster-fight.png diff --git a/dist/v-1527758585938/images/notification-decoration.png b/dist/v-1528953702317/images/notification-decoration.png similarity index 100% rename from dist/v-1527758585938/images/notification-decoration.png rename to dist/v-1528953702317/images/notification-decoration.png diff --git a/dist/v-1527758585938/images/project-logos/project-logo-01.png b/dist/v-1528953702317/images/project-logos/project-logo-01.png similarity index 100% rename from dist/v-1527758585938/images/project-logos/project-logo-01.png rename to dist/v-1528953702317/images/project-logos/project-logo-01.png diff --git a/dist/v-1527758585938/images/project-logos/project-logo-02.png b/dist/v-1528953702317/images/project-logos/project-logo-02.png similarity index 100% rename from dist/v-1527758585938/images/project-logos/project-logo-02.png rename to dist/v-1528953702317/images/project-logos/project-logo-02.png diff --git a/dist/v-1527758585938/images/project-logos/project-logo-03.png b/dist/v-1528953702317/images/project-logos/project-logo-03.png similarity index 100% rename from dist/v-1527758585938/images/project-logos/project-logo-03.png rename to dist/v-1528953702317/images/project-logos/project-logo-03.png diff --git a/dist/v-1527758585938/images/project-logos/project-logo-04.png b/dist/v-1528953702317/images/project-logos/project-logo-04.png similarity index 100% rename from dist/v-1527758585938/images/project-logos/project-logo-04.png rename to dist/v-1528953702317/images/project-logos/project-logo-04.png diff --git a/dist/v-1527758585938/images/project-logos/project-logo-05.png b/dist/v-1528953702317/images/project-logos/project-logo-05.png similarity index 100% rename from dist/v-1527758585938/images/project-logos/project-logo-05.png rename to dist/v-1528953702317/images/project-logos/project-logo-05.png diff --git a/dist/v-1527758585938/images/quote.png b/dist/v-1528953702317/images/quote.png similarity index 100% rename from dist/v-1527758585938/images/quote.png rename to dist/v-1528953702317/images/quote.png diff --git a/dist/v-1527758585938/images/tribe-logo.png b/dist/v-1528953702317/images/tribe-logo.png similarity index 100% rename from dist/v-1527758585938/images/tribe-logo.png rename to dist/v-1528953702317/images/tribe-logo.png diff --git a/dist/v-1527758585938/images/unnamed.png b/dist/v-1528953702317/images/unnamed.png similarity index 100% rename from dist/v-1527758585938/images/unnamed.png rename to dist/v-1528953702317/images/unnamed.png diff --git a/dist/v-1527758585938/images/user-avatars/user-avatar-01.png b/dist/v-1528953702317/images/user-avatars/user-avatar-01.png similarity index 100% rename from dist/v-1527758585938/images/user-avatars/user-avatar-01.png rename to dist/v-1528953702317/images/user-avatars/user-avatar-01.png diff --git a/dist/v-1527758585938/images/user-avatars/user-avatar-02.png b/dist/v-1528953702317/images/user-avatars/user-avatar-02.png similarity index 100% rename from dist/v-1527758585938/images/user-avatars/user-avatar-02.png rename to dist/v-1528953702317/images/user-avatars/user-avatar-02.png diff --git a/dist/v-1527758585938/images/user-avatars/user-avatar-03.png b/dist/v-1528953702317/images/user-avatars/user-avatar-03.png similarity index 100% rename from dist/v-1527758585938/images/user-avatars/user-avatar-03.png rename to dist/v-1528953702317/images/user-avatars/user-avatar-03.png diff --git a/dist/v-1527758585938/images/user-avatars/user-avatar-04.png b/dist/v-1528953702317/images/user-avatars/user-avatar-04.png similarity index 100% rename from dist/v-1527758585938/images/user-avatars/user-avatar-04.png rename to dist/v-1528953702317/images/user-avatars/user-avatar-04.png diff --git a/dist/v-1527758585938/images/user-avatars/user-avatar-05.png b/dist/v-1528953702317/images/user-avatars/user-avatar-05.png similarity index 100% rename from dist/v-1527758585938/images/user-avatars/user-avatar-05.png rename to dist/v-1528953702317/images/user-avatars/user-avatar-05.png diff --git a/dist/v-1527758585938/images/user-noimage.png b/dist/v-1528953702317/images/user-noimage.png similarity index 100% rename from dist/v-1527758585938/images/user-noimage.png rename to dist/v-1528953702317/images/user-noimage.png diff --git a/dist/v-1527758585938/js/app-loader.js b/dist/v-1528953702317/js/app-loader.js similarity index 96% rename from dist/v-1527758585938/js/app-loader.js rename to dist/v-1528953702317/js/app-loader.js index 64b4b42..9cdf317 100644 --- a/dist/v-1527758585938/js/app-loader.js +++ b/dist/v-1528953702317/js/app-loader.js @@ -1 +1 @@ -(function(){var n,t,e,i;window._version="v-1527758585938",window.taigaConfig={api:"http://localhost:8000/api/v1/",eventsUrl:null,tribeHost:null,eventsMaxMissedHeartbeats:5,eventsHeartbeatIntervalTime:6e4,debug:!0,defaultLanguage:"en",themes:["taiga","material-design","high-contrast"],defaultTheme:"taiga",publicRegisterEnabled:!0,feedbackEnabled:!0,supportUrl:null,privacyPolicyUrl:null,termsOfServiceUrl:null,maxUploadFileSize:null,importers:[],contribPlugins:[]},window.taigaContribPlugins=[],window._decorators=[],window.addDecorator=function(n,t){return window._decorators.push({provider:n,decorator:t})},window.getDecorators=function(){return window._decorators},e=function(n){return $("head").append('')},n=function(n){return new Promise(function(t,i){var o,r;return r=function(n){var i,o,r,a;if(n.isPack)for(a=n.plugins,i=0,r=a.length;i0?t(window.taigaConfig.contribPlugins).then(function(){return ljs.load("/"+window._version+"/js/app.js",function(){return n.then(function(){return angular.bootstrap(document,["taiga"])})})}):ljs.load("/"+window._version+"/js/app.js",function(){return n.then(function(){return angular.bootstrap(document,["taiga"])})})})}).call(this); \ No newline at end of file +(function(){var n,t,e,i;window._version="v-1528953702317",window.taigaConfig={api:"http://localhost:8000/api/v1/",eventsUrl:null,tribeHost:null,eventsMaxMissedHeartbeats:5,eventsHeartbeatIntervalTime:6e4,debug:!0,defaultLanguage:"en",themes:["taiga","material-design","high-contrast"],defaultTheme:"taiga",publicRegisterEnabled:!0,feedbackEnabled:!0,supportUrl:null,privacyPolicyUrl:null,termsOfServiceUrl:null,maxUploadFileSize:null,importers:[],contribPlugins:[]},window.taigaContribPlugins=[],window._decorators=[],window.addDecorator=function(n,t){return window._decorators.push({provider:n,decorator:t})},window.getDecorators=function(){return window._decorators},e=function(n){return $("head").append('')},n=function(n){return new Promise(function(t,i){var o,r;return r=function(n){var i,o,r,a;if(n.isPack)for(a=n.plugins,i=0,r=a.length;i0?t(window.taigaConfig.contribPlugins).then(function(){return ljs.load("/"+window._version+"/js/app.js",function(){return n.then(function(){return angular.bootstrap(document,["taiga"])})})}):ljs.load("/"+window._version+"/js/app.js",function(){return n.then(function(){return angular.bootstrap(document,["taiga"])})})})}).call(this); \ No newline at end of file diff --git a/dist/v-1528953702317/js/app.js b/dist/v-1528953702317/js/app.js new file mode 100644 index 0000000..89cf552 --- /dev/null +++ b/dist/v-1528953702317/js/app.js @@ -0,0 +1,23 @@ +(function(){var t,e,r,n,i,o,s,a;this.taiga=a={},a.emojis=window.emojis,this.taigaContribPlugins=this.taigaContribPlugins||window.taigaContribPlugins||[],a.generateHash=function(t){return null==t&&(t=[]),t=_.map(t,function(t){return JSON.stringify(t)}),hex_sha1(t.join(":"))},a.generateUniqueSessionIdentifier=function(){var t,e;return t=(new Date).getTime(),e=Math.floor(150994944*Math.random()),a.generateHash([t,e])},a.sessionId=a.generateUniqueSessionIdentifier(),t=function(t,e,r,n,i,o,s,c,u){var l,p,h,f,d,g,m,v,y;return u.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/),g=t.when,t.when=function(e,r){return r.resolve||(r.resolve={}),angular.extend(r.resolve,{languageLoad:["$q","$translate",function(t,e){var r;return r=t.defer(),e().then(function(){return r.resolve()}),r.promise}],projectLoaded:["$q","tgProjectService","$route",function(t,e,r){var n,i;return n=t.defer(),e.setSection(null!=(i=r.current.$$route)?i.section:void 0),r.current.params.pslug?e.setProjectBySlug(r.current.params.pslug).then(n.resolve):(e.cleanProject(),n.resolve()),n.promise}]}),g.call(t,e,r)},t.when("/",{templateUrl:"home/home.html",controller:"Home",controllerAs:"vm",loader:!0,title:"HOME.PAGE_TITLE",loader:!0,description:"HOME.PAGE_DESCRIPTION",joyride:"dashboard"}),t.when("/discover",{templateUrl:"discover/discover-home/discover-home.html",controller:"DiscoverHome",controllerAs:"vm",title:"PROJECT.NAVIGATION.DISCOVER",loader:!0}),t.when("/discover/search",{templateUrl:"discover/discover-search/discover-search.html",title:"PROJECT.NAVIGATION.DISCOVER",loader:!0,controller:"DiscoverSearch",controllerAs:"vm",reloadOnSearch:!1}),t.when("/projects/",{templateUrl:"projects/listing/projects-listing.html",access:{requiresLogin:!0},title:"PROJECTS.PAGE_TITLE",description:"PROJECTS.PAGE_DESCRIPTION",loader:!0,controller:"ProjectsListing",controllerAs:"vm"}),t.when("/project/new",{title:"PROJECT.CREATE.TITLE",templateUrl:"projects/create/create-project.html",loader:!0,controller:"CreateProjectCtrl",controllerAs:"vm"}),t.when("/project/new/scrum",{title:"PROJECT.CREATE.TITLE",template:'',loader:!0}),t.when("/project/new/kanban",{title:"PROJECT.CREATE.TITLE",template:'',loader:!0}),t.when("/project/new/duplicate",{title:"PROJECT.CREATE.TITLE",template:"",loader:!0}),t.when("/project/new/import/:platform?",{title:"PROJECT.CREATE.TITLE",template:"",loader:!0}),t.when("/project/:pslug/",{templateUrl:"projects/project/project.html",loader:!0,controller:"Project",controllerAs:"vm",section:"project-timeline"}),t.when("/project/:pslug/t/:ref",{loader:!0,controller:"DetailController",template:""}),t.when("/project/:pslug/search",{templateUrl:"search/search.html",reloadOnSearch:!1,section:"search",loader:!0}),t.when("/project/:pslug/epics",{section:"epics",templateUrl:"epics/dashboard/epics-dashboard.html",loader:!0,controller:"EpicsDashboardCtrl",controllerAs:"vm"}),t.when("/project/:pslug/epic/:epicref",{templateUrl:"epic/epic-detail.html",loader:!0,section:"epics"}),t.when("/project/:pslug/backlog",{templateUrl:"backlog/backlog.html",loader:!0,section:"backlog",joyride:"backlog"}),t.when("/project/:pslug/kanban",{templateUrl:"kanban/kanban.html",loader:!0,section:"kanban",joyride:"kanban"}),t.when("/project/:pslug/taskboard/:sslug",{templateUrl:"taskboard/taskboard.html",loader:!0,section:"backlog"}),t.when("/project/:pslug/us/:usref",{templateUrl:"us/us-detail.html",loader:!0,section:"backlog-kanban"}),t.when("/project/:pslug/task/:taskref",{templateUrl:"task/task-detail.html",loader:!0,section:"backlog-kanban"}),t.when("/project/:pslug/wiki",{redirectTo:function(t){return"/project/"+t.pslug+"/wiki/home"}}),t.when("/project/:pslug/wiki-list",{templateUrl:"wiki/wiki-list.html",loader:!0,section:"wiki"}),t.when("/project/:pslug/wiki/:slug",{templateUrl:"wiki/wiki.html",loader:!0,section:"wiki"}),t.when("/project/:pslug/team",{templateUrl:"team/team.html",loader:!0,section:"team"}),t.when("/project/:pslug/issues",{templateUrl:"issue/issues.html",loader:!0,section:"issues"}),t.when("/project/:pslug/issue/:issueref",{templateUrl:"issue/issues-detail.html",loader:!0,section:"issues"}),t.when("/project/:pslug/admin/project-profile/details",{templateUrl:"admin/admin-project-profile.html",section:"admin"}),t.when("/project/:pslug/admin/project-profile/default-values",{templateUrl:"admin/admin-project-default-values.html",section:"admin"}),t.when("/project/:pslug/admin/project-profile/modules",{templateUrl:"admin/admin-project-modules.html",section:"admin"}),t.when("/project/:pslug/admin/project-profile/export",{templateUrl:"admin/admin-project-export.html",section:"admin"}),t.when("/project/:pslug/admin/project-profile/reports",{templateUrl:"admin/admin-project-reports.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/status",{templateUrl:"admin/admin-project-values-status.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/points",{templateUrl:"admin/admin-project-values-points.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/priorities",{templateUrl:"admin/admin-project-values-priorities.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/severities",{templateUrl:"admin/admin-project-values-severities.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/types",{templateUrl:"admin/admin-project-values-types.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/custom-fields",{templateUrl:"admin/admin-project-values-custom-fields.html",section:"admin"}),t.when("/project/:pslug/admin/project-values/tags",{templateUrl:"admin/admin-project-values-tags.html",section:"admin"}),t.when("/project/:pslug/admin/memberships",{templateUrl:"admin/admin-memberships.html",section:"admin"}),t.when("/project/:pslug/admin/roles",{templateUrl:"admin/admin-roles.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/webhooks",{templateUrl:"admin/admin-third-parties-webhooks.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/github",{templateUrl:"admin/admin-third-parties-github.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/gitlab",{templateUrl:"admin/admin-third-parties-gitlab.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/bitbucket",{templateUrl:"admin/admin-third-parties-bitbucket.html",section:"admin"}),t.when("/project/:pslug/admin/third-parties/gogs",{templateUrl:"admin/admin-third-parties-gogs.html",section:"admin"}),t.when("/project/:pslug/admin/contrib/:plugin",{templateUrl:"contrib/main.html"}),t.when("/project/:pslug/transfer/:token",{templateUrl:"projects/transfer/transfer-page.html",loader:!0,controller:"Project",controllerAs:"vm"}),t.when("/user-settings/user-profile",{templateUrl:"user/user-profile.html"}),t.when("/user-settings/user-change-password",{templateUrl:"user/user-change-password.html"}),t.when("/user-settings/mail-notifications",{templateUrl:"user/mail-notifications.html"}),t.when("/user-settings/live-notifications",{templateUrl:"user/live-notifications.html"}),t.when("/change-email/:email_token",{templateUrl:"user/change-email.html"}),t.when("/cancel-account/:cancel_token",{templateUrl:"user/cancel-account.html"}),t.when("/user-settings/contrib/:plugin",{templateUrl:"contrib/user-settings.html"}),t.when("/profile",{templateUrl:"profile/profile.html",loader:!0,access:{requiresLogin:!0},controller:"Profile",controllerAs:"vm"}),t.when("/profile/:slug",{templateUrl:"profile/profile.html",loader:!0,controller:"Profile",controllerAs:"vm"}),t.when("/login",{templateUrl:"auth/login.html",title:"LOGIN.PAGE_TITLE",description:"LOGIN.PAGE_DESCRIPTION",disableHeader:!0,controller:"LoginPage"}),t.when("/register",{templateUrl:"auth/register.html",title:"REGISTER.PAGE_TITLE",description:"REGISTER.PAGE_DESCRIPTION",disableHeader:!0}),t.when("/forgot-password",{templateUrl:"auth/forgot-password.html",title:"FORGOT_PASSWORD.PAGE_TITLE",description:"FORGOT_PASSWORD.PAGE_DESCRIPTION",disableHeader:!0}),t.when("/change-password/:token",{templateUrl:"auth/change-password-from-recovery.html",title:"CHANGE_PASSWORD.PAGE_TITLE",description:"CHANGE_PASSWORD.PAGE_TITLE",disableHeader:!0}),t.when("/invitation/:token",{templateUrl:"auth/invitation.html",title:"INVITATION.PAGE_TITLE",description:"INVITATION.PAGE_DESCRIPTION",disableHeader:!0}),t.when("/external-apps",{templateUrl:"external-apps/external-app.html",title:"EXTERNAL_APP.PAGE_TITLE",description:"EXTERNAL_APP.PAGE_DESCRIPTION",controller:"ExternalApp",controllerAs:"vm",disableHeader:!0,mobileViewport:!0}),t.when("/blocked-project/:pslug/",{templateUrl:"projects/project/blocked-project.html",loader:!0}),t.when("/error",{templateUrl:"error/error.html"}),t.when("/not-found",{templateUrl:"error/not-found.html"}),t.when("/permission-denied",{templateUrl:"error/permission-denied.html"}),t.otherwise({templateUrl:"error/not-found.html"}),e.html5Mode({enabled:!0,requireBase:!1}),f={"Content-Type":"application/json","Accept-Language":window.taigaConfig.defaultLanguage||"en","X-Session-Id":a.sessionId},r.defaults.headers["delete"]=f,r.defaults.headers.patch=f,r.defaults.headers.post=f,r.defaults.headers.put=f,r.defaults.headers.get={"X-Session-Id":a.sessionId},r.useApplyAsync(!0),i.setSessionId(a.sessionId),l=function(t,e,r,n,i){var o;return o=function(o){var s,a;return 0===o.status||o.status===-1&&!o.config.cancelable?(n.closeAll(),i.error()):401===o.status&&e.url().indexOf("/login")===-1&&(s=e.url(),a=e.search(),a.force_next?e.url(r.resolve("login")).search("force_next",a.force_next):e.url(r.resolve("login")).search({unauthorized:!0,next:s})),t.reject(o)},{responseError:o}},n.factory("authHttpIntercept",["$q","$location","$tgNavUrls","lightboxService","tgErrorHandlingService",l]),r.interceptors.push("authHttpIntercept"),d=function(t,e){return{request:function(t){return e.logRequest(),t},requestError:function(r){return e.logResponse(),t.reject(r)},responseError:function(r){return e.logResponse(),t.reject(r)},response:function(t){return e.logResponse(),t}}},n.factory("loaderIntercept",["$q","tgLoader",d]),r.interceptors.push("loaderIntercept"),y=function(t){var e;return e=function(e){var r;return 400===e.status&&e.data.version&&(r=angular.element("body").injector(),r.invoke(["$tgConfirm","$translate",function(t){return function(t,e){var r;return r=e.instant("ERROR.VERSION_ERROR"),t.notify("error",r,null,1e4)}}(this)])),t.reject(e)},{responseError:e}},n.factory("versionCheckHttpIntercept",["$q",y]),r.interceptors.push("versionCheckHttpIntercept"),p=function(t,e){var r,n,i;return r=function(){return e.block()},i=function(t){return t.data.blocked_code&&r(),t},n=function(e){return 451===e.status&&r(),t.reject(e)},{response:i,responseError:n}},n.factory("blockingIntercept",["$q","tgErrorHandlingService",p]),r.interceptors.push("blockingIntercept"),o.debugInfoEnabled(window.taigaConfig.debugInfo||!1),localStorage.userInfo&&(v=JSON.parse(localStorage.userInfo)),m=(null!=v?v.lang:void 0)||window.taigaConfig.defaultLanguage||"en",c.addPart("taiga"),s.useLoader("$translatePartialLoader",{urlTemplate:"/"+window._version+"/locales/{part}/locale-{lang}.json"}).useSanitizeValueStrategy("escapeParameters").addInterpolation("$translateMessageFormatInterpolation").preferredLanguage(m),s.fallbackLanguage(m),h=window.getDecorators(),_.each(h,function(t){return n.decorator(t.provider,t.decorator)})},e=function(t,e){var r;return moment.locale(t),"en"!==t&&ljs.load("/"+window._version+"/locales/moment-locales/"+t+".js"),r={defaultMessage:e.instant("COMMON.FORM_ERRORS.DEFAULT_MESSAGE"),type:{email:e.instant("COMMON.FORM_ERRORS.TYPE_EMAIL"),url:e.instant("COMMON.FORM_ERRORS.TYPE_URL"),urlstrict:e.instant("COMMON.FORM_ERRORS.TYPE_URLSTRICT"),number:e.instant("COMMON.FORM_ERRORS.TYPE_NUMBER"),digits:e.instant("COMMON.FORM_ERRORS.TYPE_DIGITS"),dateIso:e.instant("COMMON.FORM_ERRORS.TYPE_DATEISO"),alphanum:e.instant("COMMON.FORM_ERRORS.TYPE_ALPHANUM"),phone:e.instant("COMMON.FORM_ERRORS.TYPE_PHONE")},notnull:e.instant("COMMON.FORM_ERRORS.NOTNULL"),notblank:e.instant("COMMON.FORM_ERRORS.NOT_BLANK"),required:e.instant("COMMON.FORM_ERRORS.REQUIRED"),regexp:e.instant("COMMON.FORM_ERRORS.REGEXP"),min:e.instant("COMMON.FORM_ERRORS.MIN"),max:e.instant("COMMON.FORM_ERRORS.MAX"),range:e.instant("COMMON.FORM_ERRORS.RANGE"),minlength:e.instant("COMMON.FORM_ERRORS.MIN_LENGTH"),maxlength:e.instant("COMMON.FORM_ERRORS.MAX_LENGTH"),rangelength:e.instant("COMMON.FORM_ERRORS.RANGE_LENGTH"),mincheck:e.instant("COMMON.FORM_ERRORS.MIN_CHECK"),maxcheck:e.instant("COMMON.FORM_ERRORS.MAX_CHECK"),rangecheck:e.instant("COMMON.FORM_ERRORS.RANGE_CHECK"),equalto:e.instant("COMMON.FORM_ERRORS.EQUAL_TO"),linewidth:e.instant("COMMON.FORM_ERRORS.LINEWIDTH"),pikaday:e.instant("COMMON.FORM_ERRORS.PIKADAY")},checksley.updateMessages("default",r)},r=function(t,r,n,i,o,s,c,u,l,p,h,f,d,g){var m,v,y;return t.debug("Initialize application"),r.$on("$translatePartialLoaderStructureChanged",function(){return s.refresh()}),y={linewidth:function(t,e){var r,n;return r=a.nl2br(t).split("
    "),n=_.every(r,function(t){return t.length-1}),Promise.setScheduler(function(t){return r.$evalAsync(t)}),i.setupConnection(),n.isAuthenticated()&&(v=n.getUser(),n.showTerms()),o.initialize(),r.$on("$locationChangeStart",function(t){if(f.init(),d.getLightboxOpen().length)return t.preventDefault(),d.closeAll()}),m=r.$on("$routeChangeStart",function(t,e){return e.loader&&p.start(!0),m()}),r.$on("$routeChangeSuccess",function(t,e){var r,i;return e.loader&&p.start(!0),e.access&&e.access.requiresLogin&&(n.isAuthenticated()||c.path(u.resolve("login"))),(e.title||e.description)&&(i=s.instant(e.title||""),r=s.instant(e.description||""),l.setAll(i,r)),e.mobileViewport?l.addMobileViewport():l.removeMobileViewport(),e.disableHeader?h.disableHeader():h.enableHeader()})},angular.module("infinite-scroll").value("THROTTLE_MILLISECONDS",500),s=_.filter(this.taigaContribPlugins,function(t){return t.module}),o=_.map(s,function(t){return t.module}),i=["taigaBase","taigaCommon","taigaResources","taigaResources2","taigaAuth","taigaEvents","taigaHome","taigaNavigationBar","taigaProjects","taigaRelatedTasks","taigaBacklog","taigaTaskboard","taigaKanban","taigaIssues","taigaUserStories","taigaTasks","taigaTeam","taigaWiki","taigaSearch","taigaAdmin","taigaProject","taigaUserSettings","taigaFeedback","taigaPlugins","taigaIntegrations","taigaComponents","taigaProfile","taigaHome","taigaUserTimeline","taigaExternalApps","taigaDiscover","taigaHistory","taigaWikiHistory","taigaEpics","taigaUtils","templates","ngSanitize","ngRoute","ngAnimate","ngAria","pascalprecht.translate","infinite-scroll","tgRepeat"].concat(o),n=angular.module("taiga",i),n.config(["$routeProvider","$locationProvider","$httpProvider","$provide","$tgEventsProvider","$compileProvider","$translateProvider","$translatePartialLoaderProvider","$animateProvider",t]),n.run(["$log","$rootScope","$tgAuth","$tgEvents","$tgAnalytics","$translate","$tgLocation","$tgNavUrls","tgAppMetaService","tgLoader","tgNavigationBarService","tgErrorHandlingService","lightboxService","$tgConfig",r])}).call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty,o=function(t,e){return function(){return t.apply(e,arguments)}};t=function(){function t(){}return t}(),r=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return n(e,t),e}(t),e=function(t){function e(){return this.onInitialDataError=o(this.onInitialDataError,this),e.__super__.constructor.apply(this,arguments)}return n(e,t),e.prototype.onInitialDataError=function(t){return t&&(404===t.status?this.errorHandlingService.notfound():403===t.status&&this.errorHandlingService.permissionDenied()),this.q.reject(t)},e}(t),this.taiga.Base=t,this.taiga.Service=r,this.taiga.Controller=e}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,$,I,E,T,C,P,w,A,O,R=[].indexOf||function(t){for(var e=0,r=this.length;e\r\n]?)(\r\n|\n\r|\r|\n)/g,"$1"+e+"$2")}}(this),r=function(t){return function(t){var e,r;return e=_.keys(t),r=[],_.forIn(t,function(t,n){if(R.call(e,n)<0&&_.isFunction(t))return r.push(n)}),_.bindAll(t,r)}}(this),n=function(t){return function(t,e,r){var n,i;return i=t.$eval(e),void 0!==i?r(i):(n=null,n=t.$watch(e,function(t){if(void 0!==t)return r(t),n?n():void 0}))}}(this),m=function(){var t,e,r,n,i,o,s,a;for(e=arguments[0],o=2<=arguments.length?M.call(arguments,1):[],t=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return U(e,t),e}(e),r=o.length-1;r>=0;r+=-1){i=o[r],a=i.prototype;for(s in a)n=a[s],t.prototype[s]=n}return t},w=function(t,e){return _.trim(t,e)},k=function(t){return t.toString().toLowerCase().trim().replace(/\s+/g,"-").replace(/&/g,"-and-").replace(/[^\w\-]+/g,"").replace(/\-\-+/g,"-")},O=function(t){return t?_.capitalize(t.replace(/-/g," ")):t},P=function(t,e){var r,n;return r=t.data("nextTextPosition"),(null==r||r>=e.length)&&(r=0),n=e[r],t.data("nextTextPosition",r+1),t.text(n)},p=function(t,e){var r,n,i,o;for(o={},r=0,i=t.length;re&&(n=n.substring(0,e+1),n=n.substring(0,Math.min(n.length,n.lastIndexOf(" "))),n+=r),n):t},j=function(t,e){var r,n,i;return null==e&&(e=1),isNaN(parseFloat(t))||!isFinite(t)?"-":0===t?"0 bytes":(i=["bytes","KB","MB","GB","TB","PB"],r=Math.floor(Math.log(t)/Math.log(1024)),r>5&&(r=5),n=(t/Math.pow(1024,r)).toFixed(e),n+" "+i[r])},I=function(t,e){var r;return e?(r=new RegExp("<(?!"+e+"s*/?)[^>]+>","gi"),String(t).replace(r,"")):String(t).replace(/<\/?[^>]+>/g,"")},b=function(t,e,r){var n;return n=new RegExp("<("+e+")>","gi"),t=t.replace(n,"<"+r+">"),n=new RegExp("","gi"),t=t.replace(n,"")},a=function(t){return function(t,e,r){return Object.defineProperty(t,e,{get:function(){var t;if(!_.isFunction(r))throw"defineImmutableProperty third param must be a function";if(t=r(),t&&_.isObject(t)&&void 0===t.size)throw"defineImmutableProperty must return immutable data";return t}})}}(this),_.mixin({removeKeys:function(t,e){return _.chain([e]).flatten().reduce(function(t,e){return delete t[e],t},t).value()},cartesianProduct:function(){return _.reduceRight(arguments,function(t,e){return _.flatten(_.map(t,function(t){return _.map(e,function(e){return[e].concat(t)})}),!0)},[[]])}}),f=function(t){return null!==t.match(/\.(jpe?g|png|gif|gifv|webm|svg|psd)/i)},h=function(t){return null!=t&&null!==t.match(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/)},d=function(t){return null!==t.match(/\.(pdf)/i)},y=function(t,e){var r;return r={},e.forEach(function(e,n){if(e!==t.get(n))return e.toJS?r[n]=e.toJS():r[n]=e}),r},t=["#fce94f","#edd400","#c4a000","#8ae234","#73d216","#4e9a06","#d3d7cf","#fcaf3e","#f57900","#ce5c00","#729fcf","#3465a4","#204a87","#888a85","#ad7fa8","#75507b","#5c3566","#ef2929","#cc0000","#a40000","#222222"],l=function(){return _.sample(t)},c=function(){return _.clone(t)},u=function(t,e,r){var n,i;for(r||(r=1),i=[],n=null;n=e.exec(t);)r===-1?i.push(n):i.push(n[r]);return i},E=this.taiga,E.addClass=e,E.nl2br=v,E.bindMethods=r,E.bindOnce=n,E.mixOf=m,E.trim=w,E.slugify=k,E.unslugify=O,E.toggleText=P,E.groupBy=p,E.timeout=T,E.cancelTimeout=i,E.scopeDefer=S,E.toString=C,E.joinStr=g,E.truncate=A,E.debounce=o,E.debounceLeading=s,E.startswith=$,E.sizeFormat=j,E.stripTags=I,E.replaceTags=b,E.defineImmutableProperty=a,E.isImage=f,E.isEmail=h,E.isPdf=d,E.patch=y,E.getRandomDefaultColor=l,E.getDefaulColorList=c,E.getMatches=u}.call(this),function(){var t,e,r,n,i,o,s,a;o=this.taiga,n=this.taiga.groupBy,i=this.taiga.joinStr,a=this.taiga.trim,s=this.taiga.toString,e=function(){function t(){}return t.prototype.fillUsersAndRoles=function(t,e){var r,i;return r=_.filter(t,function(t){return function(t){return t.is_active}}(this)),this.scope.activeUsers=_.sortBy(r,"full_name_display"),this.scope.activeUsersById=n(this.scope.activeUsers,function(t){return t.id}),this.scope.users=_.sortBy(t,"full_name_display"),this.scope.usersById=n(this.scope.users,function(t){return t.id}),this.scope.roles=_.sortBy(e,"order"),i=_(this.scope.project.members).map("role").uniq().value(),this.scope.computableRoles=_(e).filter("computable").filter(function(t){return _.includes(i,t.id)}).value()},t.prototype.loadUsersAndRoles=function(){var t;return t=this.q.all([this.rs.projects.usersList(this.scope.projectId),this.rs.projects.rolesList(this.scope.projectId)]),t.then(function(t){return function(e){var r,n;return n=e[0],r=e[1],t.fillUsersAndRoles(n,r),e}}(this))},t}(),o.PageMixin=e,t=function(){function t(){}return t.prototype.selectFilter=function(t,e,r){var n,s,c;if(null==r&&(r=!1),c=this.location.search(),void 0!==c[t]&&"page"!==t&&(n=_.map(o.toString(c[t]).split(","),function(t){return a(t)}),n.push(o.toString(e)),n=_.compact(n),e=i(",",_.uniq(n))),!this.location.isInCurrentRouteParams(t,e))return s=r?this.location:this.location.noreload(this.scope),s.search(t,e)},t.prototype.replaceFilter=function(t,e,r){var n;if(null==r&&(r=!1),!this.location.isInCurrentRouteParams(t,e))return n=r?this.location:this.location.noreload(this.scope),n.search(t,e)},t.prototype.replaceAllFilters=function(t,e){var r;return null==e&&(e=!1),r=e?this.location:this.location.noreload(this.scope),r.search(t)},t.prototype.unselectFilter=function(t,e,r){var n,s,c,u;if(null==r&&(r=!1),c=this.location.search(),void 0!==c[t])return void 0!==e&&null!==e||delete c[t],u=_.map(o.toString(c[t]).split(","),function(t){return a(t)}),s=_.reject(u,function(t){return t===o.toString(e)}),s=_.compact(s),e=_.isEmpty(s)?null:i(",",_.uniq(s)),n=r?this.location:this.location.noreload(this.scope),n.search(t,e)},t.prototype.applyStoredFilters=function(t,e){var r;return!(!_.isEmpty(this.location.search())||(r=this.getFilters(t,e),!Object.keys(r).length))&&(this.location.search(r),this.location.replace(),!0)},t.prototype.storeFilters=function(t,e,r){var n,i;return i=t+":"+r,n=o.generateHash([t,i]),this.storage.set(n,e)},t.prototype.getFilters=function(t,e){var r,n;return n=t+":"+e,r=o.generateHash([t,n]),this.storage.get(r)||{}},t.prototype.formatSelectedFilters=function(t,e,r){var n,i,o,s,a;return s=r.split(","),o=_.filter(e,function(t){return s.indexOf(_.toString(t.id))!==-1}),i=_.filter(s,function(t){return!_.find(o,function(e){return _.toString(e.id)===t})}),n=_.map(i,function(e){return{id:e,key:t+":"+e,dataType:t,name:e}}),a=_.map(o,function(e){return{id:e.id,key:t+":"+e.id,dataType:t,name:e.name,color:e.color}}),n.concat(a)},t}(),o.FiltersMixin=t,r=function(){function t(){}return t.prototype.changeQ=function(t){return this.replaceFilter("q",t),this.filtersReloadContent(),this.generateFilters()},t.prototype.removeFilter=function(t){return this.unselectFilter(t.dataType,t.id),this.filtersReloadContent(),this.generateFilters()},t.prototype.addFilter=function(t){return this.selectFilter(t.category.dataType,t.filter.id),this.filtersReloadContent(),this.generateFilters()},t.prototype.selectCustomFilter=function(t){return this.replaceAllFilters(t.filter),this.filtersReloadContent(),this.generateFilters()},t.prototype.saveCustomFilter=function(t){var e,r;return e={},r=this.location.search(),e.tags=r.tags,e.status=r.status,e.assigned_to=r.assigned_to,e.owner=r.owner,e.epic=r.epic,e.role=r.role,this.filterRemoteStorageService.getFilters(this.scope.projectId,this.storeCustomFiltersName).then(function(r){return function(n){return n[t]=e,r.filterRemoteStorageService.storeFilters(r.scope.projectId,n,r.storeCustomFiltersName).then(r.generateFilters)}}(this))},t.prototype.removeCustomFilter=function(t){return this.filterRemoteStorageService.getFilters(this.scope.projectId,this.storeCustomFiltersName).then(function(e){return function(r){return delete r[t.id],e.filterRemoteStorageService.storeFilters(e.scope.projectId,r,e.storeCustomFiltersName).then(e.generateFilters),e.generateFilters()}}(this))},t.prototype.isFilterDataTypeSelected=function(t){var e,r,n,i;for(i=this.selectedFilters,r=0,n=i.length;r0}),n=_.map(o.assigned_to,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.full_name||"Unassigned",t}),c=_.map(o.roles,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.name||"Unassigned",t}),a=_.map(o.owners,function(t){return t.id=t.id.toString(),t.name=t.full_name,t}),s=_.map(o.epics,function(t){return t.id?(t.id=t.id.toString(),t.name="#"+t.ref+" "+t.subject):(t.id="null",t.name="Not in an epic"),t}),t.selectedFilters=[],e.status&&(u=t.formatSelectedFilters("status",l,e.status),t.selectedFilters=t.selectedFilters.concat(u)),e.tags&&(u=t.formatSelectedFilters("tags",p,e.tags),t.selectedFilters=t.selectedFilters.concat(u)),e.assigned_to&&(u=t.formatSelectedFilters("assigned_to",n,e.assigned_to),t.selectedFilters=t.selectedFilters.concat(u)),e.owner&&(u=t.formatSelectedFilters("owner",a,e.owner),t.selectedFilters=t.selectedFilters.concat(u)),e.epic&&(u=t.formatSelectedFilters("epic",s,e.epic),t.selectedFilters=t.selectedFilters.concat(u)),e.role&&(u=t.formatSelectedFilters("role",c,e.role),t.selectedFilters=t.selectedFilters.concat(u)),t.filterQ=e.q,t.filters=[{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.STATUS"),dataType:"status",content:l},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.TAGS"),dataType:"tags",content:p,hideEmpty:!0,totalTaggedElements:h.length},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.ASSIGNED_TO"),dataType:"assigned_to",content:n},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.ROLE"),dataType:"role",content:c},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.CREATED_BY"),dataType:"owner",content:a},{title:t.translate.instant("COMMON.FILTERS.CATEGORIES.EPIC"),dataType:"epic",content:s}],t.customFilters=[],_.forOwn(i,function(e,r){return t.customFilters.push({id:r,name:r,filter:e})})}}(this))},t}(),o.UsFiltersMixin=r}.call(this),function(){var t;t=angular.module("taigaAdmin",[])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f=function(t,e){function r(){this.constructor=t}for(var n in e)d.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},d={}.hasOwnProperty;h=this.taiga,l=this.taiga.debounce,p=angular.module("taigaAuth",["taigaResources"]),a=function(){function t(t,e,r,n,i){var o;t.isAuthenticated()&&(n.force_login||(o=r.resolve("home"),n.next&&(o=decodeURIComponent(n.next),e.search("next",null)),n.unauthorized?(i.clear(),i.removeToken()):e.url(o)))}return t.$inject=["tgCurrentUserService","$location","$tgNavUrls","$routeParams","$tgAuth"],t}(),p.controller("LoginPage",a),t=function(t){function e(t,r,n,i,o,s,a,c,u,l,p,h){var f;this.rootscope=t,this.storage=r,this.model=n,this.rs=i,this.http=o,this.urls=s,this.config=a,this.translate=c,this.currentUserService=u,this.themeService=l,this.analytics=p,this.termsAnnouncementService=h,e.__super__.constructor.call(this),f=this.getUser(),this._currentTheme=this._getUserTheme(),this.setUserdata(f)}return f(e,t),e.$inject=["$rootScope","$tgStorage","$tgModel","$tgResources","$tgHttp","$tgUrls","$tgConfig","$translate","tgCurrentUserService","tgThemeService","$tgAnalytics","tgTermsAnnouncementService"],e.prototype.setUserdata=function(t){return t?(this.userData=Immutable.fromJS(t.getAttrs()),this.currentUserService.setUser(this.userData)):this.userData=null,this.analytics.setUserId()},e.prototype._getUserTheme=function(){var t;return(null!=(t=this.rootscope.user)?t.theme:void 0)||this.config.get("defaultTheme")||"taiga"},e.prototype._setTheme=function(){var t;if(t=this._getUserTheme(),this._currentTheme!==t)return this._currentTheme=t,this.themeService.use(this._currentTheme)},e.prototype._setLocales=function(){var t,e;return t=(null!=(e=this.rootscope.user)?e.lang:void 0)||this.config.get("defaultLanguage")||"en",this.translate.preferredLanguage(t),this.translate.use(t)},e.prototype.getUser=function(){var t,e;return this.rootscope.user?this.rootscope.user:(e=this.storage.get("userInfo"))?(t=this.model.make_model("users",e),this.rootscope.user=t,this._setLocales(),this._setTheme(),t):(this._setTheme(),null)},e.prototype.setUser=function(t){return this.rootscope.auth=t,this.storage.set("userInfo",t.getAttrs()),this.rootscope.user=t,this.setUserdata(t),this._setLocales(),this._setTheme()},e.prototype.clear=function(){return this.rootscope.auth=null,this.rootscope.user=null,this.storage.remove("userInfo")},e.prototype.setToken=function(t){return this.storage.set("token",t)},e.prototype.getToken=function(){return this.storage.get("token")},e.prototype.removeToken=function(){return this.storage.remove("token")},e.prototype.isAuthenticated=function(){return null!==this.getUser()},e.prototype.refresh=function(){var t;return t=this.urls.resolve("user-me"),this.http.get(t).then(function(t){return function(e,r){var n;return n=e.data,n.token=t.getUser().auth_token,n=t.model.make_model("users",n),t.setUser(n),t.rootscope.$broadcast("auth:refresh",n),n}}(this))},e.prototype.login=function(t,e){var r;return r=this.urls.resolve("auth"),t=_.clone(t,!1),t.type=e?e:"normal",this.removeToken(),this.http.post(r,t).then(function(t){return function(e,r){var n;return n=t.model.make_model("users",e.data),t.setToken(n.auth_token),t.setUser(n),t.rootscope.$broadcast("auth:login",n),n}}(this))},e.prototype.logout=function(){return this.removeToken(),this.clear(),this.currentUserService.removeUser(),this._setTheme(),this._setLocales(),this.rootscope.$broadcast("auth:logout"),this.analytics.setUserId(); +},e.prototype.register=function(t,e,r){var n;return n=this.urls.resolve("auth-register"),t=_.clone(t,!1),t.type=e?e:"public","private"===e&&(t.existing=!!r&&r),this.removeToken(),this.http.post(n,t).then(function(t){return function(e){var r;return r=t.model.make_model("users",e.data),t.setToken(r.auth_token),t.setUser(r),t.rootscope.$broadcast("auth:register",r),r}}(this))},e.prototype.getInvitation=function(t){return this.rs.invitations.get(t)},e.prototype.acceptInvitiationWithNewUser=function(t){return this.register(t,"private",!1)},e.prototype.forgotPassword=function(t){var e;return e=this.urls.resolve("users-password-recovery"),t=_.clone(t,!1),this.removeToken(),this.http.post(e,t)},e.prototype.changePasswordFromRecovery=function(t){var e;return e=this.urls.resolve("users-change-password-from-recovery"),t=_.clone(t,!1),this.removeToken(),this.http.post(e,t)},e.prototype.changeEmail=function(t){var e;return e=this.urls.resolve("users-change-email"),t=_.clone(t,!1),this.http.post(e,t)},e.prototype.cancelAccount=function(t){var e;return e=this.urls.resolve("users-cancel-account"),t=_.clone(t,!1),this.http.post(e,t)},e.prototype.exportProfile=function(){var t;return t=this.urls.resolve("users-export"),this.http.post(t)},e.prototype.showTerms=function(t){var e;if(e=this.getUser(),e&&!e.read_new_terms)return this.termsAnnouncementService.show()},e}(h.Service),p.service("$tgAuth",t),c=function(t,e,r,n){var i,o;return i=n.get("auth/login-text.html",!0),o=function(){var n,o,s;return(o=t.get("publicRegisterEnabled"))?(s=e.resolve("register"),r.force_next&&(n=encodeURIComponent(r.force_next),s+="?next="+n),i({url:s})):""},{restrict:"AE",scope:{},template:o}},p.directive("tgPublicRegisterMessage",["$tgConfig","$tgNavUrls","$routeParams","$tgTemplate",c]),s=function(t,e,r,n,i,o,s,a,c,u){var p;return p=function(p,h,f){var d,g,m,v;return d=new checksley.Form(h.find("form.login-form")),i.next&&i.next!==o.resolve("login")?p.nextUrl=decodeURIComponent(i.next):p.nextUrl=o.resolve("home"),i.force_next&&(p.nextUrl=decodeURIComponent(i.force_next)),m=function(e){return s.setupConnection(),u.trackEvent("auth","login","user login",1),t.showTerms(),0===p.nextUrl.indexOf("http")?c.location.href=p.nextUrl:r.url(p.nextUrl)},g=function(t){return e.notify("light-error",a.instant("LOGIN_FORM.ERROR_AUTH_INCORRECT"))},p.onKeyUp=function(t){var e,r;if(e=angular.element(t.currentTarget),r=e.val(),p.iscapsLockActivated=!1,r!==r.toLowerCase())return p.iscapsLockActivated=!0},v=l(2e3,function(e){return function(e){var r,i,o;if(e.preventDefault(),d.validate())return r={username:h.find("form.login-form input[name=username]").val(),password:h.find("form.login-form input[name=password]").val()},i=n.get("loginFormType","normal"),o=t.login(r,i),o.then(m,g)}}(this)),h.on("submit","form",v),window.prerenderReady=!0,p.$on("$destroy",function(){return h.off()})},{link:p}},p.directive("tgLogin",["$tgAuth","$tgConfirm","$tgLocation","$tgConfig","$routeParams","$tgNavUrls","$tgEvents","$translate","$window","$tgAnalytics",s]),u=function(t,e,r,n,i,o,s,a,c){var u;return u=function(u,p,h){var f,d,g,m;return i.get("publicRegisterEnabled")||(r.path(n.resolve("not-found")),r.replace()),u.data={},f=p.find("form").checksley({onlyOneErrorElement:!0}),o.next&&o.next!==n.resolve("login")?u.nextUrl=decodeURIComponent(o.next):u.nextUrl=n.resolve("home"),g=function(t){return s.trackEvent("auth","register","user registration",1),0===u.nextUrl.indexOf("http")?c.location.href=u.nextUrl:r.url(u.nextUrl)},d=function(t){var r;return t.data._error_message&&(r=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),e.notify("light-error",r)),f.setErrors(t.data)},m=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),f.validate())return r=t.register(u.data),r.then(g,d)}}(this)),p.on("submit","form",m),u.$on("$destroy",function(){return p.off()}),window.prerenderReady=!0},{link:u}},p.directive("tgRegister",["$tgAuth","$tgConfirm","$tgLocation","$tgNavUrls","$tgConfig","$routeParams","$tgAnalytics","$translate","$window",u]),i=function(t,e,r,n,i){var o;return o=function(o,s,a){var c,u,p,h;return o.data={},c=s.find("form").checksley(),p=function(t){var o,s;return r.path(n.resolve("login")),s=i.instant("FORGOT_PASSWORD_FORM.SUCCESS_TITLE"),o=i.instant("FORGOT_PASSWORD_FORM.SUCCESS_TEXT"),e.success(s,o)},u=function(t){var r;return r=i.instant("FORGOT_PASSWORD_FORM.ERROR"),e.notify("light-error",r)},h=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),c.validate())return r=t.forgotPassword(o.data),r.then(p,u)}}(this)),s.on("submit","form",h),o.$on("$destroy",function(){return s.off()}),window.prerenderReady=!0},{link:o}},p.directive("tgForgotPassword",["$tgAuth","$tgConfirm","$tgLocation","$tgNavUrls","$translate",i]),n=function(t,e,r,n,i,o){var s;return s=function(s,a,c){var u,p,h,f,d;return s.data={},null!=n.token?(s.tokenInParams=!0,s.data.token=n.token):(r.path(i.resolve("login")),d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.ERROR"),e.notify("light-error",d)),u=a.find("form").checksley(),h=function(t){return r.path(i.resolve("login")),d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS"),e.success(d)},p=function(t){return d=o.instant("CHANGE_PASSWORD_RECOVERY_FORM.ERROR"),e.notify("light-error",d)},f=l(2e3,function(e){return function(e){var r;if(e.preventDefault(),u.validate())return r=t.changePasswordFromRecovery(s.data),r.then(h,p)}}(this)),a.on("submit","form",f),s.$on("$destroy",function(){return a.off()})},{link:s}},p.directive("tgChangePasswordFromRecovery",["$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls","$translate",n]),o=function(t,e,r,n,i,o,s,a,c){var u;return u=function(u,p,h){var f,d,g,m,v,y,b,S,j,k;return k=i.token,y=t.getInvitation(k),y.then(function(t){return u.invitation=t,u.publicRegisterEnabled=c.get("publicRegisterEnabled")}),y.then(null,function(t){var n;return r.path(o.resolve("login")),n=a.instant("INVITATION_LOGIN_FORM.NOT_FOUND"),e.notify("light-error",n)}),u.dataLogin={token:k},f=p.find("form.login-form").checksley({onlyOneErrorElement:!0}),m=function(t){var n;return s.trackEvent("auth","invitationAccept","invitation accept with existing user",1),r.path(o.resolve("project",{project:u.invitation.project_slug})),n=a.instant("INVITATION_LOGIN_FORM.SUCCESS",{project_name:u.invitation.project_name}),e.notify("success",n)},d=function(t){return e.notify("light-error",t.data._error_message)},S=l(2e3,function(e){return function(e){var r,i;if(e.preventDefault(),f.validate())return i=n.get("loginFormType","normal"),r=u.dataLogin,y=t.login({username:r.username,password:r.password,invitation_token:r.token},i),y.then(m,d)}}(this)),p.on("submit","form.login-form",S),p.on("click",".button-login",S),u.dataRegister={token:k},b=p.find("form.register-form").checksley({onlyOneErrorElement:!0}),v=function(t){return s.trackEvent("auth","invitationAccept","invitation accept with new user",1),r.path(o.resolve("project",{project:u.invitation.project_slug})),e.notify("success","You've successfully joined this project","Welcome to "+_.escape(u.invitation.project_name))},g=function(t){var r;return t.data._error_message&&(r=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),e.notify("light-error",r)),b.setErrors(t.data)},j=l(2e3,function(e){return function(e){if(e.preventDefault(),b.validate())return y=t.acceptInvitiationWithNewUser(u.dataRegister),y.then(v,g)}}(this)),p.on("submit","form.register-form",j),p.on("click",".button-register",j),u.$on("$destroy",function(){return p.off()})},{link:u}},p.directive("tgInvitation",["$tgAuth","$tgConfirm","$tgLocation","$tgConfig","$routeParams","$tgNavUrls","$tgAnalytics","$translate","$tgConfig",o]),r=function(t,e,r,n,i,o,s,a){var c;return c=function(e,c,u){var l,p,h,f;return e.data={},e.data.email_token=o.email_token,l=c.find("form").checksley(),h=function(e){var o;return r.isAuthenticated()?t.queryOne("users",r.getUser().id).then(function(t){return function(t){return r.setUser(t),i.path(s.resolve("home")),i.replace()}}(this)):(i.path(s.resolve("login")),i.replace()),o=a.instant("CHANGE_EMAIL_FORM.SUCCESS"),n.success(o)},p=function(t){var e;return e=a.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),n.notify("light-error",e)},f=function(){var t;if(l.validate())return t=r.changeEmail(e.data),t.then(h,p)},c.on("submit",function(t){return t.preventDefault(),f()}),c.on("click","a.button-change-email",function(t){return t.preventDefault(),f()}),e.$on("$destroy",function(){return c.off()})},{link:c}},p.directive("tgChangeEmail",["$tgRepo","$tgModel","$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls","$translate",r]),e=function(t,e,r,n,i,o,s){var a;return a=function(t,e,a){var c,u,p,h;return t.data={},t.data.cancel_token=o.cancel_token,c=e.find("form").checksley(),p=function(t){var e;return r.logout(),i.path(s.resolve("home")),e=$translate.instant("CANCEL_ACCOUNT.SUCCESS"),n.success(e)},u=function(t){var e;return e=$translate.instant("COMMON.GENERIC_ERROR",{error:t.data._error_message}),n.notify("error",e)},h=l(2e3,function(e){return function(e){var n;if(e.preventDefault(),c.validate())return n=r.cancelAccount(t.data),n.then(p,u)}}(this)),e.on("submit","form",h),t.$on("$destroy",function(){return e.off()})},{link:a}},p.directive("tgCancelAccount",["$tgRepo","$tgModel","$tgAuth","$tgConfirm","$tgLocation","$routeParams","$tgNavUrls",e])}.call(this),function(){var t;t=angular.module("taigaBacklog",[])}.call(this),function(){var t,e,r,n,i,o,s;o=this.taiga,r=this.taiga.groupBy,e=this.taiga.bindOnce,i=angular.module("taigaBase",[]),t=function(t,e){var r;return r=function(r,n,i){return e.onresize=function(){return t.$broadcast("resize")}},{link:r}},i.directive("tgMain",["$rootScope","$window",t]),s={home:"/",projects:"/projects",error:"/error","not-found":"/not-found","permission-denied":"/permission-denied",discover:"/discover","discover-search":"/discover/search",login:"/login","forgot-password":"/forgot-password","change-password":"/change-password/:token","change-email":"/change-email/:token","cancel-account":"/cancel-account/:token",register:"/register",invitation:"/invitation/:token","create-project":"/project/new","create-project-scrum":"/project/new/scrum","create-project-kanban":"/project/new/kanban","create-project-duplicate":"/project/new/duplicate","create-project-import":"/project/new/import","create-project-import-platform":"/project/new/import/:platform",profile:"/profile","user-profile":"/profile/:username","blocked-project":"/blocked-project/:project",project:"/project/:project","project-detail-ref":"/project/:project/t/:ref","project-backlog":"/project/:project/backlog","project-taskboard":"/project/:project/taskboard/:sprint","project-kanban":"/project/:project/kanban","project-issues":"/project/:project/issues","project-epics":"/project/:project/epics","project-search":"/project/:project/search","project-epics-detail":"/project/:project/epic/:ref","project-userstories-detail":"/project/:project/us/:ref","project-tasks-detail":"/project/:project/task/:ref","project-issues-detail":"/project/:project/issue/:ref","project-wiki":"/project/:project/wiki","project-wiki-list":"/project/:project/wiki-list","project-wiki-page":"/project/:project/wiki/:slug","project-team":"/project/:project/team","project-admin-home":"/project/:project/admin/project-profile/details","project-admin-project-profile-details":"/project/:project/admin/project-profile/details","project-admin-project-profile-default-values":"/project/:project/admin/project-profile/default-values","project-admin-project-profile-modules":"/project/:project/admin/project-profile/modules","project-admin-project-profile-export":"/project/:project/admin/project-profile/export","project-admin-project-profile-reports":"/project/:project/admin/project-profile/reports","project-admin-project-values-status":"/project/:project/admin/project-values/status","project-admin-project-values-points":"/project/:project/admin/project-values/points","project-admin-project-values-priorities":"/project/:project/admin/project-values/priorities","project-admin-project-values-severities":"/project/:project/admin/project-values/severities","project-admin-project-values-types":"/project/:project/admin/project-values/types","project-admin-project-values-custom-fields":"/project/:project/admin/project-values/custom-fields","project-admin-project-values-tags":"/project/:project/admin/project-values/tags","project-admin-memberships":"/project/:project/admin/memberships","project-admin-roles":"/project/:project/admin/roles","project-admin-third-parties-webhooks":"/project/:project/admin/third-parties/webhooks","project-admin-third-parties-github":"/project/:project/admin/third-parties/github","project-admin-third-parties-gitlab":"/project/:project/admin/third-parties/gitlab","project-admin-third-parties-bitbucket":"/project/:project/admin/third-parties/bitbucket","project-admin-third-parties-gogs":"/project/:project/admin/third-parties/gogs","project-admin-contrib":"/project/:project/admin/contrib/:plugin","user-settings-user-profile":"/user-settings/user-profile","user-settings-user-change-password":"/user-settings/user-change-password","user-settings-user-avatar":"/user-settings/user-avatar","user-settings-mail-notifications":"/user-settings/mail-notifications","user-settings-live-notifications":"/user-settings/live-notifications","user-settings-contrib":"/user-settings/contrib/:plugin"},n=function(t,e){return t.debug("Initialize navigation urls"),e.update(s)},i.run(["$log","$tgNavUrls",n])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v=[].slice,y=function(t,e){function r(){this.constructor=t}for(var n in e)b.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},b={}.hasOwnProperty;m=this.taiga,g=angular.module("taigaCommon",[]),s=function(t,e,r){return{get:function(){var n,i,o,s;return s=r.getUser(),i=s.lang||t.preferredLanguage(),o=e.get("rtlLanguages",[]),n=o.indexOf(i)>-1,{i18n:{previousMonth:t.instant("COMMON.PICKERDATE.PREV_MONTH"),nextMonth:t.instant("COMMON.PICKERDATE.NEXT_MONTH"),months:[t.instant("COMMON.PICKERDATE.MONTHS.JAN"),t.instant("COMMON.PICKERDATE.MONTHS.FEB"),t.instant("COMMON.PICKERDATE.MONTHS.MAR"),t.instant("COMMON.PICKERDATE.MONTHS.APR"),t.instant("COMMON.PICKERDATE.MONTHS.MAY"),t.instant("COMMON.PICKERDATE.MONTHS.JUN"),t.instant("COMMON.PICKERDATE.MONTHS.JUL"),t.instant("COMMON.PICKERDATE.MONTHS.AUG"),t.instant("COMMON.PICKERDATE.MONTHS.SEP"),t.instant("COMMON.PICKERDATE.MONTHS.OCT"),t.instant("COMMON.PICKERDATE.MONTHS.NOV"),t.instant("COMMON.PICKERDATE.MONTHS.DEC")],weekdays:[t.instant("COMMON.PICKERDATE.WEEK_DAYS.SUN"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.MON"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.TUE"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.WED"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.THU"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.FRI"),t.instant("COMMON.PICKERDATE.WEEK_DAYS.SAT")],weekdaysShort:[t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI"),t.instant("COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT")]},isRTL:n,firstDay:parseInt(t.instant("COMMON.PICKERDATE.FIRST_DAY_OF_WEEK"),10),format:t.instant("COMMON.PICKERDATE.FORMAT")}}}},g.factory("tgDatePickerConfigService",["$translate","$tgConfig","$tgAuth",s]),p=function(t,e){var r;return r=function(){return t.getSelection?t.getSelection().toString():e.selection?e.selection.createRange().text:""},{get:r}},g.factory("$selectedText",["$window","$document",p]),n=function(t){var e,r;return r=function(t,e,r){if(e&&r&&e.get("my_permissions").indexOf(r)>-1)return t.removeClass("hidden")},e=function(e,n,i){var o,s,a;return n.addClass("hidden"),o=i.tgCheckPermission,a=e.$watch(function(){return t.project},function(){if(t.project)return r(n,t.project,o),a()}),s=i.$observe("tgCheckPermission",function(e){if(e)return r(n,t.project,e),s()}),e.$on("$destroy",function(){return n.off()})},{link:e}},n.$inject=["tgProjectService"],g.directive("tgCheckPermission",n),i=function(){var t,e;return e="tgClassPermission",t=function(t,r,n){var i,o,s;return i=function(t,e,n){var i;return i="!"===n[0],i&&(n=n.slice(1)),i&&t.my_permissions.indexOf(n)===-1?r.addClass(e):i||t.my_permissions.indexOf(n)===-1?r.removeClass(e):r.addClass(e)},o=function(r){var o,a,c,u;if(r){s(),a=t.$eval(n[e]),u=[];for(o in a)c=a[o],u.push(i(r,o,c));return u}},s=t.$watch("project",o)},{link:t}},g.directive("tgClassPermission",i),t=function(){var t,e,r,n;return e=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,r=function(t){return function(t){var i;if(i=n.shift(),i(),n.length)return e(r)}}(this),n=[],t=function(){var t,i,o,s;for(s=[],i=0,o=arguments.length;i-1?t.resolve("project-backlog",r):e.is_kanban_activated&&e.my_permissions.indexOf("view_us")>-1?t.resolve("project-kanban",r):e.is_wiki_activated&&e.my_permissions.indexOf("view_wiki_pages")>-1?t.resolve("project-wiki",r):e.is_issues_activated&&e.my_permissions.indexOf("view_issues")>-1?t.resolve("project-issues",r):t.resolve("project",r)},{get:e}},g.factory("$projectUrl",["$tgNavUrls",c]),u=function(t){var e,r,n;return e=t.defer(),e.resolve(),r=e.promise,n={bindAdd:function(t){return function(e){return function(){var n;return n=1<=arguments.length?v.call(arguments,0):[],r=r.then(function(){return e.apply(t,n)})}}}(this),add:function(t){return function(t){return r=r?r.then(t):t(),n}}(this)}},g.factory("$tgQqueue",["$q",u]),l=function(t){function e(t,e,r,n){this.qqueue=t,this.repo=e,this.q=r,this.model=n}return y(e,t),e.$inject=["$tgQqueue","$tgRepo","$q","$tgModel"],e.prototype.setObject=function(t,e){this.scope=t,this.prop=e},e.prototype.clone=function(){var t,e;return t=_.cloneDeep(this.scope[this.prop]._attrs),e=this.model.make_model(this.scope[this.prop]._name,t)},e.prototype.getObj=function(){return this.scope[this.prop]},e.prototype.save=function(t){var e;return e=this.q.defer(),this.qqueue.add(function(r){return function(){var n,i,o,s,a;return s=r.getObj(),i=s.comment,s.comment="",n=r.clone(),o=_.omit(s._modifiedAttrs,["version"]),n=_.assign(n,o),t(n),i.length&&(n.comment=i),a=function(){return r.scope[r.prop]=n,e.resolve.apply(null,arguments)},r.repo.save(n).then(a,e.reject)}}(this)),e.promise},e}(m.Service),g.service("$tgQueueModelTransformation",l),f=function(t){return{get:function(e){return function(e,r){var n;return null==r&&(r=!1),n=t.get(e),r&&(n=_.template(n)),n}}(this)}},g.factory("$tgTemplate",["$templateCache",f]),r=function(){var t;return t="",{template:t}},g.directive("tgCapslock",[r]),a=function(){var t,e;return e='\n \n',t=function(t,e,r){},{scope:{onClose:"&"},link:t,template:e}},g.directive("tgLightboxClose",[a]),h=function(){var t;return t='\n \n {{svgTitle}}\n {{svgTitleTranslate | translate: svgTitleTranslateValues}}\n \n',{scope:{svgIcon:"@",svgTitle:"@",svgTitleTranslate:"@",svgTitleTranslateValues:"="},template:t}},g.directive("tgSvg",[h]),e=function(t,e,r){return{restrict:"A",link:function(r,n,i){var o;return i.ngShow?(o=e(i.ngShow),r.$watch(o,function(e){if(e===!0)return t(function(){return n[0].focus()})})):t(function(){return n[0].focus()})}}},g.directive("tgAutofocus",["$timeout","$parse","animationFrame",e]),g.directive("tgPreloadImage",function(){var t,e,r;return e="loading...",r="
    \n \n
    ",t=function(t,e){var r;return r=new Image,r.onload=e,r.src=t,r},{template:r,transclude:!0,replace:!0,link:function(r,n,i){var o,s,a;return o=n.find("img:last"),a=null,s=function(){if(n.find(".loading-spinner").remove(),o.show(),a)return clearTimeout(a),a=null},i.$observe("preloadSrc",function(r){return a&&clearTimeout(a),n.find(".loading-spinner").remove(),a=setTimeout(function(){return n.prepend(e)},200),o.hide(),t(r,s)})}}}),o=function(){var t;return t=function(t,e,r){return e.on("click",function(t){if(t.ctrlKey||t.metaKey)return t.preventDefault()})},{link:t}},g.directive("tgCtrlClickDisable",o)}.call(this),function(){var t,e,r,n,i,o,s,a,c;a=this.taiga,o=this.taiga.mixOf,c=this.taiga.toString,i=this.taiga.joinStr,n=this.taiga.groupBy,r=this.taiga.bindOnce,e=this.taiga.bindMethods,s=angular.module("taigaCommon"),t=function(){function t(t,e,r,n,i){this.params=t,this.repo=e,this.projectService=r,this.navurls=n,this.location=i,this.repo.resolve({pslug:this.params.pslug,ref:this.params.ref}).then(function(t){return function(e){var r;return e.issue?r=t.navurls.resolve("project-issues-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.task?r=t.navurls.resolve("project-tasks-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.us?r=t.navurls.resolve("project-userstories-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.epic?r=t.navurls.resolve("project-epics-detail",{project:t.projectService.project.get("slug"),ref:t.params.ref}):e.wikipage&&(r=t.navurls.resolve("project-wiki-page",{project:t.projectService.project.get("slug"),slug:t.params.ref})),t.location.path(r)}}(this))}return t.$inject=["$routeParams","$tgRepo","tgProjectService","$tgNavUrls","$location"],t}(),s.controller("DetailController",t)}.call(this),function(){var t;t=angular.module("taigaEpics",[])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){return function(){return t.apply(e,arguments)}};o=this.taiga,i=this.taiga.startswith,r=this.taiga.bindMethods,n=angular.module("taigaEvents",[]),e=function(){function t(t,e,n,i,o,a){this.win=t,this.log=e,this.config=n,this.auth=i,this.liveAnnouncementService=o,this.rootScope=a,this.processMessage=s(this.processMessage,this),r(this)}return t.prototype.initialize=function(t){if(this.sessionId=t,this.subscriptions={},this.connected=!1,this.error=!1,this.pendingMessages=[],this.missedHeartbeats=0,this.heartbeatInterval=null,void 0===this.win.WebSocket)return this.log.info("WebSockets not supported on your browser")},t.prototype.setupConnection=function(){var t,e,r,n;if(this.stopExistingConnection(),n=this.config.get("eventsUrl"))return i(n,"ws:")||i(n,"wss:")||(t=this.win.location,r="https:"===t.protocol?"wss:":"ws:",e=_.trimStart(n,"/"),n=r+"//"+t.host+"/"+e),this.error=!1,this.ws=new this.win.WebSocket(n),this.ws.addEventListener("open",this.onOpen),this.ws.addEventListener("message",this.onMessage),this.ws.addEventListener("error",this.onError),this.ws.addEventListener("close",this.onClose)},t.prototype.stopExistingConnection=function(){if(void 0!==this.ws)return this.ws.removeEventListener("open",this.onOpen),this.ws.removeEventListener("close",this.onClose),this.ws.removeEventListener("error",this.onError),this.ws.removeEventListener("message",this.onMessage),this.stopHeartBeatMessages(),this.ws.close(),delete this.ws},t.prototype.notifications=function(){return this.subscribe(null,"notifications",function(t){return function(e){return t.liveAnnouncementService.show(e.title,e.desc),t.rootScope.$digest()}}(this))},t.prototype.liveNotifications=function(){var t,e;if(null!=this.auth.userData)return e=this.auth.userData.get("id"),t=function(t){return function(){return t.subscribe(null,"live_notifications."+e,function(t){var e;if(e=new Notification(t.title,{icon:"/"+window._version+"/images/favicon.png",body:t.body,tag:t.id}),e.onshow=function(){if(t.timeout&&t.timeout>0)return setTimeout(function(){return e.close()},t.timeout)},t.url)return e.onclick=function(){return window.open(t.url)}})}}(this),Notification?"granted"===Notification.permission?t():"denied"!==Notification.permission?Notification.requestPermission(function(e){return function(e){if("granted"===e)return t()}}(this)):void 0:console.log("This browser does not support desktop notification")},t.prototype.startHeartBeatMessages=function(){var t,e,r;if(!this.heartbeatInterval)return e=this.config.get("eventsMaxMissedHeartbeats",5),t=this.config.get("eventsHeartbeatIntervalTime",6e4),r=this.config.get("eventsReconnectTryInterval",1e4),this.missedHeartbeats=0,this.heartbeatInterval=setInterval(function(t){return function(){var r;try{if(t.missedHeartbeats>=e)throw new Error("Too many missed heartbeats PINGs.");return t.missedHeartbeats++,t.sendMessage({cmd:"ping"}),t.log.debug("HeartBeat send PING")}catch(n){return r=n,t.log.error("HeartBeat error: "+r.message),t.setupConnection()}}}(this),t),this.log.debug("HeartBeat enabled")},t.prototype.stopHeartBeatMessages=function(){if(this.heartbeatInterval)return clearInterval(this.heartbeatInterval),this.heartbeatInterval=null,this.log.debug("HeartBeat disabled")},t.prototype.processHeartBeatPongMessage=function(t){return this.missedHeartbeats=0,this.log.debug("HeartBeat recived PONG")},t.prototype.serialize=function(t){return _.isObject(t)?JSON.stringify(t):t},t.prototype.sendMessage=function(t){var e,r,n,i,o;if(this.pendingMessages.push(t),this.connected){for(n=_.map(this.pendingMessages,this.serialize),this.pendingMessages=[],o=[],e=0,r=n.length;e\n
    <%- name %>
    '),i=function(i,c,u){var l,p,h,f,d;return d=function(t){var e,o,a;return o={name:r.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED")},a=i.usersById[t.assigned_to],e=n.getAvatar(a),o.imgurl=e.url,o.bg=e.bg,a&&(o.name=a.full_name_display),c.find(".avatar").html(s(o)),c.find(".task-assignedto").attr("title",o.name)},l=c.controller(),f=i.$eval(u.tgRelatedTaskAssignedToInlineEdition),h=i.$eval(u.notAutoSave),p=!h,i.$watch(u.tgRelatedTaskAssignedToInlineEdition,function(){return f=i.$eval(u.tgRelatedTaskAssignedToInlineEdition),d(f)}),d(f),c.on("click",".task-assignedto",function(t){return e.$broadcast("assigned-to:add",f)}),a.bindOnce(i,"project",function(t){if(t.my_permissions.indexOf("modify_task")===-1)return c.unbind("click"),c.find("a").addClass("not-clickable")}),i.$on("assigned-to:added",o(2e3,function(e){return function(e,r,n){if(n.id===f.id)return n.assigned_to=r,p&&t.save(n).then(function(){return i.$emit("related-tasks:assigned-to-changed")}),d(n)}}(this))),i.$on("$destroy",function(){return c.off()})},{link:i}},s.directive("tgRelatedTaskAssignedToInlineEdition",["$tgRepo","$rootScope","$translate","tgAvatarService",t])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){function r(){this.constructor=t}for(var n in e)a.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},a={}.hasOwnProperty;i=this.taiga,t=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return s(e,t),e}(i.Service),o={auth:"/auth","auth-register":"/auth/register",invitations:"/invitations",users:"/users",by_username:"/users/by_username","users-password-recovery":"/users/password_recovery","users-change-password-from-recovery":"/users/change_password_from_recovery","users-change-password":"/users/change_password","users-change-email":"/users/change_email","users-cancel-account":"/users/cancel","users-export":"/users/export","user-stats":"/users/%s/stats","user-liked":"/users/%s/liked","user-voted":"/users/%s/voted","user-watched":"/users/%s/watched","user-contacts":"/users/%s/contacts","user-me":"/users/me",permissions:"/permissions","notify-policies":"/notify-policies","user-storage":"/user-storage",memberships:"/memberships","bulk-create-memberships":"/memberships/bulk_create",roles:"/roles",permissions:"/permissions",resolver:"/resolver",projects:"/projects","project-templates":"/project-templates","project-modules":"/projects/%s/modules","bulk-update-projects-order":"/projects/bulk_update_order","project-like":"/projects/%s/like","project-unlike":"/projects/%s/unlike","project-watch":"/projects/%s/watch","project-unwatch":"/projects/%s/unwatch","project-contact":"contact","project-transfer-validate-token":"/projects/%s/transfer_validate_token","project-transfer-accept":"/projects/%s/transfer_accept","project-transfer-reject":"/projects/%s/transfer_reject","project-transfer-request":"/projects/%s/transfer_request","project-transfer-start":"/projects/%s/transfer_start","epic-statuses":"/epic-statuses","userstory-statuses":"/userstory-statuses",points:"/points","task-statuses":"/task-statuses","issue-statuses":"/issue-statuses","issue-types":"/issue-types",priorities:"/priorities",severities:"/severities",milestones:"/milestones",epics:"/epics","epic-upvote":"/epics/%s/upvote","epic-downvote":"/epics/%s/downvote","epic-watch":"/epics/%s/watch","epic-unwatch":"/epics/%s/unwatch","epic-related-userstories":"/epics/%s/related_userstories","epic-related-userstories-bulk-create":"/epics/%s/related_userstories/bulk_create",userstories:"/userstories","bulk-create-us":"/userstories/bulk_create","bulk-update-us-backlog-order":"/userstories/bulk_update_backlog_order","bulk-update-us-milestone":"/userstories/bulk_update_milestone","bulk-update-us-miles-order":"/userstories/bulk_update_sprint_order","bulk-update-us-kanban-order":"/userstories/bulk_update_kanban_order","bulk-update-us-milestone":"/userstories/bulk_update_milestone","userstories-filters":"/userstories/filters_data","userstory-upvote":"/userstories/%s/upvote","userstory-downvote":"/userstories/%s/downvote","userstory-watch":"/userstories/%s/watch","userstory-unwatch":"/userstories/%s/unwatch",tasks:"/tasks","bulk-create-tasks":"/tasks/bulk_create","bulk-update-task-taskboard-order":"/tasks/bulk_update_taskboard_order","task-upvote":"/tasks/%s/upvote","task-downvote":"/tasks/%s/downvote","task-watch":"/tasks/%s/watch","task-unwatch":"/tasks/%s/unwatch","task-filters":"/tasks/filters_data",issues:"/issues","bulk-create-issues":"/issues/bulk_create","issues-filters":"/issues/filters_data","issue-upvote":"/issues/%s/upvote","issue-downvote":"/issues/%s/downvote","issue-watch":"/issues/%s/watch","issue-unwatch":"/issues/%s/unwatch",wiki:"/wiki","wiki-restore":"/wiki/%s/restore","wiki-links":"/wiki-links","history/epic":"/history/epic","history/us":"/history/userstory","history/issue":"/history/issue","history/task":"/history/task","history/wiki":"/history/wiki/%s","attachments/epic":"/epics/attachments","attachments/us":"/userstories/attachments","attachments/issue":"/issues/attachments","attachments/task":"/tasks/attachments","attachments/wiki_page":"/wiki/attachments","custom-attributes/epic":"/epic-custom-attributes","custom-attributes/userstory":"/userstory-custom-attributes","custom-attributes/task":"/task-custom-attributes","custom-attributes/issue":"/issue-custom-attributes","custom-attributes-values/epic":"/epics/custom-attributes-values","custom-attributes-values/userstory":"/userstories/custom-attributes-values","custom-attributes-values/task":"/tasks/custom-attributes-values","custom-attributes-values/issue":"/issues/custom-attributes-values",webhooks:"/webhooks","webhooks-test":"/webhooks/%s/test",webhooklogs:"/webhooklogs","webhooklogs-resend":"/webhooklogs/%s/resend","epics-csv":"/epics/csv?uuid=%s","userstories-csv":"/userstories/csv?uuid=%s","tasks-csv":"/tasks/csv?uuid=%s","issues-csv":"/issues/csv?uuid=%s","timeline-profile":"/timeline/profile","timeline-user":"/timeline/user","timeline-project":"/timeline/project",search:"/search",exporter:"/exporter",importer:"/importer/load_dump",feedback:"/feedback",locales:"/locales",applications:"/applications","application-tokens":"/application-tokens","stats-discover":"/stats/discover","importers-trello-auth-url":"/importers/trello/auth_url","importers-trello-authorize":"/importers/trello/authorize","importers-trello-list-projects":"/importers/trello/list_projects","importers-trello-list-users":"/importers/trello/list_users","importers-trello-import-project":"/importers/trello/import_project","importers-jira-auth-url":"/importers/jira/auth_url","importers-jira-authorize":"/importers/jira/authorize","importers-jira-list-projects":"/importers/jira/list_projects","importers-jira-list-users":"/importers/jira/list_users","importers-jira-import-project":"/importers/jira/import_project","importers-github-auth-url":"/importers/github/auth_url","importers-github-authorize":"/importers/github/authorize","importers-github-list-projects":"/importers/github/list_projects","importers-github-list-users":"/importers/github/list_users","importers-github-import-project":"/importers/github/import_project","importers-asana-auth-url":"/importers/asana/auth_url","importers-asana-authorize":"/importers/asana/authorize","importers-asana-list-projects":"/importers/asana/list_projects","importers-asana-list-users":"/importers/asana/list_users","importers-asana-import-project":"/importers/asana/import_project"},r=function(t,e){return t.debug("Initialize api urls"),e.update(o)},e=function(t,e){var r,n,i,o,s;for(t.debug("Initialize resources"),o=_.toArray(arguments).slice(2),s=[],r=0,n=o.length;rn){n=a.length,s.name=i,s.value=a;break}return 0===n?s:s},d=function(t){var e,r,n;r=[];for(e in t)n=t[e],m.find("li."+e).show(),r.push(m.find("li."+e+" .num").html(n.length));return r},f=function(t){return m.find("a.active").removeClass("active"),m.find("li."+t.name+" a").addClass("active"),u=!1,c=t.name},v={epics:r.get("search-epics"),issues:r.get("search-issues"),tasks:r.get("search-tasks"),userstories:r.get("search-userstories"),wikipages:r.get("search-wikipages")},g=function(r){var i,o,s,a,c;return o=n.find(".search-result-table").children(),s=o.scope(),s&&(s.$destroy(),o.remove()),a=t.$new(),a[r.name]=r.value,c=angular.element.parseHTML(l(v[r.name])),i=e(c)(a),n.find(".search-result-table").html(i)},t.$watch("searchResults",function(t){var e;if(h=t)return e=p(t),d(t),g(e),f(e)}),t.$watch("searchTerm",function(t){return void 0!==t&&i.search("text",t),o.trackPage(i.url(),"Search")}),n.on("click",".search-filter li > a",function(e){var r,n,i,o;return e.preventDefault(),o=angular.element(e.currentTarget),i=o.parent().data("name"),n=h?h[i]:[],r={name:i,value:n},t.$apply(function(){return g(r),f(r)})})},s=function(t,e,r){var i,o;return i=e.controller(),a(t,e,r,i),o=n.text,t.$watch("projectId",function(e){if(null!=e)return t.searchTerm=o})},{link:s}},c.directive("tgSearch",["$log","$compile","$templateCache","$routeParams","$tgLocation","$tgAnalytics",r])}.call(this),function(){var t;t=angular.module("taigaTaskboard",[])}.call(this),function(){var t;t=angular.module("taigaTasks",[])}.call(this),function(){var t;t=angular.module("taigaTeam",[])}.call(this),function(){var t;t=angular.module("taigaUserSettings",[])}.call(this),function(){var t;t=angular.module("taigaUserStories",[])}.call(this),function(){var t;t=angular.module("taigaWiki",[])}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,e=angular.module("taigaCommon"),t=function(t){function e(t,e,r,n,i,o){var s;this.rootscope=t,this.log=e,this.config=r,this.win=n,this.doc=i,this.location=o,this.initialized=!1,s=this.config.get("analytics",{}),this.accountId=s.accountId,this.pageEvent=s.pageEvent||"$routeChangeSuccess",this.trackRoutes=s.trackRoutes||!0,this.ignoreFirstPageLoad=s.ignoreFirstPageLoad||!1}return n(e,t),e.$inject=["$rootScope","$log","$tgConfig","$window","$document","$location"],e.prototype.initialize=function(){return this.accountId?(this.injectAnalytics(),this.win.ga("create",this.accountId,"auto"),this.win.ga("require","ec"),this.win.ga("require","displayfeatures"),this.trackRoutes&&!this.ignoreFirstPageLoad&&this.win.ga("send","pageview",this.getUrl()),this.trackRoutes&&this.rootscope.$on(this.pageEvent,function(t){return function(){return t.trackPage(t.getUrl(),"Taiga")}}(this)),this.initialized=!0,this.setUserId()):void this.log.debug("Analytics: no acount id provided. Disabling.")},e.prototype.setUserId=function(){var t,e;if(this.initialized&&this.win.ga)return this.win.ga("set","userId",null!=(t=this.rootscope)&&null!=(e=t.user)?e.uuid:void 0)},e.prototype.getUrl=function(){return this.location.path()},e.prototype.injectAnalytics=function(){var t;return(t=function(t,e,r,n,i,o,s){t.GoogleAnalyticsObject=i,t[i]=t[i]||function(){(t[i].q=t[i].q||[]).push(arguments)},t[i].l=1*new Date,o=e.createElement(r),s=e.getElementsByTagName(r)[0],o.async=1,o.src=n,s.parentNode.insertBefore(o,s)})(window,document,"script","//www.google-analytics.com/analytics.js","ga")},e.prototype.trackPage=function(t,e){if(this.initialized&&this.win.ga)return e=e||this.doc[0].title,this.win.ga("send","pageview",{page:t,title:e})},e.prototype.trackEvent=function(t,e,r,n){if(this.initialized&&this.win.ga)return this.win.ga("send","event",t,e,r,n)},e.prototype.ecViewPlan=function(t){if(this.initialized&&this.win.ga)return this.win.ga("ec:addProduct",{id:t.plan_id,name:t.name,category:"plans",quantity:1,position:1}),this.win.ga("ec:setAction","detail"),this.trackEvent("ecommerce","view-product-detail",t.name,t.plan_id)},e.prototype.ecClickPlan=function(t){if(this.initialized&&this.win.ga)return this.win.ga("ec:addProduct",{id:t.plan_id,name:t.name,category:"plans",quantity:1,position:1}),this.win.ga("ec:setAction","click"),this.trackEvent("ecommerce","click-product",t.name,t.plan_id)},e.prototype.ecListPlans=function(t,e){var r,n,i,o,s;if(o=t[0],this.initialized&&this.win.ga){for(s=1,r=0,n=o.length;r0},g=function(i,o){var s;return s=n.save(function(t){return t.assigned_users=i,t.assigned_to||(t.assigned_to=o),t}),s.then(function(){var e;return i=_.map(i,function(t){return r.usersById[t]}),d(i),e=t.$broadcast("object:updated")}),s.then(null,function(){return e.notify("error")})},f=function(){var e;return e=_.clone(c.$modelValue,!1),t.$broadcast("assigned-user:add",e)},u=function(){var t,e;if(h())return e=a.getUser().get("id"),t=_.clone(c.$modelValue.assigned_users,!1),t.push(e),t=_.uniq(t),g(t,e)},l=function(i){var o;return o=n.save(function(t){var e;return t.assigned_users=i,e=t.assigned_to,$.call(i,e)<0&&i.length>0&&(t.assigned_to=i[0]),0===i.length&&(t.assigned_to=null),t}),o.then(function(){var e,i;return i=n.getObj(),e=_.map(i.assignedUsers,function(t){return r.usersById[t]}),d(e),t.$broadcast("object:updated")}),o.then(null,function(){return item.revert(),e.notify("error")})},d=function(t){return r.assignedUsers=t,r.isEditable=h(),r.isAssigned=p(),r.openAssignedUsers=f,r.assignToMe=u},i.on("click",".remove-user",function(t){var n,i,o,a;if(t.preventDefault(),h())return o=angular.element(t.currentTarget),n=o.data("assigned-user-id"),a=s.instant("COMMON.ASSIGNED_USERS.TITLE_LIGHTBOX_DELETE_ASSIGNED"),i=r.usersById[n].full_name_display,e.askOnDelete(a,i).then(function(t){return function(t){var e;return t.finish(),e=_.clone(c.$modelValue.assigned_users,!1),e=_.pull(e,n),l(e)}}(this))}),r.$on("assigned-user:deleted",function(t,e){var r;return r=_.clone(c.$modelValue.assigned_users,!1),r=_.pull(r,e),r=_.uniq(r),l(r)}),r.$on("assigned-user:added",function(t,e){var r;return r=_.clone(c.$modelValue.assigned_users,!1),r.push(e),r=_.uniq(r),g(r,e)}),r.$watch(o.ngModel,function(t){var e;if(null!=t)return e=_.map(t.assigned_users,function(t){return r.usersById[t]}),e=_.filter(e,function(t){return!!t}),d(e)}),r.$on("$destroy",function(){return i.off()})},{scope:!0,templateUrl:"common/components/assigned-users.html",link:c,require:"ngModel"}},j.directive("tgAssignedUsers",["$rootScope","$tgConfirm","$tgRepo","$tgQueueModelTransformation","$tgTemplate","$compile","$translate","tgCurrentUserService",e]),t=function(t,e,r,n,i,o,s,a,c,u){var l,p;return p=o.get("common/components/assigned-to.html",!0),l=function(r,o,l,h){var f,d,g;return f=function(){var t,e;return(null!=(t=r.project)&&null!=(e=t.my_permissions)?e.indexOf(l.requiredPerm):void 0)!==-1},g=function(r){var s,a,c;return a=h.$modelValue.clone(),a.assigned_to=r,s=n().target(o).start(),c=i.save(function(t){return t.assigned_to=r,t}),c.then(function(){return s.finish(),d(i.getObj()),t.$broadcast("object:updated")}),c.then(null,function(){return e.notify("error"),s.finish()}),c},d=function(t){var e,n,i,l,h,d,g;return e=u.getAvatar(null!=t?t.assigned_to_extra_info:void 0),n=null,null!=(null!=t?t.assigned_to:void 0)?(l=t.assigned_to_extra_info.full_name_display,g=!1,n=e.bg):(l=s.instant("COMMON.ASSIGNED_TO.ASSIGN"),g=!0),d=null!=t?t.is_iocaine:void 0,i={fullName:l,avatar:e.url,bg:n,isUnassigned:g,isEditable:f(),isIocaine:d,fullNameVisible:!(g&&!c.isAuthenticated())},h=a(p(i))(r),o.html(h)},o.on("click",".user-assigned",function(e){if(e.preventDefault(),f())return r.$apply(function(){return t.$broadcast("assigned-to:add",h.$modelValue)})}),o.on("click",".assign-to-me",function(t){if(t.preventDefault(),f())return h.$modelValue.assigned_to=c.getUser().get("id"),g(c.getUser().get("id"))}),o.on("click",".remove-user",function(t){var r;if(t.preventDefault(),f())return r=s.instant("COMMON.ASSIGNED_TO.CONFIRM_UNASSIGNED"),e.ask(r).then(function(t){return function(t){return t.finish(),h.$modelValue.assigned_to=null,g(null)}}(this))}),r.$on("assigned-to:added",function(t,e,r){if(r.id===h.$modelValue.id)return g(e)}),r.$watch(l.ngModel,function(t){return d(t)}),r.$on("$destroy",function(){return o.off()})},{link:l,require:"ngModel"}},j.directive("tgAssignedTo",["$rootScope","$tgConfirm","$tgRepo","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$translate","$compile","tgCurrentUserService","tgAvatarService",t]),r=function(t,e,r){var n,i;return i=r.get("common/components/block-button.html"),n=function(r,n,i,o){var s;return s=function(){return r.project.my_permissions.indexOf("modify_us")!==-1},r.$watch(i.ngModel,function(t){if(t)return s()&&n.find(".item-block").addClass("editable"),t.is_blocked?(n.find(".item-block").removeClass("is-active"),n.find(".item-unblock").addClass("is-active")):(n.find(".item-block").addClass("is-active"),n.find(".item-unblock").removeClass("is-active"))}),n.on("click",".item-block",function(e){return e.preventDefault(),t.$broadcast("block",o.$modelValue)}),n.on("click",".item-unblock",function(r){var i,s;return r.preventDefault(),i=e().target(n.find(".item-unblock")).start(),s=function(){return i.finish()},t.$broadcast("unblock",o.$modelValue,s)}),r.$on("$destroy",function(){return n.off()})},{link:n,restrict:"EA",require:"ngModel",template:i}},j.directive("tgBlockButton",["$rootScope","$tgLoading","$tgTemplate",r]),s=function(t,e,r,n,i){var o,s;return s=i.get("common/components/delete-button.html"),o=function(i,o,s,a){return s.onDeleteGoToUrl?s.onDeleteTitle?(o.on("click",".button-delete",function(t){var o,c;return c=s.onDeleteTitle,o=a.$modelValue.subject,r.askOnDelete(c,o).then(function(t){return function(t){var o;return o=e.remove(a.$modelValue),o.then(function(){var e;return t.finish(),e=i.$eval(s.onDeleteGoToUrl),n.path(e)}),o.then(null,function(){return t.finish(!1),r.notify("error")})}}(this))}),i.$on("$destroy",function(){return o.off()})):t.error("DeleteButtonDirective requires on-delete-title set in scope."):t.error("DeleteButtonDirective requires on-delete-go-to-url set in scope.")},{link:o,restrict:"EA",require:"ngModel",template:s}},j.directive("tgDeleteButton",["$log","$tgRepo","$tgConfirm","$tgLocation","$tgTemplate",s]),c=function(){var t;return t=function(t,e,r){var n;return n=t.$eval(r.tgListitemEpicStatus),S(t,"epicStatusById",function(t){ +return e.html(t[n.status].name)})},{link:t}},j.directive("tgListitemEpicStatus",c),d=function(){var t;return t=function(t,e,r){var n;return n=t.$eval(r.tgListitemUsStatus),S(t,"usStatusById",function(t){return e.html(t[n.status].name)})},{link:t}},j.directive("tgListitemUsStatus",d),h=function(){var t;return t=function(t,e,r){var n;return n=t.$eval(r.tgListitemTaskStatus),S(t,"taskStatusById",function(t){return e.html(t[n.status].name)})},{link:t}},j.directive("tgListitemTaskStatus",h),a=function(t,e,r){var n,i;return i=t.get("common/components/list-item-assigned-to-avatar.html",!0),n=function(t,n,o){return S(t,"usersById",function(s){var a,c,u,l;return u=t.$eval(o.tgListitemAssignedto),c={name:e.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED")},l=s[u.assigned_to],a=r.getAvatar(l),c.imgurl=a.url,c.bg=a.bg,l&&(c.name=l.full_name_display),n.html(i(c))})},{link:n}},j.directive("tgListitemAssignedto",["$tgTemplate","$translate","tgAvatarService",a]),u=function(){var t;return t=function(t,e,r){var n;return n=t.$eval(r.tgListitemIssueStatus),S(t,"issueStatusById",function(t){return e.html(t[n.status].name)})},{link:t}},j.directive("tgListitemIssueStatus",u),f=function(){var t;return t=function(t,e,r){var n;return n=function(t,r){var n,i;return i=t[r.type],n=e.find(".level"),n.css("background-color",i.color),n.attr("title",i.name)},S(t,"issueTypeById",function(e){var i;return i=t.$eval(r.tgListitemType),n(e,i)}),t.$watch(r.tgListitemType,function(e){return n(t.issueTypeById,e)})},{link:t,templateUrl:"common/components/level.html"}},j.directive("tgListitemType",f),l=function(){var t;return t=function(t,e,r){var n;return n=function(t,r){var n,i;return i=t[r.priority],n=e.find(".level"),n.css("background-color",i.color),n.attr("title",i.name)},S(t,"priorityById",function(e){var i;return i=t.$eval(r.tgListitemPriority),n(e,i)}),t.$watch(r.tgListitemPriority,function(e){return n(t.priorityById,e)})},{link:t,templateUrl:"common/components/level.html"}},j.directive("tgListitemPriority",l),p=function(){var t;return t=function(t,e,r){var n;return n=function(t,r){var n,i;return i=t[r.severity],n=e.find(".level"),n.css("background-color",i.color),n.attr("title",i.name)},S(t,"severityById",function(e){var i;return i=t.$eval(r.tgListitemSeverity),n(e,i)}),t.$watch(r.tgListitemSeverity,function(e){return n(t.severityById,e)})},{link:t,templateUrl:"common/components/level.html"}},j.directive("tgListitemSeverity",p),v=function(t){var e,r,n;return n=t.get("common/components/progress-bar.html",!0),r=function(t,e){return t.html(n({percentage:e}))},e=function(t,e,n){var i;return i=angular.element(e),t.$watch(n.tgProgressBar,function(t){return t=_.max([0,t]),t=_.min([100,t]),r(e,t)}),t.$on("$destroy",function(){return e.off()})},{link:e}},j.directive("tgProgressBar",["$tgTemplate",v]),m=function(t){var e;return e=function(t,e,r){return r.$observe("i18nSectionName",function(e){return t.sectionName=e}),t.$on("$destroy",function(){return e.off()})},{link:e,templateUrl:"common/components/main-title.html",scope:{projectName:"=projectName"}}},j.directive("tgMainTitle",["$translate",m])}.call(this),function(){var t,e,r,n,i,o,s,a,c=function(t,e){function r(){this.constructor=t}for(var n in e)u.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},u={}.hasOwnProperty;s=this.taiga,a=this.taiga.timeout,n=this.taiga.cancelTimeout,i=this.taiga.debounce,r=this.taiga.bindMethods,e={success:{title:"NOTIFICATION.OK",message:"NOTIFICATION.SAVED"},error:{title:"NOTIFICATION.WARNING",message:"NOTIFICATION.WARNING_TEXT"},"light-error":{title:"NOTIFICATION.WARNING",message:"NOTIFICATION.WARNING_TEXT"}},t=function(t){function o(t,e,n,i){this.q=t,this.lightboxService=e,this.loading=n,this.translate=i,r(this)}return c(o,t),o.$inject=["$q","lightboxService","$tgLoading","$translate"],o.prototype.hide=function(t){if(t)return this.lightboxService.close(t),t.off(".confirm-dialog")},o.prototype.ask=function(t,e,r,n){var o,s;return null==n&&(n=".lightbox-generic-ask"),o=this.q.defer(),s=angular.element(n),t&&s.find(".title").text(t),e&&s.find(".subtitle").text(e),r&&s.find(".message").text(r),s.on("click.confirm-dialog",".button-green",i(2e3,function(t){return function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=t.loading().target(n).start(),o.resolve({finish:function(e){if(null==e&&(e=!0),r.finish(),e)return t.hide(s)}})}}(this))),s.on("click.confirm-dialog",".button-red",function(t){return function(e){return e.preventDefault(),o.reject(),t.hide(s)}}(this)),this.lightboxService.open(s),o.promise},o.prototype.askOnDelete=function(t,e,r){return null==r&&(r=this.translate.instant("NOTIFICATION.ASK_DELETE")),this.ask(t,r,e)},o.prototype.askChoice=function(t,e,r,n,o,s){var a,c,u;return null==s&&(s=".lightbox-ask-choice"),c=this.q.defer(),u=angular.element(s),u.find(".title").text(t),u.find(".subtitle").text(e),n?u.find(".replacement").text(n):u.find(".replacement").remove(),o?u.find(".warning").text(o):u.find(".warning").remove(),a=u.find(".choices"),a.html(""),_.each(r,function(t,e){return t=_.escape(t),a.append(angular.element(""))}),u.on("click.confirm-dialog","a.button-green",i(2e3,function(t){return function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=t.loading().target(n).start(),c.resolve({selected:a.val(),finish:function(e){if(null==e&&(e=!0),r.finish(),e)return t.hide(u)}})}}(this))),u.on("click.confirm-dialog",".button-red",function(t){return function(e){return e.preventDefault(),c.reject(),t.hide(u)}}(this)),this.lightboxService.open(u),c.promise},o.prototype.error=function(t){var e,r;return e=this.q.defer(),r=angular.element(".lightbox-generic-error"),r.find(".title").html(t),r.on("click.confirm-dialog",".button-green",function(t){return function(n){return n.preventDefault(),e.resolve(),t.hide(r)}}(this)),r.on("click.confirm-dialog",".close",function(t){return function(n){return n.preventDefault(),e.resolve(),t.hide(r)}}(this)),this.lightboxService.open(r),e.promise},o.prototype.success=function(t,e,r){var n,i,o,a,c;return n=this.q.defer(),o=angular.element(".lightbox-generic-success"),o.find("img").remove(),o.find("svg").remove(),r&&("img"===r.type?i=$("").addClass("lb-icon").attr("src",r.name):"svg"===r.type&&(i=document.createElement("div"),s.addClass(i,"icon"),s.addClass(i,r.name),s.addClass(i,"lb-icon"),a=document.createElementNS("http://www.w3.org/2000/svg","svg"),c=document.createElementNS("http://www.w3.org/2000/svg","use"),c.setAttributeNS("http://www.w3.org/1999/xlink","href","#"+r.name),i.appendChild(a).appendChild(c)),i&&o.find("section").prepend(i)),t&&o.find(".title").html(t),e&&o.find(".message").html(e),o.on("click.confirm-dialog",".button-green",function(t){return function(e){return e.preventDefault(),n.resolve(),t.hide(o)}}(this)),o.on("click.confirm-dialog",".close",function(t){return function(e){return e.preventDefault(),n.resolve(),t.hide(o)}}(this)),this.lightboxService.open(o),n.promise},o.prototype.loader=function(t,e,r){var n;return null==r&&(r=!1),n=angular.element(".lightbox-generic-loading"),t&&n.find(".title").html(t),e&&n.find(".message").html(e),r&&n.find(".spin").removeClass("hidden"),{start:function(t){return function(){return t.lightboxService.open(n)}}(this),stop:function(t){return function(){return t.lightboxService.close(n)}}(this),update:function(t){return function(t,e,r,i){return e&&n.find(".title").html(e),r&&n.find(".message").html(r),i?(n.find(".spin").addClass("hidden"),n.find(".progress-bar-wrapper").removeClass("hidden"),n.find(".progress-bar-wrapper > .bar").width(i+"%"),n.find(".progress-bar-wrapper > span").html(i+"%").css("left",i-9+"%")):(n.find(".spin").removeClass("hidden"),n.find(".progress-bar-wrapper").addClass("hidden"))}}(this)}},o.prototype.notify=function(t,r,i,o){var s,c,u;if(u=".notification-message-"+t,c=angular.element(u),!c.hasClass("active"))return i?c.find("h4").html(i):c.find("h4").html(this.translate.instant(e[t].title)),r?c.find("p").html(r):c.find("p").html(this.translate.instant(e[t].message)),s=angular.element("body"),s.find(".notification-message .notification-light").removeClass("active").addClass("inactive"),s.find(u).removeClass("inactive").addClass("active"),this.tsem&&n(this.tsem),o||(o="error"===t||"light-error"===t?3500:1500),this.tsem=a(o,function(t){return function(){return s.find(u).removeClass("active").addClass("inactive").one("animationend",function(){return $(this).removeClass("inactive")}),delete t.tsem}}(this)),c.on("click",".icon-close, .close",function(t){return function(t){return s.find(u).removeClass("active").addClass("inactive")}}(this))},o}(s.Service),o=angular.module("taigaCommon"),o.service("$tgConfirm",t)}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g=function(t,e){function r(){this.constructor=t}for(var n in e)m.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},m={}.hasOwnProperty;d=this.taiga,u=this.taiga.bindMethods,l=this.taiga.bindOnce,p=this.taiga.debounce,h=d.generateHash,f=angular.module("taigaCommon"),s="text",o="url",i="multiline",n="date",c="url",a=[{key:s,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT"},{key:i,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI"},{key:n,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE"},{key:c,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL"},{key:o,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT"}],e=function(t){function e(t,e,r,n,i,o){this.scope=t,this.rootscope=e,this.repo=r,this.rs=n,this.confirm=i,this.q=o,u(this),this.type=null,this.objectId=null,this.projectId=null,this.customAttributes=[],this.customAttributesValues=null}return g(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$tgConfirm","$q"],e.prototype.initialize=function(t,e){return this.project=this.scope.project,this.type=t,this.objectId=e,this.projectId=this.scope.projectId},e.prototype.loadCustomAttributesValues=function(){return this.objectId?this.rs.customAttributesValues[this.type].get(this.objectId).then(function(t){return function(e){return t.customAttributes=t.project[t.type+"_custom_attributes"],t.customAttributesValues=e,e}}(this)):this.customAttributesValues},e.prototype.getAttributeValue=function(t){var e;return e=_.clone(t,!1),e.value=this.customAttributesValues.attributes_values[t.id],e},e.prototype.updateAttributeValue=function(t){var e,r,n;return n=function(t){return function(){return t.rootscope.$broadcast("custom-attributes-values:edit")}}(this),r=function(t){return function(e){return t.confirm.notify("error"),t.q.reject()}}(this),e=_.clone(this.customAttributesValues.attributes_values,!0),e[t.id]=t.value,this.customAttributesValues.attributes_values=e,this.customAttributesValues.id=this.objectId,this.repo.save(this.customAttributesValues).then(n,r)},e}(d.Controller),r=function(t,r){var n,i,o,s;return o=t.get("custom-attributes/custom-attributes-values.html",!0),n=function(t){return h(["custom-attributes-collapsed",t])},i=function(t,e,i,o){var s,a,c;return s=o[0],a=o[1],c=n(i.type),t.collapsed=r.get(c)||!1,l(t,i.ngModel,function(t){return s.initialize(i.type,t.id),s.loadCustomAttributesValues()}),t.toggleCollapse=function(){return t.collapsed=!t.collapsed,r.set(c,t.collapsed)},t.$on("$destroy",function(){return e.off()})},s=function(t,e){return o({requiredEditionPerm:e.requiredEditionPerm})},{require:["tgCustomAttributesValues","ngModel"],controller:e,controllerAs:"ctrl",restrict:"AE",scope:!0,link:i,template:s}},f.directive("tgCustomAttributesValues",["$tgTemplate","$tgStorage","$translate",r]),t=function(t,e,r,i,o,s){var a,c,u;return c=t.get("custom-attributes/custom-attribute-value.html",!0),u=t.get("custom-attributes/custom-attribute-value-edit.html",!0),a=function(t,a,l,h){var f,d,g,m,v,y;return g=i.instant("COMMON.PICKERDATE.FORMAT"),m=function(e,i){var l,p,h,f,m,v;return null==i&&(i=!1),v=e.type===n&&e.value?moment(e.value,"YYYY-MM-DD").format(g):e.value,h=d(),l={id:e.id,name:e.name,description:e.description,value:v,isEditable:h,type:e.type},m=t.$new(),m.attributeHtml=s.getHTML(v),!h||!i&&v?(f=c(l),f=r(f)(m),a.html(f)):(f=u(l),f=r(f)(m),a.html(f),e.type===n?(p=o.get(),_.merge(p,{field:a.find("input[name=value]")[0],onSelect:function(t){return function(t){var e;return e=t}}(this),onOpen:function(t){return function(){if("undefined"!=typeof selectedDate&&null!==selectedDate)return a.picker.setDate(selectedDate)}}(this)}),a.picker=new Pikaday(p)):void 0)},d=function(){var e,r;return e=t.project.my_permissions,r=l.requiredEditionPerm,e.indexOf(r)>-1},t.saveCustomRichText=function(t){return function(t,e){return f.value=t,h.updateAttributeValue(f).then(function(){return e(),m(f,!1)})}}(this),t.cancelCustomRichText=function(t){return function(){return m(f,!1),null}}(this),y=p(2e3,function(e){return function(e){var r,i;if(e.preventDefault(),r=a.find("form").checksley(),r.validate())return i=a.find("input[name=value], textarea[name='value']"),f.value=i.val(),f.type===n&&moment(f.value,g).isValid()&&(f.value=moment(f.value,g).format("YYYY-MM-DD")),t.$apply(function(){return h.updateAttributeValue(f).then(function(){return m(f,!1)})})}}(this)),v=function(){return a.find("input[name='value'], textarea[name='value']").focus().select()},f=t.$eval(l.tgCustomAttributeValue),null!==f.value&&void 0!==f.value||(f.value=""),t.customAttributeValue=f,m(f),a.on("click",".js-value-view-mode span a",function(t){return t.stopPropagation()}),a.on("click",".js-value-view-mode",function(){if(d()&&!e.get().length)return m(f,!0),v()}),a.on("click",".js-edit-description",function(t){return t.preventDefault(),m(f,!0),v()}),a.on("keyup","input[name=value], textarea[name='value']",function(t){return 13===t.keyCode&&"textarea"!==t.currentTarget.type?y(t):27===t.keyCode?m(f,!1):void 0}),a.on("submit","form",y),a.on("click",".js-save-description",y),t.$on("$destroy",function(){return a.off()})},{link:a,require:"^tgCustomAttributesValues",restrict:"AE"}},f.directive("tgCustomAttributeValue",["$tgTemplate","$selectedText","$compile","$translate","tgDatePickerConfigService","tgWysiwygService",t])}.call(this),function(){var t,e,r,n=function(t,e){return function(){return t.apply(e,arguments)}},i=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;r=this.taiga,e=angular.module("taigaCommon"),t=function(t){function e(){this.replaceEmojiNameByHtmlImgs=n(this.replaceEmojiNameByHtmlImgs,this),this.replaceEmojiNameByImgs=n(this.replaceEmojiNameByImgs,this),this.replaceImgsByEmojiName=n(this.replaceImgsByEmojiName,this),this.getEmojiByName=n(this.getEmojiByName,this),this.getEmojiById=n(this.getEmojiById,this),this.searchByName=n(this.searchByName,this),this.emojis=_.map(r.emojis,function(t){return t.image="/"+window._version+"/emojis/"+t.image,t}),this.emojisById=_.keyBy(this.emojis,"id"),this.emojisByName=_.keyBy(this.emojis,"name")}return i(e,t),e.$inject=[],e.prototype.searchByName=function(t){return _.filter(this.emojis,function(e){return e.name.indexOf(t)!==-1})},e.prototype.getEmojiById=function(t){return this.emojisById[t]},e.prototype.getEmojiByName=function(t){return this.emojisByName[t]},e.prototype.replaceImgsByEmojiName=function(t){var e,n,i,o,s,a;for(i=r.getMatches(t,/emojis\/([^"]+).png"/gi),o=0,s=i.length;o]+>","g"),e=this.getEmojiById(n),t=t.replace(a,":"+e.name+":");return t},e.prototype.replaceEmojiNameByImgs=function(t){var e,n,i,o,s,a;for(i=r.getMatches(t,/:([\w +-]*):/g),o=0,s=i.length;o'));return t},e}(r.Service),e.service("$tgEmojis",t)}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){return function(){return t.apply(e,arguments)}};o=this.taiga,n=this.taiga.groupBy,i=angular.module("taigaCommon"),e=function(t,e,r,n,i){var o;return o=function(e,r,o,s){return e.$watch(o.ngModel,function(o){var a;if(o)return a=t.create(r,o,e.project),a.onSelectedPointForRole=function(t,r,n){return o.points=n,a.render(),e.$apply(function(){return s.$setViewValue(o)})},a.render=function(){var t,r,o,s;return t={totalPoints:this.calculateTotalPoints(),roles:this.calculateRoles(),editable:this.isEditable,loading:!1},o="common/estimation/us-estimation-points-per-role.html",s=n.get(o,!0),r=s(t),r=i(r)(e),this.$el.html(r)},a.render()}),e.$on("$destroy",function(){return r.off()})},{link:o,restrict:"EA",require:"ngModel"}},i.directive("tgLbUsEstimation",["$tgEstimationsService","$rootScope","$tgRepo","$tgTemplate","$compile",e]),r=function(t,e,r,n,i,o,s){var a;return a=function(r,a,c,u){var l;return l=function(t){var e,r;return r=o.save(function(e){return function(e){return e.points=t,e}}(this)),e=function(t){return function(){return s.notify("error")}}(this),r.then(null,e)},r.$watchCollection(function(){return u.$modelValue&&u.$modelValue.points},function(){var o,s;if(s=u.$modelValue)return o=t.create(a,s,r.project),o.onSelectedPointForRole=function(t,r,n){return o.loading=t,o.render(),l(n).then(function(){return o.loading=!1,e.$broadcast("object:updated"),o.render()})},o.render=function(){var t,e,s,a;return t={totalPoints:this.calculateTotalPoints(),roles:this.calculateRoles(),editable:this.isEditable,loading:o.loading},s="common/estimation/us-estimation-points-per-role.html",a=n.get(s,!0),e=a(t),e=i(e)(r),this.$el.html(e)},o.render()}),r.$on("$destroy",function(){return a.off()})},{link:a,restrict:"EA",require:"ngModel"}},i.directive("tgUsEstimation",["$tgEstimationsService","$rootScope","$tgRepo","$tgTemplate","$compile","$tgQueueModelTransformation","$tgConfirm",r]),t=function(t,e,r,i,o){var a,c,u;return u=t.get("common/estimation/us-estimation-points.html",!0),a=function(){function t(t,e,r){this.$el=t,this.us=e,this.project=r,this.bindClickEvents=s(this.bindClickEvents,this),this.isEditable=this.project.my_permissions.indexOf("modify_us")!==-1,this.roles=this.project.roles,this.points=this.project.points,this.loading=!1,this.pointsById=n(this.points,function(t){return t.id}),this.onSelectedPointForRole=function(t,e){},this.render=function(){}}return t.prototype.save=function(t,n){var s;return s=i.defer(),o.add(function(t){return function(){var n,i;return i=function(){return s.resolve(),t.render()},n=function(){return r.notify("error"),t.us.revert(),t.render(),s.reject()},e.save(t.us).then(i,n)}}(this)),s.promise},t.prototype.calculateTotalPoints=function(){var t,e;return e=_.map(this.us.points,function(t){return function(e,r){var n;return null!=(n=t.pointsById[e])?n.value:void 0}}(this)),0===e.length?"?":(t=_.filter(e,function(t){return null!=t}),0===t.length?"?":_.reduce(t,function(t,e){return t+e}))},t.prototype.calculateRoles=function(){var t,e;return t=_.filter(this.project.roles,"computable"),e=_.map(t,function(t){return function(e){var r,n;return r=t.us.points[e.id],n=t.pointsById[r],e=_.clone(e,!0),e.points=null!=n&&null!=n.name?n.name:"?",e}}(this))},t.prototype.bindClickEvents=function(){return this.$el.on("click",".total.clickable",function(t){return function(e){var r,n;return e.preventDefault(),e.stopPropagation(),n=angular.element(e.currentTarget),r=n.data("role-id"),t.renderPointsSelector(r,n),n.siblings().removeClass("active"),n.addClass("active")}}(this)),this.$el.on("click",".point",function(t){return function(e){var r,n,i,o;return e.preventDefault(),e.stopPropagation(),o=angular.element(e.currentTarget),i=o.data("role-id"),r=o.data("point-id"),t.$el.find(".popover").popover().close(),n=_.clone(t.us.points,!0),n[i]=r,t.onSelectedPointForRole(i,r,n)}}(this))},t.prototype.renderPointsSelector=function(t,e){var r,n,i,o,s;if(o=_.map(this.points,function(e){return function(r){return r=_.clone(r,!0),r.selected=e.us.points[t]!==r.id,r}}(this)),i=5,r=_.some(o,function(t){return function(t){return t.name.length>i}}(this)),n=u({points:o,roleId:t,horizontal:r}),this.$el.find(".popover").popover().close(),this.$el.find(".pop-points-open").remove(),null!=e?this.$el.find(e).append(n):this.$el.append(n),this.$el.find(".pop-points-open").popover().open(function(){return $(this).removeClass("active").closest("li").removeClass("active")}),this.$el.find(".pop-points-open").show(),s=this.$el.find(".pop-points-open"),s.offset().top+s.height()>document.body.clientHeight)return s.addClass("pop-bottom")},t}(),c=function(t,e,r){var n;return t.unbind("click"),n=new a(t,e,r),n.isEditable&&n.bindClickEvents(),n},{create:c}},i.factory("$tgEstimationsService",["$tgTemplate","$tgRepo","$tgConfirm","$q","$tgQqueue",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f;l=this.taiga,s=angular.module("taigaCommon"),r=function(){return function(t,e){return t===[null,void 0]?e:t}},s.filter("default",r),f=function(t){return function(e){return e?t.instant("COMMON.YES"):t.instant("COMMON.NO")}},s.filter("yesNo",["$translate",f]),h=function(){return l.unslugify},s.filter("unslugify",h),a=function(){return function(t,e){return t?moment(t).format(e):""}},s.filter("momentFormat",a),c=function(){return function(t,e){return t?moment(t).fromNow(e||!1):""}},s.filter("momentFromNow",c),u=function(t){return function(){return t.taiga.sizeFormat}}(this),s.filter("sizeFormat",u),p=function(){var t,e;return e=function(t){return t.toJS()},t=_.memoize(e),function(e){return e instanceof Immutable.List?t(e):e}},s.filter("toMutable",p),t=function(t){return function(e,r){var n;return(null!=r?r.startsWith("#"):void 0)?(n=r.substr(1),_.filter(e,function(t){return function(t){return String(t.ref).startsWith(n)}}(this))):t(e,r)}},s.filter("byRef",["filterFilter",t]),e=function(){return function(t,e){var r,n,i,o,s,a,c,u;for(t=new String(t).replace(/[^0-9a-f]/gi,""),t.length<6&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),e=e||0,a="#",n=0,i=0,r=0,u=255,c=[0,1,2],o=0,s=c.length;o5},a=d(r),a=n(a)(o),s.find(".assigned-to-list").html(a)},c=function(){return e.stop(),t.close(s)},o.$on("assigned-to:add",function(r,n){var i;return h=n,i=n.assigned_to,f=o.usersById[i],p(f),t.open(s).then(function(){return s.find("input").focus(),e.init(s)})}),o.$watch("usersSearch",function(t){if(null!=t)return p(f,t),s.find("input").focus()}),s.on("click",".user-list-single",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),c(),o.$apply(function(){return o.$broadcast("assigned-to:added",e.data("user-id"),h),o.usersSearch=null})}),s.on("click",".remove-assigned-to",function(t){return t.preventDefault(),t.stopPropagation(),c(),o.$apply(function(){return o.usersSearch=null,o.$broadcast("assigned-to:added",null,h)})}),s.on("click",".close",function(t){return t.preventDefault(),c(),o.$apply(function(){return o.usersSearch=null})}),o.$on("$destroy",function(){return s.off()})},{templateUrl:"common/lightbox/lightbox-assigned-to.html",link:o}},d.directive("tgLbAssignedto",["lightboxService","lightboxKeyboardNavigationService","$tgTemplate","$compile","tgAvatarService",t]),e=function(t,e,r,n,i,o){var s;return s=function(t,s,a){var c,u,l,p,h,d,g;return d=[],h=null,g=n.get("common/lightbox/lightbox-assigned-users-users.html",!0),l=function(t){var e;return e=t,e=e.replace("Á","A").replace("Ä","A").replace("À","A"),e=e.replace("É","E").replace("Ë","E").replace("È","E"),e=e.replace("Í","I").replace("Ï","I").replace("Ì","I"),e=e.replace("Ó","O").replace("Ö","O").replace("Ò","O"),e=e.replace("Ú","U").replace("Ü","U").replace("Ù","U")},u=function(t,e){var r;return r=e.full_name_display.toUpperCase(),r=l(r),t=t.toUpperCase(),t=l(t),_.includes(r,t)},p=function(e,r){var n,a,c,l,p;return l=_.clone(t.activeUsers,!0),l=_.sortBy(l,function(e){return e.id===t.user.id?0:e.id}),null!=r&&(l=_.filter(l,_.partial(u,r))),c=[],_.map(l,function(t){var r;if(r=t.id,S.call(e,r)>=0)return t.avatar=o.getAvatar(t),c.push(t)}),p=[],_.map(l,function(t){var r;if(r=t.id,S.call(e,r)<0)return t.avatar=o.getAvatar(t),p.push(t)}),n={selected:c,users:_.slice(p,0,5),showMore:l.length>5},a=g(n),a=i(a)(t),s.find(".assigned-to-list").html(a)},c=function(){return r.stop(),e.close(s)},t.$on("assigned-user:add",function(t,n){return h=n,d=n.assigned_users,p(d),e.open(s).then(function(){return s.find("input").focus(),r.init(s)})}),t.$watch("usersSearch",function(t){if(null!=t)return p(d,t),s.find("input").focus()}),s.on("click",".user-list-single",f(200,function(e){var r;return c(),e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return t.usersSearch=null,t.$broadcast("assigned-user:added",r.data("user-id"),h)})})),s.on("click",".remove-assigned-to",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),e.stopPropagation(),t.$apply(function(){return t.usersSearch=null,t.$broadcast("assigned-user:deleted",r.data("user-id"),h)}),c()}),s.on("click",".close",function(t){return t.preventDefault(),c()}),t.$on("$destroy",function(){return s.off()})},{templateUrl:"common/lightbox/lightbox-assigned-users.html",link:s}},d.directive("tgLbAssignedUsers",["$tgRepo","lightboxService","lightboxKeyboardNavigationService","$tgTemplate","$compile","tgAvatarService",e]),p=function(t,e,r,n,i,o){var s;return s=function(t,s,a){var c,u,l,p,h;return p=null,h=n.get("common/lightbox/lightbox-assigned-to-users.html",!0),u=function(e){var r,n;return null==e&&(e=""),r=function(t,e){var r;return(!p||!_.find(p.watchers,function(t){return t===e.id}))&&(r=e.full_name_display.toUpperCase(),t=t.toUpperCase(),_.includes(r,t))},n=_.clone(t.activeUsers,!0),n=_.filter(n,_.partial(r,e))},l=function(e){var r,n,a;return a=_.slice(e,0,5),a=_.map(a,function(t){return t.avatar=o.getAvatar(t),t}),r={selected:!1,users:a,showMore:e.length>5},n=h(r),n=i(n)(t),s.find(".ticket-watchers").html(n)},c=function(){return r.stop(),e.close(s)},t.$on("watcher:add",function(t,n){var i;return p=n,i=u(),l(i),e.open(s).then(function(){return s.find("input").focus(),r.init(s)})}),t.$watch("usersSearch",function(t){var e;if(null!=t)return e=u(t),l(e),s.find("input").focus()}),s.on("click",".user-list-single",f(200,function(e){var r;return c(),e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return t.usersSearch=null,t.$broadcast("watcher:added",r.data("user-id"))})})),s.on("click",".close",function(e){return e.preventDefault(),c(),t.$apply(function(){return t.usersSearch=null})}),t.$on("$destroy",function(){return s.off()})},{templateUrl:"common/lightbox/lightbox-users.html",link:s}},d.directive("tgLbWatchers",["$tgRepo","lightboxService","lightboxKeyboardNavigationService","$tgTemplate","$compile","tgAvatarService",p]),c=function(t,e,r){var n;return n=function(e,r,n){return t.open(r)},{templateUrl:"common/lightbox/lightbox-leave-project-warning.html",link:n,scope:!0}},d.directive("tgLightboxLeaveProjectWarning",["lightboxService",c]),l=function(t,e,r,n,i){var o;return o=function(o,s,a){var c,u,l;return c=r.instant("COMMON.PICKERDATE.FORMAT"),t.open(s),o.object.due_date&&(o.new_due_date=moment(o.object.due_date).format(c)),s.on("click",".suggestion",function(t){var e,r,n,i;return r=angular.element(t.currentTarget),e=r.data("quantity"),n=r.data("unit"),i=moment().add(e,n).format(c),s.find(".due-date").val(i)}),l=function(){var r,o;return r=e().target(s.find(".submit-button")).start(),o=i.save(function(t){var e;return e=$(".due-date").val(),t.due_date=e?moment(e,c).format("YYYY-MM-DD"):null,t}),o.then(function(){return n.notify("success")}),o.then(null,function(){return n.notify("error")}),o["finally"](function(){return r.finish(),t.close(s)})},s.on("click",".submit-button",function(t){return t.preventDefault(),l()}),u=function(){var t,e,i;return i=r.instant("LIGHTBOX.DELETE_DUE_DATE.TITLE"),e=r.instant("LIGHTBOX.DELETE_DUE_DATE.SUBTITLE"),t=moment(o.object.due_date).format(c),n.askOnDelete(i,t,e).then(function(t){return t.finish(),$(".due-date").val(null),o.object.due_date_reason=null,l()})},s.on("click",".delete-due-date",function(t){return t.preventDefault(),u()})},{templateUrl:"common/lightbox/lightbox-due-date.html",link:o,scope:!0}},d.directive("tgLbSetDueDate",["lightboxService","$tgLoading","$translate","$tgConfirm","$tgQueueModelTransformation",l])}.call(this),function(){var t,e,r,n,i,o;i=this.taiga,n=this.taiga.sizeFormat,o=this.taiga.timeout,r=angular.module("taigaCommon"),e=function(t,e){var r;return r=function(e,r,n){return t.onStart(function(){return $(document.body).addClass("loader-active"),r.addClass("active")}),t.onEnd(function(){return $(document.body).removeClass("loader-active"),r.removeClass("active")})},{link:r}},r.directive("tgLoader",["tgLoader","$rootScope",e]),t=function(t){var e,r,n,i,s,a,c,u;return r={minTime:300},i=!1,u=0,a=0,n=0,s=function(e){var s,c,l;return null==e&&(e=!1),u&&(l=0,e||(c=(new Date).getTime(),s=c-u,s",function(){var r;return r={settings:{target:null,scope:null,classes:[],timeout:0,template:null},target:function(t){return r.settings.target=t,r},scope:function(t){return r.settings.scope=t,r},template:function(t){return r.settings.template=t,r},removeClasses:function(){var t;return t=1<=arguments.length?n.call(arguments,0):[],r.settings.classes=t,r},timeout:function(t){return r.settings.timeout=t,r},start:function(){var t,n;return t=r.settings.target,r.settings.classes.map(function(e){return t.removeClass(e)}),t.hasClass("loading")||r.settings.template||(r.settings.template=t.html()),n=setTimeout(function(){if(!t.hasClass("loading"))return t.addClass("loading"),t.html(e)},r.settings.timeout),r.settings.timeoutId=n,r},finish:function(){var e,n,i;return n=r.settings.target,i=r.settings.timeoutId,i&&(clearTimeout(i),e=r.settings.classes,e.map(function(t){return r.settings.target.addClass(t)}),n.html(r.settings.template),n.removeClass("loading"),r.settings.scope&&t(n.contents())(r.settings.scope)),r}}}},e.$inject=["$compile"],r.factory("$tgLoading",e),t=function(t){var e;return e=function(e,r,n){var i,o;return i=null,o=r.html(),e.$watch(n.tgLoading,function(n){return function(n){return n?i=t().target(r).timeout(100).template(o).scope(e).start():i?i.finish():void 0}}(this))},{priority:99999,link:e}},r.directive("tgLoading",["$tgLoading",t])}.call(this),function(){var t,e,r,n,i,o;o=this.taiga,r=this.taiga.bindOnce,n=this.taiga.debounce,i=angular.module("taigaCommon"),e=function(t,e){var i,o;return o=e.get("common/popover/popover-us-status.html",!0),i=function(e,i,s){var a,c,u;return a=i.controller(),c=function(t){var r,n,o;if(o=i.find(".us-status"),n=i.find(".us-status .us-status-bind"),r=e.usStatusById,r[t.status])return n.text(r[t.status].name),o.css("color",r[t.status].color)},i.on("click",".us-status",function(t){return t.preventDefault(),t.stopPropagation(),i.find(".pop-status").popover().open()}),i.on("click",".status",n(2e3,function(r){var n,o;return r.preventDefault(),r.stopPropagation(),n=angular.element(r.currentTarget),o=e.$eval(s.tgUsStatus),o.status=n.data("status-id"),c(o),i.find(".pop-status").popover().close(),e.$apply(function(){return t.save(o).then(function(){return e.$eval(s.onUpdate)})})})),e.$on("userstories:loaded",function(){return c(e.$eval(s.tgUsStatus))}),e.$on("$destroy",function(){return i.off()}),u=e.$eval(s.tgUsStatus),c(u),r(e,"project",function(t){var r;if(r=o({statuses:t.us_statuses}),i.append(r),e.project.my_permissions.indexOf("modify_us")===-1)return i.unbind("click"),i.find("a").addClass("not-clickable")})},{link:i}},i.directive("tgUsStatus",["$tgRepo","$tgTemplate",e]),t=function(t,e){var r,i,s;return i=e.get("common/popover/popover-related-task-status.html",!0),s=function(t,e,r){var n,i;if(i=t.find(".us-status"),n=t.find(".task-status .task-status-bind"),r[e.status])return n.text(r[e.status].name),i.css("color",r[e.status].color)},r=function(e,r,a){var c,u,l,p;return c=r.controller(),p=e.$eval(a.tgRelatedTaskStatus),l=e.$eval(a.notAutoSave),u=!l,r.on("click",".task-status",function(t){return t.preventDefault(),t.stopPropagation(),r.find(".pop-status").popover().open()}),r.on("click",".status",n(2e3,function(n){var i;if(n.preventDefault(),n.stopPropagation(),i=angular.element(n.currentTarget),p.status=i.data("status-id"),r.find(".pop-status").popover().close(),s(r,p,e.taskStatusById),u)return e.$apply(function(){return t.save(p).then(function(){return e.$eval(a.onUpdate),e.$emit("related-tasks:status-changed")})})})),e.$watch(a.tgRelatedTaskStatus,function(){return p=e.$eval(a.tgRelatedTaskStatus),s(r,p,e.taskStatusById)}),o.bindOnce(e,"project",function(t){if(r.append(i({statuses:t.task_statuses})),s(r,p,e.taskStatusById),t.my_permissions.indexOf("modify_task")===-1)return r.unbind("click"),r.find("a").addClass("not-clickable")}),e.$on("$destroy",function(){return r.off()})},{link:r}},i.directive("tgRelatedTaskStatus",["$tgRepo","$tgTemplate",t]),$.fn.popover=function(){var t,e,r,n,i,o;return t=this,i=function(e){return function(){var e,r,n,i,o,s,a,c,u,l;return t.css({display:"block",visibility:"hidden"}),i=$(window).scrollTop(),e=i+$(window).height(),o=$(window).width(),n=o,r=0,u=t.offset().top,s=u+t.height(),l=t.width(),a=t.offset().left,c=t.offset().left+l,t.css({display:"none",visibility:"visible"}),s<=e&&u>=i&&a>=r&&c<=n}}(this),n=function(e){return function(e){return e&&e.call(t),t.fadeOut(function(){return t.removeClass("active").removeClass("fix")}),t.off("popup:close")}}(this),r=function(t){return function(){return $(".popover.active").each(function(){return $(this).trigger("popup:close")})}}(this),o=function(o){return function(o){return t.hasClass("active")?e():(r(),i()||t.addClass("fix"),t.fadeIn(function(){return t.addClass("active"),$(document.body).off("popover"),$(document.body).one("click.popover",function(){return r()})}),t.on("popup:close",function(t){return n(o)}))}}(this),e=function(e){return function(){return t.trigger("popup:close")}}(this),{open:o,close:e,closeAll:r}}}.call(this),function(){var t,e,r;r=this.taiga,e=angular.module("taigaCommon"),t=function(t,e){var r;return this.config=e,r=this.config.get("ravenConfig",null),r?(t.debug("Using the RavenJS exception handler."),Raven.config(r).install(),function(e,r){return t.error.apply(t,arguments),Raven.captureException(e)}):(t.debug("Using the default logging exception handler."),function(e,r){return t.error.apply(t,arguments)})},e.factory("$exceptionHandler",["$log","$tgConfig",t])}.call(this),function(){var e,r,n,i,o,s,a,c=[].indexOf||function(t){for(var e=0,r=this.length;e\n <% if (tag[1] !== null) { %>\n \n <%= emojify(tag[0]) %>\n \n <% } %>\n<% }) %>\n<% _.each(tags, function(tag) { %>\n <% if (tag[1] === null) { %>\n \n <%= emojify(tag[0]) %>\n \n <% } %>\n<% }) %>'),e=function(e,n,i,o){var s;return s=function(e){var i;return i=r({tags:e,emojify:function(e){return t.replaceEmojiNameByHtmlImgs(_.escape(e))}}),n.html(i)},e.$watch(i.tgColorizeBacklogTags,function(t){if(null!=t)return s(t)}),e.$on("$destroy",function(){return n.off()})},{link:e}},o.directive("tgColorizeBacklogTags",["$tgEmojis",e]),r=function(e,r,n){var o,s,u,l,p;return s=13,o=188,p=r.get("common/tag/lb-tag-line-tags.html",!0),u=null,l=function(e,r,o,l){var h,f,d,g,m,v,y,b;return b=_.has(o,"withoutColors"),g=function(i,o){var s,a,c;return null==o&&(o=[]),s=b?null:o[t],a={tags:_.map(i,function(t){return{name:t,style:s?"border-left: 5px solid "+s:""}})},c=n(p(a))(e),r.find(".tags-container").html(c)},y=function(){return r.find(".save").removeClass("hidden")},d=function(){return r.find(".save").addClass("hidden")},m=function(){return r.find("input").val(""),u.close()},h=function(t){var r;if(t=a(t.toLowerCase()),0!==t.length)return r=_.clone(l.$modelValue,!1),null==r&&(r=[]),c.call(r,t)<0&&r.push(t),e.$apply(function(){return l.$setViewValue(r)}),d()},f=function(t){var r;if(t=a(t.toLowerCase()),0!==t.length)return r=_.clone(l.$modelValue,!1),r=_.pull(r,t),e.$apply(function(){return l.$setViewValue(r)})},v=function(){var t;return t=r.find("input").val(),h(t),m()},r.on("keypress","input",function(t){var e;return e=angular.element(t.currentTarget),t.keyCode===s?(t.preventDefault(),v()):","===String.fromCharCode(t.keyCode)?(t.preventDefault(),v()):e.val().length?y():d()}),r.on("click",".save",function(t){return t.preventDefault(),v()}),r.on("click",".remove-tag",function(t){var e,r;return t.preventDefault(),e=angular.element(t.currentTarget),r=e.siblings(".tag-name").text(),f(r)}),i(e,"project",function(t){var e;return e=r.find("input"),u=new Awesomplete(e[0],{list:_.keys(t.tags_colors)}),e.on("awesomplete-selectcomplete",function(){return h(e.val()),e.val("")})}),e.$watch(o.ngModel,function(t){var r,n;return n=(null!=(r=e.project)?r.tags_colors:void 0)||[],g(t,n)}),e.$on("$destroy",function(){return r.off()})},{link:l,require:"ngModel",templateUrl:"common/tag/lb-tag-line.html"}},o.directive("tgLbTagLine",["$tgResources","$tgTemplate","$compile",r])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,r=this.taiga.debounce,n=angular.module("taigaBacklog"),t=function(t,e,n,i,o,s,a){var c;return c=function(n,c,u){var l,p,h,f,d,g,m,v;return f=!1,l=!0,p=null,n.newSprint={},v=null,g=function(){return p&&p.reset(),n.newSprint={project:null,name:null,estimated_start:null,estimated_finish:null}},m=r(2e3,function(r){return function(r){var u,h,d,g,m,y,b,S,j;return r.preventDefault(),j=angular.element(r.currentTarget),y=a.instant("COMMON.PICKERDATE.FORMAT"),S=c.find(".submit-button"),p=c.find("form").checksley(),p.validate()?(f=!1,u=null,g=$(".date-start").val(),d=$(".date-end").val(),l?(m=angular.copy(n.newSprint),m.estimated_start=moment(g,y).format("YYYY-MM-DD"),m.estimated_finish=moment(d,y).format("YYYY-MM-DD"),b=t.create("milestones",m),u="sprintform:create:success"):(m=n.newSprint.realClone(),m.estimated_start=moment(g,y).format("YYYY-MM-DD"),m.estimated_finish=moment(d,y).format("YYYY-MM-DD"),b=t.save(m),u="sprintform:edit:success"),h=s().target(S).start(),b.then(function(t){return h.finish(),l&&(n.sprintsCounter+=1),n.sprints=_.map(n.sprints,function(e){return e.id===t.id?t:e}),"sprintform:create:success"===u&&v?i.$broadcast(u,t,v):i.$broadcast(u,t),o.close(c)}),b.then(null,function(t){return h.finish(),p.setErrors(t),t._error_message?e.notify("light-error",t._error_message):t.__all__?e.notify("light-error",t.__all__[0]):void 0})):(f=!0,void c.find(".last-sprint-name").addClass("disappear"))}}(this)),d=function(){var r,s;return s=a.instant("LIGHTBOX.DELETE_SPRINT.TITLE"),r=n.newSprint.name,e.askOnDelete(s,r).then(function(r){return function(r){var s,a;return a=function(){return r.finish(),n.milestonesCounter-=1,o.close(c),i.$broadcast("sprintform:remove:success",n.newSprint)},s=function(){return r.finish(!1),e.notify("error")},t.remove(n.newSprint).then(a,s)}}(this))},h=function(){var t,e;return t=_.filter(n.sprints,function(t){return!t.closed}),e=_.sortBy(t,function(t){return moment(t.estimated_finish,"YYYY-MM-DD").format("X")}),e[e.length-1]},n.$on("sprintform:create",function(t,e,r){var i,s,u,f,d,m;return v=r,g(),p=c.find("form").checksley(),p.reset(),l=!0,d=a.instant("COMMON.PICKERDATE.FORMAT"),n.newSprint.project=e,n.newSprint.name=null,n.newSprint.slug=null,u=h(),s=moment(),u?s=moment(u.estimated_finish):n.newSprint.estimated_start&&(s=moment(n.newSprint.estimated_start)),n.newSprint.estimated_start=s.format(d),i=moment().add(2,"weeks"),u?i=moment(u.estimated_finish).add(2,"weeks"):n.newSprint.estimated_finish&&(i=moment(n.newSprint.estimated_finish)),n.newSprint.estimated_finish=i.format(d),f=c.find(".last-sprint-name"),null!=(null!=u?u.name:void 0)&&(m=a.instant("LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME",{lastSprint:u.name}),f.html(m)),c.find(".delete-sprint").addClass("hidden"),m=a.instant("LIGHTBOX.ADD_EDIT_SPRINT.TITLE"),c.find(".title").text(m),m=a.instant("COMMON.CREATE"),c.find(".button-green").text(m),o.open(c),c.find(".sprint-name").focus(),c.find(".last-sprint-name").removeClass("disappear")}),n.$on("sprintform:edit",function(t,e){var r,i,s;return g(),l=!1,i=a.instant("COMMON.PICKERDATE.FORMAT"),n.$apply(function(){return n.newSprint=e.realClone(),n.newSprint.estimated_start=moment(n.newSprint.estimated_start).format(i),n.newSprint.estimated_finish=moment(n.newSprint.estimated_finish).format(i)}),c.find(".delete-sprint").removeClass("hidden"),r=a.instant("BACKLOG.EDIT_SPRINT"),c.find(".title").text(r),s=a.instant("COMMON.SAVE"),c.find(".button-green").text(s),o.open(c),c.find(".sprint-name").focus().select(),c.find(".last-sprint-name").addClass("disappear")}),c.on("keyup",".sprint-name",function(t){return c.find(".sprint-name").val().length>0||f?c.find(".last-sprint-name").addClass("disappear"):c.find(".last-sprint-name").removeClass("disappear")}),c.on("submit","form",m),c.on("click",".delete-sprint",function(t){return t.preventDefault(),d()}),n.$on("$destroy",function(){return c.off()}),g()},{link:c}},n.directive("tgLbCreateEditSprint",["$tgRepo","$tgConfirm","$tgResources","$rootScope","lightboxService","$tgLoading","$translate",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v=function(t,e){function r(){this.constructor=t}for(var n in e)y.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},y={}.hasOwnProperty;d=this.taiga,p=this.taiga.mixOf,m=this.taiga.toggleText,f=this.taiga.scopeDefer,c=this.taiga.bindOnce,l=this.taiga.groupBy,g=this.taiga.timeout,a=this.taiga.bindMethods,u=this.taiga.generateHash,h=angular.module("taigaBacklog"),t=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f,d,g,m,v,y,_,b){var S;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=c,this.appMetaService=u,this.navUrls=l,this.events=p,this.analytics=h,this.translate=f,this.loading=d,this.rs2=g,this.modelTransform=m,this.errorHandlingService=v,this.storage=y,this.filterRemoteStorageService=_,this.projectService=b,a(this),this.backlogOrder={},this.milestonesOrder={},this.page=1,this.disablePagination=!1,this.firstLoadComplete=!1,this.scope.userstories=[],this.applyStoredFilters(this.params.pslug,"backlog-filters")||(this.scope.sectionName=this.translate.instant("BACKLOG.SECTION_NAME"),this.showTags=!1,this.activeFilters=!1,this.scope.showGraphPlaceholder=null,this.displayVelocity=!1,this.initializeEventHandlers(),S=this.loadInitialData(),S.then(function(t){return function(){var e,r;if(t.firstLoadComplete=!0,r=t.translate.instant("BACKLOG.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.translate.instant("BACKLOG.PAGE_DESCRIPTION",{projectName:t.scope.project.name,projectDescription:t.scope.project.description}),t.appMetaService.setAll(r,e),t.rs.userstories.getShowTags(t.scope.projectId))return t.showTags=!0,t.scope.$broadcast("showTags",t.showTags)}}(this)),S.then(null,this.onInitialDataError.bind(this)))}return v(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","tgAppMetaService","$tgNavUrls","$tgEvents","$tgAnalytics","$translate","$tgLoading","tgResources","$tgQueueModelTransformation","tgErrorHandlingService","$tgStorage","tgFilterRemoteStorageService","tgProjectService"],e.prototype.storeCustomFiltersName="backlog-custom-filters",e.prototype.storeFiltersName="backlog-filters",e.prototype.backlogOrder={},e.prototype.milestonesOrder={},e.prototype.filtersReloadContent=function(){return this.loadUserstories(!0)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("usform:bulk:success",function(t){return function(){return t.loadUserstories(!0),t.loadProjectStats(),t.confirm.notify("success"),t.analytics.trackEvent("userstory","create","bulk create userstory on backlog",1)}}(this)),this.scope.$on("sprintform:create:success",function(t){return function(e,r,n){return t.loadSprints().then(function(){return t.scope.$broadcast("sprintform:create:success:callback",n)}),t.loadProjectStats(),t.confirm.notify("success"),t.analytics.trackEvent("sprint","create","create sprint on backlog",1)}}(this)),this.scope.$on("usform:new:success",function(t){return function(){return t.loadUserstories(!0),t.loadProjectStats(),t.rootscope.$broadcast("filters:update"),t.confirm.notify("success"),t.analytics.trackEvent("userstory","create","create userstory on backlog",1)}}(this)),this.scope.$on("sprintform:edit:success",function(t){return function(){return t.loadProjectStats()}}(this)),this.scope.$on("sprintform:remove:success",function(t){return function(e,r){return t.loadSprints(),t.loadProjectStats(),t.loadUserstories(!0),r.closed&&t.loadClosedSprints(),t.rootscope.$broadcast("filters:update")}}(this)),this.scope.$on("usform:edit:success",function(t){return function(e,r){var n;return n=_.findIndex(t.scope.userstories,function(t){return t.id===r.id}),t.scope.userstories[n]=r,t.rootscope.$broadcast("filters:update")}}(this)),this.scope.$on("sprint:us:move",this.moveUs),this.scope.$on("sprint:us:moved",function(t){return function(){return t.loadSprints(),t.loadProjectStats()}}(this)),this.scope.$on("backlog:load-closed-sprints",this.loadClosedSprints),this.scope.$on("backlog:unload-closed-sprints",this.unloadClosedSprints)},e.prototype.initializeSubscription=function(){var t,e;return t="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadAllPaginatedUserstories(),t.loadSprints()}}(this)),e="changes.project."+this.scope.projectId+".milestones",this.events.subscribe(this.scope,e,function(t){return function(e){return t.loadSprints()}}(this))},e.prototype.toggleShowTags=function(){return this.scope.$apply(function(t){return function(){return t.showTags=!t.showTags,t.rs.userstories.storeShowTags(t.scope.projectId,t.showTags)}}(this))},e.prototype.toggleActiveFilters=function(){return this.activeFilters=!this.activeFilters},e.prototype.toggleVelocityForecasting=function(){return this.displayVelocity=!this.displayVelocity,this.displayVelocity?this.scope.visibleUserStories=_.map(this.forecastedStories,function(t){return t.ref}):this.scope.visibleUserStories=_.map(this.scope.userstories,function(t){return t.ref}),f(this.scope,function(t){return function(){return t.scope.$broadcast("userstories:loaded")}}(this))},e.prototype.loadProjectStats=function(){return this.rs.projects.stats(this.scope.projectId).then(function(t){return function(e){var r;return t.scope.stats=e,r=e.total_points?e.total_points:e.defined_points,r?t.scope.stats.completedPercentage=Math.round(100*e.closed_points/r):t.scope.stats.completedPercentage=0,t.scope.showGraphPlaceholder=!(null!=e.total_points&&null!=e.total_milestones),t.calculateForecasting(),e}}(this))},e.prototype.setMilestonesOrder=function(t){var e,r,n,i,o;for(i=[],r=0,n=t.length;r0&&t>s.speed));r++)o.push(void 0);return o},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_backlog_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.closedMilestones=!!t.total_closed_milestones,this.scope.$emit("project:loaded",t),this.scope.points=_.sortBy(t.points,"order"),this.scope.pointsById=l(t.points,function(t){return t.id}),this.scope.usStatusById=l(t.us_statuses,function(t){return t.id}),this.scope.usStatusList=_.sortBy(t.us_statuses,"id"),t},e.prototype.loadInitialData=function(){ +var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.loadBacklog().then(function(t){return function(){var e;return t.generateFilters(e="null")}}(this)).then(function(t){return function(){return t.scope.$emit("backlog:loaded")}}(this))},e.prototype.prepareBulkUpdateData=function(t,e){return null==e&&(e="backlog_order"),_.map(t,function(t){return{us_id:t.id,order:t[e]}})},e.prototype.moveUs=function(t,e,r,n){var i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,$,I,E,T,C,P,w,A,O,R,M,U,N,D,L,x,F,B,H;if(E=e[0].milestone,R=e[0].project,E&&(F=this.scope.sprintsById[E]||this.scope.closedSprintsById[E]),n&&($=this.scope.sprintsById[n]||this.scope.closedSprintsById[n]),s=n!==E?n:E,P=null,C="",n!==E)if(null===n){for(l=u=0,h=e.length;u1&&(x=_.map(O,function(t){return{us_id:t.id,order:P[t.id]}}))):B=0,j=[],l=S=0,d=e.length;S1&&n!==E)a=j.concat(x),M=this.rs.userstories.bulkUpdateMilestone(R,n,a);else if(e.length>1)a=j.concat(x),M=this.rs.userstories.bulkUpdateBacklogOrder(R,a);else{for(L={},U=0,y=x.length;U=n&&t<=r})},e}(p(d.Controller,d.PageMixin,d.FiltersMixin,d.UsFiltersMixin)),h.controller("BacklogController",t),e=function(t,e,r,n){var i,o,s,a,c,u,l,p;return i=_.template('
    <%- text %>
    '),s=function(t,e,n,o){var s,a,c,u;return c=function(){var r,n,i,o,a,c,l,p,h,f;if(t.displayVelocity&&u(),null!=t.stats&&null!=t.stats.total_points&&0!==t.stats.total_points&&null==t.displayVelocity){if(u(),p=t.stats,h=p.total_points,r=p.assigned_points,!t.userstories)return;for(c=t.userstories,l=[],i=o=0,a=c.length;oh){n=e.find(".backlog-table-body .us-item-row")[i],s(n);break}l.push(void 0)}return l}},u=function(){return e.find(".doom-line").remove()},s=function(t){var e;return e=r.instant("BACKLOG.DOOMLINE"),$(t).before(i({text:e}))},a=function(){var t;return t=e.find(".backlog-table-body .us-item-row"),_.map(t,function(t){return angular.element(t)})},t.$on("userstories:loaded",c),t.$on("userstories:forecast",u),t.$watch("stats",c)},c=function(t,r,i,o){var s,a,c,u,l,h,f;return a=function(){var e;return e=r.find(".backlog-table-body input:checkbox:checked"),_.map(e,function(e){var r;return e=$(e).closest(".tg-scope"),r=e.scope(),r.us.milestone=t.sprints[0].id,r.us})},h=function(e,i){var s,a,c,u;return u=_(t.userstories),t.userstories=u.without.apply(u,e).value(),a=_.map(e,function(t,e){return t.total_points}),c=_.reduce(a,function(t,e){return t+e}),i.user_stories=_.union(i.user_stories,e),i.total_points+=c,s=_.map(e,function(t){return{us_id:t.id,order:t.sprint_order}}),n.userstories.bulkUpdateMilestone(t.project.id,t.sprints[0].id,s).then(function(t){return function(){return o.loadSprints(),o.loadProjectStats(),o.toggleVelocityForecasting(),o.calculateForecasting()}}(this)),r.find(".move-to-sprint").hide()},u=function(e){return h(e,t.currentSprint)},l=function(e){return h(e,t.sprints[0])},t.$on("sprintform:create:success:callback",function(t,e){return _.partial(u,e)()}),f=!1,c=null,s=function(e){var n,i;return c=e.closest(".us-item-row"),e.closest(".us-item-row").toggleClass("ui-multisortable-multiple"),n=r.find(".move-to-sprint"),i=r.find(".backlog-table-body input:checkbox:checked"),i.length>0&&t.sprints.length>0?n.show():n.hide()},$(window).on("keydown.shift-pressed keyup.shift-pressed",function(t){return f=!!t.shiftKey,!0}),r.on("change",".backlog-table-body input:checkbox",function(t){var e,r,n,i,o;return c&&f&&(r=[],e=$(t.currentTarget).closest(".us-item-row"),n=c.nextAll(),i=c.prevAll(),_.some(n,function(t){return t===e[0]})?r=c.nextUntil(e):_.some(i,function(t){return t===e[0]})&&(r=c.prevUntil(e)),_.map(r,function(t){var e;return e=$(t).find("input:checkbox"),e.prop("checked",!0),s(e)})),o=angular.element(t.currentTarget),o.closest(".us-item-row").toggleClass("is-checked"),s(o)}),r.on("click","#move-to-latest-sprint",function(e){return function(e){var r;return r=a(),t.$apply(_.partial(l,r))}}(this)),r.on("click","#move-to-current-sprint",function(e){return function(e){var r;return r=a(),t.$apply(_.partial(u,r))}}(this)),r.on("click","#show-tags",function(t){return t.preventDefault(),o.toggleShowTags(),p(o)}),r.on("click",".forecasting-add-sprint",function(r){var n,i;return i=o.forecastedStories,t.currentSprint?(n=_.map(i,function(e,r){return e.milestone=t.currentSprint.id,e.order=r,e}),t.$apply(_.partial(u,n))):(n=_.map(i,function(t,e){return t.order=e,t}),e.$broadcast("sprintform:create",t.projectId,n))})},p=function(t){var e,n;return e=angular.element("#show-tags"),t.showTags?(e.addClass("active"),n=r.instant("BACKLOG.TAGS.HIDE"),e.text(n)):(e.removeClass("active"),n=r.instant("BACKLOG.TAGS.SHOW"),e.text(n))},u=function(t,e,r){var n;return n=e.find("sidebar.backlog-filter"),n.addClass("active"),r.activeFilters=!0},l=function(t,n,i){var o,s,a,c;return a=n.find("sidebar.backlog-filter"),a.one("transitionend",function(){return g(150,function(){return e.$broadcast("resize"),$(".burndown").css("visibility","visible")})}),c=angular.element("#show-filters-button"),$(".burndown").css("visibility","hidden"),a.toggleClass("active"),c.toggleClass("active"),o=r.instant("BACKLOG.FILTERS.HIDE"),s=r.instant("BACKLOG.FILTERS.SHOW"),m(c,[o,s]),i.toggleActiveFilters()},a=function(t,e,r,n){return t.filtersSearch={},e.on("click","#show-filters-button",function(r){return r.preventDefault(),t.$apply(function(){return l(t,e,n)})})},o=function(t,e,r,n){var i,o;return i=e.controller(),c(t,e,r,i),a(t,e,r,i),s(t,e,r,i),o=i.location.search(),(o.status||o.tags||o.q||o.assigned_to||o.owner)&&u(t,e,i),t.$on("showTags",function(){return p(i)}),t.$on("$destroy",function(){return e.off(),$(window).off(".shift-pressed")})},{link:o}},h.directive("tgBacklog",["$tgRepo","$rootScope","$translate","$tgResources",e]),s=function(t,e,r,n){var i,o;return o=e.get("backlog/us-role-points-popover.html",!0),i=function(e,i,s){return c(e,"project",function(t){var n,s;return s=_.filter(t.roles,"computable"),n=_.size(s),n>1?i.append(r(o({roles:s}))(e)):(i.find(".icon-arrow-down").remove(),i.find(".header-points").addClass("not-clickable"))}),e.$on("uspoints:select",function(t,e,r){return i.find(".popover").popover().close(),i.find(".header-points").html(r+"/Total")}),e.$on("uspoints:clear-selection",function(t,e){var r;return i.find(".popover").popover().close(),r=n.instant("COMMON.FIELDS.POINTS"),i.find(".header-points").text(r)}),i.on("click",function(t){var e;return e=angular.element(t.target),(e.is("span")||e.is("div"))&&t.stopPropagation(),i.find(".popover").popover().open()}),i.on("click",".clear-selection",function(e){return e.preventDefault(),e.stopPropagation(),t.$broadcast("uspoints:clear-selection")}),i.on("click",".role",function(e){var r,n;return e.preventDefault(),e.stopPropagation(),n=angular.element(e.currentTarget),r=n.scope(),t.$broadcast("uspoints:select",n.data("role-id"),n.text())}),e.$on("$destroy",function(){return i.off()})},{link:i}},h.directive("tgUsRolePointsSelector",["$rootScope","$tgTemplate","$compile","$translate",s]),o=function(t,e,r){var n,i;return i=r.get("common/estimation/us-points-roles-popover.html",!0),n=function(e,n,o){var s,a,c,u,l,p,h;return s=n.controller(),h=null,p=null,u=null,c=null,e.$on("uspoints:select",function(t,r,n){var i;return i=e.$eval(o.tgBacklogUsPoints),p=r,c.render()}),e.$on("uspoints:clear-selection",function(t){var r;return r=e.$eval(o.tgBacklogUsPoints),p=null,c.render()}),e.$watch(o.tgBacklogUsPoints,function(i){var o;if(i)return c=t.create(n,i,e.project),o=c.calculateRoles(),0===o.length?(n.find(".icon-arrow-bottom").remove(),n.find("a.us-points").addClass("not-clickable")):1===o.length&&(p=_.keys(i.points)[0]),c.isEditable&&a(),c.onSelectedPointForRole=function(t,e,r){return i.points=r,c.render(),this.save(t,e).then(function(){return s.loadProjectStats()})},c.render=function(){var t,e,n,i,s,a,c,u,l;return l=this.calculateTotalPoints(),null==p||1===o.length?(c=l,u=l):(i=this.us.points[p],s=this.pointsById[i],c=s.name+" / "+l+"",u=s.name+" / "+l),t={totalPoints:l,roles:this.calculateRoles(),editable:this.isEditable,text:c,title:u},n="common/estimation/us-estimation-total.html",a=r.get(n,!0),e=a(t),this.$el.html(e)},c.render()}),l=function(){var t,e;return e=c.calculateRoles(),t=i({roles:e}),n.append(t),n.find(".pop-role").popover().open(function(){return $(this).remove()})},a=function(){return n.on("click","a.us-points",function(t){var r;return t.preventDefault(),t.stopPropagation(),r=e.$eval(o.tgBacklogUsPoints),h=p,null!=p?c.renderPointsSelector(p):l()}),n.on("click",".role",function(t){var r,i,s;return t.preventDefault(),t.stopPropagation(),i=angular.element(t.currentTarget),s=e.$eval(o.tgBacklogUsPoints),h=i.data("role-id"),r=n.find(".pop-role"),r.find("a").removeClass("active"),r.find("a[data-role-id='"+h+"']").addClass("active"),c.renderPointsSelector(h)})},e.$on("$destroy",function(){return n.off()})},{link:n}},h.directive("tgBacklogUsPoints",["$tgEstimationsService","$tgRepo","$tgTemplate",o]),i=function(t){var e,r,n;return e=function(){return $(".js-burndown-graph").removeClass("shown"),$(".js-toggle-burndown-visibility-button").removeClass("active"),$(".js-burndown-graph").removeClass("open")},n=function(t){return $(".js-toggle-burndown-visibility-button").addClass("active"),t?$(".js-burndown-graph").addClass("shown"):$(".js-burndown-graph").addClass("open")},r=function(r,i,o){var s,a,c;return s=!0,a=u(["is-burndown-grpahs-collapsed"]),r.isBurndownGraphCollapsed=t.get(a)||!1,c=function(){return r.isBurndownGraphCollapsed?e(s):n(s),s=!1},r.$watch("showGraphPlaceholder",function(){if(null!=r.showGraphPlaceholder)return r.isBurndownGraphCollapsed=r.isBurndownGraphCollapsed||r.showGraphPlaceholder,c()}),i.on("click",".js-toggle-burndown-visibility-button",function(){return r.isBurndownGraphCollapsed=!r.isBurndownGraphCollapsed,t.set(a,r.isBurndownGraphCollapsed),c()}),r.$on("$destroy",function(){return i.off()})},{link:r}},h.directive("tgToggleBurndownVisibility",["$tgStorage",i]),r=function(t){var e,r;return r=function(e,r){var n,i,o,s,a,c,u,l,p,h,f;return h=e.width(),e.height(h/6),a=function(){l=[];for(var t=0,e=r.milestones.length-1;0<=e?t<=e:t>=e;0<=e?t++:t--)l.push(t);return l}.apply(this),o=[],f=_.map(r.milestones,function(t){return 0}),o.push({data:_.zip(a,f),lines:{fillColor:"rgba(0,0,0,0)"},points:{show:!1}}),c=_.map(r.milestones,function(t){return t.optimal}),o.push({data:_.zip(a,c),lines:{fillColor:"rgba(120,120,120,0.2)"}}),s=_.filter(_.map(r.milestones,function(t){return t.evolution}),function(t){return null!=t}),o.push({data:_.zip(a,s),lines:{fillColor:"rgba(102,153,51,0.3)"}}),n=_.map(r.milestones,function(t){return-t["team-increment"]-t["client-increment"]}),o.push({data:_.zip(a,n),lines:{fillColor:"rgba(255,51,51,0.3)"}}),p=_.map(r.milestones,function(t){return-t["team-increment"]}),o.push({data:_.zip(a,p),lines:{fillColor:"rgba(153,51,51,0.3)"}}),i=["rgba(0,0,0,1)","rgba(120,120,120,0.2)","rgba(102,153,51,1)","rgba(153,51,51,1)","rgba(255,51,51,1)"],u={grid:{borderWidth:{top:0,right:1,left:0,bottom:0},borderColor:"#ccc",hoverable:!0},xaxis:{ticks:r.milestones.length,axisLabel:t.instant("BACKLOG.CHART.XAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5,tickFormatter:function(t,e){return""}},yaxis:{axisLabel:t.instant("BACKLOG.CHART.YAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5},series:{shadowSize:0,lines:{show:!0,fill:!0},points:{show:!0,fill:!0,radius:4,lineWidth:2}},colors:i,tooltip:!0,tooltipOpts:{content:function(e,n,i,o){var s;return 1===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.OPTIMAL",s)):2===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.REAL",s)):3===o.seriesIndex?(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.INCREMENT_CLIENT",s)):(s={sprintName:r.milestones[n].name,value:Math.abs(i)},t.instant("BACKLOG.CHART.INCREMENT_TEAM",s))}}},e.empty(),e.plot(o,u).data("plot")},e=function(t,e,n){var i;return i=angular.element(e),t.$watch("stats",function(e){if(null!=t.stats)return r(i,t.stats),t.$on("resize",function(){return r(i,t.stats)})}),t.$on("$destroy",function(){return e.off()})},{link:e}},h.directive("tgBurndownBacklogGraph",["$translate",r]),n=function(t,e){var r,n,i,o;return o=t.get("backlog/progress-bar.html",!0),i=function(t,r,n,i){var s;return s=o({projectPointsPercentaje:n,closedPointsPercentaje:i}),s=e(s)(t),r.html(s)},r=function(t){var e;return e=_.max([0,t]),e=_.min([100,e]),Math.round(e)},n=function(t,e,n){var o;return o=angular.element(e),t.$watch(n.tgBacklogProgressBar,function(n){var o,s,a,c,u;if(null!=n)return u=n.total_points?n.total_points:n.defined_points,a=n.defined_points,o=n.closed_points,a>u?(c=100*u/a,s=100*o/a):(c=100,s=100*o/u),c=r(c-3),s=r(s-3),i(t,e,c,s)}),t.$on("$destroy",function(){return e.off()})},{link:n}},h.directive("tgBacklogProgressBar",["$tgTemplate","$compile",n])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,n=angular.module("taigaBacklog"),r=function(t){return $(t).scope().$destroy(),$(t).off(),$(t).remove()},t=function(){var t;return t=function(t,n,i){return e(t,"project",function(e){var i,o,s;if(e.my_permissions.indexOf("modify_us")>-1)return o=!1,i=dragula([n[0],$(".js-empty-backlog")[0]],{copySortSource:!1,copy:!1,isContainer:function(t){return t.classList.contains("sprint-table")},moves:function(t){return!!$(t).hasClass("row")}}),i.on("drag",function(t,e){var r,n;return n=$(t).parent(),o=n.hasClass("backlog-table-body"),$(document.body).addClass("drag-active"),r=$(t).find("input[type='checkbox']").is(":checked"),window.dragMultiple.start(t,e)}),i.on("cloned",function(t){return $(t).addClass("multiple-drag-mirror")}),i.on("dragend",function(e){var n,i,s,a,c,u,l,p;return c=$(e).parent(),$(".doom-line").remove(),c=$(e).parent(),a=c.hasClass("backlog-table-body")||c.hasClass("js-empty-backlog"),u=o||a?o===a:$(e).scope().sprint.id===c.scope().sprint.id,n=window.dragMultiple.stop(),$(document.body).removeClass("drag-active"),l=null,i=n.length?n[0]:e,a?s=$(i).index(".backlog-table-body .row"):(s=$(i).index(),l=c.scope().sprint.id),u?p=n.length?_.map(n,function(t){return t=$(t).scope().us}):[$(e).scope().us]:(p=n.length?_.map(n,function(t){return t=$(t).scope().us}):[$(e).scope().us],n.length?_.each(n,function(t){return r(t)}):r(e)),t.$emit("sprint:us:move",p,s,l)}),s=autoScroll([window],{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&i.dragging}}),t.$on("$destroy",function(){return n.off(),i.destroy()})})},{link:t}},n.directive("tgBacklogSortable",t)}.call(this),function(){var t,e,r,n,i;i=this.taiga,n=angular.module("taigaBacklog"),t=function(t,e){var r,n,i,o;return i=50,n={duration:500,easing:"linear"},o=function(t){return function(t){var e,r;return r=t.find(".sprint-table"),e=t.find(".compact-sprint"),e.toggleClass("active"),r.toggleClass("open")}}(this),r=function(t,r,i){return t.$watch(i.tgBacklogSprint,function(e){return e=t.$eval(i.tgBacklogSprint),e.closed?r.addClass("sprint-closed"):o(r)}),r.on("click",".sprint-name > .compact-sprint",function(t){return t.preventDefault(),o(r),r.find(".sprint-table").slideToggle(n)}),r.on("click",".edit-sprint",function(r){var n;return r.preventDefault(),n=t.$eval(i.tgBacklogSprint),e.$broadcast("sprintform:edit",n)}),t.$on("$destroy",function(){return r.off()})},{link:r}},n.directive("tgBacklogSprint",["$tgRepo","$rootScope",t]),e=function(t,e,r,n){var i,o;return o=e.get("backlog/sprint-header.html"),i=function(e,i,s,a){var c,u,l,p;return l=n.instant("BACKLOG.SPRINTS.DATE"),c=function(){return e.project.my_permissions.indexOf("modify_milestone")!==-1},u=function(){return e.project.my_permissions.indexOf("view_milestones")!==-1},p=function(n){var s,a,p,h,f,d,g;return d=t.resolve("project-taskboard",{project:e.project.slug,sprint:n.slug}),f=moment(n.estimated_start).format(l),h=moment(n.estimated_finish).format(l),p=f+"-"+h,a={name:n.name,taskboardUrl:d,estimatedDateRange:p,closedPoints:n.closed_points||0,totalPoints:n.total_points||0,isVisible:u(),isEditable:c()},g=e.$new(),_.assign(g,a),s=r(o)(g),i.html(s)},e.$watch("sprint",function(t){return p(t)}),e.$on("$destroy",function(){return i.off()})},{link:i,restrict:"EA"}},n.directive("tgBacklogSprintHeader",["$tgNavUrls","$tgTemplate","$compile","$translate",e]),r=function(t,e,r){var n,i;return n=!0,i=function(i,o,s){var a,c;return c=$("
    "),o.after(c),a=null,o.on("click",function(r){return r.preventDefault(),n=!n,a=e().target(c).start(),n?t.$broadcast("backlog:unload-closed-sprints"):t.$broadcast("backlog:load-closed-sprints")}),i.$on("$destroy",function(){return o.off()}),i.$on("closed-sprints:reloaded",function(t){return function(t,e){var n,i;return a.finish(),n=e.length>0?"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS":"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS",i=r.instant(n),o.find(".text").text(i)}}(this))},{link:i}},n.directive("tgBacklogToggleClosedSprintsVisualization",["$rootScope","$tgLoading","$translate",r])}.call(this),function(){var t,e,r,n,i,o,s,a,c;s=this.taiga,n=this.taiga.mixOf,c=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,a=this.taiga.timeout,i=angular.module("taigaTaskboard"),t=function(t){var e,r;return r=function(e,r){var n,i,o,s;return s=e.width(),e.height(240),i=_.map(r,function(t){return moment(new Date(t.day).getTime())}),n=[],n.unshift({data:_.zip(i,_.map(r,function(t){return t.optimal_points})),lines:{fillColor:"rgba(120,120,120,0.2)"}}),n.unshift({data:_.zip(i,_.map(r,function(t){return t.open_points})),lines:{fillColor:"rgba(102,153,51,0.3)"}}),o={grid:{borderWidth:{top:0,right:1,left:0,bottom:0},borderColor:"#ccc",hoverable:!0},xaxis:{tickSize:[1,"day"],min:i[0],max:_.last(i),mode:"time",daysNames:i,axisLabel:t.instant("TASKBOARD.CHARTS.XAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5},yaxis:{min:0,axisLabel:t.instant("TASKBOARD.CHARTS.YAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5},series:{shadowSize:0,lines:{show:!0,fill:!0},points:{show:!0,fill:!0,radius:4,lineWidth:2}},colors:["rgba(102,153,51,1)","rgba(120,120,120,0.2)"],tooltip:!0,tooltipOpts:{content:function(e,r,n,i){var o,s;return o=moment(r).format(t.instant("TASKBOARD.CHARTS.DATE")),s=Math.round(n),1===i.seriesIndex?t.instant("TASKBOARD.CHARTS.OPTIMAL",{formattedDate:o,roundedValue:s}):t.instant("TASKBOARD.CHARTS.REAL",{formattedDate:o,roundedValue:s})}}},e.empty(),e.plot(n,o).data("plot")},e=function(t,e,n){var i;return i=angular.element(e),t.$on("resize",function(){if(t.stats)return r(i,t.stats.days)}),t.$on("taskboard:graph:toggle-visibility",function(){return e.parent().toggleClass("open"),a(100,function(){if(t.stats)return r(i,t.stats.days)})}),t.$watch("stats",function(e){if(null!=t.stats)return r(i,t.stats.days)}),t.$on("$destroy",function(){return e.off()})},{link:e}},i.directive("tgSprintGraph",["$translate",t])}.call(this),function(){var t,e,r,n,i,o,s,a=[].indexOf||function(t){for(var e=0,r=this.length;e1&&r<=1&&(this.zoomLoading=!0,this.loadTasks().then(function(t){return function(){return t.zoomLoading=!1,t.taskboardTasksService.resetFolds()}}(this))),"0"===this.zoomLevel?this.rootscope.$broadcast("sprint:zoom0"):void 0)},e.prototype.changeQ=function(t){return this.replaceFilter("q",t),this.loadTasks(),this.generateFilters()},e.prototype.removeFilter=function(t){return this.unselectFilter(t.dataType,t.id),this.loadTasks(),this.generateFilters()},e.prototype.addFilter=function(t){return this.selectFilter(t.category.dataType,t.filter.id),this.loadTasks(),this.generateFilters()},e.prototype.selectCustomFilter=function(t){return this.replaceAllFilters(t.filter),this.loadTasks(),this.generateFilters()},e.prototype.removeCustomFilter=function(t){return this.filterRemoteStorageService.getFilters(this.scope.projectId,"tasks-custom-filters").then(function(e){return function(r){return delete r[t.id],e.filterRemoteStorageService.storeFilters(e.scope.projectId,r,"tasks-custom-filters").then(e.generateFilters)}}(this))},e.prototype.isFilterDataTypeSelected=function(t){var e,r,n,i;for(i=this.selectedFilters,r=0,n=i.length;r0}),n=_.map(o.assigned_to,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.full_name||"Unassigned",t}),a=_.map(o.roles,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.name||"Unassigned",t}),s=_.map(o.owners,function(t){return t.id=t.id.toString(), +t.name=t.full_name,t}),e.selectedFilters=[],t.status&&(c=e.formatSelectedFilters("status",u,t.status),e.selectedFilters=e.selectedFilters.concat(c)),t.tags&&(c=e.formatSelectedFilters("tags",l,t.tags),e.selectedFilters=e.selectedFilters.concat(c)),t.assigned_to&&(c=e.formatSelectedFilters("assigned_to",n,t.assigned_to),e.selectedFilters=e.selectedFilters.concat(c)),t.owner&&(c=e.formatSelectedFilters("owner",s,t.owner),e.selectedFilters=e.selectedFilters.concat(c)),t.role&&(c=e.formatSelectedFilters("role",a,t.role),e.selectedFilters=e.selectedFilters.concat(c)),e.filterQ=t.q,e.filters=[{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.STATUS"),dataType:"status",content:u},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TAGS"),dataType:"tags",content:l,hideEmpty:!0,totalTaggedElements:p.length},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ASSIGNED_TO"),dataType:"assigned_to",content:n},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ROLE"),dataType:"role",content:a},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.CREATED_BY"),dataType:"owner",content:s}],e.customFilters=[],_.forOwn(i,function(t,r){return e.customFilters.push({id:r,name:r,filter:t})})}}(this))},e.prototype._setMeta=function(){var t,e,r;return e=this.translate.instant("BACKLOG.SPRINTS.DATE"),r=this.translate.instant("TASKBOARD.PAGE_TITLE",{projectName:this.scope.project.name,sprintName:this.scope.sprint.name}),t=this.translate.instant("TASKBOARD.PAGE_DESCRIPTION",{projectName:this.scope.project.name,sprintName:this.scope.sprint.name,startDate:moment(this.scope.sprint.estimated_start).format(e),endDate:moment(this.scope.sprint.estimated_finish).format(e),completedPercentage:this.scope.stats.completedPercentage||"0",completedPoints:this.scope.stats.completedPointsSum||"--",totalPoints:this.scope.stats.totalPointsSum||"--",openTasks:this.scope.stats.openTasks||"--",totalTasks:this.scope.stats.total_tasks||"--"}),this.appMetaService.setAll(r,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("taskform:bulk:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.add(r)}),t.analytics.trackEvent("task","create","bulk create task on taskboard",1)}}(this)),this.scope.$on("taskform:new:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.add(r)}),t.analytics.trackEvent("task","create","create task on taskboard",1)}}(this)),this.scope.$on("taskform:edit:success",function(t){return function(e,r){return t.refreshTagsColors().then(function(){return t.taskboardTasksService.replaceModel(r)})}}(this)),this.scope.$on("taskboard:task:deleted",function(t){return function(e,r){return t.loadTasks()}}(this)),this.scope.$on("taskboard:task:move",this.taskMove),this.scope.$on("assigned-to:added",this.onAssignedToChanged)},e.prototype.onAssignedToChanged=function(t,e,r){return r.assigned_to=e,this.taskboardTasksService.replaceModel(r),this.repo.save(r).then(function(t){return function(){if(t.generateFilters(),t.isFilterDataTypeSelected("assigned_to")||t.isFilterDataTypeSelected("role"))return t.loadTasks()}}(this))},e.prototype.initializeSubscription=function(){var t,e;return t="changes.project."+this.scope.projectId+".tasks",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadTaskboard()}}(this)),e="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,e,function(t){return function(e){return t.refreshTagsColors(),t.loadSprintStats(),t.loadSprint()}}(this))},e.prototype.loadProject=function(){return this.rs.projects.get(this.scope.projectId).then(function(t){return function(e){return e.is_backlog_activated||t.errorHandlingService.permissionDenied(),t.scope.project=e,t.scope.pointsList=_.sortBy(e.points,"order"),t.scope.pointsById=o(e.points,function(t){return t.id}),t.scope.roleById=o(e.roles,function(t){return t.id}),t.scope.taskStatusList=_.sortBy(e.task_statuses,"order"),t.scope.usStatusList=_.sortBy(e.us_statuses,"order"),t.scope.usStatusById=o(e.us_statuses,function(t){return t.id}),t.scope.$emit("project:loaded",e),t.fillUsersAndRoles(e.members,e.roles),e}}(this))},e.prototype.loadSprintStats=function(){return this.rs.sprints.stats(this.scope.projectId,this.scope.sprintId).then(function(t){return function(e){var r,n,i,o;return o=_.reduce(_.values(e.total_points),function(t,e){return t+e},0),r=_.reduce(_.values(e.completed_points),function(t,e){return t+e},0),n=o-r,i=e.total_tasks-e.completed_tasks,t.scope.stats=e,t.scope.stats.totalPointsSum=o,t.scope.stats.completedPointsSum=r,t.scope.stats.remainingPointsSum=n,t.scope.stats.remainingTasks=i,e.totalPointsSum?t.scope.stats.completedPercentage=Math.round(100*e.completedPointsSum/e.totalPointsSum):t.scope.stats.completedPercentage=0,t.scope.stats.openTasks=e.total_tasks-e.completed_tasks,e}}(this))},e.prototype.refreshTagsColors=function(){return this.rs.projects.tagsColors(this.scope.projectId).then(function(t){return function(e){return t.scope.project.tags_colors=e._attrs}}(this))},e.prototype.loadSprint=function(){return this.rs.sprints.get(this.scope.projectId,this.scope.sprintId).then(function(t){return function(e){return t.scope.sprint=e,t.scope.userstories=_.sortBy(e.user_stories,"sprint_order"),t.taskboardTasksService.setUserstories(t.scope.userstories),e}}(this))},e.prototype.loadTasks=function(){var t;return t={},this.zoomLevel>1&&(t.include_attachments=1),t=_.merge(t,this.location.search()),this.rs.tasks.list(this.scope.projectId,this.scope.sprintId,null,t).then(function(t){return function(e){return t.taskboardTasksService.init(t.scope.project,t.scope.usersById),t.taskboardTasksService.set(e)}}(this))},e.prototype.loadTaskboard=function(){return this.q.all([this.refreshTagsColors(),this.loadSprintStats(),this.loadSprint().then(function(t){return function(){return t.loadTasks()}}(this))])},e.prototype.loadInitialData=function(){var t,e;return t={pslug:this.params.pslug,sslug:this.params.sslug},e=this.repo.resolve(t).then(function(t){return function(e){return t.scope.projectId=e.project,t.scope.sprintId=e.milestone,t.initializeSubscription(),e}}(this)),e.then(function(t){return function(){return t.loadProject()}}(this)).then(function(t){return function(){return t.generateFilters(),t.loadTaskboard().then(function(){return t.setRolePoints()})}}(this))},e.prototype.showPlaceHolder=function(t,e){return!(this.taskboardTasksService.tasksRaw.length||this.scope.taskStatusList[0].id!==t||this.scope.userstories.length&&this.scope.userstories[0].id!==e)},e.prototype.editTask=function(t){var e;return e=this.taskboardTasksService.getTask(t),e=e.set("loading-edit",!0),this.taskboardTasksService.replace(e),this.rs.tasks.getByRef(e.getIn(["model","project"]),e.getIn(["model","ref"])).then(function(t){return function(r){return t.rs2.attachments.list("task",e.get("id"),e.getIn(["model","project"])).then(function(n){return t.rootscope.$broadcast("taskform:edit",r,n.toJS()),e=e.set("loading",!1),t.taskboardTasksService.replace(e)})}}(this))},e.prototype.deleteTask=function(t){var e;return e=this.taskboardTasksService.getTask(t),e=e.set("loading-delete",!0),this.rs.tasks.getByRef(e.getIn(["model","project"]),e.getIn(["model","ref"])).then(function(t){return function(r){var n,i;return e=e.set("loading-delete",!1),i=t.translate.instant("TASK.TITLE_DELETE_ACTION"),n=r.subject,t.confirm.askOnDelete(i,n).then(function(e){var n;return n=t.repo.remove(r),n.then(function(){return t.scope.$broadcast("taskboard:task:deleted"),e.finish()}),n.then(null,function(){return e.finish(!1),this.confirm.notify("error")})})}}(this))},e.prototype.taskMove=function(t,e,r,n,i,o){var s,a,c,u;return e=this.taskboardTasksService.getTaskModel(e.get("id")),s=this.taskboardTasksService.move(e.id,n,i,o),c={status__is_archived:!1,include_attachments:!0},a={headers:{"set-orders":JSON.stringify(s.set_orders)}},u=this.repo.save(e,!0,c,a,!0).then(function(t){return function(e){var r;if(r=e[1],r&&r["taiga-info-order-updated"]&&(o=JSON.parse(r["taiga-info-order-updated"]),t.taskboardTasksService.assignOrders(o)),t.loadSprintStats(),t.generateFilters(),t.isFilterDataTypeSelected("status"))return t.loadTasks()}}(this))},e.prototype.addNewTask=function(t,e){switch(t){case"standard":return this.rootscope.$broadcast("taskform:new",this.scope.sprintId,null!=e?e.id:void 0);case"bulk":return this.rootscope.$broadcast("taskform:bulk",this.scope.sprintId,null!=e?e.id:void 0)}},e.prototype.toggleFold=function(t){return this.taskboardTasksService.toggleFold(t)},e.prototype.changeTaskAssignedTo=function(t){var e;return e=this.taskboardTasksService.getTaskModel(t),this.rootscope.$broadcast("assigned-to:add",e)},e.prototype.setRolePoints=function(){var t,e,r,n;return t=_.filter(this.scope.project.roles,"computable"),r=function(e){return function(e){return e=parseInt(e,10),_.find(t,function(t){return t.id===e})}}(this),e=function(t){return function(e){var r;return r=parseInt(e,10),_.find(t.scope.project.points,function(t){return t.id===e})}}(this),n=_.reduce(this.scope.userstories,function(t){return function(t,n,i){return _.forOwn(n.points,function(n,i){var o,s;return s=r(i),o=e(n),t[s.id]||(t[s.id]=s,t[s.id].points=0),t[s.id].points+=o.value}),t}}(this),{}),this.scope.pointsByRole=Object.keys(n).map(function(t){return n[t]})},e}(s(u.Controller,u.PageMixin,u.FiltersMixin)),a.controller("TaskboardController",t),e=function(t){var e;return e=function(e,r,n){var i,o;return i=r.controller(),r.on("click",".toggle-analytics-visibility",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),r.toggleClass("active"),t.$broadcast("taskboard:graph:toggle-visibility")}),o=r.find(".taskboard-table-body"),o.on("scroll",function(t){var e,n;return n=angular.element(t.currentTarget),e=r.find(".taskboard-table-header .taskboard-table-inner"),e.css("left",-1*n.scrollLeft())}),e.$on("$destroy",function(){return r.off()})},{link:e}},a.directive("tgTaskboard",["$rootScope",e]),r=function(t){var e,r,n;return e=40,n=300,r=function(r,i,o){var s,a,c,u,l;return r.$on("sprint:zoom0",function(t){return function(){return c()}}(this)),r.$on("sprint:task:moved",function(t){return function(){return c()}}(this)),r.$watch("usTasks",function(){if(r.project)return r.statusesFolded=t.tasks.getStatusColumnModes(r.project.id),r.usFolded=t.tasks.getUsRowModes(r.project.id,r.sprintId),c()}),r.foldStatus=function(e){return r.statusesFolded[e.id]=!r.statusesFolded[e.id],t.tasks.storeStatusColumnModes(r.projectId,r.statusesFolded),c()},r.foldUs=function(e){return e?r.usFolded[e.id]=!r.usFolded[e.id]:r.usFolded[null]=!r.usFolded[null],t.tasks.storeUsRowModes(r.projectId,r.sprintId,r.usFolded),c()},s=function(t){return function(t,n){var i,o,s;return i=t?r.usTasks.getIn([t.toString(),n.toString()]).size:r.usTasks.getIn(["null",n.toString()]).size,r.statusesFolded[n]?(i&&r.usFolded[t]?(o=Math.round(Math.sqrt(i)),s=e*o):s=e,s):0}}(this),l=function(t){return function(t,e){var o;return o=i.find(".squish-status-"+t),e?o.css("max-width",e):"0"===r.ctrl.zoomLevel?o.css("max-width",148):o.css("max-width",n)}}(this),u=function(t){return function(){var t,e,r;return t=[],e=i.find(".task-colum-name"),t=_.map(e,function(t){return $(t).outerWidth(!0)}),r=_.reduce(t,function(t,e){return t+e}),i.find(".taskboard-table-inner").css("width",r)}}(this),a=function(t){return function(t){var e;return e=s(null,t),_.forEach(r.userstories,function(r){var n;if(n=s(r.id,t),n>e)return e=n}),l(t,e)}}(this),c=function(t){return function(){_.forEach(r.taskStatusList,function(t){return a(t.id)}),u()}}(this)},{link:r}},a.directive("tgTaskboardSquishColumn",["$tgResources",r])}.call(this),function(){var t,e,r,n,i,o,s,a;s=this.taiga,n=this.taiga.mixOf,a=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,i=angular.module("taigaBacklog"),t=function(t,e,r,n){var i;return i=function(t,e,i){var o;return o=t.$watch("usTasks",function(i){var s,a,c,u,l,p,h,f,d;if(i&&i.size&&(o(),t.project.my_permissions.indexOf("modify_task")>-1))return h=null,p=null,l=null,d=e,u=function(){var t;return t=n.instant("BACKLOG.SORTABLE_FILTER_ERROR"),$tgConfirm.notify("error",t)},a=function(t){return t.scope().$destroy(),t.off(),t.remove()},s=_.map(e.find(".task-column"),function(t){return t}),c=dragula(s,{copySortSource:!1,copy:!1,accepts:function(t,e){return!$(e).hasClass("taskboard-userstory-box")},moves:function(t){return $(t).is("tg-card")}}),c.on("drag",function(t){if(h=$(t).parent().scope(),e.hasClass("active-filters"))return u(),setTimeout(function(){return c.cancel(!0)},0),!1}),c.on("dragend",function(e){var n,i,o,s,c,u,f;return f=$(e).parent(),l=$(e),i=l.scope().task,n=l.index(),p=f.scope(),u=h.us?h.us.id:null,c=h.st.id,s=p.us?p.us.id:null,o=p.st.id,o===c&&s===u||a(l),t.$apply(function(){return r.$broadcast("taskboard:task:move",i,i.getIn(["model","status"]),s,o,n)})}),f=autoScroll([$(".taskboard-table-body")[0]],{margin:100,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&c.dragging}}),t.$on("$destroy",function(){return e.off(),c.destroy()})})},{link:i}},i.directive("tgTaskboardSortable",["$tgRepo","$tgResources","$rootScope","$translate",t])}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga.groupBy,t=function(t){function e(){this.reset()}return r(e,t),e.$inject=[],e.prototype.reset=function(){return this.tasksRaw=[],this.foldStatusChanged={},this.usTasks=Immutable.Map()},e.prototype.init=function(t,e){return this.project=t,this.usersById=e},e.prototype.resetFolds=function(){return this.foldStatusChanged={},this.refresh()},e.prototype.toggleFold=function(t){return this.foldStatusChanged[t]=!this.foldStatusChanged[t],this.refresh()},e.prototype.add=function(t){return this.tasksRaw=this.tasksRaw.concat(t),this.refresh()},e.prototype.set=function(t){return this.tasksRaw=t,this.refreshRawOrder(),this.refresh()},e.prototype.setUserstories=function(t){return this.userstories=t},e.prototype.refreshRawOrder=function(){var t,e,r,n,i;for(this.order={},r=this.tasksRaw,n=[],t=0,e=r.length;t1)for(s=0,l=f.length;s1)for(o=0,p=m.length;o1&&(b=_.map(m,function(t){return function(e){return{us_id:e.id,order:t.order[e.id]}}}(this)))}}else S=0;for(l=u=0,f=t.length;u1&&r<=1?(this.zoomLoading=!0,this.loadUserstories().then(function(t){return function(){return t.zoomLoading=!1,t.kanbanUserstoriesService.resetFolds()}}(this))):void 0)},e.prototype.filtersReloadContent=function(){return this.loadUserstories().then(function(t){return function(){var e,r,n,i,o;if(n=_.difference(t.kanbanUserstoriesService.archivedStatus,t.kanbanUserstoriesService.statusHide),n.length){for(i=[],e=0,r=n.length;e0&&(r.assigned_to=n[0]),0===n.length&&(r.assigned_to=null),this.kanbanUserstoriesService.replaceModel(r),i=this.repo.save(r),i.then(null,function(){return console.log("FAIL")})},e.prototype.refreshTagsColors=function(){return this.rs.projects.tagsColors(this.scope.projectId).then(function(t){return function(e){return t.scope.project.tags_colors=e._attrs}}(this))},e.prototype.loadUserstories=function(){var t,e;return t={status__is_archived:!1},this.zoomLevel>1&&(t.include_attachments=1,t.include_tasks=1),t=_.merge(t,this.location.search()),e=this.rs.userstories.listAll(this.scope.projectId,t).then(function(t){return function(e){return t.kanbanUserstoriesService.init(t.scope.project,t.scope.usersById),t.kanbanUserstoriesService.set(e),p(t.scope,function(){return t.scope.$broadcast("userstories:loaded",e)}),e}}(this)),e.then(function(t){return function(){return t.scope.$broadcast("redraw:wip")}}(this)),e},e.prototype.loadUserStoriesForStatus=function(t,e){var r,n;if(r=this.location.search().status,!r||(r=r.split(",").map(function(t){return parseInt(t,10)}),r.indexOf(e)!==-1))return n={status:e,include_attachments:!0,include_tasks:!0},n=_.merge(n,this.location.search()),this.rs.userstories.listAll(this.scope.projectId,n).then(function(t){return function(r){return t.scope.$broadcast("kanban:shown-userstories-for-status",e,r),r}}(this))},e.prototype.hideUserStoriesForStatus=function(t,e){return this.scope.$broadcast("kanban:hidden-userstories-for-status",e)},e.prototype.loadKanban=function(){return this.q.all([this.refreshTagsColors(),this.loadUserstories()])},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_kanban_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.projectId=t.id,this.scope.points=_.sortBy(t.points,"order"),this.scope.pointsById=c(t.points,function(t){return t.id}),this.scope.usStatusById=c(t.us_statuses,function(t){return t.id}),this.scope.usStatusList=_.sortBy(t.us_statuses,"order"),this.scope.$emit("project:loaded",t),t},e.prototype.initializeSubscription=function(){var t;return t="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadUserstories()}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.loadKanban(),this.generateFilters()},e.prototype.prepareBulkUpdateData=function(t,e){return null==e&&(e="kanban_order"),_.map(t,function(t){return{us_id:t.id,order:t[e]}})},e.prototype.moveUs=function(t,e,r,n){var i,o;return this.cleanSelectedUss(),e=_.map(e,function(t){return function(e){return t.kanbanUserstoriesService.getUsModel(e.id)}}(this)),i=this.kanbanUserstoriesService.move(e,r,n),o=this.rs.userstories.bulkUpdateKanbanOrder(this.scope.projectId,r,i.bulkOrders),o.then(function(t){return function(){var r,n,s;return r={headers:{"set-orders":JSON.stringify(i.setOrders)}},n={include_attachments:!0,include_tasks:!0},s=_.map(e,function(e){return t.repo.save(e,!0,n,r,!0)}),o=t.q.all(s),o.then(function(e){var r,n; +return r=e[1],r&&r["taiga-info-order-updated"]&&(n=JSON.parse(r["taiga-info-order-updated"]),t.kanbanUserstoriesService.assignOrders(n)),t.scope.$broadcast("redraw:wip"),t.generateFilters(),t.isFilterDataTypeSelected("status")&&t.filtersReloadContent(),o})}}(this))},e}(u(h.Controller,h.PageMixin,h.FiltersMixin,h.UsFiltersMixin)),l.controller("KanbanController",r),n=function(t,e){var r;return r=function(t,e,r){var n;return n=e.find(".kanban-table-body"),n.on("scroll",function(t){var r,n;return n=angular.element(t.currentTarget),r=e.find(".kanban-table-header .kanban-table-inner"),r.css("left",-1*n.scrollLeft())}),t.$on("$destroy",function(){return e.off()})},{link:r}},l.directive("tgKanban",["$tgRepo","$rootScope",n]),t=function(t,e,r){var n,i,o;return o=e.instant("KANBAN.ACTION_SHOW_ARCHIVED"),n=e.instant("KANBAN.ACTION_HIDE_ARCHIVED"),i=function(e,i,s){var a,c;return c=e.$eval(s.tgKanbanArchivedStatusHeader),a=!0,r.addArchivedStatus(c.id),r.hideStatus(c.id),e["class"]="icon-watch",e.title=o,i.on("click",function(i){return a=!a,e.$apply(function(){return a?(e["class"]="icon-watch",e.title=o,t.$broadcast("kanban:hide-userstories-for-status",c.id),r.hideStatus(c.id)):(e["class"]="icon-unwatch",e.title=n,t.$broadcast("kanban:show-userstories-for-status",c.id),r.showStatus(c.id))})}),e.$on("$destroy",function(){return i.off()})},{link:i}},l.directive("tgKanbanArchivedStatusHeader",["$rootScope","$translate","tgKanbanUserstories",t]),e=function(t,e){var r,n;return n=[],r=function(r,n,i){var o,s,a;return o=t.instant("KANBAN.HIDDEN_USER_STORIES"),s=r.$eval(i.tgKanbanArchivedStatusIntro),n.text(o),a=function(t){return t?n.text(""):n.text(o)},r.$on("kanban:us:move",function(t,r,n,i,o){var s;return s=!!e.getStatus(i).length,a(s)}),r.$on("kanban:shown-userstories-for-status",function(t,r,n){var i;if(r===s.id)return e.deleteStatus(r),e.add(n),i=!!e.getStatus(r).length,a(i)}),r.$on("kanban:hidden-userstories-for-status",function(t,e){if(e===s.id)return a(!1)}),r.$on("$destroy",function(){return n.off()})},{link:r}},l.directive("tgKanbanArchivedStatusIntro",["$translate","tgKanbanUserstories",e]),i=function(t,e){var r;return r=function(r,n,i){var o,s;return r.foldStatus=function(e){r.folds[e.id]=!r.folds[e.id],t.kanban.storeStatusColumnModes(r.projectId,r.folds),s()},s=function(){var t,e;return t=_.map(r.usStatusList,function(t){return r.folds[t.id]?40:310}),e=_.reduce(t,function(t,e){return t+e}),n.find(".kanban-table-inner").css("width",e)},o=r.$watch("usByStatus",function(n){if(n.size)return r.folds=t.kanban.getStatusColumnModes(e.project.get("id")),s(),o()})},{link:r}},l.directive("tgKanbanSquishColumn",["$tgResources","tgProjectService",i]),o=function(t){var e;return e=function(e,r,n){var i,o;return o=e.$eval(n.tgKanbanWipLimit),i=function(e){return function(){return r.find(".kanban-wip-limit").remove(),t(function(){var t;if(t=r.find("tg-card")[o.wip_limit])return angular.element(t).before("
    ")})}}(this),o&&!o.is_archived&&(e.$on("redraw:wip",i),e.$on("kanban:us:move",i),e.$on("usform:new:success",i),e.$on("usform:bulk:success",i)),e.$on("$destroy",function(){return r.off()})},{link:e}},l.directive("tgKanbanWipLimit",["$timeout",o])}.call(this),function(){var t,e,r,n,i,o,s,a,c;s=this.taiga,n=this.taiga.mixOf,c=this.taiga.toggleText,o=this.taiga.scopeDefer,e=this.taiga.bindOnce,r=this.taiga.groupBy,a=this.taiga.timeout,i=angular.module("taigaKanban"),t=function(t,e,r){var n;return n=function(t,e,n){var i;return i=t.$watch("usByStatus",function(n){var o,s,a,c,u,l,p;if(n&&n.size&&(i(),t.project.my_permissions.indexOf("modify_us")>-1))return u=null,c=null,p=e,s=function(t){return t.scope().$destroy(),t.off(),t.remove()},o=_.map(e.find(".task-column"),function(t){return t}),a=dragula(o,{copySortSource:!1,copy:!1,moves:function(t){return $(t).is("tg-card")}}),a.on("drag",function(t){return window.dragMultiple.start(t,o)}),a.on("cloned",function(t,e){return $(t).addClass("multiple-drag-mirror")}),a.on("dragend",function(e){var n,i,o,a,l,p,h,f;return h=$(e).parent(),u=h.scope(),p=u.s.id,n=window.dragMultiple.stop(),n.length||(n=[e]),o=n[0],a=$(o).index(),l=u.s.id,f=_.map(n,function(t){return $(t).scope().us}),i=_.map(f,function(t){return{id:t.get("id"),oldStatusId:t.getIn(["model","status"])}}),t.$apply(function(){return _.each(f,function(t){return function(t,e){var r,i;if(r=t.getIn(["model","status"]),i=l===r,!i)return c=$(n[e]),s(c)}}(this)),r.$broadcast("kanban:us:move",i,l,a)})}),l=autoScroll(o,{margin:100,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&a.dragging}}),t.$on("$destroy",function(){return e.off(),a.destroy()})})},{link:n}},i.directive("tgKanbanSortable",["$tgRepo","$tgResources","$rootScope",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){function r(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},h={}.hasOwnProperty;u=this.taiga,a=this.taiga.mixOf,l=this.taiga.toString,s=this.taiga.joinStr,o=this.taiga.groupBy,i=this.taiga.bindOnce,n=this.taiga.bindMethods,c=angular.module("taigaEpics"),t=function(t){function e(t,e,r,i,o,s,a,c,u,l,p,h,f,d,g,m,v){var y;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=i,this.rs=o,this.rs2=s,this.params=a,this.q=c,this.location=u,this.log=l,this.appMetaService=p,this.analytics=h,this.navUrls=f,this.translate=d,this.modelTransform=g,this.errorHandlingService=m,this.projectService=v,n(this),this.scope.epicRef=this.params.epicref,this.scope.sectionName=this.translate.instant("EPIC.SECTION_NAME"),this.initializeEventHandlers(),y=this.loadInitialData(),y.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),y.then(null,this.onInitialDataError.bind(this))}return p(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgAnalytics","$tgNavUrls","$translate","$tgQueueModelTransformation","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r;return r=this.translate.instant("EPIC.PAGE_TITLE",{epicRef:"#"+this.scope.epic.ref,epicSubject:this.scope.epic.subject,projectName:this.scope.project.name}),t=this.translate.instant("EPIC.PAGE_DESCRIPTION",{epicStatus:(null!=(e=this.scope.statusById[this.scope.epic.status])?e.name:void 0)||"--",epicDescription:angular.element(this.scope.epic.description_html||"").text()}),this.appMetaService.setAll(r,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on epic",1)}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadEpic()}}(this)),this.scope.$on("custom-attributes-values:edit",function(t){return function(){return t.rootscope.$broadcast("object:updated")}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;return t={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-epics",t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.immutableProject=this.projectService.project,this.scope.$emit("project:loaded",t),this.scope.statusList=t.epic_statuses,this.scope.statusById=o(t.epic_statuses,function(t){return t.id}),t},e.prototype.loadEpic=function(){return this.rs.epics.getByRef(this.scope.projectId,this.params.epicref).then(function(t){return function(e){var r,n,i;if(t.scope.epic=e,t.scope.immutableEpic=Immutable.fromJS(e._attrs),t.scope.epicId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"epic"),null!=(null!=(n=t.scope.epic.neighbors.previous)?n.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.epic.neighbors.previous.ref},t.scope.previousUrl=t.navUrls.resolve("project-epics-detail",r)),null!=(null!=(i=t.scope.epic.neighbors.next)?i.ref:void 0))return r={project:t.scope.project.slug,ref:t.scope.epic.neighbors.next.ref},t.scope.nextUrl=t.navUrls.resolve("project-epics-detail",r)}}(this))},e.prototype.loadUserstories=function(){return this.rs2.userstories.listInEpic(this.scope.epicId).then(function(t){return function(e){return t.scope.userstories=e}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadEpic().then(function(t){return function(){return t.loadUserstories()}}(this))},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.upvote(this.scope.epicId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.downvote(this.scope.epicId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.watch(this.scope.epicId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadEpic(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.epics.unwatch(this.scope.epicId).then(e,t)},e.prototype.onSelectColor=function(t){var e,r,n;return r=function(t){return function(){return t.rootscope.$broadcast("object:updated"),t.confirm.notify("success")}}(this),e=function(t){return function(){return t.confirm.notify("error")}}(this),n=this.modelTransform.save(function(e){return e.color=t,e}),n.then(r,e)},e}(a(u.Controller,u.PageMixin)),c.controller("EpicDetailController",t),r=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:s.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},c.directive("tgEpicStatusDisplay",["$tgTemplate","$compile",r]),e=function(t,e,r,n,i,o,s,a){var c,u;return u=a.get("common/components/status-button.html",!0),c=function(e,s,a,c){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_epic")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=o(u({status:n,statuses:e.statusList,editable:l()}))(e),s.html(r)}}(this),h=function(e){var o,a,c,u;return o=n().target(s).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),o.finish()},a=function(){return r.notify("error"),o.finish()},u.then(c,a)},s.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return s.find(".pop-status").popover().open()}),s.on("click",".status",function(t){var e;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),$.fn.popover().closeAll(),h(e.data("status-id"))}),e.$watch(function(){var t;return null!=(t=c.$modelValue)?t.status:void 0},function(){var t;if(t=c.$modelValue)return p(t)}),e.$on("$destroy",function(){return s.off()})},{link:c,restrict:"EA",require:"ngModel"}},c.directive("tgEpicStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$compile","$translate","$tgTemplate",e])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g=function(t,e){function r(){this.constructor=t}for(var n in e)m.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},m={}.hasOwnProperty;f=this.taiga,p=this.taiga.mixOf,d=this.taiga.toString,l=this.taiga.joinStr,u=this.taiga.groupBy,c=this.taiga.bindOnce,a=this.taiga.bindMethods,h=angular.module("taigaIssues"),t=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f,d,g,m){var v;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=c,this.log=u,this.appMetaService=l,this.analytics=p,this.navUrls=h,this.translate=f,this.modelTransform=d,this.errorHandlingService=g,this.projectService=m,a(this),this.scope.issueRef=this.params.issueref,this.scope.sectionName=this.translate.instant("ISSUES.SECTION_NAME"),this.initializeEventHandlers(),v=this.loadInitialData(),v.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),v.then(null,this.onInitialDataError.bind(this))}return g(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgAnalytics","$tgNavUrls","$translate","$tgQueueModelTransformation","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r,n,i,o;return o=this.translate.instant("ISSUE.PAGE_TITLE",{issueRef:"#"+this.scope.issue.ref,issueSubject:this.scope.issue.subject,projectName:this.scope.project.name}),t=this.translate.instant("ISSUE.PAGE_DESCRIPTION",{issueStatus:(null!=(e=this.scope.statusById[this.scope.issue.status])?e.name:void 0)||"--",issueType:(null!=(r=this.scope.typeById[this.scope.issue.type])?r.name:void 0)||"--",issueSeverity:(null!=(n=this.scope.severityById[this.scope.issue.severity])?n.name:void 0)||"--",issuePriority:(null!=(i=this.scope.priorityById[this.scope.issue.priority])?i.name:void 0)||"--",issueDescription:angular.element(this.scope.issue.description_html||"").text()}),this.appMetaService.setAll(o,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on issue",1)}}(this)),this.scope.$on("promote-issue-to-us:success",function(t){return function(){return t.analytics.trackEvent("issue","promoteToUserstory","promote issue to userstory",1),t.rootscope.$broadcast("object:updated"),t.loadIssue()}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadIssue()}}(this)),this.scope.$on("custom-attributes-values:edit",function(t){return function(){return t.rootscope.$broadcast("object:updated")}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;return t={project:this.scope.project.slug},this.scope.project.is_issues_activated?this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-issues",t):this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.statusList=t.issue_statuses,this.scope.statusById=u(t.issue_statuses,function(t){return t.id}),this.scope.typeById=u(t.issue_types,function(t){return t.id}),this.scope.typeList=_.sortBy(t.issue_types,"order"),this.scope.severityList=t.severities,this.scope.severityById=u(t.severities,function(t){return t.id}),this.scope.priorityList=t.priorities,this.scope.priorityById=u(t.priorities,function(t){return t.id}),t},e.prototype.loadIssue=function(){return this.rs.issues.getByRef(this.scope.projectId,this.params.issueref).then(function(t){return function(e){var r,n,i;if(t.scope.issue=e,t.scope.issueId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"issue"),null!=(null!=(n=t.scope.issue.neighbors.previous)?n.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.issue.neighbors.previous.ref},t.scope.previousUrl=t.navUrls.resolve("project-issues-detail",r)),null!=(null!=(i=t.scope.issue.neighbors.next)?i.ref:void 0))return r={project:t.scope.project.slug,ref:t.scope.issue.neighbors.next.ref},t.scope.nextUrl=t.navUrls.resolve("project-issues-detail",r)}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadIssue()},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.upvote(this.scope.issueId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.downvote(this.scope.issueId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.watch(this.scope.issueId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadIssue(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.issues.unwatch(this.scope.issueId).then(e,t)},e}(p(f.Controller,f.PageMixin)),h.controller("IssueDetailController",t),i=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:s.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},h.directive("tgIssueStatusDisplay",["$tgTemplate","$compile",i]),n=function(t,e,r,n,i,o,s){var a,c;return c=o.get("common/components/status-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=c({status:n,statuses:e.statusList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-status").popover().open()}),o.on("click",".status",function(t){var e;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),h(e.data("status-id"))}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.status:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",n]),o=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-type-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.typeById[t.type],r=c({type:n,typees:e.typeList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.type=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".type-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-type").popover().open()}),o.on("click",".type",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),r=e.data("type-id"),h(r)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.type:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueTypeButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",o]),r=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-severity-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.severityById[t.severity],r=c({severity:n,severityes:e.severityList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.severity=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".severity-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-severity").popover().open()}),o.on("click",".severity",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return r=angular.element(t.currentTarget),e=r.data("severity-id"),h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.severity:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssueSeverityButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",r]),e=function(t,e,r,n,i,o,s){var a,c;return c=o.get("issue/issue-priority-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_issue")!==-1},p=function(t){return function(t){var r,n;return n=e.priorityById[t.priority],r=c({priority:n,priorityes:e.priorityList,editable:l()}),r=s(r)(e),o.html(r)}}(this),h=function(e){var s,a,c,u;return $.fn.popover().closeAll(),s=n().target(o.find(".level-name")).start(),u=i.save(function(t){return t.priority=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)},o.on("click",".priority-data",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-priority").popover().open()}),o.on("click",".priority",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return r=angular.element(t.currentTarget),e=r.data("priority-id"),h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.priority:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},h.directive("tgIssuePriorityButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",e]),s=function(t,e,r,n){var i;return i=function(i,o,s,a){var c;return c=function(n){return function(n,i){var o,s,a;return o={generated_from_issue:n.id,project:n.project,subject:n.subject,description:n.description,tags:n.tags,is_blocked:n.is_blocked,blocked_note:n.blocked_note,due_date:n.due_date},a=function(){return i.finish(),r.notify("success"),t.$broadcast("promote-issue-to-us:success")},s=function(){return i.finish(),r.notify("error")},e.create("userstories",o).then(a,s)}}(this),o.on("click","a",function(t){var e,i,o,s;return t.preventDefault(),e=a.$modelValue,s=n.instant("ISSUES.CONFIRM_PROMOTE.TITLE"),i=n.instant("ISSUES.CONFIRM_PROMOTE.MESSAGE"),o=e.subject,r.ask(s,o,i).then(function(t){return function(t){return c(e,t)}}(this))}),i.$on("$destroy",function(){return o.off()})},{restrict:"AE",require:"ngModel",templateUrl:"issue/promote-issue-to-us-button.html",link:i}},h.directive("tgPromoteIssueToUsButton",["$rootScope","$tgRepo","$tgConfirm","$translate",s])}.call(this),function(){var t,e,r,n,i,o,s,a=[].indexOf||function(t){for(var e=0,r=this.length;e0}),n=_.map(o.assigned_to,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.full_name||"Unassigned",t}),s=_.map(o.owners,function(t){return t.id=t.id.toString(),t.name=t.full_name,t}),c=_.map(o.roles,function(t){return t.id?t.id=t.id.toString():t.id="null",t.name=t.name||"Unassigned",t}),e.selectedFilters=[],t.status&&(u=e.formatSelectedFilters("status",p,t.status),e.selectedFilters=e.selectedFilters.concat(u)),t.tags&&(u=e.formatSelectedFilters("tags",h,t.tags),e.selectedFilters=e.selectedFilters.concat(u)),t.assigned_to&&(u=e.formatSelectedFilters("assigned_to",n,t.assigned_to),e.selectedFilters=e.selectedFilters.concat(u)), +t.owner&&(u=e.formatSelectedFilters("owner",s,t.owner),e.selectedFilters=e.selectedFilters.concat(u)),t.type&&(u=e.formatSelectedFilters("type",d,t.type),e.selectedFilters=e.selectedFilters.concat(u)),t.severity&&(u=e.formatSelectedFilters("severity",l,t.severity),e.selectedFilters=e.selectedFilters.concat(u)),t.priority&&(u=e.formatSelectedFilters("priority",a,t.priority),e.selectedFilters=e.selectedFilters.concat(u)),t.role&&(u=e.formatSelectedFilters("role",c,t.role),e.selectedFilters=e.selectedFilters.concat(u)),e.filterQ=t.q,e.filters=[{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TYPE"),dataType:"type",content:d},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.SEVERITY"),dataType:"severity",content:l},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.PRIORITIES"),dataType:"priority",content:a},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.STATUS"),dataType:"status",content:p},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.TAGS"),dataType:"tags",content:h,hideEmpty:!0,totalTaggedElements:f.length},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ASSIGNED_TO"),dataType:"assigned_to",content:n},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.ROLE"),dataType:"role",content:c},{title:e.translate.instant("COMMON.FILTERS.CATEGORIES.CREATED_BY"),dataType:"owner",content:s}],e.customFilters=[],_.forOwn(i,function(t,r){return e.customFilters.push({id:r,name:r,filter:t})})}}(this))},e.prototype.initializeSubscription=function(){var t;return t="changes.project."+this.scope.projectId+".issues",this.events.subscribe(this.scope,t,function(t){return function(e){return t.loadIssues()}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_issues_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.issueStatusById=a(t.issue_statuses,function(t){return t.id}),this.scope.issueStatusList=_.sortBy(t.issue_statuses,"order"),this.scope.severityById=a(t.severities,function(t){return t.id}),this.scope.severityList=_.sortBy(t.severities,"order"),this.scope.priorityById=a(t.priorities,function(t){return t.id}),this.scope.priorityList=_.sortBy(t.priorities,"order"),this.scope.issueTypes=_.sortBy(t.issue_types,"order"),this.scope.issueTypeById=a(t.issue_types,function(t){return t.id}),t},e.prototype.loadIssuesRequests=0,e.prototype.loadIssues=function(){var t,e;return t=this.location.search(),e=this.rs.issues.list(this.scope.projectId,t),this.loadIssuesRequests+=1,e.index=this.loadIssuesRequests,e.then(function(t){return function(r){return e.index===t.loadIssuesRequests&&(t.scope.issues=r.models,t.scope.page=r.current,t.scope.count=r.count,t.scope.paginatedBy=r.paginatedBy),r}}(this)),e},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.initializeSubscription(),this.generateFilters(),this.loadIssues()},e.prototype.addNewIssue=function(){return this.rootscope.$broadcast("issueform:new",this.scope.project)},e.prototype.addIssuesInBulk=function(){return this.rootscope.$broadcast("issueform:bulk",this.scope.projectId)},e.prototype.upVoteIssue=function(t){var e,r;return this.voting=t,r=function(t){return function(){return t.loadIssues(),t.voting=null}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.voting=null}}(this),this.rs.issues.upvote(t).then(r,e)},e.prototype.downVoteIssue=function(t){var e,r;return this.voting=t,r=function(t){return function(){return t.loadIssues(),t.voting=null}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.voting=null}}(this),this.rs.issues.downvote(t).then(r,e)},e.prototype.getOrderBy=function(){return _.isString(this.location.search().order_by)?this.location.search().order_by:"created_date"},e}(u(h.Controller,h.PageMixin,h.FiltersMixin)),l.controller("IssuesController",r),n=function(t,e,r,n){var i,o,s,a;return a=r.get("issue/issue-paginator.html",!0),s=function(t,e,r,i){var o,s,c,u,l,p,h;return s=2,l=4,c=2,u=2,o=e.find(".issues-paginator"),p=function(){var e;return e=t.count/t.paginatedBy,e=parseInt(e,10)1,d.showNext=!(t.page===f),e=t.page,i=h=1,m=f;1<=m?h<=m:h>=m;i=1<=m?++h:--h)i===e+s&&f>e+s+u?g.push({classes:"dots",type:"dots"}):i===e-l&&e>c+l?g.push({classes:"dots",type:"dots"}):i>e+s&&i<=f-u||ic||(i===e?g.push({classes:"active",num:i,type:"page-active"}):g.push({classes:"page",num:i,type:"page"}));return r=a(d),r=n(r)(t),o.html(r)},t.$watch("issues",function(t){if(t)return h()}),e.on("click",".issues-paginator a.next",function(e){return e.preventDefault(),t.$apply(function(){return i.selectFilter("page",t.page+1),i.loadIssues()})}),e.on("click",".issues-paginator a.previous",function(e){return e.preventDefault(),t.$apply(function(){return i.selectFilter("page",t.page-1),i.loadIssues()})}),e.on("click",".issues-paginator li.page > a",function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=n.data("pagenum"),t.$apply(function(){return i.selectFilter("page",r),i.loadIssues()})})},o=function(t,r,i,o){var s,a,c,u;return a=o.getOrderBy(),a&&(c=p(a,"-")?"icon-arrow-up":"icon-arrow-down",s=r.find(".row.title > div[data-fieldname='"+d(a,"-")+"']"),u=$("").attr("svg-icon",c),s.append(u),n(s.contents())(t)),r.on("click",".row.title > div",function(i){var s,l,h;return h=angular.element(i.currentTarget),a=o.getOrderBy(),l=h.data("fieldname"),"total_voters"===l&&"-total_voters"!==a&&(a="total_voters"),s=a===l?"-"+l:l,t.$apply(function(){return o.replaceFilter("order_by",s),o.storeFilters(o.params.pslug,e.search(),o.filtersHashSuffix),o.loadIssues().then(function(){return r.find(".row.title > div > tg-svg").remove(),c=p(s,"-")?"icon-arrow-up":"icon-arrow-down",u=$("").attr("svg-icon",c),h.append(u),n(h.contents())(t)})})})},i=function(t,e,r){var n;return n=e.controller(),o(t,e,r,n),s(t,e,r,n),t.$on("$destroy",function(){return e.off()})},{link:i}},l.directive("tgIssues",["$log","$tgLocation","$tgTemplate","$compile",n]),e=function(t,e,r){var n,i,o;return i=e.get("issue/issue-status-inline-edition-selection.html",!0),o=function(t,e,r){var n,i,o;if(i=t.find(".issue-status"),n=t.find(".issue-status .issue-status-bind"),o=r[e.status])return n.text(o.name),n.prop("title",o.name),i.css("color",o.color)},n=function(e,r,n){var s,a;return s=r.controller(),a=e.$eval(n.tgIssueStatusInlineEdition),r.on("click",".issue-status",function(t){return t.preventDefault(),t.stopPropagation(),r.find(".pop-status").popover().open()}),r.on("click",".status",function(n){var i;return n.preventDefault(),n.stopPropagation(),i=angular.element(n.currentTarget),a.status=i.data("status-id"),r.find(".pop-status").popover().close(),o(r,a,e.issueStatusById),e.$apply(function(){return t.save(a).then(function(){if(s.generateFilters(),s.isFilterDataTypeSelected("status"))return s.loadIssues()})})}),h.bindOnce(e,"project",function(t){if(r.append(i({statuses:t.issue_statuses})),o(r,a,e.issueStatusById),t.my_permissions.indexOf("modify_issue")===-1)return r.unbind("click"),r.find("a").addClass("not-clickable")}),e.$watch(n.tgIssueStatusInlineEdition,function(t){return function(t){return o(r,t,e.issueStatusById)}}(this)),e.$on("$destroy",function(){return r.off()})},{link:n}},l.directive("tgIssueStatusInlineEdition",["$tgRepo","$tgTemplate","$rootScope",e]),t=function(t,e,r,n){var i,o;return o=_.template('<%- name %>\n
    <%- name %>
    '),i=function(i,s,a){var c,u,l;return l=function(t){var e,a,c;return a={name:r.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED"),imgurl:"/"+window._version+"/images/unnamed.png"},c=i.usersById[t.assigned_to],e=n.getAvatar(c),a.imgurl=e.url,a.bg=null,c&&(a.name=c.full_name_display,a.bg=e.bg),s.find(".avatar").html(o(a)),s.find(".issue-assignedto").attr("title",a.name)},c=s.controller(),u=i.$eval(a.tgIssueAssignedToInlineEdition),l(u),s.on("click",".issue-assignedto",function(t){return e.$broadcast("assigned-to:add",u)}),h.bindOnce(i,"project",function(t){if(t.my_permissions.indexOf("modify_issue")===-1)return s.unbind("click"),s.find("a").addClass("not-clickable")}),i.$on("assigned-to:added",function(e,r,n){if(n.id===u.id)return n.assigned_to=r,t.save(u).then(function(){if(l(n),c.generateFilters(),c.isFilterDataTypeSelected("assigned_to")||c.isFilterDataTypeSelected("role"))return c.loadIssues()})}),i.$watch(a.tgIssueAssignedToInlineEdition,function(t){return l(t)}),i.$on("$destroy",function(){return s.off()})},{link:i}},l.directive("tgIssueAssignedToInlineEdition",["$tgRepo","$rootScope","$translate","tgAvatarService",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){function r(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},h={}.hasOwnProperty;l=this.taiga,c=this.taiga.mixOf,a=this.taiga.groupBy,s=this.taiga.bindOnce,o=this.taiga.bindMethods,u=angular.module("taigaUserStories"),i=function(t){function e(t,e,r,n,i,s,a,c,u,l,p,h,f,d,g,m,v,y){var _;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=s,this.q=a,this.location=c,this.log=u,this.appMetaService=l,this.navUrls=p,this.analytics=h,this.translate=f,this.modelTransform=d,this.errorHandlingService=g,this.configService=m,this.projectService=v,this.wysiwigService=y,o(this),this.scope.usRef=this.params.usref,this.scope.sectionName=this.translate.instant("US.SECTION_NAME"),this.scope.tribeEnabled=this.configService.config.tribeHost,this.initializeEventHandlers(),_=this.loadInitialData(),_.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),_.then(null,this.onInitialDataError.bind(this))}return p(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate","$tgQueueModelTransformation","tgErrorHandlingService","$tgConfig","tgProjectService","tgWysiwygService"],e.prototype._setMeta=function(){var t,e,r,n,i,o;return o=this.scope.tasks.length,t=_.filter(this.scope.tasks,function(t){return function(e){return t.scope.taskStatusById[e.status].is_closed}}(this)).length,r=o>0?Math.round(100*t/o):0,i=this.translate.instant("US.PAGE_TITLE",{userStoryRef:"#"+this.scope.us.ref,userStorySubject:this.scope.us.subject,projectName:this.scope.project.name}),e=this.translate.instant("US.PAGE_DESCRIPTION",{userStoryStatus:(null!=(n=this.scope.statusById[this.scope.us.status])?n.name:void 0)||"--",userStoryPoints:this.scope.us.total_points,userStoryDescription:angular.element(this.wysiwigService.getHTML(this.scope.us.description)||"").text(),userStoryClosedTasks:t,userStoryTotalTasks:o,userStoryProgressPercentage:r}),this.appMetaService.setAll(i,e)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("related-tasks:update",function(t){return function(){var e;if(t.scope.tasks=_.clone(t.scope.tasks,!1),e=_.every(t.scope.tasks,function(t){return t.is_closed}),t.scope.us.is_closed!==e)return t.loadUs()}}(this)),this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on userstory",1)}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadUs()}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;return t={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",t),this.scope.project.is_backlog_activated?this.scope.us.milestone?(t.sprint=this.scope.sprint.slug,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-taskboard",t)):this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-backlog",t):this.scope.project.is_kanban_activated?this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-kanban",t):void 0},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.statusList=t.us_statuses,this.scope.statusById=a(t.us_statuses,function(t){return t.id}),this.scope.taskStatusById=a(t.task_statuses,function(t){return t.id}),this.scope.pointsList=_.sortBy(t.points,"order"),this.scope.pointsById=a(this.scope.pointsList,function(t){return t.id}),t},e.prototype.loadUs=function(){var t,e,r,n;return t=_.pick(this.location.search(),"milestone","no-milestone","kanban-status"),r=t.milestone,r&&this.rs.userstories.storeQueryParams(this.scope.projectId,{milestone:r,order_by:"sprint_order"}),n=t["no-milestone"],n&&this.rs.userstories.storeQueryParams(this.scope.projectId,{milestone:"null",order_by:"backlog_order"}),e=t["kanban-status"],e&&this.rs.userstories.storeQueryParams(this.scope.projectId,{status:e,order_by:"kanban_order"}),this.rs.userstories.getByRef(this.scope.projectId,this.params.usref).then(function(t){return function(e){return t.scope.us=e,t.scope.usId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"us"),e}}(this))},e.prototype.loadSprint=function(){if(this.scope.us.milestone)return this.rs.sprints.get(this.scope.us.project,this.scope.us.milestone).then(function(t){return function(e){return t.scope.sprint=e,e}}(this))},e.prototype.loadTasks=function(){return this.rs.tasks.list(this.scope.projectId,null,this.scope.usId).then(function(t){return function(e){return t.scope.tasks=e,e}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadUs().then(function(t){return function(){return t.q.all([t.loadSprint(),t.loadTasks()])}}(this))},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadUs(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.userstories.upvote(this.scope.usId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadUs(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.userstories.downvote(this.scope.usId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadUs(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.userstories.watch(this.scope.usId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadUs(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.userstories.unwatch(this.scope.usId).then(e,t)},e.prototype.onTribeInfo=function(){var t,e,r,n;return r=this.translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TITLE"),t=$("").attr({src:"/"+window._version+"/images/monster-fight.png",alt:this.translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TITLE")}),n=this.translate.instant("US.TRIBE.PUBLISH_MORE_INFO_TEXT"),e=$("
    ").append(t).append(n),this.confirm.success(r,e)},e}(c(l.Controller,l.PageMixin)),u.controller("UserStoryDetailController",i),r=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:i.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},u.directive("tgUsStatusDisplay",["$tgTemplate","$compile",r]),e=function(t,e,r,n,i,o,s){var a,c;return c=o.get("common/components/status-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_us")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=c({status:n,statuses:e.statusList,editable:l()}),o.html(r),s(o.contents())(e)}}(this),h=function(e){return function(e){var s,a,c,u;return o.find(".pop-status").popover().close(),s=n().target(o.find(".js-edit-status")).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),s.finish()},a=function(){return r.notify("error"),s.finish()},u.then(c,a)}}(this),o.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return o.find(".pop-status").popover().open()}),o.on("click",".status",function(t){var e,r;if(t.preventDefault(),t.stopPropagation(),l())return r=angular.element(t.currentTarget),e=r.data("status-id"),h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.status:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},u.directive("tgUsStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",e]),n=function(t,e,r,n,i,o,s){var a,c;return c=o.get("us/us-team-requirement-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_us")!==-1},p=function(t){var r,n;return r={canEdit:l(),isRequired:t.team_requirement},n=c(r),n=s(n)(e),o.html(n)},h=function(e){var s,a;return s=n().target(o.find("label")).start(),a=i.save(function(t){return t.team_requirement=e,t}),a.then(function(e){return function(){return s.finish(),t.$broadcast("object:updated")}}(this)),a.then(null,function(){return s.finish(),r.notify("error")})},o.on("click",".team-requirement",function(t){var e;if(l())return e=!u.$modelValue.team_requirement,h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.team_requirement:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},u.directive("tgUsTeamRequirementButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",n]),t=function(t,e,r,n,i,o,s){var a,c;return c=o.get("us/us-client-requirement-button.html",!0),a=function(e,o,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_us")!==-1},p=function(t){var r,n;return r={canEdit:l(),isRequired:t.client_requirement},n=s(c(r))(e),o.html(n)},h=function(e){var s,a;return s=n().target(o.find("label")).start(),a=i.save(function(t){return t.client_requirement=e,t}),a.then(function(e){return function(){return s.finish(),t.$broadcast("object:updated")}}(this)),a.then(null,function(){return r.notify("error")})},o.on("click",".client-requirement",function(t){var e;if(l())return e=!u.$modelValue.client_requirement,h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.client_requirement:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return o.off()})},{link:a,restrict:"EA",require:"ngModel"}},u.directive("tgUsClientRequirementButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$tgTemplate","$compile",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u=function(t,e){function r(){this.constructor=t}for(var n in e)l.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},l={}.hasOwnProperty;c=this.taiga,s=this.taiga.mixOf,o=this.taiga.groupBy,i=this.taiga.bindMethods,a=angular.module("taigaTasks"),t=function(t){function e(t,e,r,n,o,s,a,c,u,l,p,h,f,d,g,m){var v;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=o,this.params=s,this.q=a,this.location=c,this.log=u,this.appMetaService=l,this.navUrls=p,this.analytics=h,this.translate=f,this.modelTransform=d,this.errorHandlingService=g,this.projectService=m,i(this),this.scope.taskRef=this.params.taskref,this.scope.sectionName=this.translate.instant("TASK.SECTION_NAME"),this.initializeEventHandlers(),v=this.loadInitialData(),v.then(function(t){return function(){return t._setMeta(),t.initializeOnDeleteGoToUrl()}}(this)),v.then(null,this.onInitialDataError.bind(this))}return u(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate","$tgQueueModelTransformation","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r;return r=this.translate.instant("TASK.PAGE_TITLE",{taskRef:"#"+this.scope.task.ref,taskSubject:this.scope.task.subject,projectName:this.scope.project.name}),t=this.translate.instant("TASK.PAGE_DESCRIPTION",{taskStatus:(null!=(e=this.scope.statusById[this.scope.task.status])?e.name:void 0)||"--",taskDescription:angular.element(this.scope.task.description_html||"").text()}),this.appMetaService.setAll(r,t)},e.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(t){return function(){return t.analytics.trackEvent("attachment","create","create attachment on task",1)}}(this)),this.scope.$on("custom-attributes-values:edit",function(t){return function(){return t.rootscope.$broadcast("object:updated")}}(this)),this.scope.$on("comment:new",function(t){return function(){return t.loadTask()}}(this))},e.prototype.initializeOnDeleteGoToUrl=function(){var t;if(t={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",t),this.scope.project.is_backlog_activated){if(this.scope.task.milestone)return t.sprint=this.scope.sprint.slug,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-taskboard",t);if(this.scope.task.us)return t.ref=this.scope.us.ref,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-userstories-detail",t)}else if(this.scope.project.is_kanban_activated&&this.scope.us)return t.ref=this.scope.us.ref,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-userstories-detail",t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.statusList=t.task_statuses,this.scope.statusById=o(t.task_statuses,function(t){return t.id}),t},e.prototype.loadTask=function(){return this.rs.tasks.getByRef(this.scope.projectId,this.params.taskref).then(function(t){return function(e){var r,n,i;return t.scope.task=e,t.scope.taskId=e.id,t.scope.commentModel=e,t.modelTransform.setObject(t.scope,"task"),null!=(null!=(n=t.scope.task.neighbors.previous)?n.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.task.neighbors.previous.ref},t.scope.previousUrl=t.navUrls.resolve("project-tasks-detail",r)),null!=(null!=(i=t.scope.task.neighbors.next)?i.ref:void 0)&&(r={project:t.scope.project.slug,ref:t.scope.task.neighbors.next.ref},t.scope.nextUrl=t.navUrls.resolve("project-tasks-detail",r)),e}}(this))},e.prototype.loadSprint=function(){if(this.scope.task.milestone)return this.rs.sprints.get(this.scope.task.project,this.scope.task.milestone).then(function(t){return function(e){return t.scope.sprint=e,e}}(this))},e.prototype.loadUserStory=function(){if(this.scope.task.user_story)return this.rs.userstories.get(this.scope.task.project,this.scope.task.user_story).then(function(t){return function(e){return t.scope.us=e,e}}(this))},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.fillUsersAndRoles(t.members,t.roles),this.loadTask().then(function(t){return function(){return t.q.all([t.loadSprint(),t.loadUserStory()])}}(this))},e.prototype.onUpvote=function(){var t,e;return e=function(t){return function(){return t.loadTask(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.tasks.upvote(this.scope.taskId).then(e,t)},e.prototype.onDownvote=function(){var t,e;return e=function(t){return function(){return t.loadTask(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.tasks.downvote(this.scope.taskId).then(e,t)},e.prototype.onWatch=function(){var t,e;return e=function(t){return function(){return t.loadTask(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.tasks.watch(this.scope.taskId).then(e,t)},e.prototype.onUnwatch=function(){var t,e;return e=function(t){return function(){return t.loadTask(),t.rootscope.$broadcast("object:updated")}}(this),t=function(t){return function(){return t.confirm.notify("error")}}(this),this.rs.tasks.unwatch(this.scope.taskId).then(e,t)},e}(s(c.Controller,c.PageMixin)),a.controller("TaskDetailController",t),n=function(t,e){var r,n;return n=t.get("common/components/status-display.html",!0),r=function(t,r,i){var o;return o=function(i){var o,s;return s=t.statusById[i.status],o=n({is_closed:s.is_closed,status:s}),o=e(o)(t),r.html(o)},t.$watch(i.ngModel,function(t){if(null!=t)return o(t)}),t.$on("$destroy",function(){return r.off()})},{link:r,restrict:"EA",require:"ngModel"}},a.directive("tgTaskStatusDisplay",["$tgTemplate","$compile",n]),r=function(t,e,r,n,i,o,s,a){var c,u;return u=a.get("common/components/status-button.html",!0),c=function(e,s,a,c){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_task")!==-1},p=function(t){return function(t){var r,n;return n=e.statusById[t.status],r=o(u({status:n,statuses:e.statusList,editable:l()}))(e),s.html(r)}}(this),h=function(e){var o,a,c,u;return o=n().target(s).start(),u=i.save(function(t){return t.status=e,t}),c=function(){return t.$broadcast("object:updated"),o.finish()},a=function(){return r.notify("error"),o.finish()},u.then(c,a)},s.on("click",".js-edit-status",function(t){if(t.preventDefault(),t.stopPropagation(),l())return s.find(".pop-status").popover().open()}),s.on("click",".status",function(t){var e;if(t.preventDefault(),t.stopPropagation(),l())return e=angular.element(t.currentTarget),$.fn.popover().closeAll(),h(e.data("status-id"))}),e.$watch(function(){var t;return null!=(t=c.$modelValue)?t.status:void 0},function(){var t;if(t=c.$modelValue)return p(t)}),e.$on("$destroy",function(){return s.off()})},{link:c,restrict:"EA",require:"ngModel"}},a.directive("tgTaskStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$compile","$translate","$tgTemplate",r]),e=function(t,e,r,n,i,o,s){var a,c;return c=s.get("issue/iocaine-button.html",!0),a=function(e,s,a,u){var l,p,h;return l=function(){return e.project.my_permissions.indexOf("modify_task")!==-1},p=function(t){var r,n;return l()||t.is_iocaine?(r={isIocaine:t.is_iocaine,isEditable:l()},n=o(c(r))(e),s.html(n)):void s.html("")},h=function(e){var o,a;return o=n().target(s.find("label")).start(),a=i.save(function(t){return t.is_iocaine=e,t}),a.then(function(){return t.$broadcast("object:updated")}),a.then(null,function(){return r.notify("error")}),a["finally"](function(){return o.finish()})},s.on("click",".is-iocaine",function(t){var e;if(l())return e=!u.$modelValue.is_iocaine,h(e)}),e.$watch(function(){var t;return null!=(t=u.$modelValue)?t.is_iocaine:void 0},function(){var t;if(t=u.$modelValue)return p(t)}),e.$on("$destroy",function(){return s.off()})},{link:a,restrict:"EA",require:"ngModel"}},a.directive("tgTaskIsIocaineButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQueueModelTransformation","$compile","$tgTemplate",e])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l=function(t,e){function r(){this.constructor=t}for(var n in e)p.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},p={}.hasOwnProperty;u=this.taiga,a=this.taiga.mixOf,c=angular.module("taigaTeam"),e=function(t){function e(t,e,r,n,i,o,s,a,c,u,l,p,h){var f;this.scope=t,this.rootscope=e,this.repo=r,this.rs=n,this.params=i,this.q=o,this.location=s,this.navUrls=a,this.appMetaService=c,this.auth=u,this.translate=l,this.projectService=p,this.errorHandlingService=h,this.scope.sectionName="TEAM.SECTION_NAME",f=this.loadInitialData(),f.then(function(t){return function(){var e,r;return r=t.translate.instant("TEAM.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.translate.instant("TEAM.PAGE_DESCRIPTION",{projectName:t.scope.project.name,projectDescription:t.scope.project.description}),t.appMetaService.setAll(r,e)}}(this)),f.then(null,this.onInitialDataError.bind(this))}return l(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$location","$tgNavUrls","tgAppMetaService","$tgAuth","$translate","tgProjectService","tgErrorHandlingService"],e.prototype.setRole=function(t){return t?this.scope.filtersRole=t:this.scope.filtersRole=null},e.prototype.loadMembers=function(){var t,e,r,n,i;for(i=this.auth.getUser(),this.scope.totals={},n=this.scope.activeUsers,t=0,e=n.length;t=0)})}},c.filter("membersFilter",s)}.call(this),function(){var t,e,r,n,i,o,s,a,c,u=function(t,e){return function(){return t.apply(e,arguments)}},l=function(t,e){function r(){this.constructor=t}for(var n in e)p.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},p={}.hasOwnProperty;c=this.taiga,s=this.taiga.mixOf,o=this.taiga.groupBy,n=this.taiga.bindOnce,i=this.taiga.debounce,a=angular.module("taigaWiki"),t=function(t){function e(t,e,r,n,i,o,s,a,c,l,p,h,f,d,g,m,v){var y;this.scope=t,this.rootscope=e,this.repo=r,this.model=n,this.confirm=i,this.rs=o,this.params=s,this.q=a,this.location=c,this.filter=l,this.log=p,this.appMetaService=h,this.navUrls=f,this.analytics=d,this.translate=g,this.errorHandlingService=m,this.projectService=v,this.moveLink=u(this.moveLink,this),this.loadWiki=u(this.loadWiki,this),this.scope.$on("wiki:links:move",this.moveLink),this.scope.$on("wikipage:add",this.loadWiki),this.scope.projectSlug=this.params.pslug,this.scope.wikiSlug=this.params.slug,this.scope.sectionName="Wiki",this.scope.linksVisible=!1,y=this.loadInitialData(),y.then(function(t){return function(){return t._setMeta()}}(this)),y.then(null,this.onInitialDataError.bind(this))}return l(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgModel","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$filter","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate","tgErrorHandlingService","tgProjectService"],e.prototype._setMeta=function(){var t,e,r,n,i;return i=this.translate.instant("WIKI.PAGE_TITLE",{wikiPageName:this.scope.wikiSlug,projectName:this.scope.project.name}),t=this.translate.instant("WIKI.PAGE_DESCRIPTION",{wikiPageContent:angular.element((null!=(e=this.scope.wiki)?e.html:void 0)||"").text(),totalEditions:(null!=(r=this.scope.wiki)?r.editions:void 0)||0,lastModifiedDate:moment(null!=(n=this.scope.wiki)?n.modified_date:void 0).format(this.translate.instant("WIKI.DATETIME"))}),this.appMetaService.setAll(i,t)},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_wiki_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadWiki=function(){var t;return t=this.rs.wiki.getBySlug(this.scope.projectId,this.params.slug),t.then(function(t){return function(e){return t.scope.wiki=e,t.scope.wikiId=e.id,t.scope.wiki}}(this)),t.then(null,function(t){return function(e){var r;return t.scope.wikiId=null,t.scope.project.my_permissions.indexOf("add_wiki_page")===-1?null:(r={project:t.scope.projectId,slug:t.scope.wikiSlug,content:""},t.scope.wiki=t.model.make_model("wiki",r),t.scope.wiki)}}(this))},e.prototype.loadWikiLinks=function(){return this.rs.wiki.listLinks(this.scope.projectId).then(function(t){return function(e){var r,n,i,o,s;for(t.scope.wikiLinks=e,o=t.scope.wikiLinks,r=0,n=o.length;r\n \n \n\n
    \n\n \n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\n
    \n
    "}},a.directive("tgWikiWysiwyg",["$tgQueueModelTransformation","$rootScope","$tgConfirm","tgAttachmentsFullService","$tgQqueue","$tgRepo","$tgAnalytics","tgWikiHistoryService",r])}.call(this),function(){var t,e,r,n,i,o;o=this.taiga,n=this.taiga.mixOf,r=this.taiga.groupBy,e=this.taiga.bindOnce,i=angular.module("taigaWiki"),t=function(t,r,n,i,o,s,a,c,u){var l,p,h;return h=a.get("wiki/wiki-nav.html",!0),p=function(n,a,l){var p,f,d,g;return p=a.controller(),null==l.ngModel?r.error("WikiNavDirective: no ng-model attr is defined"):(f=n.project.my_permissions.indexOf("add_wiki_link")>-1,d=null,g=function(e){var r,l,m,v,y;return f=n.project.my_permissions.indexOf("add_wiki_link")>-1,r=n.project.my_permissions.indexOf("delete_wiki_link")>-1,l=h({wikiLinks:e,projectSlug:n.projectSlug,addWikiLinkPermission:f,deleteWikiLinkPermission:r}),l=c(l)(n),a.off(),f&&d&&d.destroy(),a.html(l),f&&(m=null,y=a.find(".sortable"),d=dragula([y[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:y[0],moves:function(t){return $(t).is("li")}}),d.on("dragend",function(t){var e;return m=$(t),t=m.scope().link,e=m.index(),n.$emit("wiki:links:move",t,e)}),v=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&d.dragging}})),a.on("click",".add-button",function(t){return t.preventDefault(),a.find(".new").removeClass("hidden"),a.find(".new input").focus(),a.find(".add-button").hide()}),a.on("click",".js-delete-link",function(e){var r,o,s,a;return e.preventDefault(),e.stopPropagation(),s=angular.element(e.currentTarget),r=s.parents(".wiki-link").data("id"),a=u.instant("WIKI.DELETE_LINK_TITLE"),o=n.wikiLinks[r].title,i.askOnDelete(a,o).then(function(e){return function(e){var o;return o=t.remove(n.wikiLinks[r]),o.then(function(){return o=p.loadWikiLinks(),o.then(function(){return e.finish(),g(n.wikiLinks)}),o.then(null,function(){return e.finish()})}),o.then(null,function(){return e.finish(!1),i.notify("error")})}}(this))}),a.on("keyup",".new input",function(e){var r,c,u,l;return e.preventDefault(),13===e.keyCode?(l=angular.element(e.currentTarget),c=l.val(),r=s().target(a.find(".new")).start(),u=t.create("wiki-links",{project:n.projectId,title:c}),u.then(function(){var t;return o.trackEvent("wikilink","create","create wiki link",1),t=p.loadWikiLinks(),t.then(function(){return r.finish(),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show(),g(n.wikiLinks)}),t.then(null,function(){return r.finish(),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show(),i.notify("error","Error loading wiki links")})}),u.then(null,function(t){var e;return r.finish(),a.find(".new input").val(c),a.find(".new input").focus().select(),null!=(null!=t&&null!=(e=t.__all__)?e[0]:void 0)?i.notify("error","The link already exists"):i.notify("error")})):27===e.keyCode?(l=angular.element(e.currentTarget),a.find(".new").addClass("hidden"),a.find(".new input").val(""),a.find(".add-button").show()):void 0})},e(n,l.ngModel,g))},l=function(t,e,r){return p(t,e,r),t.$on("$destroy",function(){return e.off()})},{link:l}},i.directive("tgWikiNav",["$tgRepo","$log","$tgLocation","$tgConfirm","$tgAnalytics","$tgLoading","$tgTemplate","$compile","$translate",t])}.call(this),function(){var t,e,r,n,i=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;n=this.taiga,e=this.taiga.mixOf,r=angular.module("taigaWiki"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.model=n,this.confirm=i,this.rs=o,this.params=s,this.q=a,this.navUrls=c,this.errorHandlingService=u,this.projectService=l,this.scope.projectSlug=this.params.pslug,this.scope.wikiSlug=this.params.slug,this.scope.sectionName="Wiki",this.scope.linksVisible=!1,p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return i(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgModel","$tgConfirm","$tgResources","$routeParams","$q","$tgNavUrls","tgErrorHandlingService","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.is_wiki_activated||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadWikiPages=function(){var t;return t=this.rs.wiki.list(this.scope.projectId).then(function(t){return function(e){return t.scope.wikipages=e}}(this))},e.prototype.loadWikiLinks=function(){return this.rs.wiki.listLinks(this.scope.projectId).then(function(t){return function(e){var r,n,i,o,s;for(t.scope.wikiLinks=e,o=t.scope.wikiLinks,r=0,n=o.length;rt.total_memberships,this.scope.$emit("project:loaded",t),t},e.prototype.loadMembers=function(){var t;return t=this.getUrlFilters(),this.rs.memberships.list(this.scope.projectId,t).then(function(t){return function(e){return t.scope.memberships=_.filter(e.models,function(t){return null===t.user||t.is_user_active}),t.scope.page=e.current,t.scope.count=e.count,t.scope.paginatedBy=e.paginatedBy,e}}(this))},e.prototype.loadInitialData=function(){return this.loadProject(),this.q.all([this.loadMembers(),this.auth.refresh()])},e.prototype.getUrlFilters=function(){var t;return t=_.pick(this.location.search(),"page"),t.page||(t.page=1),t},e.prototype.addNewMembers=function(){return this.lightboxFactory.create("tg-lb-add-members",{"class":"lightbox lightbox-add-member",project:"project"},{project:this.scope.project})},e.prototype.showLimitUsersWarningMessage=function(){var t,e,r;return r=this.translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING"),e=this.translate.instant("ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING_MESSAGE",{members:this.scope.project.max_memberships}),t="/"+window._version+"/svg/icons/team-question.svg",this.confirm.success(r,e,{name:t,type:"img"})},e}(c(l.Controller,l.PageMixin,l.FiltersMixin)),u.controller("MembershipsController",t),e=function(t,e){var r,n,i;return i=t.get("admin/admin-membership-paginator.html",!0),n=function(t,r,n,o){var s,a,c,u,l,p,h;return a=2,l=4,c=2,u=2,s=r.find(".memberships-paginator"),p=function(){var e;return e=t.count/t.paginatedBy,e=parseInt(e,10)1,d.showNext=!(t.page===f),r=t.page,o=h=1,m=f;1<=m?h<=m:h>=m;o=1<=m?++h:--h)o===r+a&&f>r+a+u?g.push({classes:"dots",type:"dots"}):o===r-l&&r>c+l?g.push({classes:"dots",type:"dots"}):o>r+a&&o<=f-u||oc||(o===r?g.push({classes:"active",num:o,type:"page-active"}):g.push({classes:"page",num:o,type:"page"}));return n=i(d),n=e(n)(t),s.html(n),s.show()},t.$watch("memberships",function(t){if(t)return h()}),r.on("click",".memberships-paginator a.next",function(e){return e.preventDefault(),t.$apply(function(){return o.selectFilter("page",t.page+1),o.loadMembers()})}),r.on("click",".memberships-paginator a.previous",function(e){return e.preventDefault(),t.$apply(function(){return o.selectFilter("page",t.page-1),o.loadMembers()})}),r.on("click",".memberships-paginator li.page > a",function(e){var r,n;return e.preventDefault(),n=angular.element(e.currentTarget),r=n.data("pagenum"),t.$apply(function(){return o.selectFilter("page",r),o.loadMembers()})})},r=function(t,e,r){var i;return i=e.controller(),n(t,e,r,i),t.$on("$destroy",function(){return e.off()})},{link:r}},u.directive("tgMemberships",["$tgTemplate","$compile",e]),i=function(t,e,r,n,i){var o,s;return s=e.get("admin/memberships-row-avatar.html",!0),o=function(e,o,a){var c,u,l;return u=r.instant("ADMIN.MEMBERSHIP.STATUS_PENDING"),l=function(t){var r,a,c;return r=i.getAvatar(t),a={full_name:t.full_name?t.full_name:"",email:t.user_email?t.user_email:t.email,imgurl:r.url,bg:r.bg,pending:t.is_user_active?"":u,isOwner:t.is_owner},c=s(a),c=n(c)(e),o.html(c)},null==a.tgMembershipsRowAvatar?t.error("MembershipsRowAvatarDirective: the directive need a member"):(c=e.$eval(a.tgMembershipsRowAvatar),l(c),e.$on("$destroy",function(){return o.off()}))},{link:o}},u.directive("tgMembershipsRowAvatar",["$log","$tgTemplate","$translate","$compile","tgAvatarService",i]),n=function(t,e,r,n,i){var o,s;return s=n.get("admin/admin-memberships-row-checkbox.html",!0),o=function(n,o,a){var c,u,l;return n.$on("$destroy",function(){return o.off()}),null==a.tgMembershipsRowAdminCheckbox?t.error("MembershipsRowAdminCheckboxDirective: the directive need a member"):(u=n.$eval(a.tgMembershipsRowAdminCheckbox),u.is_owner?void o.find(".js-check").remove():(l=function(t){var e,r;return e={inputId:"is-admin-"+t.id},r=s(e),r=i(r)(n),o.html(r)},o.on("click",":checkbox",function(t){return function(t){var n,i,s;return i=function(){return r.notify("success")},n=function(t){return u.revert(),o.find(":checkbox").prop("checked",u.is_admin),r.notify("error",t.is_admin[0])},s=angular.element(t.currentTarget),u.is_admin=s.prop("checked"),e.save(u).then(i,n)}}(this)),c=l(u),u.is_admin?o.find(":checkbox").prop("checked",!0):void 0))},{link:o}},u.directive("tgMembershipsRowAdminCheckbox",["$log","$tgRepo","$tgConfirm","$tgTemplate","$compile",n]),o=function(t,e,r){var n,i;return i=_.template(''),n=function(n,o,s){var a,c,u,l;return l=function(t){var e,r;return e={roleList:n.project.roles,selectedRole:t.role},r=i(e),o.html(r)},null==s.tgMembershipsRowRoleSelector?t.error("MembershipsRowRoleSelectorDirective: the directive need a member"):(a=o.controller(),u=n.$eval(s.tgMembershipsRowRoleSelector),c=l(u),o.on("change","select",function(t){return function(t){var n,i,o,s;if(o=function(){return r.notify("success")},i=function(){return r.notify("error")},s=angular.element(t.currentTarget),n=parseInt(s.val(),10),u.role!==n)return u.role=n,e.save(u).then(o,i)}}(this)),n.$on("$destroy",function(){return o.off()}))},{link:n}},u.directive("tgMembershipsRowRoleSelector",["$log","$tgRepo","$tgConfirm",o]),r=function(t,e,r,n,i,o,s,a,c,u){var l,p,h;return l='
    \n
    \n\n \n',h='\n\n\n \n',p=function(p,f,d){var g,m,v,y;return y=function(t){var e;return e=t.user?i(l)(p):i(h)(p),f.html(e)},null==d.tgMembershipsRowActions?t.error("MembershipsRowActionsDirective: the directive need a member"):(g=f.controller(),v=p.$eval(d.tgMembershipsRowActions),y(v),f.on("click",".js-resend",function(t){var e,i;return t.preventDefault(),i=function(){var t;return t=o.instant("ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION",{email:p.member.email}),n.notify("success",t)},e=function(){var t;return t=o.instant("ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION"),n.notify("error",t)},r.memberships.resendInvitation(p.member.id).then(i,e)}),m=function(){var t,r,i;return i=o.instant("ADMIN.MEMBERSHIP.DELETE_MEMBER"),t=o.instant("ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE",{email:v.email}),r=v.user?v.full_name:t,n.askOnDelete(i,r).then(function(t){var i,c;return c=function(e){return function(){var e;return t.finish(),v.user!==p.user.id?(p.page>1&&p.count-1<=p.paginatedBy&&g.selectFilter("page",p.page-1),u.fetchProject().then(function(){return g.loadInitialData()})):s.path(a.resolve("home")),e=o.instant("ADMIN.MEMBERSHIP.SUCCESS_DELETE",{message:r}),n.notify("success",e,null,5e3)}}(this),i=function(e){return function(){var e;return t.finish(!1),e=o.instant("ADMIN.MEMBERSHIP.ERROR_DELETE",{message:r}),n.notify("error",e)}}(this),e.remove(v).then(c,i)})},f.on("click",".delete",function(t){var e;return t.preventDefault(),p.project.owner.id===v.user?(e=p.user.id===v.user,c.create("tg-lightbox-leave-project-warning",{"class":"lightbox lightbox-leave-project-warning"},{isCurrentUser:e,project:p.project})):m()}),p.$on("$destroy",function(){return f.off()}))},{link:p}},u.directive("tgMembershipsRowActions",["$log","$tgRepo","$tgResources","$tgConfirm","$compile","$translate","$tgLocation","$tgNavUrls","tgLightboxFactory","tgProjectService",r]),s=function(){return{templateUrl:"admin/no-more-memberships-explanation.html",scope:{project:"="}}},u.directive("tgNoMoreMembershipsExplanation",[s])}.call(this),function(){var t,e;t=function(){var t;return t=function(t,e,r){var n;return n=r.tgAdminNavigation,e.find(".active").removeClass("active"),e.find("#adminmenu-"+n+" a").addClass("active"),t.$on("$destroy",function(){return e.off()})},{link:t}},e=angular.module("taigaAdmin"),e.directive("tgAdminNavigation",t)}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,$,I,E,T,C,P,w=function(t,e){function r(){this.constructor=t}for(var n in e)A.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},A={}.hasOwnProperty,O=function(t,e){return function(){return t.apply(e,arguments)}};T=this.taiga,$=this.taiga.mixOf,E=this.taiga.scopeDefer,P=this.taiga.trim,C=this.taiga.toString,k=this.taiga.joinStr,j=this.taiga.groupBy,b=this.taiga.bindOnce,S=this.taiga.debounce,I=angular.module("taigaAdmin"),v=function(t){function e(t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g){var m;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.appMetaService=u,this.translate=l,this.tgAuth=p,this.currentUserService=h,this.errorHandlingService=f,this.projectService=d,this.model=g,this.scope.project={},this.scope.projectTags=[],m=this.loadInitialData(),m.then(function(t){return function(){var e,r,n;return r=t.translate.instant(t.scope.sectionName),n=t.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:r,projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(n,e),t.fillUsersAndRoles(t.scope.project.members,t.scope.project.roles)}}(this)),m.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:loaded",function(t){return function(){var e,r,n;return r=t.translate.instant(t.scope.sectionName),n=t.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:r,projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(n,e)}}(this))}return w(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","$tgAuth","tgCurrentUserService","tgErrorHandlingService","tgProjectService","$tgModel"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t=this.model.make_model("projects",t),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.epicStatusList=_.sortBy(t.epic_statuses,"order"),this.scope.usStatusList=_.sortBy(t.us_statuses,"order"),this.scope.pointsList=_.sortBy(t.points,"order"),this.scope.taskStatusList=_.sortBy(t.task_statuses,"order"),this.scope.issueTypesList=_.sortBy(t.issue_types,"order"),this.scope.issueStatusList=_.sortBy(t.issue_statuses,"order"),this.scope.prioritiesList=_.sortBy(t.priorities,"order"),this.scope.severitiesList=_.sortBy(t.severities,"order"),E(this.scope,function(e){return function(){return e.scope.$emit("project:loaded",t)}}(this)),this.scope.projectTags=_.map(this.scope.project.tags,function(t){return function(e){return[e,t.scope.project.tags_colors[e]]}}(this)),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.tgAuth.refresh()},e.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.project)},e.prototype.addTag=function(t,e){var r;return r=_.clone(this.scope.project.tags),r.push(t),this.scope.projectTags.push([t,null]),this.scope.project.tags=r},e.prototype.deleteTag=function(t){var e;return e=_.clone(this.scope.project.tags),_.pull(e,t[0]),_.remove(this.scope.projectTags,function(e){return function(e){return e[0]===t[0]}}(this)),this.scope.project.tags=e},e}($(T.Controller,T.PageMixin)),I.controller("ProjectProfileController",v),y=function(t,e,r,n,i,o,s,a){var c;return c=function(c,u,l){var p,h,f,d;return p=u.controller(),h=u.find("form").checksley({onlyOneErrorElement:!0}),f=S(2e3,function(u){return function(u){var l,f,g;if(u.preventDefault(),h.validate())return l=r().target(d).start(),f=c.project.isAttributeModified("is_private"),g=t.save(c.project),g.then(function(){var t;return l.finish(),f&&c.project.is_private?a.trackEvent("project-privacy-changed","from-public-to-private","Change project privacy from public to private",1):f&&!c.project.is_private&&a.trackEvent("project-privacy-changed","from-private-to-public","Change project privacy from private to public",1),e.notify("success"),t=n.resolve("project-admin-project-profile-details",{project:c.project.slug}),i.path(t),o.fetchProject().then(function(t){return function(){return p.loadInitialData()}}(this)),s.loadProjects()}),g.then(null,function(t){if(l.finish(),h.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),d=u.find(".submit-button"),u.on("submit","form",f)},{link:c}},I.directive("tgProjectProfile",["$tgRepo","$tgConfirm","$tgLoading","$tgNavUrls","$tgLocation","tgProjectService","tgCurrentUserService","$tgAnalytics",y]),h=function(t,e,r){var n;return n=function(n,i,o){var s,a,c;return s=i.find("form").checksley({onlyOneErrorElement:!0}),a=S(2e3,function(i){return function(i){var o,a;if(i.preventDefault(),s.validate())return o=r().target(c).start(),a=t.save(n.project),a.then(function(){return o.finish(),e.notify("success")}),a.then(null,function(t){if(o.finish(),s.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),c=i.find(".submit-button"),i.on("submit","form",a),n.$on("$destroy",function(){return i.off()})},{link:n}},I.directive("tgProjectDefaultValues",["$tgRepo","$tgConfirm","$tgLoading",h]),m=function(t,e,r,n){var i;return i=function(r,i,o){var s;return s=function(o){return function(){var o,s;if(o=i.find("form").checksley(),o.initializeFields(),o.reset(),o.validate())return s=t.save(r.project),s.then(function(){return r.$emit("project:loaded",r.project),e.notify("success"),n.fetchProject()}),s.then(null,function(t){if(o.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this),i.on("change",".module-activation.module-direct-active input",function(t){return t.preventDefault(),r.$applyAsync(s)}),i.on("submit","form",function(t){return t.preventDefault(),s()}),i.on("click",".save",function(t){return t.preventDefault(),s()}),i.on("keydown",".videoconference-attributes input",function(t){return 32!==t.which}),r.$watch("project.videoconferences",function(t,e){if(null!=t&&null!=e&&t!==e)return r.project.videoconferences_extra_data=""}),r.$watch("isVideoconferenceActivated",function(t,e){if(t===!1&&(r.project.videoconferences=null,r.project.videoconferences_extra_data="",e===!0))return s()}),r.$watch("project",function(t){return null!=t.videoconferences?r.isVideoconferenceActivated=!0:r.isVideoconferenceActivated=!1})},{link:i}},I.directive("tgProjectModules",["$tgRepo","$tgConfirm","$tgLoading","tgProjectService",m]), +f=function(t,e,r,n,i){var o;return o=function(o,s,a){var c,u,l,p,h,f,d,g,m,v,y,_,b,j,k,$,I,E,T,C,P,w,A,O,R,M;return u=s.find(".admin-project-export-buttons"),E=function(){return u.removeClass("hidden")},p=function(){return u.addClass("hidden")},m=s.find(".admin-project-export-result"),A=function(){return m.removeClass("hidden")},h=function(){return m.addClass("hidden")},R=s.find(".spin"),O=function(){return R.removeClass("hidden")},f=function(){return R.addClass("hidden")},y=s.find(".result-title"),g=n.instant("ADMIN.PROJECT_EXPORT.LOADING_TITLE"),d=n.instant("ADMIN.PROJECT_EXPORT.LOADING_MESSAGE"),l=function(){return y.html(n.instant("ADMIN.PROJECT_EXPORT.DUMP_READY"))},c=function(){return y.html(n.instant("ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE"))},M=function(t){return y.html(n.instant("ADMIN.PROJECT_EXPORT.SYNC_MESSAGE",{url:t}))},k=function(){return y.html(g)},b=function(){return y.html(d)},I=function(){return y.html(l)},v=s.find(".result-message "),j=function(){return v.html(d)},_=function(){return v.html(c)},$=function(t){return v.html(M(t))},w=function(){return O(),k(),j(),p(),A()},C=function(){return f(),b(),_()},P=function(t){return f(),I(),$(t)},T=function(){return f(),h(),E()},s.on("click","a.button-export",S(2e3,function(s){return function(s){var a,c;return s.preventDefault(),c=function(e){var r;return i.trackEvent("exporter","export-project","Exported project",1),202===e.status?C():(r=e.data.url,P(r),t.open(r,"_blank"))},a=function(t){var e,i;return T(),e=n.instant("ADMIN.PROJECT_EXPORT.ERROR"),429===t.status?e=n.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY"):(null!=(i=t.data)?i._error_message:void 0)&&(e=n.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY",{message:t.data._error_message})),r.notify("error",e)},w(),e.projects["export"](o.projectId).then(c,a)}}(this)))},{link:o}},I.directive("tgProjectExport",["$window","$tgResources","$tgConfirm","$translate","$tgAnalytics",f]),i=function(t){function e(t,e,r,n,i,o){this.scope=t,this.rootscope=e,this.urls=r,this.confirm=n,this.rs=i,this.translate=o,this._generateUuid=O(this._generateUuid,this),this.setCsvUuid=O(this.setCsvUuid,this),this.rootscope.$on("project:loaded",this.setCsvUuid),this.scope.$watch("csvUuid",function(t){return function(e){return e?t.scope.csvUrl=t.urls.resolveAbsolute(t.type+"-csv",e):t.scope.csvUrl=""}}(this))}return w(e,t),e.$inject=["$scope","$rootScope","$tgUrls","$tgConfirm","$tgResources","$translate"],e.prototype.setCsvUuid=function(){return this.scope.csvUuid=this.scope.project[this.type+"_csv_uuid"]},e.prototype._generateUuid=function(t){var e;return null==t&&(t=null),e=this.rs.projects["regenerate_"+this.type+"_csv_uuid"](this.scope.projectId),e.then(function(t){return function(e){var r;return t.scope.csvUuid=null!=(r=e.data)?r.uuid:void 0}}(this)),e.then(null,function(t){return function(){return t.confirm.notify("error")}}(this)),e["finally"](function(){if(t)return t.finish()}),e},e.prototype.regenerateUuid=function(){var t,e;return this.scope.csvUuid?(e=this.translate.instant("ADMIN.REPORTS.REGENERATE_TITLE"),t=this.translate.instant("ADMIN.REPORTS.REGENERATE_SUBTITLE"),this.confirm.ask(e,t).then(this._generateUuid)):this._generateUuid()},e}(T.Controller),o=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="epics",e}(i),c=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="userstories",e}(i),a=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="tasks",e}(i),s=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return w(e,t),e.prototype.type="issues",e}(i),I.controller("CsvExporterEpicsController",o),I.controller("CsvExporterUserstoriesController",c),I.controller("CsvExporterTasksController",a),I.controller("CsvExporterIssuesController",s),n=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_EPIC"},{controller:"CsvExporterEpicsController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvEpic",["$translate",n]),p=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_US"},{controller:"CsvExporterUserstoriesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvUs",["$translate",p]),l=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_TASK"},{controller:"CsvExporterTasksController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvTask",["$translate",l]),u=function(t){var e;return e=function(t){return t.sectionTitle="ADMIN.CSV.SECTION_TITLE_ISSUE"},{controller:"CsvExporterIssuesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:e,scope:!0}},I.directive("tgCsvIssue",["$translate",u]),d=function(t,e,r,n){var i;return i=function(t,i,o){var s,a,c;return c=function(){return i.find(".size-info").addClass("active")},a=function(r){var o;return o=e.make_model("projects",r.data),t.project=o,i.find(".loading-overlay").removeClass("active"),n.notify("success")},s=function(t){return 413===t.status&&c(),i.find(".loading-overlay").removeClass("active"),n.notify("error",t.data._error_message)},i.on("click",".js-change-logo",function(){return i.find("#logo-field").click()}),i.on("change","#logo-field",function(e){if(t.logoAttachment)return i.find(".loading-overlay").addClass("active"),r.projects.changeLogo(t.project.id,t.logoAttachment).then(a,s)}),i.on("click","a.js-use-default-logo",function(e){return i.find(".loading-overlay").addClass("active"),r.projects.removeLogo(t.project.id).then(a,s)}),t.$on("$destroy",function(){return i.off()})},{link:i}},I.directive("tgProjectLogo",["$tgAuth","$tgModel","$tgResources","$tgConfirm",d]),g=function(t){var e;return e=function(e,r,n){var i,o;return i=t(n.tgProjectLogoModel),o=i.assign,r.bind("change",function(){return e.$apply(function(){return o(e,r[0].files[0])})})},{link:e}},I.directive("tgProjectLogoModel",["$parse",g]),r=function(){return{scope:{project:"="},templateUrl:"admin/admin-project-restrictions.html"}},I.directive("tgAdminProjectRestrictions",[r]),e=function(t){return{link:function(e){return e.requestOwnership=function(){return t.create("tg-lb-request-ownership",{"class":"lightbox lightbox-request-ownership"},{projectId:e.projectId})}},scope:{projectId:"=",owner:"="},templateUrl:"admin/admin-project-request-ownership.html"}},I.directive("tgAdminProjectRequestOwnership",["tgLightboxFactory",e]),t=function(t){return{link:function(e){return e.changeOwner=function(){return t.create("tg-lb-change-owner",{"class":"lightbox lightbox-select-user","project-id":"projectId","active-users":"activeUsers","current-owner-id":"currentOwnerId"},{projectId:e.projectId,activeUsers:e.activeUsers,currentOwnerId:e.owner.id,members:e.members})}},scope:{activeUsers:"=",projectId:"=",owner:"=",members:"="},templateUrl:"admin/admin-project-change-owner.html"}},I.directive("tgAdminProjectChangeOwner",["tgLightboxFactory",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b,S,j,k,I,E=function(t,e){function r(){this.constructor=t}for(var n in e)T.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},T={}.hasOwnProperty,C=function(t,e){return function(){return t.apply(e,arguments)}};j=this.taiga,b=this.taiga.mixOf,I=this.taiga.trim,k=this.taiga.toString,y=this.taiga.joinStr,v=this.taiga.groupBy,d=this.taiga.bindOnce,g=this.taiga.debounce,m=this.taiga.getDefaulColorList,S=angular.module("taigaAdmin"),u=function(t){function e(t,e,r,n,i,o,s,a,c,u,l,p,h){var f,d,g;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.appMetaService=u,this.translate=l,this.errorHandlingService=p,this.projectService=h,this.scope.project={},this.loadInitialData(),d=this.translate.instant(this.scope.sectionName),g=this.translate.instant("ADMIN.PROJECT_VALUES.PAGE_TITLE",{sectionName:d,projectName:this.scope.project.name}),f=this.scope.project.description,this.appMetaService.setAll(g,f)}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgErrorHandlingService","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){var t;return t=this.loadProject()},e}(b(j.Controller,j.PageMixin)),S.controller("ProjectValuesSectionController",u),a=function(t){function e(t,e,r,n,i){var o;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.moveValue=C(this.moveValue,this),this.loadValues=C(this.loadValues,this),this.scope.$on("admin:project-values:move",this.moveValue),o=this.scope.$watch("resource",function(t){return function(e){if(e)return t.loadValues(),o()}}(this))}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources"],e.prototype.loadValues=function(){return this.rs[this.scope.resource].listValues(this.scope.projectId,this.scope.type).then(function(t){return function(e){return t.scope.values=e,t.scope.maxValueOrder=_.maxBy(e,"order").order,e}}(this))},e.prototype.moveValue=function(t,e,r){var n,i;return i=this.scope.values,n=i.indexOf(e),i.splice(n,1),i.splice(r,0,e),_.each(i,function(t,e){return t.order=e}),this.repo.saveAll(i)},e}(j.Controller),S.controller("ProjectValuesController",a),c=function(t,e,r,n,i,o,s,a){var c,u,l;return u=function(t,e,r){var n,i,o,s,a,c;return s=null,o=null,i=null,c=e.find(".sortable"),n=dragula([c[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:c[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),n.on("dragend",function(e){var r,n;return i=$(e),n=i.scope().value,r=i.index(),t.$broadcast("admin:project-values:move",n,r)}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&n.dragging}}),t.$on("$destroy",function(){return e.off(),n.destroy()})},l=function(t,n,i){var c,u,l,p,h,f,d,m,v;return c=n.controller(),v=i.type,f=i.objname,p=function(){return t.newValue={name:"",is_closed:!1,is_archived:!1}},h=function(){return t.addNewElementText=o.instant("ADMIN.PROJECT_VALUES_"+f.toUpperCase()+".ACTION_ADD")},p(),h(),s.$on("$translateChangeEnd",function(){return t.$evalAsync(h)}),l=function(t){return function(t){var e;if(null==t&&(t=!1),e=n.find(".table-main"),$(document.body).scrollTop(e.offset().top+e.height()),t)return n.find(".new-value input:visible").first().focus()}}(this),m=function(t){var r,n,i,o;if(n=t.parents("form"),r=n.checksley(),r.validate())return o=n.scope().value,i=e.save(o),i.then(function(e){return function(){var e;return e=t.parents(".row.table-main"),e.addClass("hidden"),e.siblings(".visualization").removeClass("hidden"),a.fetchProject()}}(this)),i.then(null,function(t){return r.setErrors(t)})},d=function(r){var n,i,o;if(i=r.parents("form"),n=i.checksley(),n.validate())return t.newValue.project=t.project.id,t.newValue.order=t.maxValueOrder?t.maxValueOrder+1:1,o=e.create(v,t.newValue),o.then(function(e){return function(e){return r.addClass("hidden"),t.values.push(e),t.maxValueOrder=e.order,p()}}(this)),o.then(null,function(t){return n.setErrors(t)})},u=function(e){var r,n,i;return n=e.parents(".row.table-main"),r=e.parents("form"),i=r.scope().value,t.$apply(function(){return n.addClass("hidden"),i.revert(),n.siblings(".visualization").removeClass("hidden")})},n.on("click",".show-add-new",function(t){return t.preventDefault(),n.find(".new-value").removeClass("hidden"),l(!0)}),n.on("click",".add-new",g(2e3,function(t){var e;return t.preventDefault(),e=n.find(".new-value"),d(e)})),n.on("click",".delete-new",function(t){return t.preventDefault(),n.find(".new-value").addClass("hidden"),p()}),n.on("click",".edit-value",function(t){var e,r,n;return t.preventDefault(),n=angular.element(t.currentTarget),r=n.parents(".row.table-main"),r.addClass("hidden"),e=r.siblings(".edition"),e.removeClass("hidden"),e.find("input:visible").first().focus().select()}),n.on("keyup",".new-value input",function(t){var e;return 13===t.keyCode?(e=n.find(".new-value"),d(e)):27===t.keyCode?(n.find(".new-value").addClass("hidden"),p()):void 0}),n.on("click",".save",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),m(e)}),n.on("click",".cancel",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),u(e)}),n.on("click",".delete-value",function(n){var i,s,a,u,l,p,h;return n.preventDefault(),u=angular.element(n.currentTarget),s=u.parents("form"),h=s.scope().value,i={},_.each(t.values,function(t){if(h.id!==t.id)return i[t.id]=t.name}),a=h.name,0===_.keys(i).length?r.error(o.instant("ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL")):(p=o.instant("ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE"),l=o.instant("ADMIN.PROJECT_VALUES.REPLACEMENT"),r.askChoice(p,a,i,l).then(function(t){var n,i;return i=function(){return c.loadValues()["finally"](function(){return t.finish()})},n=function(){return r.notify("error")},e.remove(h,{moveTo:t.selected}).then(i,n)}))})},c=function(t,e,r){return u(t,e,r),l(t,e,r),t.$on("$destroy",function(){return e.off()})},{link:c}},S.directive("tgProjectValues",["$log","$tgRepo","$tgConfirm","$tgLocation","animationFrame","$translate","$rootScope","tgProjectService",c]),t=function(){var t;return t=function(t,e,r,n){var i;return t.colorList=m(),t.allowEmpty=!1,r.tgAllowEmpty&&(t.allowEmpty=!0),i=e.controller(),t.$watch(r.ngModel,function(e){return t.color=e.color}),e.on("click",".current-color",function(t){var r,n;return t.preventDefault(),t.stopPropagation(),n=angular.element(t.currentTarget),$(".select-color").hide(),n.siblings(".select-color").show(),r=angular.element("body"),r.on("click",function(t){return function(t){if(0===angular.element(t.target).parent(".select-color").length)return e.find(".select-color").hide(),r.unbind("click")}}(this))}),e.on("click",".select-color .color",function(r){var i;return r.preventDefault(),i=angular.element(r.currentTarget),t.$apply(function(){return n.$modelValue.color=i.data("color")}),e.find(".select-color").hide()}),e.on("click",".select-color .selected-color",function(r){return r.preventDefault(),t.$apply(function(){return n.$modelValue.color=t.color}),e.find(".select-color").hide()}),e.on("keyup","input",function(r){return r.stopPropagation(),13===r.keyCode?(t.$apply(function(){return n.$modelValue.color=t.color}),e.find(".select-color").hide()):27===r.keyCode?e.find(".select-color").hide():void 0}),t.$on("$destroy",function(){return e.off()})},{link:t,require:"ngModel"}},S.directive("tgColorSelection",t),p="text",r="multiline",l="richtext",e="date",f="url",h=[{key:p,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT"},{key:r,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI"},{key:l,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT"},{key:e,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE"},{key:f,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL"}],n=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p,f,d;this.scope=t,this.rootscope=e,this.repo=r,this.rs=n,this.params=i,this.q=o,this.location=s,this.navUrls=a,this.appMetaService=c,this.translate=u,this.projectService=l,this.moveCustomAttributes=C(this.moveCustomAttributes,this),this.deleteCustomAttribute=C(this.deleteCustomAttribute,this),this.saveCustomAttribute=C(this.saveCustomAttribute,this),this.createCustomAttribute=C(this.createCustomAttribute,this),this.loadCustomAttributes=C(this.loadCustomAttributes,this),this.scope.TYPE_CHOICES=h,this.scope.project=this.projectService.project.toJS(),this.scope.projectId=this.scope.project.id,f=this.translate.instant(this.scope.sectionName),d=this.translate.instant("ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE",{sectionName:f,projectName:this.scope.project.name}),p=this.scope.project.description,this.appMetaService.setAll(d,p),this.scope.init=function(t){return function(e){return t.scope.type=e,t.loadCustomAttributes()}}(this)}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadCustomAttributes=function(){return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then(function(t){return function(e){var r;return t.scope.customAttributes=e,t.scope.maxOrder=null!=(r=_.maxBy(e,"order"))?r.order:void 0,e}}(this))},e.prototype.createCustomAttribute=function(t){return this.repo.create("custom-attributes/"+this.scope.type,t)},e.prototype.saveCustomAttribute=function(t){return this.repo.save(t)},e.prototype.deleteCustomAttribute=function(t){return this.repo.remove(t)},e.prototype.moveCustomAttributes=function(t,e){var r,n;return r=this.scope.customAttributes,n=r.indexOf(t),r.splice(n,1),r.splice(e,0,t),_.each(r,function(t,e){return t.order=e}),this.repo.saveAll(r)},e}(b(j.Controller,j.PageMixin)),S.controller("ProjectCustomAttributesController",n),i=function(t,e,r,n){var i;return i=function(t,r,i){var o,s,a,c,u,l,p,h,f,d,m,v,y,_,b,S,j,k;return o=r.controller(),t.$on("$destroy",function(){return r.off()}),j=r.find(".js-sortable"),l=dragula([j[0]],{direction:"vertical",copySortSource:!1,copy:!1,mirrorContainer:j[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),l.on("dragend",function(t){var e,r,n;return r=$(t),e=r.scope().attr,n=r.index(),o.moveCustomAttributes(e,n)}),b=function(){return r.find(".js-new-custom-field").removeClass("hidden"),r.find(".js-new-custom-field input:visible").first().focus()},f=function(){return r.find(".js-new-custom-field").addClass("hidden")},y=function(){return r.find(".js-add-custom-field-button").removeClass("hidden")},p=function(){return r.find(".js-add-custom-field-button").addClass("hidden")},_=function(){return r.find(".js-cancel-new-custom-field-button").removeClass("hidden")},h=function(){return r.find(".js-cancel-new-custom-field-button").addClass("hidden")},m=function(){return t.newAttr={}},c=function(r){var n,i,s,a;if(i=r.checksley(),i.validate())return a=function(t){return function(){return o.loadCustomAttributes(),f(),m(),e.notify("success")}}(this),s=function(t){return function(t){return i.setErrors(t)}}(this),n=t.newAttr,n.project=t.projectId,n.order=t.maxOrder?t.maxOrder+1:1,o.createCustomAttribute(n).then(a,s)},s=function(){return f(),m()},t.$watch("customAttributes",function(t){if(t)return 0===t.length?(h(),p(),b()):(f(),y(),_())}),r.on("click",".js-add-custom-field-button",function(t){return t.preventDefault(),b()}),r.on("click",".js-create-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),c(e)})),r.on("click",".js-cancel-new-custom-field-button",function(t){return t.preventDefault(),s()}),r.on("keyup",".js-new-custom-field input",function(t){var e,r;return 13===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),c(e)):27===t.keyCode?s():void 0}),S=function(t){return t.find(".js-view-custom-field").addClass("hidden"),t.find(".js-edit-custom-field").removeClass("hidden"),t.find(".js-edit-custom-field input:visible").first().focus().select()},d=function(t){return t.find(".js-edit-custom-field").addClass("hidden"),t.find(".js-view-custom-field").removeClass("hidden")},v=function(e){return t.$apply(function(){return e.scope().attr.revert()})},k=function(t){var r,n,i,s;if(n=t.checksley(),n.validate())return s=function(r){return function(){return o.loadCustomAttributes(),d(t),e.notify("success")}}(this),i=function(t){return function(t){return n.setErrors(t)}}(this),r=t.scope().attr,o.saveCustomAttribute(r).then(s,i)},a=function(t){return d(t),v(t)},r.on("click",".js-edit-custom-field-button",function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),S(e)}),r.on("click",".js-update-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),k(e)})),r.on("click",".js-cancel-edit-custom-field-button",function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),a(e)}),r.on("keyup",".js-edit-custom-field input",function(t){var e,r;return 13===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),k(e)):27===t.keyCode?(r=angular.element(t.currentTarget),e=r.closest("form"),a(e)):void 0}),u=function(t){var r,i,s,a;return r=t.scope().attr,i=r.name,a=n.instant("COMMON.CUSTOM_ATTRIBUTES.DELETE"),s=n.instant("COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE"),e.ask(a,s,i).then(function(t){var n,s;return s=function(){return o.loadCustomAttributes()["finally"](function(){return t.finish()})},n=function(){return e.notify("error",null,"We have not been able to delete '"+i+"'.")},o.deleteCustomAttribute(r).then(s,n)})},r.on("click",".js-delete-custom-field-button",g(2e3,function(t){var e,r;return t.preventDefault(),r=angular.element(t.currentTarget),e=r.closest("form"),u(e)}))},{link:i}},S.directive("tgProjectCustomAttributes",["$log","$tgConfirm","animationFrame","$translate",i]),o=function(t){function e(t,e,r,n,i,o,s){this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.model=o,this.projectService=s,this.mixingClass=C(this.mixingClass,this),this.cancelMixingTags=C(this.cancelMixingTags,this),this.confirmMixingTags=C(this.confirmMixingTags,this),this.toggleMixingFromTags=C(this.toggleMixingFromTags,this),this.startMixingTags=C(this.startMixingTags,this),this.deleteTag=C(this.deleteTag,this),this.editTag=C(this.editTag,this),this.createTag=C(this.createTag,this),this.filterAndSortTags=C(this.filterAndSortTags,this),this.loadTags=C(this.loadTags,this),this.loading=!0,this.loadTags()}return E(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$tgModel","tgProjectService"],e.prototype.loadTags=function(){var t;return t=this.projectService.project.toJS(),this.rs.projects.tagsColors(t.id).then(function(t){return function(e){return t.scope.projectTagsAll=_.map(e.getAttrs(),function(e,r){return t.model.make_model("tag",{name:r,color:e})}),t.filterAndSortTags(),t.loading=!1}}(this))},e.prototype.filterAndSortTags=function(){return this.scope.projectTags=_.sortBy(this.scope.projectTagsAll,function(t){return t.name.toLowerCase()}),this.scope.projectTags=_.filter(this.scope.projectTags,function(t){return function(e){return e.name.indexOf(t.scope.tagsFilter.name)!==-1}}(this))},e.prototype.createTag=function(t,e){return this.rs.projects.createTag(this.scope.projectId,t,e)},e.prototype.editTag=function(t,e,r){return t===e&&(e=null),this.rs.projects.editTag(this.scope.projectId,t,e,r)},e.prototype.deleteTag=function(t){return this.scope.loadingDelete=!0,this.rs.projects.deleteTag(this.scope.projectId,t)["finally"](function(t){return function(){return t.scope.loadingDelete=!1}}(this))},e.prototype.startMixingTags=function(t){return this.scope.mixingTags.toTag=t.name},e.prototype.toggleMixingFromTags=function(t){var e;if(t.name!==this.scope.mixingTags.toTag)return e=this.scope.mixingTags.fromTags.indexOf(t.name),e===-1?this.scope.mixingTags.fromTags.push(t.name):this.scope.mixingTags.fromTags.splice(e,1)},e.prototype.confirmMixingTags=function(){var t,e;return e=this.scope.mixingTags.toTag,t=this.scope.mixingTags.fromTags,this.scope.loadingMixing=!0,this.rs.projects.mixTags(this.scope.projectId,e,t).then(function(t){return function(){return t.cancelMixingTags(),t.loadTags()}}(this))["finally"](function(t){return function(){return t.scope.loadingMixing=!1}}(this))},e.prototype.cancelMixingTags=function(){return this.scope.mixingTags.toTag=null,this.scope.mixingTags.fromTags=[]},e.prototype.mixingClass=function(t){if(null!==this.scope.mixingTags.toTag){if(t.name===this.scope.mixingTags.toTag)return"mixing-tags-to";if(this.scope.mixingTags.fromTags.indexOf(t.name)!==-1)return"mixing-tags-from"}},e}(j.Controller),S.controller("ProjectTagsController",o),s=function(t,e,r,n,i,o,s){var a;return a=function(t,e,n){var i,a,c,u,l,p,h,f,d,m,v,y;return a=$(window),i=e.controller(),y=n.type,d=n.objname,p=function(){return t.newValue={tag:"",color:""}},h=function(){return t.tagsFilter={name:""}},l=function(){return t.mixingTags={toTag:null,fromTags:[]}},f=function(){return t.addNewElementText=o.instant("ADMIN.PROJECT_VALUES_TAGS.ACTION_ADD")},p(),h(),l(),f(),s.$on("$translateChangeEnd",function(){return t.$evalAsync(f)}),u=function(t){return function(t){var r;if(null==t&&(t=!1),r=e.find(".table-main"),$(document.body).scrollTop(r.offset().top+r.height()),t)return e.find(".new-value input:visible").first().focus()}}(this),v=function(e){return function(e){var r,n,o,s,a;if(n=e.parents("form"),r=n.checksley(),r.validate())return a=n.scope().tag,o=a.clone(),o.revert(),t.loadingEdit=!0,s=i.editTag(o.name,a.name,a.color),s.then(function(){return i.loadTags().then(function(){var r;return r=e.parents(".row.table-main"),r.addClass("hidden"),t.loadingEdit=!1,r.siblings(".visualization").removeClass("hidden")})}),s.then(null,function(e){return t.loadingEdit=!1,r.setErrors(e.data)})}}(this),m=function(e){return function(e){var r,n,o;if(n=e.parents("form"),n=e,r=n.checksley(),r.validate())return t.loadingCreate=!0,o=i.createTag(t.newValue.tag,t.newValue.color),o.then(function(r){return i.loadTags().then(function(){return t.loadingCreate=!1,e.addClass("hidden"),p()})}),o.then(null,function(e){return t.loadingCreate=!1,r.setErrors(e.data)})}}(this),c=function(e){var r,n,i;return n=e.parents(".row.table-main"),r=e.parents("form"),i=r.scope().tag,t.$apply(function(){return n.addClass("hidden"),i.revert(),n.siblings(".visualization").removeClass("hidden")})},t.$watch("tagsFilter.name",function(t){return i.filterAndSortTags()}),a.on("keyup",function(e){if(27===e.keyCode)return t.$apply(function(){return l()})}),e.on("click",".show-add-new",function(t){return t.preventDefault(),e.find(".new-value").removeClass("hidden")}),e.on("click",".add-new",g(2e3,function(t){var r;return t.preventDefault(),r=e.find(".new-value"),m(r)})),e.on("click",".delete-new",function(t){return t.preventDefault(),e.find(".new-value").addClass("hidden"),p()}),e.on("click",".mix-tags",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return i.startMixingTags(r.parents("form").scope().tag)})}),e.on("click",".mixing-row",function(e){var r;return e.preventDefault(),r=angular.element(e.currentTarget),t.$apply(function(){return i.toggleMixingFromTags(r.parents("form").scope().tag)})}),e.on("click",".mixing-confirm",function(e){return e.preventDefault(),e.stopPropagation(),t.$apply(function(){return i.confirmMixingTags()})}),e.on("click",".mixing-cancel",function(e){return e.preventDefault(),e.stopPropagation(),t.$apply(function(){return i.cancelMixingTags()})}),e.on("click",".edit-value",function(t){var e,r,n;return t.preventDefault(),n=angular.element(t.currentTarget),r=n.parents(".row.table-main"),r.addClass("hidden"),e=r.siblings(".edition"),e.removeClass("hidden"),e.find("input:visible").first().focus().select()}),e.on("keyup",".new-value input",function(t){var r;return 13===t.keyCode?(r=e.find(".new-value"),m(r)):27===t.keyCode?(e.find(".new-value").addClass("hidden"),p()):void 0}),e.on("keyup",".status-name input",function(t){var e;return e=angular.element(t.currentTarget),13===t.keyCode?v(e):27===t.keyCode?c(e):void 0}),e.on("click",".save",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),v(e)}),e.on("click",".cancel",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),c(e)}),e.on("click",".delete-tag",function(t){var e,n,s,a;return t.preventDefault(),s=angular.element(t.currentTarget),e=s.parents("form"),n=e.scope().tag,a=o.instant("ADMIN.COMMON.TITLE_ACTION_DELETE_TAG"),r.askOnDelete(a,n.name).then(function(t){var e,o;return o=function(){return i.loadTags()["finally"](function(){return t.finish()})},e=function(){return r.notify("error")},i.deleteTag(n.name).then(o,e)})}),t.$on("$destroy",function(){return e.off(),a.off()})},{link:a}},S.directive("tgProjectTags",["$log","$tgRepo","$tgConfirm","$tgLocation","animationFrame","$translate","$rootScope",s])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p=function(t,e){return function(){return t.apply(e,arguments)}},h=function(t,e){function r(){this.constructor=t}for(var n in e)f.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},f={}.hasOwnProperty,d=[].indexOf||function(t){for(var e=0,r=this.length;e\n
    \n
    <%- category.activePermissions %>/<%- category.permissions.length %>
    \n <% _.each(category.permissions, function(permission) { %>\n
    \n <% }) %>\n
    \n'),o=_.template('
    \n
    \n
    \n
    \n
    \n <% _.each(category.permissions, function(permission) { %>\n
    \n \n
    \n disabled="disabled" <% } %>\n <% if(permission.active) { %> checked="checked" <% } %>/>\n
    \n \n \n
    \n
    \n <% }) %>\n
    \n
    \n
    '),i=_.template('
    '),a=function(a,u,l){var p,h,f,g,m;return p=u.controller(),h=function(t){var e,r,n,i,o,s,c,u,l,p;return s=function(e){return _.map(e,function(e){var r;return _.extend({},e,{active:(r=e.key,d.call(t.permissions,r)>=0)})})},n=function(t,e,r){return!(e.external_user&&!r.is_private&&0===t.key.indexOf("view_"))},c=function(e){return _.map(e,function(e){return e.permissions=e.permissions.map(function(e){return e.editable=n(e,t,a.project),e}),_.extend({},e,{activePermissions:_.filter(e.permissions,"active").length})})},e=[],r=[{key:"view_epics",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.VIEW_EPICS"},{key:"add_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.ADD_EPICS"},{key:"modify_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.MODIFY_EPICS"},{key:"comment_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.COMMENT_EPICS"},{key:"delete_epic",name:"COMMON.PERMISIONS_CATEGORIES.EPICS.DELETE_EPICS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.EPICS.NAME",permissions:s(r)}),o=[{key:"view_milestones",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS"},{key:"add_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS"},{key:"modify_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS"},{key:"delete_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME",permissions:s(o)}),l=[{key:"view_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES"},{key:"add_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES"},{key:"modify_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES"},{key:"comment_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.COMMENT_USER_STORIES"},{key:"delete_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME",permissions:s(l)}),u=[{key:"view_tasks",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS"},{key:"add_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS"},{key:"modify_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS"},{key:"comment_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.COMMENT_TASKS"},{key:"delete_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME",permissions:s(u)}),i=[{key:"view_issues",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES"},{key:"add_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES"},{key:"modify_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES"},{key:"comment_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.COMMENT_ISSUES"},{key:"delete_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME",permissions:s(i)}),p=[{key:"view_wiki_pages",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES"},{key:"add_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES"},{key:"modify_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES"},{key:"delete_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES"},{key:"view_wiki_links",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS"},{key:"add_wiki_link",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS"},{key:"delete_wiki_link",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS"}],e.push({name:"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME",permissions:s(p)}),c(e)},m=function(t,e){return t.find(".resume").html(n(c({category:e}))(a))},f=function(t,e){var r;return r=o({category:t,index:e}),r=angular.element(r),m(r,t),n(r)(a)},g=function(){var n;return u.off(),n=i(),_.each(h(a.role),function(t,e){return n=angular.element(n).append(f(t,e))}),u.html(n),u.on("click",".resume",function(t){var e;return t.preventDefault(),e=angular.element(t.currentTarget),e.toggleClass("open-drawer"),e.next().toggleClass("open")}),u.on("change",".category-item input",function(n){var i,o,s,c;return i=function(){var t;return t=_.filter(u.find(".category-item input"),function(t){return angular.element(t).is(":checked")}),t=_.sortBy(_.map(t,function(t){var e;return e=angular.element(t).parents(".category-item").data("id")})),t.length&&t.push("view_project"),t},c=angular.element(n.currentTarget),a.role.permissions=i(),s=function(){var e,n;return e=h(a.role),n=c.parents(".category-config").data("id"),m(c.parents(".category-config"),e[n]),t.$broadcast("projects:reload"),r.notify("success"),p.forceLoadProject()},o=function(){return r.notify("error"),c.prop("checked",!c.prop("checked")),a.role.permissions=i()},a.role.external_user?(a.project.public_permissions=a.role.permissions,a.project.anon_permissions=a.role.permissions.filter(function(t){return 0===t.indexOf("view_")}),e.save(a.project).then(s,o)):e.save(a.role).then(s,o)})},a.$on("$destroy",function(){return u.off()}),a.$on("role:changed",function(){return g()}),s(a,l.ngModel,g)},{link:a}},u.directive("tgRolePermissions",["$rootScope","$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y,b=function(t,e){function r(){this.constructor=t}for(var n in e)S.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},S={}.hasOwnProperty;v=this.taiga,g=this.taiga.mixOf,f=this.taiga.bindMethods,d=this.taiga.debounce,y=this.taiga.timeout,m=angular.module("taigaAdmin"),h=function(t){function e(t,e,r,n,i,o,s,a,c,u){var l;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.location=i,this.navUrls=o,this.appMetaService=s,this.translate=a,this.errorHandlingService=c,this.projectService=u,f(this),this.scope.sectionName="ADMIN.WEBHOOKS.SECTION_NAME",this.scope.project={},l=this.loadInitialData(),l.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.WEBHOOKS.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),l.then(null,this.onInitialDataError.bind(this)),this.scope.$on("webhooks:reload",this.loadWebhooks)}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","$tgLocation","$tgNavUrls","tgAppMetaService","$translate","tgErrorHandlingService","tgProjectService"],e.prototype.loadWebhooks=function(){return this.rs.webhooks.list(this.scope.projectId).then(function(t){return function(e){return t.scope.webhooks=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),t.i_am_admin||this.errorHandlingService.permissionDenied(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadWebhooks()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("WebhooksController",h),p=function(t,e,r,n,i){var o;return o=function(n,o,s){var a,c,u,l,p,h,f,g;return g=n.$eval(s.tgWebhook),h=function(){var e;return e=i.instant("ADMIN.WEBHOOKS.DATE"),t.webhooklogs.list(g.id).then(function(t){return function(t){var r,n,i,o;for(r=0,n=t.length;r=1)return a.addClass("hidden")})}),s.on("click",function(t){return a.removeClass("hidden"),a.find("input")[0].focus()})},{link:o}},m.directive("tgNewWebhook",["$tgResources","$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",c]),r=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GITHUB.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GITHUB.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"github").then(function(t){return function(e){return t.scope.github=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){var t;return t=this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("GithubController",r),i=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GITLAB.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GITLAB.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(t){return function(){return t.loadModules()}}(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"gitlab").then(function(t){return function(e){return t.scope.gitlab=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("GitlabController",i),t=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.BITBUCKET.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.BITBUCKET.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(t){return function(){return t.loadModules()}}(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"bitbucket").then(function(t){return function(e){return t.scope.bitbucket=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),m.controller("BitbucketController",t),u=function(){var t;return t=function(t,e,r){return e.on("click",".select-input-content",function(){return e.find("input").select(),e.find(".help-copy").addClass("visible")})},{link:t}},m.directive("tgSelectInputText",u),n=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.github,"github"),c.then(function(){return n.trackEvent("github-webhook","created-or-changed","Create or changed github webhook",1),s.finish(),e.notify("success")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgGithubWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",n]),o=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.gitlab,"gitlab"),c.then(function(){return n.trackEvent("gitlab-webhook","created-or-changed","Create or changed gitlab webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgGitlabWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",o]),e=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.bitbucket,"bitbucket"),c.then(function(){return n.trackEvent("bitbucket-webhook","created-or-changed","Create or changed bitbucket webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c)},{link:i}},m.directive("tgBitbucketWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",e]),l=function(){var t;return t=function(t,e,r,n){return n.$parsers.push(function(t){return t=$.trim(t),""===t?[]:t.split(",")})},{link:t,restrict:"EA",require:"ngModel"}},m.directive("tgValidOriginIps",l),s=function(t){function e(t,e,r,n,i,o,s){var a;this.scope=t,this.repo=e,this.rs=r,this.params=n,this.appMetaService=i,this.translate=o,this.projectService=s,f(this),this.scope.sectionName=this.translate.instant("ADMIN.GOGS.SECTION_NAME"),this.scope.project={},a=this.loadInitialData(),a.then(function(t){return function(){var e,r;return r=t.translate.instant("ADMIN.GOGS.PAGE_TITLE",{projectName:t.scope.project.name}),e=t.scope.project.description,t.appMetaService.setAll(r,e)}}(this)),a.then(null,this.onInitialDataError.bind(this))}return b(e,t),e.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate","tgProjectService"],e.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"gogs").then(function(t){return function(e){return t.scope.gogs=e}}(this))},e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject(),this.loadModules()},e}(g(v.Controller,v.PageMixin,v.FiltersMixin)),a=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return a=o.find("form").checksley({onlyOneErrorElement:!0}),c=d(2e3,function(o){return function(o){var s,c;if(o.preventDefault(),a.validate())return s=r().target(u).start(),c=t.saveAttribute(i.gogs,"gogs"),c.then(function(){return n.trackEvent("gogs-webhook","create-or-change","Create or change gogs webhook",1),s.finish(),e.notify("success"),i.$emit("project:modules:reload")}),c.then(null,function(t){if(s.finish(),a.setErrors(t),t._error_message)return e.notify("error",t._error_message)})}}(this)),u=o.find(".submit-button"),o.on("submit","form",c),o.on("click",".submit-button",c)},{link:i}},m.controller("GogsController",s),m.directive("tgGogsWebhooks",["$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics",a])}.call(this),function(){var t,e,r,n,i,o;i=this.taiga,e=this.taiga.bindOnce,o=this.taiga.timeout,r=this.taiga.debounce,n=angular.module("taigaProject"),t=function(t,e,r,n,i,o,s,a,c,u){var l;return l=function(r,l,p){var h,f;return h=null,r.$on("deletelightbox:new",function(t,e){return s.open(l),h=e}),r.$on("$destroy",function(){return l.off()}),f=function(){var r;return a.start(),s.close(l),r=t.remove(h),r.then(function(t){return u.trackEvent("projects","delete","Delete project",1),a.pageLoaded(),e.$broadcast("projects:reload"),n.path(i.resolve("home")),o.notify("success"),c.loadProjects()}),r.then(null,function(){return o.notify("error"),s.close(l)})},l.on("click",".button-red",function(t){return t.preventDefault(),s.close(l)}),l.on("click",".button-green",function(t){return t.preventDefault(),f()})},{link:l}},n.directive("tgLbDeleteProject",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","$tgConfirm","lightboxService","tgLoader","tgCurrentUserService","$tgAnalytics",t])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u,l;u=this.taiga.bindOnce,r=function(){var t;return t=function(t,e,r){return u(t,r.tgBoBind,function(t){return e.text(t)})},{link:t}},i=function(){var t;return t=function(t,e,r){return u(t,r.tgBoHtml,function(t){return e.html(t)})},{link:t}},o=function(){var t;return t=function(t,e,r){return u(t,r.tgBoRef,function(t){return e.html("#"+t+" ")})},{link:t}},s=function(){var t;return t=function(t,e,r){return u(t,r.tgBoSrc,function(t){return e.attr("src",t)})},{link:t}},n=function(){var t;return t=function(t,e,r){return u(t,r.tgBoHref,function(t){return e.attr("href",t)})},{link:t}},e=function(){var t;return t=function(t,e,r){return u(t,r.tgBoAlt,function(t){return e.attr("alt",t)})},{link:t}},a=function(){var t;return t=function(t,e,r){return u(t,r.tgBoTitle,function(t){return e.attr("title",t)})},{link:t}},c=function(){var t;return t=function(t,e,r){return t.$watch(r.tgTitleHtml,function(t){if(null!=t)return e.attr("title",t)})},{link:t}},t=function(){var t;return t=function(t,e,r){return t.$watch(r.tgBindHtml,function(t){if(null!=t)return e.html(t)})},{link:t}},l=angular.module("taigaBase"),l.directive("tgBoBind",r),l.directive("tgBoHtml",i),l.directive("tgBoRef",o),l.directive("tgBoSrc",s),l.directive("tgBoHref",n),l.directive("tgBoAlt",e),l.directive("tgBoTitle",a),l.directive("tgBindTitle",c),l.directive("tgBindHtml",t)}.call(this),function(){var t,e;t=function(){function t(){this.config=window.taigaConfig}return t.prototype.get=function(t,e){return null==e&&(e=null),_.has(this.config,t)?this.config[t]:e},t}(),e=angular.module("taigaBase"),e.service("$tgConfig",t)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=angular.module("taigaBase"),t=function(t){function e(t,e,r,n,i,o,s){this.rootScope=t,this.scope=e,this.params=r,this.repo=n,this.rs=i,this.confirm=o,this.projectService=s,this.scope.currentPlugin=_.head(_.filter(this.rootScope.adminPlugins,{slug:this.params.plugin})),this.scope.projectSlug=this.params.pslug,this.loadInitialData()}return n(e,t),e.$inject=["$rootScope","$scope","$routeParams","$tgRepo","$tgResources","$tgConfirm","tgProjectService"],e.prototype.loadProject=function(){var t;return t=this.projectService.project.toJS(),this.scope.projectId=t.id,this.scope.project=t,this.scope.$emit("project:loaded",t),this.scope.$broadcast("project:loaded",t),t},e.prototype.loadInitialData=function(){return this.loadProject()},e}(taiga.Controller),r.controller("ContribController",t),e=function(t){function e(t,e,r){this.rootScope=t,this.scope=e,this.params=r,this.scope.currentPlugin=_.head(_.filter(this.rootScope.userSettingsPlugins,{slug:this.params.plugin}))}return n(e,t),e.$inject=["$rootScope","$scope","$routeParams"],e}(taiga.Controller),r.controller("ContribUserSettingsController",e)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga,t=function(t){function e(t,e){this.storage=t,this.params=e}return r(e,t),e.$inject=["$tgStorage","$routeParams"],e.prototype.generateHash=function(t){return null==t&&(t=[]),t=_.map(t,function(t){return JSON.stringify(t)}),hex_sha1(t.join(":"))},e}(e.Service)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,t=function(t){function e(t,r,n,i,o,s){this.http=t,this.q=r,this.storage=n,this.rootScope=i,this.cacheFactory=o,this.translate=s,e.__super__.constructor.call(this),this.cache=this.cacheFactory("httpget")}return n(e,t),e.$inject=["$http","$q","$tgStorage","$rootScope","$cacheFactory","$translate"],e.prototype.headers=function(){var t,e,r;return t={},r=this.storage.get("token"),r&&(t.Authorization="Bearer "+r),e=this.translate.preferredLanguage(),e&&(t["Accept-Language"]=e),t},e.prototype.request=function(t){return t.headers=_.assign({},t.headers||{},this.headers()),this.http(t)},e.prototype.get=function(t,e,r){return r=_.assign({method:"GET",url:t},r),e&&(r.params=e),r.cache=this.cache,this.request(r)["finally"](function(t){return function(e){return t.cache.removeAll()}}(this))},e.prototype.post=function(t,e,r,n){return n=_.assign({method:"POST",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype.put=function(t,e,r,n){return n=_.assign({method:"PUT",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype.patch=function(t,e,r,n){return n=_.assign({method:"PATCH",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e.prototype["delete"]=function(t,e,r,n){return n=_.assign({method:"DELETE",url:t},n),e&&(n.data=e),r&&(n.params=r),this.request(n)},e}(r.Service),e=angular.module("taigaBase"),e.service("$tgHttp",t)}.call(this),function(){var t,e;t=function(t,e,r){return t.noreload=function(r){var n,i;return n=e.current,i=r.$on("$locationChangeSuccess",function(){return e.current=n,i()}),t},t.isInCurrentRouteParams=function(e,r){var n;return n=t.search()||{},n[e]===r},t},e=angular.module("taigaBase"),e.factory("$tgLocation",["$location","$route","$rootScope",t])}.call(this),function(){var t,e,r,n,i,o=[].indexOf||function(t){for(var e=0,r=this.length;ef?(p=a.instant("PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED",{fileName:e.name,fileSize:r(e.size),maxFileSize:r(f)}),d={status:413,data:{_error_message:p}},l.reject(d),l.promise):(v=function(t){return function(t){var e,i;return i=Math.round(t.loaded/t.total*100),e=a.instant("PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE",{uploadedSize:r(t.loaded),totalSize:r(t.total)}),n("in-progress",null,e,i)}}(this),g=function(t){return function(t){return n("done",a.instant("PROJECT.IMPORT.TITLE"),a.instant("PROJECT.IMPORT.DESCRIPTION"))}}(this),m=function(t){return function(t){return n("error")}}(this),c=function(t){return function(t){var e;d={};try{d.data=JSON.parse(t.target.responseText)}catch(r){d.data={}}return d.status=t.target.status,t.target.getResponseHeader("Taiga-Info-Project-Is-Private")&&(d.headers={isPrivate:"True"===t.target.getResponseHeader("Taiga-Info-Project-Is-Private"),memberships:parseInt(t.target.getResponseHeader("Taiga-Info-Project-Memberships"))}),201!==(e=d.status)&&202!==e||l.resolve(d),l.reject(d)}}(this),h=function(t){return function(t){return l.reject("fail")}}(this),u=new FormData,u.append("dump",e),y=new XMLHttpRequest,y.upload.addEventListener("progress",v,!1),y.upload.addEventListener("load",g,!1),y.upload.addEventListener("error",m,!1),y.upload.addEventListener("abort",m,!1),y.addEventListener("load",c,!1),y.addEventListener("error",h,!1),y.open("POST",i.resolve("importer")),y.setRequestHeader("Authorization","Bearer "+o.getToken()),y.setRequestHeader("Accept","application/json"),y.send(u),l.promise)},c.changeLogo=function(e,o){var a,c,u,l,p,h;return u=t.get("maxUploadFileSize",null),u&&o.size>u?(p={status:413,data:{_error_message:"'"+o.name+"' ("+r(o.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(u)+")"}},c=s.defer(),c.reject(p),c.promise):(a=new FormData,a.append("logo",o),l={transformRequest:angular.identity,headers:{"Content-Type":void 0}},h=i.resolve("projects")+"/"+e+"/change_logo",n.post(h,a,{},l))},c.removeLogo=function(t){var e;return e=i.resolve("projects")+"/"+t+"/remove_logo",n.post(e)},function(t){return t.projects=c}},t=angular.module("taigaResources"),t.factory("$tgProjectsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$tgAuth","$q","$translate",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("roles",e)},n.list=function(e){return t.queryMany("roles",{project:e})},function(t){return t.roles=n}},t=angular.module("taigaResources"),t.factory("$tgRolesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r,n){var i;return i={},i["do"]=function(t,i){var o,s,a,c;return o=n.defer(),c=e.resolve("search"),s={url:c,method:"GET",timeout:o.promise,cancelable:!0,params:{project:t,text:i,get_all:!1}},a=r.request(s).then(function(t){return t.data}),a.abort=function(){return o.resolve()},a["finally"]=function(){return a.abort=angular.noop,o=a=null},a},function(t){return t.search=i}},t=angular.module("taigaResources"),t.factory("$tgSearchResourcesProvider",["$tgRepo","$tgUrls","$tgHttp","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(t,e,r){var n;return n={},n.get=function(r,n){return t.queryOne("milestones",n).then(function(t){var r;return r=t.user_stories,r=_.map(r,function(t){return e.make_model("userstories",t)}),t._attrs.user_stories=r,t})},n.stats=function(e,r){return t.queryOneRaw("milestones",r+"/stats")},n.list=function(r,n){var i;return i={project:r},i=_.extend({},i,n||{}),t.queryMany("milestones",i,{},!0).then(function(t){return function(t){var r,n,i,o,s,a;for(s=t[0],r=t[1],n=0,i=s.length;nc?(l={status:413,data:{_error_message:"'"+e.name+"' ("+r(e.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(c)+")"}},a=o.defer(),a.reject(l),a.promise):(s=new FormData,s.append("avatar",e),u={transformRequest:angular.identity,headers:{"Content-Type":void 0}},p=i.resolve("users")+"/change_avatar",n.post(p,s,{},u))},s.removeAvatar=function(){var t;return t=i.resolve("users")+"/remove_avatar",n.post(t)},s.changePassword=function(t,e){var r,o;return o=i.resolve("users")+"/change_password",r={current_password:t,password:e},n.post(o,r)},function(t){return t.userSettings=s}},t=angular.module("taigaResources"),t.factory("$tgUserSettingsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,e=function(t,e){var r;return r={},r.contacts=function(r,n){var i,o;return null==n&&(n={}),o=e.resolve("user-contacts",r),i={headers:{}},n.enablePagination||(i.headers["x-disable-pagination"]="1"),t.get(o,{},i).then(function(t){return t.data})},function(t){return t.users=r}},t=angular.module("taigaResources"),t.factory("$tgUsersResourcesProvider",["$tgHttp","$tgUrls","$q",e])}.call(this),function(){var t,e,r,n;n=this.taiga,t=n.generateHash,r=function(e,r,n,i,o){var s,a;return a={},s="userstories-queryparams",a.get=function(t,r,n){var i;return i=a.getQueryParams(t),i.project=t,i=_.extend({},i,n),e.queryOne("userstories",r,i)},a.getByRef=function(t,r,n){var i;return null==n&&(n={}),i=a.getQueryParams(t),i.project=t,i.ref=r,i=_.extend({},i,n),e.queryOne("userstories","by_ref",i)},a.listInAllProjects=function(t){return e.queryMany("userstories",t)},a.filtersData=function(t){return e.queryOneRaw("userstories-filters",null,t)},a.listUnassigned=function(t,r,n){var i;return i={project:t,milestone:"null"},i=_.extend({},i,r||{}),a.storeQueryParams(t,i),e.queryMany("userstories",_.extend(i,{page_size:n}),{enablePagination:!0},!0)},a.listAll=function(t,r){var n;return n={project:t},n=_.extend({},n,r||{}),a.storeQueryParams(t,n),e.queryMany("userstories",n)},a.bulkCreate=function(t,e,i){var o,s;return o={project_id:t,status_id:e,bulk_stories:i},s=n.resolve("bulk-create-us"),r.post(s,o)},a.upvote=function(t){var e;return e=n.resolve("userstory-upvote",t),r.post(e)},a.downvote=function(t){var e;return e=n.resolve("userstory-downvote",t),r.post(e)},a.watch=function(t){var e;return e=n.resolve("userstory-watch",t),r.post(e)},a.unwatch=function(t){var e;return e=n.resolve("userstory-unwatch",t),r.post(e)},a.bulkUpdateBacklogOrder=function(t,e){var i,o;return o=n.resolve("bulk-update-us-backlog-order"),i={project_id:t,bulk_stories:e},r.post(o,i)},a.bulkUpdateMilestone=function(t,e,i){var o,s;return s=n.resolve("bulk-update-us-milestone"),o={project_id:t,milestone_id:e,bulk_stories:i},r.post(s,o)},a.bulkUpdateKanbanOrder=function(t,e,i){var o,s;return s=n.resolve("bulk-update-us-kanban-order"),o={project_id:t,status_id:e,bulk_stories:i},r.post(s,o)},a.listValues=function(t,r){var n;return n={project:t},a.storeQueryParams(t,n),e.queryMany(r,n)},a.storeQueryParams=function(e,r){var n,o;return o=e+":"+s,n=t([e,o]),i.set(n,r)},a.getQueryParams=function(e){var r,n;return n=e+":"+s,r=t([e,n]),i.get(r)||{}},a.storeShowTags=function(e,r){var n;return n=t([e,"showTags"]),i.set(n,r)},a.getShowTags=function(e){var r;return r=t([e,"showTags"]),i.get(r)||null},function(t){return t.userstories=a}},e=angular.module("taigaResources"),e.factory("$tgUserstoriesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage","$q",r])}.call(this),function(){var t,e;e=function(t,e,r){var n;return n={},n.list=function(e){var r;return r={webhook:e},t.queryMany("webhooklogs",r)},n.resend=function(t){var n;return n=e.resolve("webhooklogs-resend",t),r.post(n)},function(t){return t.webhooklogs=n}},t=angular.module("taigaResources"),t.factory("$tgWebhookLogsResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e;e=function(t,e,r){var n;return n={},n.list=function(e){var r;return r={project:e},t.queryMany("webhooks",r)},n.test=function(t){var n;return n=e.resolve("webhooks-test",t),r.post(n)},function(t){return t.webhooks=n}},t=angular.module("taigaResources"),t.factory("$tgWebhooksResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",e])}.call(this),function(){var t,e,r;r=this.taiga,e=function(t,e,r){var n;return n={},n.get=function(e){return t.queryOne("wiki",e)},n.getBySlug=function(e,r){return t.queryOne("wiki","by_slug?project="+e+"&slug="+r)},n.list=function(e){return t.queryMany("wiki",{project:e})},n.listLinks=function(e){return t.queryMany("wiki-links",{project:e})},function(t){return t.wiki=n}},t=angular.module("taigaResources"),t.factory("$tgWikiResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",e])}.call(this),function(){var t,e,r,n,i,o,s=function(t,e){function r(){this.constructor=t}for(var n in e)a.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},a={}.hasOwnProperty;o=this.taiga,n=this.taiga.mixOf,r=this.taiga.debounce,i=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.translate=l,this.scope.sectionName=this.translate.instant("CHANGE_PASSWORD.SECTION_NAME"),this.scope.user=this.auth.getUser()}return s(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate"], +e}(n(o.Controller,o.PageMixin)),i.controller("UserChangePasswordController",t),e=function(t,e,n,i){var o;return o=function(o,s,a,c){var u,l,p;return u=new checksley.Form(s.find("form")),l=r(2e3,function(r){return function(r){var s,a;if(r.preventDefault(),u.validate())return o.newPassword1!==o.newPassword2?void e.notify("error",i.instant("CHANGE_PASSWORD.ERROR_PASSWORD_MATCH")):(s=n().target(p).start(),a=t.userSettings.changePassword(o.currentPassword,o.newPassword1),a.then(function(){return s.finish(),e.notify("success")}),a.then(null,function(t){return s.finish(),e.notify("error",t.data._error_message)}))}}(this)),p=s.find(".submit-button"),s.on("submit","form",l),o.$on("$destroy",function(){return s.off()})},{link:o}},i.directive("tgUserChangePassword",["$tgResources","$tgConfirm","$tgLoading","$translate",e])}.call(this),function(){var t,e,r,n,i;i=this.taiga,e=this.taiga.bindOnce,r=this.taiga.debounce,n=angular.module("taigaUserSettings"),t=function(t,e,n,i,o,s,a){var c;return c=function(e,c,u){var l,p;return e.$on("deletelightbox:new",function(t,e){return s.open(c)}),e.$on("$destroy",function(){return c.off()}),l=function(){var r,u;return r=a().target(p).start(),u=t.remove(e.user),u.then(function(t){return r.finish(),s.close(c),n.logout(),i.path(o.resolve("login"))}),u.then(null,function(){return r.finish(),console.log("FAIL")})},c.on("click",".button-green",function(t){return t.preventDefault(),s.close(c)}),c.on("click",".button-red",r(2e3,function(t){return t.preventDefault(),l()})),p=c.find(".button-red")},{link:c,templateUrl:"user/lightbox/lightbox-delete-account.html"}},n.directive("tgLbDeleteUser",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","lightboxService","$tgLoading",t])}.call(this),function(){var t,e,r,n,i,o,s,a=function(t,e){function r(){this.constructor=t}for(var n in e)c.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},c={}.hasOwnProperty;s=this.taiga,i=this.taiga.mixOf,n=this.taiga.bindOnce,o=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.errorHandlingService=l,this.scope.sectionName="USER_SETTINGS.NOTIFICATIONS.LIVE_SECTION_NAME",this.scope.user=this.auth.getUser(),p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return a(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","tgErrorHandlingService"],e.prototype.loadInitialData=function(){return this.rs.notifyPolicies.list().then(function(t){return function(e){return t.scope.notifyPolicies=e,e}}(this))},e}(i(s.Controller,s.PageMixin)),o.controller("UserLiveNotificationsController",t),e=function(){var t;return t=function(t,e,r){return t.$on("$destroy",function(){return e.off()})},{link:t}},o.directive("tgUserLiveNotifications",e),r=function(t,e,r){var i,o;return o=_.template('<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\n
    \n
    <%- notifyPolicy.project_name %>
    \n
    \n
    \n checked="checked"<% } %>/>\n \n
    \n
    \n
    \n
    \n checked="checked"<% } %> />\n \n
    \n
    \n
    \n
    \n checked="checked"<% } %> />\n \n
    \n
    \n
    \n<% }) %>'),i=function(i,s,a){var c;return c=function(){var n,a;return s.off(),n={notifyPolicies:i.notifyPolicies},a=o(n),s.html(r(a)(i)),s.on("change","input[type=radio]",function(r){var n,o,s,a,c,u;return u=angular.element(r.currentTarget),a=u.parents(".policy-table-row").data("index"),s=i.notifyPolicies[a],c=s.live_notify_level,s.live_notify_level=parseInt(u.val(),10),o=function(){return e.notify("success")},n=function(){return e.notify("error"),u.parents(".policy-table-row").find("input[value="+c+"]").prop("checked",!0)},t.save(s).then(o,n)})},i.$on("$destroy",function(){return s.off()}),n(i,a.ngModel,c)},{link:i}},o.directive("tgUserLiveNotificationsList",["$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){var t,e,r,n,i,o,s,a,c,u=function(t,e){function r(){this.constructor=t}for(var n in e)l.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},l={}.hasOwnProperty;c=this.taiga,o=this.taiga.mixOf,a=this.taiga.sizeFormat,s=angular.module("taigaUserSettings"),i=this.taiga.debounce,n=function(t){function e(t,e,r,n,i,o,s,c,u,l,p,h,f,d){var g,m,v;this.scope=t,this.rootscope=e,this.config=r,this.repo=n,this.confirm=i,this.rs=o,this.params=s,this.q=c,this.location=u,this.navUrls=l,this.auth=p,this.translate=h,this.errorHandlingService=f,this.window=d,this.scope.sectionName="USER_SETTINGS.MENU.SECTION_TITLE",this.scope.project={},this.scope.user=this.auth.getUser(),this.scope.user||this.errorHandlingService.permissionDenied(),this.scope.lang=this.getLan(),this.scope.theme=this.getTheme(),g=this.config.get("maxUploadFileSize",null),g&&(v=this.translate.instant("USER_SETTINGS.AVATAR_MAX_SIZE",{maxFileSize:a(g)}),this.scope.maxFileSizeMsg=v),m=this.loadInitialData(),m.then(null,this.onInitialDataError.bind(this))}return u(e,t),e.$inject=["$scope","$rootScope","$tgConfig","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate","tgErrorHandlingService","$window"],e.prototype.loadInitialData=function(){return this.scope.availableThemes=this.config.get("themes",[]),this.rs.locales.list().then(function(t){return function(e){return t.scope.locales=e,e}}(this))},e.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.user)},e.prototype.getLan=function(){return this.scope.user.lang||this.translate.preferredLanguage()},e.prototype.getTheme=function(){return this.scope.user.theme||this.config.get("defaultTheme")||"taiga"},e.prototype.exportProfile=function(){var t,e;return e=function(t){var e;return e=t.data.url,this.window.open(e,"_blank")},t=function(t){return function(e){var r;if(null!=(r=e.data)?r._error_message:void 0)return t.confirm.notify("error",e.data._error_message)}}(this),this.auth.exportProfile().then(e,t)},e}(o(c.Controller,c.PageMixin)),s.controller("UserSettingsController",n),r=function(t,e,r,n){var o;return o=function(o,s,a){var c;return c=i(2e3,function(i){return function(i){var a,c,u,l;if(i.preventDefault(),c=s.find("form").checksley(),c.validate())return a=o.user.isAttributeModified("email"),o.user.lang=o.lang,o.user.theme=o.theme,l=function(r){var i;return e.setUser(r),a?(i=n.instant("USER_PROFILE.CHANGE_EMAIL_SUCCESS"),t.success(i)):t.notify("success")},u=function(e){return c.setErrors(e),t.notify("error",e._error_message)},r.save(o.user).then(l,u)}}(this)),s.on("submit","form",c),o.$on("$destroy",function(){return s.off()})},{link:o}},s.directive("tgUserProfile",["$tgConfirm","$tgAuth","$tgRepo","$translate",r]),e=function(t,e,r,n){var i;return i=function(i,o,s){var a,c,u;return u=function(){return o.find(".size-info").removeClass("hidden")},c=function(r){var s;return s=e.make_model("users",r.data),t.setUser(s),i.user=s,o.find(".loading-overlay").removeClass("active"),n.notify("success")},a=function(t){return 413===t.status&&u(),o.find(".loading-overlay").removeClass("active"),n.notify("error",t.data._error_message)},o.on("click",".js-change-avatar",function(){return o.find("#avatar-field").click()}),o.on("change","#avatar-field",function(t){if(i.avatarAttachment)return o.find(".loading-overlay").addClass("active"),r.userSettings.changeAvatar(i.avatarAttachment).then(c,a)}),o.on("click","a.js-use-gravatar",function(t){return o.find(".loading-overlay").addClass("active"),r.userSettings.removeAvatar().then(c,a)}),i.$on("$destroy",function(){return o.off()})},{link:i}},s.directive("tgUserAvatar",["$tgAuth","$tgModel","$tgResources","$tgConfirm",e]),t=function(t){var e;return e=function(e,r,n){var i,o;return i=t(n.tgAvatarModel),o=i.assign,r.bind("change",function(){return e.$apply(function(){return o(e,r[0].files[0])})})},{link:e}},s.directive("tgAvatarModel",["$parse",t])}.call(this),function(){var t,e;t=function(){var t;return t=function(t,e,r){var n;return n=r.tgUserSettingsNavigation,e.find(".active").removeClass("active"),e.find("#usersettingsmenu-"+n+" a").addClass("active"),t.$on("$destroy",function(){return e.off()})},{link:t}},e=angular.module("taigaUserSettings"),e.directive("tgUserSettingsNavigation",t)}.call(this),function(){var t,e,r,n,i,o,s,a=function(t,e){function r(){this.constructor=t}for(var n in e)c.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},c={}.hasOwnProperty;s=this.taiga,i=this.taiga.mixOf,n=this.taiga.bindOnce,o=angular.module("taigaUserSettings"),t=function(t){function e(t,e,r,n,i,o,s,a,c,u,l){var p;this.scope=t,this.rootscope=e,this.repo=r,this.confirm=n,this.rs=i,this.params=o,this.q=s,this.location=a,this.navUrls=c,this.auth=u,this.errorHandlingService=l,this.scope.sectionName="USER_SETTINGS.NOTIFICATIONS.SECTION_NAME",this.scope.user=this.auth.getUser(),p=this.loadInitialData(),p.then(null,this.onInitialDataError.bind(this))}return a(e,t),e.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","tgErrorHandlingService"],e.prototype.loadInitialData=function(){return this.rs.notifyPolicies.list().then(function(t){return function(e){return t.scope.notifyPolicies=e,e}}(this))},e}(i(s.Controller,s.PageMixin)),o.controller("UserNotificationsController",t),e=function(){var t;return t=function(t,e,r){return t.$on("$destroy",function(){return e.off()})},{link:t}},o.directive("tgUserNotifications",e),r=function(t,e,r){var i,o;return o=_.template('<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\n
    \n
    <%- notifyPolicy.project_name %>
    \n
    \n
    \n checked="checked"<% } %>/>\n \n
    \n
    \n
    \n
    \n checked="checked"<% } %> />\n \n
    \n
    \n
    \n
    \n checked="checked"<% } %> />\n \n
    \n
    \n
    \n<% }) %>'),i=function(i,s,a){var c;return c=function(){var n,a;return s.off(),n={notifyPolicies:i.notifyPolicies},a=o(n),s.html(r(a)(i)),s.on("change","input[type=radio]",function(r){var n,o,s,a,c,u;return u=angular.element(r.currentTarget),a=u.parents(".policy-table-row").data("index"),s=i.notifyPolicies[a],c=s.notify_level,s.notify_level=parseInt(u.val(),10),o=function(){return e.notify("success")},n=function(){return e.notify("error"),u.parents(".policy-table-row").find("input[value="+c+"]").prop("checked",!0)},t.save(s).then(o,n)})},i.$on("$destroy",function(){return s.off()}),n(i,a.ngModel,c)},{link:i}},o.directive("tgUserNotificationsList",["$tgRepo","$tgConfirm","$compile",r])}.call(this),function(){angular.module("taigaComponents",[])}.call(this),function(){var t;t=angular.module("taigaDiscover",[])}.call(this),function(){var t;t=angular.module("taigaExternalApps",[])}.call(this),function(){angular.module("taigaHistory",[])}.call(this),function(){var t;t=angular.module("taigaHome",[])}.call(this),function(){angular.module("taigaNavigationBar",[])}.call(this),function(){var t;t=angular.module("taigaProfile",[])}.call(this),function(){angular.module("taigaProjects",[])}.call(this),function(){angular.module("taigaResources2",[])}.call(this),function(){angular.module("taigaUserTimeline",[])}.call(this),function(){var t;t=angular.module("taigaUtils",[])}.call(this),function(){angular.module("taigaWikiHistory",[])}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{templateUrl:"components/assigned-to/assigned-item/assigned-item.html",scope:{member:"="},link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedItem",t)}.call(this),function(){var t;t=function(){function t(){this.assigned&&this._getAssignedMember(),this._filterAssignedMember()}return t.$inject=[],t.prototype._getAssignedMember=function(){return this.assignedMember=_.filter(this.project.members,function(t){return function(e){return e.id===t.assigned.get("id")}}(this))},t.prototype._filterAssignedMember=function(){return this.assigned?this.nonAssignedMembers=_.filter(this.project.members,function(t){return function(e){return e.id!==t.assigned.get("id")}}(this)):this.nonAssignedMembers=this.project.members},t}(),angular.module("taigaComponents").controller("AssignedToSelectorCtrl",t)}.call(this),function(){var t;t=function(){return{controller:"AssignedToSelectorCtrl",controllerAs:"vm",bindToController:!0,templateUrl:"components/assigned-to/assigned-to-selector/assigned-to-selector.html",scope:{assigned:"=",project:"=",onRemoveAssigned:"&",onAssignTo:"&"}}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedToSelector",t)}.call(this),function(){var t;t=function(){function t(t,e){this.lightboxFactory=t,this.lightboxService=e,this.has_permissions=_.includes(this.project.my_permissions,"modify_epic")}return t.$inject=["tgLightboxFactory","lightboxService"],t.prototype._closeAndRemoveAssigned=function(){return this.lightboxService.closeAll(),this.onRemoveAssigned()},t.prototype._closeAndAssign=function(t){return this.lightboxService.closeAll(),this.onAssignTo({member:t})},t.prototype.onSelectAssignedTo=function(t,e){return this.lightboxFactory.create("tg-assigned-to-selector",{"class":"lightbox lightbox-assigned-to-selector open",assigned:"assigned",project:"project","on-remove-assigned":"onRemoveAssigned()","on-assign-to":"assignTo(member)"},{assigned:this.assignedTo,project:this.project,onRemoveAssigned:this._closeAndRemoveAssigned.bind(this),assignTo:this._closeAndAssign.bind(this)})},t}(),angular.module("taigaComponents").controller("AssignedToCtrl",t)}.call(this),function(){var t;t=function(){return{controller:"AssignedToCtrl",controllerAs:"vm",bindToController:!0,templateUrl:"components/assigned-to/assigned-to.html",scope:{assignedTo:"=",project:"=",onRemoveAssigned:"&",onAssignTo:"&"}}},t.$inject=[],angular.module("taigaComponents").directive("tgAssignedToComponent",t)}.call(this),function(){var t;t=function(t,e,r){var n;return n=function(n,i,o){var s;return s=t(o.tgAttachmentLink)(n),i.on("click",function(t){return taiga.isImage(s.getIn(["file","name"]))?(t.preventDefault(),n.$apply(function(){return r.open($("tg-attachments-preview")),e.fileId=s.getIn(["file","id"])})):taiga.isPdf(s.getIn(["file","name"]))?(t.preventDefault(),window.open(s.getIn(["file","url"]))):void 0}),n.$on("$destroy",function(){return i.off()})},{link:n}},t.$inject=["$parse","tgAttachmentsPreviewService","lightboxService"],angular.module("taigaComponents").directive("tgAttachmentLink",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment-gallery.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentGallery",t)}.call(this),function(){var t;t=function(){function t(t,e){this.attachmentsService=t,this.translate=e,this.form={},this.form.description=this.attachment.getIn(["file","description"]),this.form.is_deprecated=this.attachment.get(["file","is_deprecated"]),this.title=this.translate.instant("ATTACHMENT.TITLE",{fileName:this.attachment.get("name"),date:moment(this.attachment.get("created_date")).format(this.translate.instant("ATTACHMENT.DATE"))})}return t.$inject=["tgAttachmentsService","$translate"],t.prototype.editMode=function(t){var e;return e=this.attachment.set("editable",t),this.onUpdate({attachment:e})},t.prototype["delete"]=function(){return this.onDelete({attachment:this.attachment})},t.prototype.save=function(){var t;return t=this.attachment.set("loading",!0),this.onUpdate({attachment:t}),t=this.attachment.merge({editable:!1,loading:!1}),t=t.mergeIn(["file"],{description:this.form.description,is_deprecated:!!this.form.is_deprecated}),this.onUpdate({attachment:t})},t}(),angular.module("taigaComponents").controller("Attachment",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachment",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i;return i=t(n.tgAttachmentsDrop),r.on("dragover",function(t){return t.preventDefault(),!1}),r.on("drop",function(t){var r;return t.stopPropagation(),t.preventDefault(),r=t.dataTransfer||t.originalEvent&&t.originalEvent.dataTransfer,e.$apply(function(){return i(e,{files:r.files})})}),e.$on("$destroy",function(){return r.off()})},{link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsDrop",t)}.call(this),function(){var t,e;e=this.taiga.sizeFormat,t=function(){function t(t,r,n,i,o,s,a){this.translate=t,this.confirm=r,this.config=n,this.storage=i,this.attachmentsFullService=o,this.projectService=s,this.attachmentsPreviewService=a,this.mode=this.storage.get("attachment-mode","list"),this.maxFileSize=this.config.get("maxUploadFileSize",null),this.maxFileSize&&(this.maxFileSize=e(this.maxFileSize)),this.maxFileSizeMsg=this.maxFileSize?this.translate.instant("ATTACHMENT.MAX_UPLOAD_SIZE",{maxFileSize:this.maxFileSize}):"",taiga.defineImmutableProperty(this,"attachments",function(t){return function(){return t.attachmentsFullService.attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(t){return function(){return t.attachmentsFullService.deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(t){return function(){return t.attachmentsFullService.attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(t){return function(){return t.attachmentsFullService.deprecatedsVisible}}(this))}return t.$inject=["$translate","$tgConfirm","$tgConfig","$tgStorage","tgAttachmentsFullService","tgProjectService","tgAttachmentsPreviewService"],t.prototype.uploadingAttachments=function(){return this.attachmentsFullService.uploadingAttachments},t.prototype.addAttachment=function(t){var e;return e="list"===this.mode,this.attachmentsFullService.addAttachment(this.projectId,this.objId,this.type,t,e)},t.prototype.setMode=function(t){return this.mode=t,this.storage.set("attachment-mode",t)},t.prototype.toggleDeprecatedsVisible=function(){return this.attachmentsFullService.toggleDeprecatedsVisible()},t.prototype.addAttachments=function(t){return _.forEach(t,function(t){return function(e){return t.addAttachment(e)}}(this))},t.prototype.loadAttachments=function(){return this.attachmentsFullService.loadAttachments(this.type,this.objId,this.projectId)},t.prototype.deleteAttachment=function(t){var e,r;return this.attachmentsPreviewService.fileId=null,r=this.translate.instant("ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT"),e=this.translate.instant("ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT",{fileName:t.getIn(["file","name"])}),this.confirm.askOnDelete(r,e).then(function(r){return function(n){var i,o;return i=function(){return e=r.translate.instant("ATTACHMENT.ERROR_DELETE_ATTACHMENT",{errorMessage:e}),r.confirm.notify("error",null,e),n.finish(!1)},o=function(){return n.finish()},r.attachmentsFullService.deleteAttachment(t,r.type).then(o,i)}}(this))},t.prototype.reorderAttachment=function(t,e){return this.attachmentsFullService.reorderAttachment(this.type,t,e)},t.prototype.updateAttachment=function(t){return this.attachmentsFullService.updateAttachment(t,this.type)},t.prototype._isEditable=function(){return!!this.projectService.project&&this.projectService.hasPermission(this.editPermission)},t.prototype.showAttachments=function(){return this._isEditable()||this.attachmentsFullService.attachments.size},t}(),angular.module("taigaComponents").controller("AttachmentsFull",t)}.call(this),function(){var t,e;e=this.taiga.bindOnce,t=function(){var t;return t=function(t,r,n,i){return e(t,"vm.objId",function(t){return i.loadAttachments()})},{scope:{},bindToController:{type:"@",objId:"=",projectId:"=",editPermission:"@"},controller:"AttachmentsFull",controllerAs:"vm",templateUrl:"components/attachments-full/attachments-full.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsFull",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.attachmentsService=t,this.rootScope=e,this._attachments=Immutable.List(),this._deprecatedsCount=0,this._attachmentsVisible=Immutable.List(),this._deprecatedsVisible=!1,this.uploadingAttachments=[],taiga.defineImmutableProperty(this,"attachments",function(t){return function(){return t._attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(t){return function(){return t._deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(t){return function(){return t._attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(t){return function(){return t._deprecatedsVisible}}(this))}return e(r,t),r.$inject=["tgAttachmentsService","$rootScope"],r.prototype.toggleDeprecatedsVisible=function(){return this._deprecatedsVisible=!this._deprecatedsVisible,this.regenerate()},r.prototype.regenerate=function(){return this._deprecatedsCount=this._attachments.count(function(t){return t.getIn(["file","is_deprecated"])}),this._deprecatedsVisible?this._attachmentsVisible=this._attachments:this._attachmentsVisible=this._attachments.filter(function(t){return!t.getIn(["file","is_deprecated"])})},r.prototype.addAttachment=function(t,e,r,n,i,o){return null==i&&(i=!0),null==o&&(o=!1),new Promise(function(s){return function(a,c){var u;return s.attachmentsService.validate(n)?(s.uploadingAttachments.push(n),u=s.attachmentsService.upload(n,e,t,r,o),u.then(function(t){var e;return s.uploadingAttachments=s.uploadingAttachments.filter(function(e){return e.name!==t.get("name")}),e=Immutable.Map(),e=e.merge({file:t,editable:i,loading:!1,from_comment:o}),s._attachments=s._attachments.push(e),s.regenerate(),s.rootScope.$broadcast("attachment:create"),a(e)})):c(new Error(n))}}(this))},r.prototype.loadAttachments=function(t,e,r){return this.attachmentsService.list(t,e,r).then(function(t){return function(e){return t._attachments=e.map(function(t){var e;return e=Immutable.Map(),e.merge({loading:!1,editable:!1,file:t})}),t.regenerate()}}(this))},r.prototype.deleteAttachment=function(t,e){var r;return r=function(e){return function(){return e._attachments=e._attachments.filter(function(e){return e!==t}),e.regenerate()}}(this),this.attachmentsService["delete"](e,t.getIn(["file","id"])).then(r)},r.prototype.reorderAttachment=function(t,e,r){var n,i,o;if(i=this.attachments.findIndex(function(t){return t===e}),i!==r)return n=this.attachments.remove(i),n=n.splice(r,0,e),n=n.map(function(t,e){return t.setIn(["file","order"],e+1)}),o=[],n.forEach(function(e){return function(r){var n;return n={order:r.getIn(["file","order"])},o.push(e.attachmentsService.patch(r.getIn(["file","id"]),t,n))}}(this)),Promise.all(o).then(function(t){return function(){return t._attachments=n,t.regenerate()}}(this))},r.prototype.updateAttachment=function(t,e){var r,n,i;return r=this._attachments.findIndex(function(e){return e.getIn(["file","id"])===t.getIn(["file","id"])}),n=this._attachments.get(r),i=taiga.patch(n.get("file"),t.get("file")),t.get("loading")?(this._attachments=this._attachments.set(r,t),this.regenerate()):this.attachmentsService.patch(t.getIn(["file","id"]),e,i).then(function(e){return function(){return e._attachments=e._attachments.set(r,t),e.regenerate()}}(this))},r}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsFullService",t)}.call(this),function(){var t;t=function(){function t(t){this.attachmentsPreviewService=t,taiga.defineImmutableProperty(this,"current",function(t){return function(){return t.attachmentsPreviewService.fileId?t.getCurrent():null}}(this))}return t.$inject=["tgAttachmentsPreviewService"],t.prototype.hasPagination=function(){var t;return t=this.attachments.filter(function(t){return function(t){return taiga.isImage(t.getIn(["file","name"]))}}(this)),t.size>1},t.prototype.getCurrent=function(){var t,e;return t=this.attachments.find(function(t){return function(e){return t.attachmentsPreviewService.fileId===e.getIn(["file","id"])}}(this)),e=t.get("file")},t.prototype.getIndex=function(){return this.attachments.findIndex(function(t){return function(e){return t.attachmentsPreviewService.fileId===e.getIn(["file","id"])}}(this))},t.prototype.next=function(){var t,e;return t=this.getIndex(),e=this.attachments.slice(t+1).find(function(t){return taiga.isImage(t.getIn(["file","name"]))}),e||(e=this.attachments.find(function(t){return taiga.isImage(t.getIn(["file","name"]))})),this.attachmentsPreviewService.fileId=e.getIn(["file","id"])},t.prototype.previous=function(){var t,e;return t=this.getIndex(),e=this.attachments.slice(0,t).findLast(function(t){return taiga.isImage(t.getIn(["file","name"]))}),e||(e=this.attachments.findLast(function(t){return taiga.isImage(t.getIn(["file","name"]))})),this.attachmentsPreviewService.fileId=e.getIn(["file","id"])},t}(),angular.module("taigaComponents").controller("AttachmentsPreview",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){return $(document.body).on("keydown.image-preview",function(r){return e.fileId&&(39===r.keyCode?i.next():37===r.keyCode&&i.previous()),t.$digest()}),t.$on("$destroy",function(){return $(document.body).off(".image-preview")})},{scope:{},controller:"AttachmentsPreview",templateUrl:"components/attachments-preview/attachments-preview.html",link:r,controllerAs:"vm",bindToController:{attachments:"="}}},angular.module("taigaComponents").directive("tgAttachmentsPreview",["lightboxService","tgAttachmentsPreviewService",t])}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){}return e(r,t),r.$inject=[],r}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsPreviewService",t)}.call(this),function(){var t;t=function(){function t(t){this.attachmentsService=t}return t.$inject=["tgAttachmentsService"],t.prototype.addAttachment=function(t){var e;if(e=Immutable.fromJS({file:t,name:t.name,size:t.size}),this.attachmentsService.validate(t)&&(this.attachments=this.attachments.push(e),this.onAdd))return this.onAdd({attachment:e})},t.prototype.addAttachments=function(t){return _.forEach(t,this.addAttachment.bind(this))},t.prototype.deleteAttachment=function(t){if(this.attachments=this.attachments.filter(function(e){return e!==t}),this.onDelete)return this.onDelete({attachment:t})},t}(),angular.module("taigaComponents").controller("AttachmentsSimple",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{scope:{},bindToController:{attachments:"=",onAdd:"&",onDelete:"&"},controller:"AttachmentsSimple",controllerAs:"vm",templateUrl:"components/attachments-simple/attachments-simple.html",link:t}},t.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsSimple",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o,s;return i=t(n.tgAttachmentsSortable),o=dragula([r[0]],{copySortSource:!1,copy:!1,mirrorContainer:r[0],moves:function(t){return $(t).is("div[tg-bind-scope]")}}),o.on("dragend",function(t){var r,n;return t=$(t),r=t.scope().attachment,n=t.index(),e.$apply(function(){return i(e,{attachment:r,index:n})})}),s=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&o.dragging}}),e.$on("$destroy",function(){return r.off(),o.destroy()})},{link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsSortable",t)}.call(this),function(){var t;t=function(t){return{link:function(e,r){return t(function(){return r[0].select()})}}},t.$inject=["$timeout"],angular.module("taigaComponents").directive("tgAutoSelect",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i;return i=n.tgAvatarBig?"avatarBig":"avatar",e.$watch(i,function(e){var n;return n=t.getAvatar(e,i),r.attr("src",n.url),r.css("background",n.bg||"")})},{link:e,scope:{avatar:"=tgAvatar",avatarBig:"=tgAvatarBig"}}},t.$inject=["tgAvatarService"],angular.module("taigaComponents").directive("tgAvatar",t),angular.module("taigaComponents").directive("tgAvatarBig",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){var t,e;return t=function(t,e,r){return t.$watch("epics",function(e){if(e&&!e.isIterable)return t.immutable_epics=Immutable.fromJS(e)})},e=function(t,e){return e.format?"components/belong-to-epics/belong-to-epics-"+e.format+".html":"components/belong-to-epics/belong-to-epics-pill.html"},{link:t,scope:{epics:"="},templateUrl:e}},e.directive("tgBelongToEpics",t)}.call(this),function(){var t;t=function(t,e,r,n,i){return{restrict:"A",compile:function(o,s){var a,c;return a=e(s.tgBindCode),c=e(s.tgBindCode,function(t){return(t||"").toString()}),r.$$addBindingClass(o),function(e,o,s){return r.$$addBindingInfo(o,s.tgBindCode),e.$watch(c,function(){var r;return r=n.getHTML(a(e)),o.html(t.getTrustedHtml(r)||""),i.addHightlighter(o)})}}}},angular.module("taigaComponents").directive("tgBindCode",["$sce","$parse","$compile","tgWysiwygService","tgWysiwygCodeHightlighterService",t]); +}.call(this),function(){var t;t=function(){return{scope:{levels:"=",value:"="},templateUrl:"components/board-zoom/board-zoom.html"}},angular.module("taigaComponents").directive("tgBoardZoom",[t])}.call(this),function(){var t;t=function(){function t(){this.index=0}return t.$inject=[],t.prototype.next=function(){if(this.index++,this.index>=this.images.size)return this.index=0},t.prototype.previous=function(){if(this.index--,this.index<0)return this.index=this.images.size-1},t}(),angular.module("taigaComponents").controller("CardSlideshow",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){return{controller:"CardSlideshow",templateUrl:"components/card-slideshow/card-slideshow.html",bindToController:!0,controllerAs:"vm",scope:{images:"="}}},e.directive("tgCardSlideshow",t)}.call(this),function(){var t;t=function(){function t(){}return t.$inject=[],t.prototype.visible=function(t){return this.zoom.indexOf(t)!==-1},t.prototype.hasTasks=function(){var t;return t=this.item.getIn(["model","tasks"]),t&&t.size>0},t.prototype.hasMultipleAssignedUsers=function(){var t;return t=this.item.getIn(["model","assigned_users"]),t&&t.size>1},t.prototype.hasVisibleAttachments=function(){return this.item.get("images").size>0},t.prototype.toggleFold=function(){return this.onToggleFold({id:this.item.get("id")})},t.prototype.getClosedTasks=function(){return this.item.getIn(["model","tasks"]).filter(function(t){return t.get("is_closed")})},t.prototype.closedTasksPercent=function(){return 100*this.getClosedTasks().size/this.item.getIn(["model","tasks"]).size},t.prototype.getModifyPermisionKey=function(){return"task"===this.type?"modify_task":"modify_us"},t.prototype.getDeletePermisionKey=function(){return"task"===this.type?"delete_task":"delete_us"},t.prototype._setVisibility=function(){var t;return t={related:this.visible("related_tasks"),slides:this.visible("attachments")},_.isUndefined(this.item.get("foldStatusChanged"))||(this.visible("related_tasks")&&this.visible("attachments")?(t.related=!this.item.get("foldStatusChanged"),t.slides=!this.item.get("foldStatusChanged")):this.visible("attachments")?(t.related=this.item.get("foldStatusChanged"),t.slides=this.item.get("foldStatusChanged")):this.visible("related_tasks")||this.visible("attachments")||(t.related=this.item.get("foldStatusChanged"),t.slides=this.item.get("foldStatusChanged"))),this.item.getIn(["model","tasks"])&&this.item.getIn(["model","tasks"]).size||(t.related=!1),this.item.get("images")&&this.item.get("images").size||(t.slides=!1),t},t.prototype.isRelatedTasksVisible=function(){var t;return t=this._setVisibility(),t.related},t.prototype.isSlideshowVisible=function(){var t;return t=this._setVisibility(),t.slides},t.prototype.getNavKey=function(){return"task"===this.type?"project-tasks-detail":"project-userstories-detail"},t}(),angular.module("taigaComponents").controller("Card",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){return{link:function(t){},controller:"Card",controllerAs:"vm",bindToController:!0,templateUrl:"components/card/card.html",scope:{onToggleFold:"&",onClickAssignedTo:"&",onClickEdit:"&",onClickDelete:"&",project:"=",item:"=",zoom:"=",zoomLevel:"=",archived:"=",type:"@"}}},e.directive("tgCard",t)}.call(this),function(){var t;t=function(){return{link:function(t,e){return e.on("click",function(t){var r;if(!$(t.target).is("input"))return t.preventDefault(),r=e.find('input[type="file"]'),r.val(""),r.trigger("click")}),t.$on("$destroy",function(){return e.off()})}}},angular.module("taigaComponents").directive("tgClickInputFile",[t])}.call(this),function(){var t,e,r;r=this.taiga,e=r.getDefaulColorList,t=function(){function t(t){this.projectService=t,this.colorList=e(),this.checkIsColorRequired(),this.displayColorList=!1}return t.$inject=["tgProjectService"],t.prototype.userCanChangeColor=function(){return!this.requiredPerm||this.projectService.hasPermission(this.requiredPerm)},t.prototype.checkIsColorRequired=function(){if(!this.isColorRequired)return this.colorList=_.dropRight(this.colorList)},t.prototype.setColor=function(t){return this.color=t,this.customColor=t},t.prototype.resetColor=function(){if(this.isColorRequired&&!this.color)return this.color=this.initColor},t.prototype.toggleColorList=function(){return this.displayColorList=!this.displayColorList,this.customColor=this.color,this.resetColor()},t.prototype.onSelectDropdownColor=function(t){return this.color=t,this.onSelectColor({color:t}),this.toggleColorList()},t.prototype.onKeyDown=function(t){if(13===t.which)return!this.customColor&&this.isColorRequired||this.onSelectDropdownColor(this.customColor),t.preventDefault()},t}(),angular.module("taigaComponents").controller("ColorSelectorCtrl",t)}.call(this),function(){var t,e;e=this.taiga.bindOnce,t=function(t){var e;return e=function(e,r,n,i){var o,s,a;return o=null,s=function(){return t.cancel(o),o=null},a=function(){if(!o)return o=t(function(){return i.displayColorList=!1,i.resetColor()},400)},r.find(".color-selector").mouseenter(s).mouseleave(a),r.find(".color-selector-dropdown").mouseenter(s).mouseleave(a),e.$watch("vm.initColor",function(t){return i.setColor(t)})},{link:e,templateUrl:"components/color-selector/color-selector.html",controller:"ColorSelectorCtrl",controllerAs:"vm",bindToController:{isColorRequired:"=",onSelectColor:"&",initColor:"=",requiredPerm:"@"},scope:{}}},t.$inject=["$timeout"],angular.module("taigaComponents").directive("tgColorSelector",t)}.call(this),function(){var t,e;e=angular.module("taigaUserStories"),t=function(){function t(t,e,r,n,i){this.rootScope=t,this.confirm=e,this.modelTransform=r,this.navUrls=n,this.window=i,this.editMode=!1,this.loadingSubject=!1,this.originalSubject=this.item.subject}return t.$inject=["$rootScope","$tgConfirm","$tgQueueModelTransformation","$tgNavUrls","$window"],t.prototype._checkNav=function(){var t,e,r;if(null!=(null!=(e=this.item.neighbors.previous)?e.ref:void 0)&&(t={project:this.project.slug,ref:this.item.neighbors.previous.ref},this.previousUrl=this.navUrls.resolve("project-"+this.item._name+"-detail",t)),null!=(null!=(r=this.item.neighbors.next)?r.ref:void 0))return t={project:this.project.slug,ref:this.item.neighbors.next.ref},this.nextUrl=this.navUrls.resolve("project-"+this.item._name+"-detail",t)},t.prototype._checkPermissions=function(){return this.permissions={canEdit:_.includes(this.project.my_permissions,this.requiredPerm)}},t.prototype.editSubject=function(t){var e;if(e=this.window.getSelection(),"Range"!==e.type&&(t&&(this.editMode=!0),!t))return this.editMode=!1},t.prototype.onKeyDown=function(t){if(13===t.which&&this.saveSubject(),27===t.which)return this.item.subject=this.originalSubject,this.editSubject(!1)},t.prototype.saveSubject=function(){var t,e,r,n;return r=function(t){return function(){return t.loadingSubject=!1,t.rootScope.$broadcast("object:updated"),t.confirm.notify("success"),t.originalSubject=t.item.subject}}(this),e=function(t){return function(){return t.loadingSubject=!1,t.confirm.notify("error")}}(this),this.editMode=!1,this.loadingSubject=!0,t=this.item,n=this.modelTransform.save(function(t){return t}),n.then(r,e)},t}(),e.controller("StoryHeaderCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaUserStories"),t=function(){var t;return this.$inject=[],t=function(t,e,r,n){return n._checkPermissions(),n._checkNav()},{link:t,controller:"StoryHeaderCtrl",bindToController:!0,scope:{item:"=",project:"=",requiredPerm:"@"},controllerAs:"vm",templateUrl:"components/detail/header/detail-header.html"}},e.directive("tgDetailHeader",t)}.call(this),function(){var t;t=function(){function t(t,e){this.translate=t,this.tgLightboxFactory=e}return t.$inject=["$translate","tgLightboxFactory"],t.prototype.visible=function(){return"button"===this.format||null!=this.dueDate},t.prototype.disabled=function(){return this.isClosed},t.prototype.color=function(){var t;return t={no_longer_applicable:"closed",due_soon:"due-soon",past_due:"past-due",set:"due-set"},t[this.dueDateStatus]||""},t.prototype.title=function(){return"button"===this.format?this.dueDate?this._formatTitle():"Edit due date":this._formatTitle()},t.prototype._formatTitle=function(){var t,e,r,n;return t="closed",n={no_longer_applicable:"COMMON.DUE_DATE.NO_LONGER_APPLICABLE",due_soon:"COMMON.DUE_DATE.DUE_SOON",past_due:"COMMON.DUE_DATE.PAST_DUE"},r=this.translate.instant("COMMON.PICKERDATE.FORMAT"),e=moment(this.dueDate).format(r),n[this.dueDateStatus]?e+" ("+this.translate.instant(n[this.dueDateStatus])+")":e},t.prototype.setDueDate=function(){if(!this.disabled())return this.tgLightboxFactory.create("tg-lb-set-due-date",{"class":"lightbox lightbox-set-due-date"},{object:this.item})},t}(),angular.module("taigaComponents").controller("DueDate",t)}.call(this),function(){var t,e;e=angular.module("taigaComponents"),t=function(){var t;return t=function(t,e){return e.format?"components/due-date/due-date-"+e.format+".html":"components/due-date/due-date-icon.html"},{link:function(t){},controller:"DueDate",controllerAs:"vm",bindToController:!0,templateUrl:t,scope:{dueDate:"=",dueDateStatus:"=",isClosed:"=",item:"=",format:"@"}}},e.directive("tgDueDate",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){var o;return o=t(n.tgFileChange),r.on("change",function(t){return e.$apply(function(){return o(e,{files:t.currentTarget.files})})}),e.$on("$destroy",function(){return r.off()})},{restrict:"A",link:e}},t.$inject=["$parse"],angular.module("taigaComponents").directive("tgFileChange",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=taiga.generateHash,t=function(t){function n(t,e,r){this.q=t,this.urls=e,this.http=r}return r(n,t),n.$inject=["$q","$tgUrls","$tgHttp"],n.prototype.storeFilters=function(t,r,n){var i,o,s,a,c;return i=this.q.defer(),c=this.urls.resolve("user-storage"),s=t+":"+n,o=e([t,s]),_.isEmpty(r)?(a=this.http["delete"](c+"/"+o,{key:o,value:r}),a.then(function(){return i.resolve()}),a.then(null,function(){return i.reject()})):(a=this.http.put(c+"/"+o,{key:o,value:r}),a.then(function(t){return i.resolve()}),a.then(null,function(t){return function(e){var n;return n=t.http.post(""+c,{key:o,value:r}),n.then(function(){return i.resolve()}),n.then(null,function(){return i.reject()})}}(this))),i.promise},n.prototype.getFilters=function(t,r){var n,i,o,s,a;return n=this.q.defer(),a=this.urls.resolve("user-storage"),o=t+":"+r,i=e([t,o]),s=this.http.get(a+"/"+i),s.then(function(t){return n.resolve(t.data.value)}),s.then(null,function(t){return n.resolve({})}),n.promise},n}(taiga.Service),angular.module("taigaComponents").service("tgFilterRemoteStorageService",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=$("tg-filter"),t.$watch(r.ngIf,function(t){var r,n;if(t)return i.find(".filter-list").hide(),n=i.height(),r=0,i.children().each(function(){return r+=$(this).outerHeight(!0)}),$(e.context.nextSibling).css({"max-height":n-r,display:"block"})})},{priority:900,link:t}},angular.module("taigaComponents").directive("tgFilterSlideDown",[t])}.call(this),function(){var t;t=function(){function t(){this.opened=null,this.customFilterForm=!1,this.customFilterName=""}return t.$inject=[],t.prototype.toggleFilterCategory=function(t){return this.opened===t?this.opened=null:this.opened=t},t.prototype.isOpen=function(t){return this.opened===t},t.prototype.saveCustomFilter=function(){return this.onSaveCustomFilter({name:this.customFilterName}),this.customFilterForm=!1,this.opened="custom-filter",this.customFilterName=""},t.prototype.changeQ=function(){return this.onChangeQ({q:this.q})},t.prototype.unselectFilter=function(t){return this.onRemoveFilter({filter:t})},t.prototype.unselectFilter=function(t){return this.onRemoveFilter({filter:t})},t.prototype.selectFilter=function(t,e){return e={category:t,filter:e},this.onAddFilter({filter:e})},t.prototype.removeCustomFilter=function(t){return this.onRemoveCustomFilter({filter:t})},t.prototype.selectCustomFilter=function(t){return this.onSelectCustomFilter({filter:t})},t.prototype.isFilterSelected=function(t,e){return!!_.find(this.selectedFilters,function(r){return e.id===r.id&&t.dataType===r.dataType})},t}(),angular.module("taigaComponents").controller("Filter",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=t.$watch("vm.defaultQ",function(e){return e&&!t.vm.filtersForm.$dirty?(t.vm.q=e,i()):t.vm.filtersForm.$dirty?i():void 0}),r.$observe("open",function(r){return r=t.$eval(r),r?e.addClass("open"):e.removeClass("open")})},{scope:{onChangeQ:"&",onAddFilter:"&",onSelectCustomFilter:"&",onRemoveFilter:"&",onRemoveCustomFilter:"&",onSaveCustomFilter:"&",customFilters:"<",defaultQ:"=q",filters:"<",customFilters:"<",selectedFilters:"<"},bindToController:!0,controller:"Filter",controllerAs:"vm",templateUrl:"components/filter/filter.html",link:t}},angular.module("taigaComponents").directive("tgFilter",[t])}.call(this),function(){var t,e;e=this.taiga,t=function(t,e,r,n,i){var o;return o=function(n,o,s,a){var c,u,l;return l=null,u=introJs(),u.oncomplete(function(){return $("html,body").scrollTop(0)}),u.onexit(function(){return e.disableJoyRide()}),c=function(t,e){if(e[t.joyride])return u.setOptions({exitOnEsc:!1,exitOnOverlayClick:!1,showStepNumbers:!1,nextLabel:i.instant("JOYRIDE.NAV.NEXT")+" →",prevLabel:"← "+i.instant("JOYRIDE.NAV.BACK"),skipLabel:i.instant("JOYRIDE.NAV.SKIP"),doneLabel:i.instant("JOYRIDE.NAV.DONE"),disableInteraction:!0}),u.setOption("steps",r.get(t.joyride)),u.start()},t.$on("$routeChangeSuccess",function(r,n){return n.joyride&&e.isAuthenticated()?(u.oncomplete(function(){return e.disableJoyRide(n.joyride)}),n.loader?l=t.$on("loader:end",function(){return e.loadJoyRideConfig().then(function(t){return c(n,t)}),l()}):e.loadJoyRideConfig().then(function(t){return c(n,t)})):(u.exit(),void(l&&l()))})},{scope:{},link:o}},t.$inject=["$rootScope","tgCurrentUserService","tgJoyRideService","$location","$translate"],angular.module("taigaComponents").directive("tgJoyRide",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.translate=t,this.checkPermissionsService=e}return e(r,t),r.$inject=["$translate","tgCheckPermissionsService"],r.prototype.getConfig=function(){return{dashboard:function(t){return function(){var e;return e=[{element:".project-list > section:not(.ng-hide)",position:"left",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP1.TITLE"),text:t.translate.instant("JOYRIDE.DASHBOARD.STEP1.TEXT")}},{element:".working-on-container",position:"right",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.DASHBOARD.STEP2.TEXT")}},{element:".watching-container",position:"right",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TITLE"),text:[t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT1"),t.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT2")]}}],$(".project-list .create-project-button").is(":hidden")||e.push({element:".project-list .create-project-button",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TITLE"),text:[t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT1"),t.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT2")]}}),e}}(this),backlog:function(t){return function(){var e;return e=[{element:".summary",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP1.TITLE"),text:[t.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT1"),t.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT2")]}},{element:".backlog-table-empty",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP2.TEXT")}},{element:".sprints",position:"left",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP3.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP3.TEXT")}}],t.checkPermissionsService.check("add_us")&&e.push({element:".new-us",position:"rigth",joyride:{title:t.translate.instant("JOYRIDE.BACKLOG.STEP4.TITLE"),text:t.translate.instant("JOYRIDE.BACKLOG.STEP4.TEXT")}}),e}}(this),kanban:function(t){return function(){var e;return e=[{element:".kanban-table-inner",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP1.TITLE"),text:t.translate.instant("JOYRIDE.KANBAN.STEP1.TEXT")}},{element:".card-placeholder",position:"right",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP2.TITLE"),text:t.translate.instant("JOYRIDE.KANBAN.STEP2.TEXT")}}],t.checkPermissionsService.check("add_us")&&e.push({element:".add-action",position:"bottom",joyride:{title:t.translate.instant("JOYRIDE.KANBAN.STEP3.TITLE"),text:[t.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT1"),t.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT2")]}}),e}}(this)}},r.prototype.get=function(t){var e,r;return r=this.getConfig(),e=r[t].call(this),_.map(e,function(t){var e;return e="",t.joyride.title&&(e+="

    "+t.joyride.title+"

    "),_.isArray(t.joyride.text)?_.forEach(t.joyride.text,function(t){return e+="

    "+t+"

    "}):e+="

    "+t.joyride.text+"

    ",t.intro=e,t})},r}(taiga.Service),angular.module("taigaComponents").service("tgJoyRideService",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i,o){var s,a,c;return r.zoomIndex=t.get("kanban_zoom")||2,r.levels=5,c=[["ref"],["subject"],["owner","tags","extra_info","unfold"],["attachments"],["related_tasks","empty_extra_info"]],s=function(e){return null==e&&(e=0),t.get("kanban_zoom")!==e&&t.set("kanban_zoom",e),_.reduce(c,function(t,r,n){return n<=e&&(t=t.concat(r)),t})},r.$watch("zoomIndex",function(t){var e;return e=s(t),r.onZoomChange({zoomLevel:t,zoom:e})}),a=r.$watch(function(){return e.project},function(t){if(t)return t.get("my_permissions").indexOf("view_tasks")===-1&&(r.levels=4),a()})},{scope:{onZoomChange:"&"},template:'',link:r}},angular.module("taigaComponents").directive("tgKanbanBoardZoom",["$tgStorage","tgProjectService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(t,e,r){},{restrict:"AE",scope:{},controllerAs:"vm",controller:function(){return this.close=function(){return t.open=!1},Object.defineProperties(this,{open:{get:function(){return t.open}},title:{get:function(){return t.title}},desc:{get:function(){return t.desc}}})},link:e,templateUrl:"components/live-announcement/live-announcement.html"}},t.$inject=["tgLiveAnnouncementService"],angular.module("taigaComponents").directive("tgLiveAnnouncement",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){this.open=!1,this.title="",this.desc=""}return e(r,t),r.prototype.show=function(t,e){return this.open=!0,this.title=t,this.desc=e},r}(taiga.Service),angular.module("taigaComponents").service("tgLiveAnnouncementService",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.$watch("project",function(e){var n,i;if(e=Immutable.fromJS(e))return i=e.get("logo_big_url"),i?(r.attr("src",i),r.css("background","")):(n=t.getDefaultProjectLogo(e.get("slug"),e.get("id")),r.attr("src",n.src),r.css("background",n.color))})},{link:e,scope:{project:"=tgProjectLogoBigSrc"}}},t.$inject=["tgProjectLogoService"],angular.module("taigaComponents").directive("tgProjectLogoBigSrc",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.$watch("project",function(e){var n,i;if(e=Immutable.fromJS(e))return i=e.get("logo_small_url"),i?(r.attr("src",i),r.css("background","")):(n=t.getDefaultProjectLogo(e.get("slug"),e.get("id")),r.attr("src",n.src),r.css("background",n.color))})},{link:e,scope:{project:"=tgProjectLogoSmallSrc"}}},t.$inject=["tgProjectLogoService"],angular.module("taigaComponents").directive("tgProjectLogoSmallSrc",t)}.call(this),function(){var t;t=function(){function t(t,e){this.projectService=t,this.lightboxFactory=e,this.project=null,this.menu=Immutable.Map()}return t.$inject=["tgProjectService","tgLightboxFactory"],t.prototype.show=function(){return this.project=this.projectService.project,this.active=this._getActiveSection(),this._setVideoConference(),this._setMenuPermissions()},t.prototype.hide=function(){return this.project=null,this.menu={}},t.prototype.search=function(){return this.lightboxFactory.create("tg-search-box",{"class":"lightbox lightbox-search"})},t.prototype._setVideoConference=function(){var t;if(t=this._videoConferenceUrl())return this.project=this.project.set("videoconferenceUrl",t)},t.prototype._setMenuPermissions=function(){if(this.menu=Immutable.Map({epics:!1,backlog:!1,kanban:!1,issues:!1,wiki:!1}),this.project.get("is_epics_activated")&&this.project.get("my_permissions").indexOf("view_epics")!==-1&&(this.menu=this.menu.set("epics",!0)),this.project.get("is_backlog_activated")&&this.project.get("my_permissions").indexOf("view_us")!==-1&&(this.menu=this.menu.set("backlog",!0)),this.project.get("is_kanban_activated")&&this.project.get("my_permissions").indexOf("view_us")!==-1&&(this.menu=this.menu.set("kanban",!0)),this.project.get("is_issues_activated")&&this.project.get("my_permissions").indexOf("view_issues")!==-1&&(this.menu=this.menu.set("issues",!0)),this.project.get("is_wiki_activated")&&this.project.get("my_permissions").indexOf("view_wiki_pages")!==-1)return this.menu=this.menu.set("wiki",!0)},t.prototype._getActiveSection=function(){var t,e,r,n,i;return n=this.projectService.section,i=this.projectService.sectionsBreadcrumb,t=i.lastIndexOf("backlog"),e=i.lastIndexOf("kanban"),t===-1&&e===-1||(r=e===-1||t>e?"backlog":"kanban"),"backlog-kanban"===n&&("backlog"===r||"kanban"===r?n=r:this.project.get("is_backlog_activated")&&!this.project.get("is_kanban_activated")?n="backlog":!this.project.get("is_backlog_activated")&&this.project.get("is_kanban_activated")&&(n="kanban")),n},t.prototype._videoConferenceUrl=function(){var t,e;if("appear-in"===this.project.get("videoconferences"))t="https://appear.in/";else if("talky"===this.project.get("videoconferences"))t="https://talky.io/";else{if("jitsi"!==this.project.get("videoconferences"))return"custom"===this.project.get("videoconferences")?this.project.get("videoconferences_extra_data"):"";t="https://meet.jit.si/"}return e=this.project.get("videoconferences_extra_data")?this.project.get("slug")+"-"+taiga.slugify(this.project.get("videoconferences_extra_data")):this.project.get("slug"),"jitsi"===this.project.get("videoconferences")&&(e=e.replace(/-/g,"")),t+e},t}(),angular.module("taigaComponents").controller("ProjectMenu",t)}.call(this),function(){var t,e;e=this.taiga,t=function(t,e){var r;return r=function(e,r,n,i){var o;return o=function(){return t.project?i.show():i.hide()},e.$watch(function(){return t.project},o),e.vm.fixed=!1,$(window).on("scroll",function(){var t;return t=$(window).scrollTop(),t>100&&e.vm.fixed===!1?(e.vm.fixed=!0,e.$digest()):t<100&&e.vm.fixed===!0?(e.vm.fixed=!1,e.$digest()):void 0})},{scope:{},controller:"ProjectMenu",controllerAs:"vm",templateUrl:"components/project-menu/project-menu.html",link:r}},t.$inject=["tgProjectService","tgLightboxFactory"],angular.module("taigaComponents").directive("tgProjectMenu",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){var t,e,r,n;return r=function(t){var e,r,n;return t.addClass("selected"),n=t.position().top+t.outerHeight(),e=t.parent().outerHeight(),n>e?(r=n-e,t.parent().scrollTop(t.parent().scrollTop()+r)):t.position().top<0?t.parent().scrollTop(t.parent().scrollTop()+t.position().top):void 0},t=function(t,e,n){var i,o,s;if(i=t.find(".selected"),40===e){if(!i.length)return r(t.find("li:first"));if(o=i.next("li"),o.length)return i.removeClass("selected"),r(o)}else if(38===e){if(!i.length)return r(t.find("li:last"));if(s=i.prev("li"),s.length)return i.removeClass("selected"),r(s)}},n=function(){return $(document).off(".tags-keyboard-navigation")},e=function(e,r){return n(),$(r).parent().on("keydown.tags-keyboard-navigation",function(n){return function(n){var i;if(i=n.keyCode?n.keyCode:n.which,40===i||38===i)return n.preventDefault(),t(r,i,e)}}(this)),e.$on("$destroy",n)},{link:e,templateUrl:"components/tags/tag-dropdown/tag-dropdown.html",scope:{onSelectTag:"&",colorArray:"=",tag:"="}}},e.directive("tgTagsDropdown",t)}.call(this),function(){var t,e,r;r=this.taiga.trim,e=angular.module("taigaCommon"),t=function(){function t(t){this.tagLineService=t,this.disableColorSelection=!1,this.newTag={name:"",color:null},this.colorArray=[],this.addTag=!1}return t.$inject=["tgTagLineService"],t.prototype.checkPermissions=function(){return this.tagLineService.checkPermissions(this.project.my_permissions,this.permissions)},t.prototype._createColorsArray=function(t){return this.colorArray=this.tagLineService.createColorsArray(t)},t.prototype.displayTagInput=function(){return this.addTag=!0},t.prototype.addNewTag=function(t,e){if(this.newTag.name="",this.newTag.color=null,t.length)return this.disableColorSelection?t.length?this.onAddTag({name:t,color:e}):void 0:(this.project.tags_colors[t]&&(e=this.project.tags_colors[t]),this.onAddTag({name:t,color:e}))},t.prototype.selectColor=function(t){return this.newTag.color=t},t}(),e.controller("TagLineCommonCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){var t;return t=function(t,e,r,n){var i;return _.isUndefined(r.disableColorSelection)||(n.disableColorSelection=!0),i=t.$watch("vm.project",function(t){if(t&&Object.keys(t).length)return i(),n.disableColorSelection?void 0:n.colorArray=n._createColorsArray(n.project.tags_colors)}),e.on("keydown",".tag-input",function(r){var i;return 27===r.keyCode?(n.addTag=!1,n.newTag.name="",n.newTag.color="",r.stopPropagation()):13===r.keyCode&&(r.preventDefault(),e.find(".tags-dropdown .selected").length?(i=$(".tags-dropdown .selected .tags-dropdown-name").text(),n.addNewTag(i,null)):n.addNewTag(n.newTag.name,n.newTag.color)),t.$apply()})},{link:t,scope:{permissions:"@",loadingAddTag:"=",loadingRemoveTag:"=",tags:"=",project:"=",onAddTag:"&",onDeleteTag:"&"},templateUrl:"components/tags/tag-line-common/tag-line-common.html",controller:"TagLineCommonCtrl",controllerAs:"vm",bindToController:!0}},e.directive("tgTagLineCommon",t)}.call(this),function(){var t,e,r;r=this.taiga.trim,e=angular.module("taigaCommon"),t=function(){function t(t,e,r){this.rootScope=t,this.confirm=e,this.modelTransform=r,this.loadingAddTag=!1}return t.$inject=["$rootScope","$tgConfirm","$tgQueueModelTransformation"],t.prototype.onDeleteTag=function(t){var e,n,i,o;return this.loadingRemoveTag=t[0],n=function(t){return function(e){return t.rootScope.$broadcast("object:updated"),t.loadingRemoveTag=!1,e}}(this),e=function(t){return function(){return t.confirm.notify("error"),t.loadingRemoveTag=!1}}(this),i=r(t[0].toLowerCase()),o=this.modelTransform.save(function(t){var e;return e=_.clone(t.tags),_.remove(e,function(t){return t[0]===i}),t.tags=e,t}),o.then(n,e)},t.prototype.onAddTag=function(t,e){var n,i,o;return this.loadingAddTag=!0,i=function(t){return function(e){return t.rootScope.$broadcast("object:updated"),t.addTag=!1,t.loadingAddTag=!1,e}}(this),n=function(t){return function(){return t.loadingAddTag=!1,t.confirm.notify("error")}}(this),o=this.modelTransform.save(function(n){return function(n){var i,o;return o=r(t.toLowerCase()),i=_.clone(n.tags),i.push([t,e]),n.tags=i,n}}(this)),o.then(i,n)},t}(),e.controller("TagLineCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){return{scope:{item:"=",permissions:"@",project:"="},templateUrl:"components/tags/tag-line-detail/tag-line-detail.html",controller:"TagLineCtrl",controllerAs:"vm",bindToController:!0}},e.directive("tgTagLine",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=angular.module("taigaCommon"),t=function(t){function e(){}return r(e,t),e.$inject=[],e.prototype.checkPermissions=function(t,e){return _.includes(t,e)},e.prototype.createColorsArray=function(t){return _.map(t,function(t,e){return[e,t]})},e}(taiga.Service),e.service("tgTagLineService",t)}.call(this),function(){var t,e;e=angular.module("taigaCommon"),t=function(){return{templateUrl:"components/tags/tag/tag.html",scope:{tag:"<",loadingRemoveTag:"<",onDeleteTag:"&",hasPermissions:"@"}}},e.directive("tgTag",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){var o,s;return e.zoomIndex=t.get("taskboard_zoom")||2,e.levels=4,s=[["ref"],["subject"],["owner","tags","extra_info","unfold"],["attachments","empty_extra_info"],["related_tasks"]],o=function(e){return null==e&&(e=0),t.get("taskboard_zoom")!==e&&t.set("taskboard_zoom",e),_.reduce(s,function(t,r,n){return n<=e&&(t=t.concat(r)),t})},e.$watch("zoomIndex",function(t){var r;return r=o(t),e.onZoomChange({zoomLevel:t,zoom:r})})},{scope:{onZoomChange:"&"},template:'',link:e}},angular.module("taigaComponents").directive("tgTaskboardZoom",["$tgStorage",t])}.call(this),function(){var t;t=function(t,e,r,n,i){var o;return o=function(t,e,r){return t.privacyPolicyUrl=n.get("privacyPolicyUrl"),t.termsOfServiceUrl=n.get("termsOfServiceUrl"),t.GDPRUrl=n.get("GDPRUrl")},{restrict:"AE",scope:{},controllerAs:"vm",controller:function(){return this.close=function(){var n,o,s;return t.open=!1,o=r.getUser(),void 0===o.read_new_terms&&(s=o.getAttrs(),s.read_new_terms=!1,o=i.make_model("users",s)),o.read_new_terms=!0,n=function(t){return r.setUser(t)},e.save(o).then(n)},Object.defineProperties(this,{open:{get:function(){return t.open}}})},link:o,templateUrl:"components/terms-announcement/terms-announcement.html"}},t.$inject=["tgTermsAnnouncementService","$tgRepo","$tgAuth","$tgConfig","$tgModel"],angular.module("taigaComponents").directive("tgTermsAnnouncement",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(){this.open=!1}return e(r,t),r.prototype.show=function(){return this.open=!0},r}(taiga.Service),angular.module("taigaComponents").service("tgTermsAnnouncementService",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){return e.privacyPolicyUrl=t.get("privacyPolicyUrl"),e.termsOfServiceUrl=t.get("termsOfServiceUrl"),e.target=!1,e.privacyPolicyUrl&&e.termsOfServiceUrl||(e.target=!0),r.on("change","input[name='accepted_terms']",function(t){var r;return r=angular.element(t.currentTarget),e.target=r.is(":checked"),e.$apply()})},{restrict:"AE",link:e,scope:{target:"="},templateUrl:"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html"}},angular.module("taigaComponents").directive("tgTermsOfServiceAndPrivacyPolicyNotice",["$tgConfig",t])}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i){return r.vm={},r.vm.tribeHost=t.config.tribeHost,r.vm.url=e.protocol()+"://"+e.host(),"http"===e.protocol()&&80!==e.port()?r.vm.url=r.vm.url+":"+e.port():"https"===e.protocol()&&443!==e.port()?r.vm.url=r.vm.url+":"+e.port():void 0},{scope:{usId:"=",projectSlug:"="},controllerAs:"vm",templateUrl:"components/tribe-button/tribe-button.html",link:r}},t.$inject=["$tgConfig","$tgLocation"],angular.module("taigaComponents").directive("tgTribeButton",t); +}.call(this),function(){var t;t=function(t){var e,r;return r=function(e,r,n){return e.vm={},e.vm.tribeHost=t.config.tribeHost,e.vm.show=function(){return e.vm.open=!0},e.vm.hide=function(t){return e.vm.open=!1}},e={templateUrl:"components/tribe-button/tribe-linked.html",scope:{gigTitle:"=",gigId:"="},link:r}},t.$inject=["$tgConfig"],angular.module("taigaComponents").directive("tgTribeLinked",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return t.$inject=["tgCurrentUserService"],t.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},t.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},t.prototype.toggleVote=function(){var t;return this.loading=!0,t=this.item.is_voter?this._downvote():this._upvote(),t["finally"](function(t){return function(){return t.loading=!1}}(this)),t},t.prototype._upvote=function(){return this.onUpvote().then(function(t){return function(){return t.showTextWhenMouseIsLeave()}}(this))},t.prototype._downvote=function(){return this.onDownvote()},t}(),angular.module("taigaComponents").controller("VoteButton",t)}.call(this),function(){var t;t=function(){return{scope:{},controller:"VoteButton",bindToController:{item:"=",onUpvote:"=",onDownvote:"="},controllerAs:"vm",templateUrl:"components/vote-button/vote-button.html"}},angular.module("taigaComponents").directive("tgVoteButton",t)}.call(this),function(){var t;t=function(){function t(t,e){this.currentUserService=t,this.rootScope=e,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return t.$inject=["tgCurrentUserService","$rootScope"],t.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},t.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},t.prototype.openWatchers=function(){return this.rootScope.$broadcast("watcher:add",this.item)},t.prototype.getPerms=function(){var t,e;return this.item?(t=this.item._name,e={userstories:"modify_us",issues:"modify_issue",tasks:"modify_task",epics:"modify_epic"},e[t]):""},t.prototype.toggleWatch=function(){var t;return this.loading=!0,t=this.item.is_watcher?this._unwatch():this._watch(),t["finally"](function(t){return function(){return t.loading=!1}}(this)),t},t.prototype._watch=function(){return this.onWatch().then(function(t){return function(){return t.showTextWhenMouseIsLeave()}}(this))},t.prototype._unwatch=function(){return this.onUnwatch()},t}(),angular.module("taigaComponents").controller("WatchButton",t)}.call(this),function(){var t;t=function(){return{scope:{},controller:"WatchButton",bindToController:{item:"=",onWatch:"=",onUnwatch:"="},controllerAs:"vm",templateUrl:function(t,e){return"components/watch-button/watch-button-"+e.environment+".html"}}},angular.module("taigaComponents").directive("tgWatchButton",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return i={epics:"epic",userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.comment.comment.id,i[e.vm.comment.comment._name],r,!0,!0).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCommentEditWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return e.editableDescription=!1,e.saveComment=function(t,r){return e.content="",e.vm.type.comment=t,e.vm.onAddComment({callback:r})},i={epics:"epic",userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.type.id,i[e.vm.type._name],r,!0,!0).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.onChange=function(t){return e.vm.type.comment=t},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCommentWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n){var i,o;return i={userstories:"us",issues:"issue",tasks:"task"},o=function(r,n){return t.addAttachment(e.vm.projectId,e.vm.comment.comment.id,i[e.vm.comment.comment._name],r).then(function(t){return n(t.getIn(["file","name"]),t.getIn(["file","url"]))})},e.uploadFiles=function(t,e){var r,n,i,s;for(s=[],n=0,i=t.length;n\n \n \n"}},angular.module("taigaComponents").directive("tgCustomFieldEditWysiwyg",["tgAttachmentsFullService",t])}.call(this),function(){var t;t=function(t,e,r,n,i){var o;return o=function(i,o,s){var a;return i.editableDescription=!1,i.saveDescription=function(n,i){var o;return o=t.save(function(t){return t.description=n,t}),o.then(function(){return r.notify("success"),e.$broadcast("object:updated")}),o.then(null,function(){return r.notify("error")}),o["finally"](i)},a=function(t,e){return n.addAttachment(i.project.id,i.item.id,s.type,t).then(function(t){return e(t.getIn(["file","name"]),t.getIn(["file","url"]))})},i.uploadFiles=function(t,e){var r,n,i,o;for(o=[],n=0,i=t.length;n\n \n \n\n \n\n \n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\n \n"}},angular.module("taigaComponents").directive("tgItemWysiwyg",["$tgQueueModelTransformation","$rootScope","$tgConfirm","tgAttachmentsFullService","$translate",t])}.call(this),function(){var t;t=function(){function t(){Prism.plugins.customClass.prefix("prism-"),Prism.plugins.customClass.map({})}return t.prototype.getLanguages=function(){return new Promise(function(t){return function(e,r){return t.languages?e(t.languages):t.loadPromise?t.loadPromise.then(function(){return e(t.languages)}):t.loadPromise=$.getJSON("/"+window._version+"/prism/prism-languages.json").then(function(r){return t.loadPromise=null,t.languages=_.map(r,function(t){return t.url="/"+window._version+"/prism/"+t.file,t}),e(t.languages)})}}(this))},t.prototype.getLanguageInClassList=function(t){var e;return e=_.find(this.languages,function(e){return!!_.find(t,function(t){return"language-"+e.name===t})}),e?e.name:null},t.prototype.loadLanguage=function(t){return new Promise(function(e){return Prism.languages[t]?e():ljs.load("/"+window._version+"/prism/prism-"+t+".min.js",e)})},t.prototype.replaceCodeBrToNl=function(t){return $(t).find("br").replaceWith("\n")},t.prototype.hightlightCode=function(t){var e;if(this.replaceCodeBrToNl(t),e=this.getLanguageInClassList(t.classList))return this.loadLanguage(e).then(function(){return Prism.highlightElement(t)})},t.prototype.addHightlighter=function(t){var e;return e=$(t).find("code"),e.each(function(t){return function(e,r){return t.hightlightCode(r)}}(this))},t}(),angular.module("taigaComponents").service("tgWysiwygCodeHightlighterService",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){return e.$watch("visible",function(n){return n&&!r.hasClass("open")?(e.open=!0,t.open(r,null,e.onClose),e.$applyAsync(function(){var t;if(t=r[0].querySelector("textarea"))return t.select()})):!n&&r.hasClass("open")?(e.open=!1,t.close(r)):void 0})},{scope:{languages:"<",codeLanguage:"<",code:"<",visible:"<",onClose:"&",onSave:"&"},link:e,templateUrl:"components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html"}},angular.module("taigaComponents").directive("tgWysiwygCodeLightbox",["lightboxService",t])}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.projectService=t,this.wysiwygService=e,this.navurls=r,this.rs=n,this.cancelablePromise=null}return t.$inject=["tgProjectService","tgWysiwygService","$tgNavUrls","$tgResources"],t.prototype.searchEmoji=function(t,e){var r;return r=this.wysiwygService.searchEmojiByName(t),r=r.slice(0,10),e(r)},t.prototype.searchUser=function(t,e){var r,n;return r=["username","full_name","full_name_display"],n=this.projectService.project.toJS().members.filter(function(e){return function(e){var n,i,o;for(n=0,i=r.length;n=0)return!0;if(e[o].indexOf(t)>=0)return!0}return!1}}(this)),n=n.slice(0,10).map(function(t){return function(e){return e.url=t.navurls.resolve("user-profile",{project:t.projectService.project.get("slug"),username:e.username}),e}}(this)),e(n)},t.prototype.searchItem=function(t){return new Promise(function(e){return function(r,n){var i,o,s,a;return t=taiga.slugify(t),s=["issues","tasks","userstories"],a={issues:"project-issues-detail",tasks:"project-tasks-detail",userstories:"project-userstories-detail"},o=["ref","subject"],i=function(e){var r,n,i;for(r=0,n=o.length;r=0)return!0;return!1},e.cancelablePromise&&e.cancelablePromise.abort(),e.cancelablePromise=e.rs.search["do"](e.projectService.project.get("id"),t),e.cancelablePromise.then(function(t){var n,o,c,u,l;if(t.count<1||t.count===t.wikipages.length)return r([]);for(u=[],n=0,c=s.length;n0&&(o=t[l].filter(i),o=o.map(function(t){return t.url=e.navurls.resolve(a[l],{project:e.projectService.project.get("slug"),ref:t.ref}),t}),u=u.concat(o));return u=_.sortBy(u,["ref"]),r(u.slice(0,10))})}}(this))},t.prototype.search=function(t){return new Promise(function(e){return function(r){return"#".indexOf(t[0])!==-1?e.searchItem(t.replace("#","")).then(r):"@".indexOf(t[0])!==-1?e.searchUser(t.replace("@",""),r):":".indexOf(t[0])!==-1?e.searchEmoji(t.replace(":",""),r):void 0}}(this))},t}(),angular.module("taigaComponents").service("tgWysiwygMentionService",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.bindOnce,t=function(t,e,n,i,o,s,a,c,u,l){var p,h,f,d,g,m,v,y,b,S,j,k;return k=function(){if(window.getSelection){if(window.getSelection().empty)return window.getSelection().empty()}else{if(window.getSelection().removeAllRanges)return window.getSelection().removeAllRanges();if(document.selection)return document.selection.empty()}},m=function(t){return $(t.endContainer).parentsUntil(".editor","code")},v=function(t){return!!m(t).length},j=function(t,e){var r,n,i;return r=$(t).is("code")?t:$(t).closest("code")[0],i=r.parentNode,n=document.createElement("p"),n.innerText=r.innerText,i.parentNode.replaceChild(n,i),e.checkContentChanged(e.elements[0])},d=function(t,e){var r,n,i,o;return i=document.createElement("pre"),r=document.createElement("code"),t.startContainer.parentNode.nextSibling||$("
    ").insertAfter(t.startContainer.parentNode),o=t.endContainer.parentNode.nextSibling,n=t.extractContents(),r.appendChild(n),i.appendChild(r),o.parentNode.insertBefore(i,o),S(e),e.checkContentChanged(e.elements[0])},S=function(e){var r,n,i,o,s,a,c,u,l,p;if(e){for(l=e.elements[0].children,r=0,i=l.length;rRTL",this.button.title="RTL",this.on(this.button,"click",this.handleClick.bind(this))},getButton:function(){return this.button},handleClick:function(t){var e;return e=MediumEditor.selection.getSelectionRange(document),"right"===e.commonAncestorContainer.parentNode.style.textAlign?document.execCommand("justifyLeft",!1):document.execCommand("justifyRight",!1)}}),g=function(t){return'\n \n'},h=MediumEditor.extensions.button.extend({name:"code",init:function(){var t;return t=_.find(this.base.options.toolbar.buttons,function(t){return"code"===t.name}),this.button=this.document.createElement("button"),this.button.classList.add("medium-editor-action"),this.button.innerHTML=t.contentDefault||"Code",this.button.title="Code",this.on(this.button,"click",this.handleClick.bind(this))},getButton:function(){return this.button},tagNames:["code"],handleClick:function(t){var e,r;if(e=MediumEditor.selection.getSelectionRange(self.document),v(e,this.base)?j(e.endContainer,this.base):(d(e,this.base),k()),r=this.base.getExtensionByName("toolbar"))return r.hideToolbar()}}),f=MediumEditor.extensions.paste.extend({doPaste:function(t,e,r){var n;return n=MediumEditor.util.htmlEntities(e),MediumEditor.util.insertHTMLCommand(this.document,n)}}),b=MediumEditor.util.isBlockContainer,MediumEditor.util.isBlockContainer=function(t){var e;return t?(e=t.tagName?t.tagName:t.parentNode.tagName,"code"===e.toLowerCase()||b(t)):b(t)},y=function(o,d,m){var v,y,b,k,I,E,T,C,P,w,A,O,R,M,U,N,D,L,x,F,B,H,q;return M=null,C=d.find(".medium"),T=d.find(".markdown"),k=null,A=!!m.$attr.editonly,U=!!m.$attr.notPersist,o.required=!!m.$attr.required,o.editMode=A||!1,o.mode=n.get("editor-mode","html"),o.markdown="",o.codeEditorVisible=!1,o.codeLans=[],a.getLanguages().then(function(t){return o.codeLans=t}),L=function(t){return o.editMode=t},x=function(t){var e;if(e=i.getHTML(t),C.html(e),a.addHightlighter(M.elements[0]),o.editMode)return S(M)},o.saveSnippet=function(t,e){var r;return o.codeEditorVisible=!1,k.innerText=e,r=k.parentNode,"remove-formating"===t?(k.className="",r.className="",j(k,M)):_.trim(e).length?(t?(k.className="language-"+t,r.className="language-"+t):(k.className="",r.className=""),a.hightlightCode(k),M.checkContentChanged(M.elements[0])):(k.parentNode.parentNode.removeChild(k.parentNode),M.checkContentChanged(M.elements[0])),F(),null},o.setMode=function(t){return n.set("editor-mode",t),"markdown"===t?H():x(o.markdown),o.mode=t,M.trigger("editableBlur",{},C[0])},o.save=function(t){t&&t.preventDefault(),"html"===o.mode&&H(),x(o.markdown),o.required&&!o.markdown.length||(o.saving=!0,o.outdated=!1,o.onSave({text:o.markdown,cb:D}))},o.cancel=function(t){t&&t.preventDefault(),A||L(!1),U?b():"html"===o.mode&&x(o.content||null),o.markdown=o.content,E(),M.trigger("blur",{},C[0]),o.outdated=!1,S(M),o.onCancel()},b=function(){return o.markdown="",C.html("")},D=function(){return o.saving=!1,A||L(!1),U&&b(),E(),M.trigger("blur",{},C[0]),u.trackEvent("develop","save wysiwyg",o.mode,1)},q=function(t,e){return r.isImage(t)?M.pasteHTML("
    "):(t=$("
    ").text(t).html(),M.pasteHTML(""+t+"
    "))},O=function(){var t;return t=n.get(o.storageKey),!(!t||!t.version||t.version===o.version)},w=function(){var t;return t=n.get(o.storageKey),!!t},P=function(){var t;return t=n.get(o.storageKey),t?t.text:o.content},E=function(){return n.remove(o.storageKey)},v=function(){var r,n;return o.content===o.markdown?(o.cancel(),document.activeElement.blur(),document.body.click(),null):(n=t.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE"),r=t.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE"),e.ask(n,null,r).then(function(t){return o.cancel(),t.finish()}))},N=function(){var t;return t=$("
    ").html(C.html()),t.find("code br").replaceWith("\n"),t.html()},H=function(){var t;return t=N(),o.markdown=i.getMarkdown(t)},R=function(t){var e;if(o.storageKey)return e={},e.version=o.version||0,e.text=t,n.set(o.storageKey,e)},y=function(){return"html"===o.mode&&H(),R(o.markdown),o.onChange({markdown:o.markdown})},F=_.throttle(y,200),I=function(t,e){var r;return null==e&&(e=!1),t.length&&(r=i.getHTML(t),C.html(r)),M=new MediumEditor(C[0],{imageDragging:!1,placeholder:{text:o.placeholder},toolbar:{buttons:[{name:"bold",contentDefault:g("editor-bold")},{name:"italic",contentDefault:g("editor-italic")},{name:"strikethrough",contentDefault:g("editor-cross-out")},{name:"anchor",contentDefault:g("editor-link")},{name:"image",contentDefault:g("editor-image")},{name:"orderedlist",contentDefault:g("editor-list-n")},{name:"unorderedlist",contentDefault:g("editor-list-o")},{name:"h1",contentDefault:g("editor-h1")},{name:"h2",contentDefault:g("editor-h2")},{name:"h3",contentDefault:g("editor-h3")},{name:"quote",contentDefault:g("editor-quote")},{name:"removeFormat",contentDefault:g("editor-no-format")},{name:"rtl",contentDefault:g("editor-rtl")},{name:"code",contentDefault:g("editor-code")}]},extensions:{paste:new f,code:new h,autolist:new AutoList,alignright:new p,mediumMention:new MentionExtension({getItems:function(t,e){return c.search(t).then(e)}})}}),o.changeMarkdown=F,M.subscribe("editableInput",function(t){return o.$applyAsync(F)}),M.subscribe("editableClick",function(t){var e;if(e=new RegExp("^(?:[a-z]+:)?//","i"),t.target.href)return e.test(t.target.getAttribute("href"))||"_blank"===t.target.getAttribute("target")?(t.stopPropagation(),window.open(t.target.href)):l.url(t.target.href)}),M.subscribe("editableDrop",function(t){return o.onUploadFile({files:t.dataTransfer.files,cb:q})}),M.subscribe("editableKeydown",function(t){var e,r;return e=t.keyCode?t.keyCode:t.which,r=$(".medium-mention"),40!==e&&38!==e||!r.length?o.editMode&&27===e?(t.stopPropagation(),o.$applyAsync(v)):27===e?C.blur():void 0:(t.stopPropagation(),void t.preventDefault())}),L(e),o.$applyAsync(function(){return a.addHightlighter(M.elements[0]),S(M)})},$(C[0]).on("mousedown",function(t){return t.target.href?(t.preventDefault(),t.stopPropagation()):o.$applyAsync(function(){if(!o.editMode)return L(!0),S(M)})}),$(C[0]).on("dblclick","pre",function(t){return o.$applyAsync(function(){return o.codeEditorVisible=!0,k=t.currentTarget.querySelector("code"),o.currentCodeLanguage=a.getLanguageInClassList(k.classList),o.code=k.innerText})}),B=o.$watch("content",function(t){var e;if(!_.isUndefined(t)){if(o.outdated=O(),!M&&w()&&L(!0),(o.markdown.length||t.length)&&o.markdown===t)return;return t=P(),o.markdown=t,M&&M.destroy(),s.open()?e=s.onEnd(function(){return I(t,o.editMode),e()}):I(t,o.editMode),B()}}),o.$on("$destroy",function(){if(M)return C.length&&$(C[0]).off(),M.destroy()})},{templateUrl:"common/components/wysiwyg-toolbar.html",scope:{placeholder:"@",version:"<",storageKey:"<",content:"<",onCancel:"&",onSave:"&",onUploadFile:"&",onChange:"&"},link:y}},angular.module("taigaComponents").directive("tgWysiwyg",["$translate","$tgConfirm","$tgStorage","tgWysiwygService","animationFrame","tgLoader","tgWysiwygCodeHightlighterService","tgWysiwygMentionService","$tgAnalytics","$location",t])}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.wysiwygCodeHightlighterService=t,this.projectService=e,this.navurls=r,this.emojis=n}return t.$inject=["tgWysiwygCodeHightlighterService","tgProjectService","$tgNavUrls","$tgEmojis"],t.prototype.searchEmojiByName=function(t){return this.emojis.searchByName(t)},t.prototype.pipeLinks=function(t){return t.replace(/\[\[(.*?)\]\]/g,function(t,e,r,n){var i,o,s;return o=e.split("|"),i=o[0],s=o[1]||o[0],"["+s+"]("+i+")"})},t.prototype.replaceUrls=function(t){var e,r,n,i,o;for(e=document.createElement("html"),e.innerHTML=t,o=e.querySelectorAll("a"),r=0,n=o.length;r(.*?)
    <\/li>/g,"
  • $1
  • ")},t.prototype.getMarkdown=function(t){var e,r,n;return e={filter:["html","body","span","div"],replacement:function(t){return t}},r={filter:function(t){return function(t){return"PRE"===t.nodeName&&t.firstChild&&"CODE"===t.firstChild.nodeName}}(this),replacement:function(t){return function(e,r){var n;return n=t.wysiwygCodeHightlighterService.getLanguageInClassList(r.firstChild.classList),n||(n=""),"\n\n```"+n+"\n"+_.trim(r.firstChild.textContent)+"\n```\n\n"}}(this)},t=t.replace(/ (<\/.*>)/g,"$1"),t=this.emojis.replaceImgsByEmojiName(t),t=this.replaceUrls(t),t=this.removeTrailingListBr(t),n=toMarkdown(t,{gfm:!0,converters:[e,r]})},t.prototype.parseMentionMatches=function(t){var e,r,n,i,o,s,a;for(s="twitter",a=this.tagBuilder,r=[],o=/@[^\s]{1,50}[^.\s]/g,e=o.exec(t);null!==e;)n=e.index,i=t.charAt(n-1),e.index===o.lastIndex&&o.lastIndex++,e.forEach(function(t,e){return r.push(new Autolinker.match.Mention({tagBuilder:a,matchedText:t,offset:n,serviceName:s,mention:t.slice(1)}))}),e=o.exec(t);return r},t.prototype.autoLinkHTML=function(t){var e,r;return r=String(Autolinker.matcher.Mention.prototype.matcherRegexes.twitter),r.indexOf(".")===-1&&(r="@[^s]{1,50}[^.s]"),e=new Autolinker({mention:"twitter",hashtag:"twitter",replaceFn:function(t){return function(e){var r,n;return"mention"===e.getType()?(r=t.navurls.resolve("user-profile",{project:t.projectService.project.get("slug"),username:e.getMention()}),'@'+e.getMention()+""):"hashtag"===e.getType()?(n=t.navurls.resolve("project-detail-ref",{project:t.projectService.project.get("slug"),ref:e.getHashtag()}),'#'+e.getHashtag()+""):void 0}}(this)}),Autolinker.matcher.Mention.prototype.parseMatches=this.parseMentionMatches.bind(e),e.link(t)},t.prototype.getHTML=function(t){var e,r,n;return t&&t.length?(r={breaks:!0},t=this.emojis.replaceEmojiNameByImgs(t),t=this.pipeLinks(t),e=window.markdownit({breaks:!0}),e.use(window.markdownitLazyHeaders),n=e.render(t),n=this.searchWikiLinks(n),n=this.autoLinkHTML(n)):""},t}(),angular.module("taigaComponents").service("tgWysiwygService",t)}.call(this),function(){var t;t=function(){function t(t){this.translate=t,this.is_open=!1,this.texts={week:this.translate.instant("DISCOVER.FILTERS.WEEK"),month:this.translate.instant("DISCOVER.FILTERS.MONTH"),year:this.translate.instant("DISCOVER.FILTERS.YEAR"),all:this.translate.instant("DISCOVER.FILTERS.ALL_TIME")}}return t.$inject=["$translate"],t.prototype.currentText=function(){return this.texts[this.currentOrderBy]},t.prototype.open=function(){return this.is_open=!0},t.prototype.close=function(){return this.is_open=!1},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.is_open=!1,this.onChange({orderBy:this.currentOrderBy})},t}(),angular.module("taigaDiscover").controller("DiscoverHomeOrderBy",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"DiscoverHomeOrderBy",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-home-order-by/discover-home-order-by.html",scope:{currentOrderBy:"=orderBy",onChange:"&"},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverHomeOrderBy",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.discoverProjectsService.projectsCount}}(this)),this.discoverProjectsService.fetchStats()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.selectFilter=function(t){return this.onChange({filter:t,q:this.q})},t.prototype.submitFilter=function(){return this.onChange({filter:this.filter,q:this.q})},t}(),angular.module("taigaDiscover").controller("DiscoverSearchBar",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){},{controller:"DiscoverSearchBar",controllerAs:"vm",templateUrl:"discover/components/discover-search-bar/discover-search-bar.html",bindToController:!0,scope:{q:"=",filter:"=",onChange:"&"},compile:function(t,e){if(!e.q)return e.q=""},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchBar",t)}.call(this),function(){var t;t=function(){function t(){this.like_is_open=0===this.orderBy.indexOf("-total_fans"),this.activity_is_open=0===this.orderBy.indexOf("-total_activity")}return t.$inject=[],t.prototype.openLike=function(){return this.like_is_open=!0,this.activity_is_open=!1,this.setOrderBy("-total_fans_last_week")},t.prototype.openActivity=function(){return this.activity_is_open=!0,this.like_is_open=!1,this.setOrderBy("-total_activity_last_week")},t.prototype.setOrderBy=function(t){return null==t&&(t=""),t||(this.like_is_open=!1,this.activity_is_open=!1),this.onChange({orderBy:t})},t}(),angular.module("taigaDiscover").controller("DiscoverSearchListHeader",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"DiscoverSearchListHeader",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-search-list-header/discover-search-list-header.html",scope:{onChange:"&",orderBy:"="},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchListHeader",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"featured",function(t){return function(){return t.discoverProjectsService.featured}}(this)),this.discoverProjectsService.fetchFeatured()}return t.$inject=["tgDiscoverProjectsService"],t}(),angular.module("taigaDiscover").controller("FeaturedProjects",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r){},{controller:"FeaturedProjects",controllerAs:"vm",templateUrl:"discover/components/featured-projects/featured-projects.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgFeaturedProjects",t)}.call(this),function(){var t;t=function(){return{templateUrl:"discover/components/highlighted/highlighted.html",scope:{loading:"=",highlighted:"=",orderBy:"="}}},t.$inject=[],angular.module("taigaDiscover").directive("tgHighlighted",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"highlighted",function(t){return function(){return t.discoverProjectsService.mostActive}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostActive({order_by:this.order_by}).then(function(t){return function(){return t.loading=!1}}(this))},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.fetch()},t.prototype.getOrderBy=function(t){return"all"===this.currentOrderBy?"-total_activity":"-total_activity_last_"+this.currentOrderBy},t}(),angular.module("taigaDiscover").controller("MostActive",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"MostActive",controllerAs:"vm",templateUrl:"discover/components/most-active/most-active.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgMostActive",t)}.call(this),function(){var t;t=function(){function t(t){this.discoverProjectsService=t,taiga.defineImmutableProperty(this,"highlighted",function(t){return function(){return t.discoverProjectsService.mostLiked}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return t.$inject=["tgDiscoverProjectsService"],t.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostLiked({order_by:this.order_by}).then(function(t){return function(){return t.loading=!1}}(this))},t.prototype.orderBy=function(t){return this.currentOrderBy=t,this.fetch()},t.prototype.getOrderBy=function(){return"all"===this.currentOrderBy?"-total_fans":"-total_fans_last_"+this.currentOrderBy},t}(),angular.module("taigaDiscover").controller("MostLiked",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"MostLiked",controllerAs:"vm",templateUrl:"discover/components/most-liked/most-liked.html",scope:{},link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgMostLiked",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n){var i,o;this.location=t,this.navUrls=e,this.appMetaService=r,this.translate=n,o=this.translate.instant("DISCOVER.PAGE_TITLE"),i=this.translate.instant("DISCOVER.PAGE_DESCRIPTION"),this.appMetaService.setAll(o,i)}return t.$inject=["$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],t.prototype.onSubmit=function(t){var e;return e=this.navUrls.resolve("discover-search"),this.location.search("text",t).path(e)},t}(),angular.module("taigaDiscover").controller("DiscoverHome",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n,i,o,s){var a,c;this.routeParams=t,this.discoverProjectsService=e,this.route=r,this.location=n,this.analytics=i,this.appMetaService=o,this.translate=s,this.page=1,taiga.defineImmutableProperty(this,"searchResult",function(t){return function(){return t.discoverProjectsService.searchResult}}(this)),taiga.defineImmutableProperty(this,"nextSearchPage",function(t){return function(){return t.discoverProjectsService.nextSearchPage}}(this)),this.q=this.routeParams.text,this.filter=this.routeParams.filter||"all",this.orderBy=this.routeParams.order_by||"",this.loadingGlobal=!1,this.loadingList=!1,this.loadingPagination=!1,c=this.translate.instant("DISCOVER.SEARCH.PAGE_TITLE"), +a=this.translate.instant("DISCOVER.SEARCH.PAGE_DESCRIPTION"),this.appMetaService.setAll(c,a),this.analytics.trackPage(this.location.url(),"Discover Search")}return t.$inject=["$routeParams","tgDiscoverProjectsService","$route","$tgLocation","$tgAnalytics","tgAppMetaService","$translate"],t.prototype.fetch=function(){return this.page=1,this.discoverProjectsService.resetSearchList(),this.search()},t.prototype.fetchByGlobalSearch=function(){if(!this.loadingGlobal)return this.loadingGlobal=!0,this.fetch().then(function(t){return function(){return t.loadingGlobal=!1}}(this))},t.prototype.fetchByOrderBy=function(){if(!this.loadingList)return this.loadingList=!0,this.fetch().then(function(t){return function(){return t.loadingList=!1}}(this))},t.prototype.showMore=function(){if(!this.loadingPagination)return this.loadingPagination=!0,this.page++,this.search().then(function(t){return function(){return t.loadingPagination=!1}}(this))},t.prototype.search=function(){var t,e;return t=this.getFilter(),e={page:this.page,q:this.q,order_by:this.orderBy},_.assign(e,t),this.discoverProjectsService.fetchSearch(e)},t.prototype.getFilter=function(){return"people"===this.filter?{is_looking_for_people:!0}:"scrum"===this.filter?{is_backlog_activated:!0}:"kanban"===this.filter?{is_kanban_activated:!0}:{}},t.prototype.onChangeFilter=function(t,e){return this.filter=t,this.q=e,this.route.updateParams({filter:this.filter,text:this.q}),this.analytics.trackPage(this.location.url(),"Discover Search"),this.fetchByGlobalSearch()},t.prototype.onChangeOrder=function(t){return this.orderBy=t,this.route.updateParams({order_by:t}),this.analytics.trackPage(this.location.url(),"Discover Search"),this.fetchByOrderBy()},t}(),angular.module("taigaDiscover").controller("DiscoverSearch",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){return n.fetch()},{controller:"DiscoverSearch",controllerAs:"vm",link:t}},t.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearch",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga,t=function(t){function n(t,r){this.rs=t,this.projectsService=r,this._mostLiked=Immutable.List(),this._mostActive=Immutable.List(),this._featured=Immutable.List(),this._searchResult=Immutable.List(),this._projectsCount=0,this.decorate=this.projectsService._decorate.bind(this.projectsService),e.defineImmutableProperty(this,"mostLiked",function(t){return function(){return t._mostLiked}}(this)),e.defineImmutableProperty(this,"mostActive",function(t){return function(){return t._mostActive}}(this)),e.defineImmutableProperty(this,"featured",function(t){return function(){return t._featured}}(this)),e.defineImmutableProperty(this,"searchResult",function(t){return function(){return t._searchResult}}(this)),e.defineImmutableProperty(this,"nextSearchPage",function(t){return function(){return t._nextSearchPage}}(this)),e.defineImmutableProperty(this,"projectsCount",function(t){return function(){return t._projectsCount}}(this))}var i;return r(n,t),n.$inject=["tgResources","tgProjectsService"],i={discover_mode:!0},n.prototype.fetchMostLiked=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,5),n=Immutable.fromJS(r),n=n.map(t.decorate),t._mostLiked=n}}(this))},n.prototype.fetchMostActive=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,5),n=Immutable.fromJS(r),n=n.map(t.decorate),t._mostActive=n}}(this))},n.prototype.fetchFeatured=function(){var t;return t=_.extend({},i),t.is_featured=!0,this.rs.projects.getProjects(t,!1).then(function(t){return function(e){var r,n;return r=e.data.slice(0,4),n=Immutable.fromJS(r),n=n.map(t.decorate),t._featured=n}}(this))},n.prototype.resetSearchList=function(){return this._searchResult=Immutable.List()},n.prototype.fetchStats=function(){return this.rs.stats.discover().then(function(t){return function(e){return t._projectsCount=e.getIn(["projects","total"])}}(this))},n.prototype.fetchSearch=function(t){var e;return e=_.extend({},i,t),this.rs.projects.getProjects(e).then(function(t){return function(e){var r;return t._nextSearchPage=!!e.headers("X-Pagination-Next"),r=Immutable.fromJS(e.data),r=r.map(t.decorate),t._searchResult=t._searchResult.concat(r)}}(this))},n}(e.Service),angular.module("taigaDiscover").service("tgDiscoverProjectsService",t)}.call(this),function(){var t,e,r,n;r=this.taiga,n=r.trim,e=r.getRandomDefaultColor,t=function(){function t(t,r,n,i){this.confirm=t,this.projectService=r,this.epicsService=n,this.analytics=i,this.project=this.projectService.project.toJS(),this.newEpic={color:e(),status:this.project.default_epic_status,tags:[]},this.attachments=Immutable.List(),this.loading=!1}return t.$inject=["$tgConfirm","tgProjectService","tgEpicsService","$tgAnalytics"],t.prototype.createEpic=function(){if(this.validateForm())return this.loading=!0,this.epicsService.createEpic(this.newEpic,this.attachments).then(function(t){return function(e){return t.analytics.trackEvent("epic","create","create epic",1),t.onCreateEpic(),t.loading=!1}}(this))["catch"](function(t){return function(e){if(t.loading=!1,t.setFormErrors(e.data),e.data._error_message)return t.confirm.notify("error",e.data._error_message)}}(this))},t.prototype.selectColor=function(t){return this.newEpic.color=t},t.prototype.addTag=function(t,e){if(t=n(t.toLowerCase()),!_.find(this.newEpic.tags,function(e){return e[0]===t}))return this.newEpic.tags.push([t,e])},t.prototype.deleteTag=function(t){return _.remove(this.newEpic.tags,function(e){return e[0]===t[0]})},t.prototype.addAttachment=function(t){return this.attachments.push(t)},t}(),angular.module("taigaEpics").controller("CreateEpicCtrl",t)}.call(this),function(){var t;t=function(){var t;return t=function(t,e,r,n){var i;return i=e.find("form").checksley(),n.validateForm=function(t){return function(){return i.validate()}}(this),n.setFormErrors=function(t){return function(t){return i.setErrors(t)}}(this)},{link:t,templateUrl:"epics/create-epic/create-epic.html",controller:"CreateEpicCtrl",controllerAs:"vm",bindToController:{onCreateEpic:"&"},scope:{}}},angular.module("taigaEpics").directive("tgCreateEpic",t)}.call(this),function(){var t;t=function(){function t(t,e,r){this.confirm=t,this.projectService=e,this.epicsService=r,this.displayUserStories=!1,this.displayAssignedTo=!1,this.displayStatusList=!1,this.loadingStatus=!1,this.project=this.projectService.project.toJS(),this._calculateProgressBar()}return t.$inject=["$tgConfirm","tgProjectService","tgEpicsService"],t.prototype._calculateProgressBar=function(){var t,e;return this.epic.getIn(["status_extra_info","is_closed"])===!0?this.percentage="100%":(t=this.epic.getIn(["user_stories_counts","progress"]),e=this.epic.getIn(["user_stories_counts","total"]),0===e?this.percentage="0%":this.percentage=100*t/e+"%")},t.prototype.canEditEpics=function(){return this.projectService.hasPermission("modify_epic")},t.prototype.toggleUserStoryList=function(){return this.displayUserStories?this.displayUserStories=!1:this.epicsService.listRelatedUserStories(this.epic).then(function(t){return function(e){return t.epicStories=e,t.displayUserStories=!0}}(this))["catch"](function(t){return function(){return t.confirm.notify("error")}}(this))},t.prototype.updateStatus=function(t){return this.displayStatusList=!1,this.loadingStatus=!0,this.epicsService.updateEpicStatus(this.epic,t)["catch"](function(t){return function(){return t.confirm.notify("error")}}(this))["finally"](function(t){return function(){return t.loadingStatus=!1}}(this))},t.prototype.updateAssignedTo=function(t){return this.assignLoader=!0,this.epicsService.updateEpicAssignedTo(this.epic,(null!=t?t.id:void 0)||null)["catch"](function(t){return function(){return t.confirm.notify("error")}}(this)).then(function(t){return function(){return t.assignLoader=!1}}(this))},t}(),angular.module("taigaEpics").controller("EpicRowCtrl",t)}.call(this),function(){var t;t=function(){return{templateUrl:"epics/dashboard/epic-row/epic-row.html",controller:"EpicRowCtrl",controllerAs:"vm",bindToController:!0,scope:{epic:"=",column:"="}}},angular.module("taigaEpics").directive("tgEpicRow",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,r,n,i,o,s,a,c,u){this.params=t,this.errorHandlingService=r,this.lightboxFactory=n,this.lightboxService=i,this.confirm=o,this.projectService=s,this.epicsService=a,this.appMetaService=c,this.translate=u,this.sectionName="EPICS.SECTION_NAME",e.defineImmutableProperty(this,"project",function(t){return function(){return t.projectService.project}}(this)),e.defineImmutableProperty(this,"epics",function(t){return function(){return t.epicsService.epics}}(this)),this.appMetaService.setfn(this._setMeta.bind(this))}return t.$inject=["$routeParams","tgErrorHandlingService","tgLightboxFactory","lightboxService","$tgConfirm","tgProjectService","tgEpicsService","tgAppMetaService","$translate"],t.prototype._setMeta=function(){var t;return this.project?(t={projectName:this.project.get("name"),projectDescription:this.project.get("description")},{title:this.translate.instant("EPICS.PAGE_TITLE",t),description:this.translate.instant("EPICS.PAGE_DESCRIPTION",t)}):null},t.prototype.loadInitialData=function(){return this.epicsService.clear(),this.projectService.setProjectBySlug(this.params.pslug).then(function(t){return function(){return t.projectService.isEpicsDashboardEnabled()?t.projectService.hasPermission("view_epics")?t.epicsService.fetchEpics():t.errorHandlingService.permissionDenied():t.errorHandlingService.notFound()}}(this))},t.prototype.canCreateEpics=function(){return this.projectService.hasPermission("add_epic")},t.prototype.onCreateEpic=function(){var t;return t=function(t){return function(){t.lightboxService.closeAll(),t.confirm.notify("success")}}(this),this.lightboxFactory.create("tg-create-epic",{"class":"lightbox lightbox-create-epic open","on-create-epic":"onCreateEpic()"},{onCreateEpic:t.bind(this)})},t}(),angular.module("taigaEpics").controller("EpicsDashboardCtrl",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i){var o,s,a;if(e.hasPermission("modify_epic"))return o=t(i.tgEpicsSortable),s=dragula([n[0]],{copySortSource:!1,copy:!1,mirrorContainer:n[0],moves:function(t){return $(t).is("div.epics-table-body-row")}}),s.on("dragend",function(t){var e,n,i;return n=$(t),e=n.scope().epic,i=n.index(),r.$apply(function(){return o(r,{epic:e,newIndex:i})})}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&s.dragging}}),r.$on("$destroy",function(){return n.off(),s.destroy()})},{link:r}},t.$inject=["$parse","tgProjectService"],angular.module("taigaComponents").directive("tgEpicsSortable",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.generateHash,t=function(){function t(t,n,i,o,s){this.confirm=t,this.epicsService=n,this.timeout=i,this.storage=o,this.projectService=s,this.hash=e([this.projectService.project.get("id"),"epics"]),this.displayOptions=!1,this.displayVotes=!0,this.column=this.storage.get(this.hash,{votes:!0,name:!0,project:!0,sprint:!0,assigned:!0,status:!0,progress:!0}),r.defineImmutableProperty(this,"epics",function(t){return function(){return t.epicsService.epics}}(this)),r.defineImmutableProperty(this,"disabledEpicsPagination",function(t){return function(){return t.epicsService._disablePagination}}(this)),r.defineImmutableProperty(this,"loadingEpics",function(t){return function(){return t.epicsService._loadingEpics}}(this))}return t.$inject=["$tgConfirm","tgEpicsService","$timeout","$tgStorage","tgProjectService"],t.prototype.toggleEpicTableOptions=function(){return this.displayOptions=!this.displayOptions},t.prototype.reorderEpic=function(t,e){return t.get("epics_order")===e?null:this.epicsService.reorderEpic(t,e).then(null,function(t){return function(){return t.confirm.notify("error")}}(this))},t.prototype.nextPage=function(){return this.epicsService.nextPage()},t.prototype.hoverEpicTableOption=function(){if(this.timer)return this.timeout.cancel(this.timer)},t.prototype.hideEpicTableOption=function(){return this.timer=this.timeout(function(t){return function(){return t.displayOptions=!1}}(this),400)},t.prototype.updateViewOptions=function(){return this.storage.set(this.hash,this.column)},t}(),angular.module("taigaEpics").controller("EpicsTableCtrl",t)}.call(this),function(){var t;t=function(){return{templateUrl:"epics/dashboard/epics-table/epics-table.html",controller:"EpicsTableCtrl",controllerAs:"vm",scope:{}}},angular.module("taigaEpics").directive("tgEpicsTable",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(){this._calculateProgressBar()}return t.$inject=[],t.prototype._calculateProgressBar=function(){var t,e;return this.story.get("is_closed")===!0?this.percentage="100%":(t=this.story.get("tasks").size,e=this.story.get("tasks").filter(function(t){return t.get("is_closed")}).size,0===t?this.percentage="0%":this.percentage=100*e/t+"%")},t}(),e.controller("StoryRowCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){return{templateUrl:"epics/dashboard/story-row/story-row.html",controller:"StoryRowCtrl",controllerAs:"vm",bindToController:!0,scope:{story:"=",column:"="}}},e.directive("tgStoryRow",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,r,n,i){this.projectService=t,this.attachmentsService=r,this.resources=n,this.xhrError=i,this.clear(),e.defineImmutableProperty(this,"epics",function(t){return function(){return t._epics}}(this))}return t.$inject=["tgProjectService","tgAttachmentsService","tgResources","tgXhrErrorService"],t.prototype.clear=function(){return this._loadingEpics=!1,this._disablePagination=!1,this._page=1,this._epics=Immutable.List()},t.prototype.fetchEpics=function(t){return null==t&&(t=!1),this._loadingEpics=!0,this._disablePagination=!0,this.resources.epics.list(this.projectService.project.get("id"),this._page).then(function(e){return function(r){return t?(e.clear(),e._epics=r.list):e._epics=e._epics.concat(r.list),e._loadingEpics=!1,e._disablePagination=!r.headers("x-pagination-next")}}(this))["catch"](function(t){return function(e){return t.xhrError.response(e)}}(this))},t.prototype.nextPage=function(){return this._page++,this.fetchEpics()},t.prototype.listRelatedUserStories=function(t){return this.resources.userstories.listInEpic(t.get("id"))},t.prototype.createEpic=function(t,e){return t.project=this.projectService.project.get("id"),this.resources.epics.post(t).then(function(t){return function(r){var n;return n=_.map(e.toJS(),function(e){return t.attachmentsService.upload(e.file,r.get("id"),r.get("project"),"epic")}),Promise.all(n).then(t.fetchEpics.bind(t,!0))}}(this))},t.prototype.reorderEpic=function(t,e){var r,n,i,o,s,a,c,u,l;return s={},this._epics.forEach(function(t){return s[t.get("id")]=t.get("epics_order")}),l=this.epics.filter(function(e){return function(e){return e.get("id")!==t.get("id")}}(this)),n=l.slice(0,e),r=l.slice(e),a=n.last(),o=a?a.get("epics_order")+1:0,s[t.get("id")]=o,c=n.filter(function(t){return function(t){return t.get("epics_order")===a.get("epics_order")}}(this)),u=_.fromPairs(c.map(function(t){return function(t){return[t.get("id"),t.get("epics_order")]}}(this)).toJS()),r.forEach(function(t){return s[t.get("id")]=t.get("epics_order")+1}),this._epics=this._epics.map(function(t){return t.set("epics_order",s[t.get("id")])}),this._epics=this._epics.sortBy(function(t){return t.get("epics_order")}),i={epics_order:o,version:t.get("version")},this.resources.epics.reorder(t.get("id"),i,u).then(function(t){return function(e){return t._epics=t._epics.map(function(t){return t.get("id")===e.get("id")?e:t})}}(this))},t.prototype.reorderRelatedUserstory=function(t,e,r,n){var i,o,s,a,c,u,l,p,h;return h=e.filter(function(t){return function(t){return t.get("id")!==r.get("id")}}(this)),i=h.slice(0,n),c=i.last(),a=c?c.get("epic_order")+1:0,u=i.filter(function(t){return function(t){return t.get("epic_order")===c.get("epic_order")}}(this)),l=_.fromPairs(u.map(function(t){return function(t){return[t.get("id"),t.get("epic_order")]}}(this)).toJS()),o={order:a},s=t.get("id"),p=r.get("id"),this.resources.epics.reorderRelatedUserstory(s,p,o,l).then(function(e){return function(){return e.listRelatedUserStories(t)}}(this))},t.prototype.replaceEpic=function(t){return this._epics=this._epics.map(function(e){return e.get("id")===t.get("id")?t:e})},t.prototype.updateEpicStatus=function(t,e){var r;return r={status:e,version:t.get("version")},this.resources.epics.patch(t.get("id"),r).then(this.replaceEpic.bind(this))},t.prototype.updateEpicAssignedTo=function(t,e){var r;return r={assigned_to:e,version:t.get("version")},this.resources.epics.patch(t.get("id"),r).then(this.replaceEpic.bind(this))},t}(),angular.module("taigaEpics").service("tgEpicsService",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e){this.projectService=t,this.epicsService=e,this.sectionName="Epics",this.showCreateRelatedUserstoriesLightbox=!1}return t.$inject=["tgProjectService","tgEpicsService"],t.prototype.showRelatedUserStoriesSection=function(){var t;return this.projectService.hasPermission("view_epics")||(null!=(t=this.userstories)?t.length:void 0)>0},t.prototype.userCanSort=function(){return this.projectService.hasPermission("modify_epic")},t.prototype.loadRelatedUserstories=function(){return this.epicsService.listRelatedUserStories(this.epic).then(function(t){return function(e){return t.userstories=e}}(this))},t.prototype.reorderRelatedUserstory=function(t,e){return this.epicsService.reorderRelatedUserstory(this.epic,this.userstories,t,e).then(function(t){return function(e){return t.userstories=e}}(this))},t}(),e.controller("RelatedUserStoriesCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e,r,n){this.currentUserService=t,this.rs=e,this.confirm=r,this.analytics=n,this.projects=null,this.projectUserstories=Immutable.List(),this.loading=!1}return t.$inject=["tgCurrentUserService","tgResources","$tgConfirm","$tgAnalytics"],t.prototype.loadProjects=function(){if(null===this.projects)return this.projects=this.currentUserService.projects.get("all")},t.prototype.filterUss=function(t,e){var r;return r=this.rs.userstories.listInAllProjects({project:t,q:e},!0).then(function(t){return function(e){var r,n;return r=t.epicUserstories.map(function(t){return t.get("id")}),n=e.filter(function(t){return r.indexOf(t.get("id"))===-1}),t.projectUserstories=n}}(this))},t.prototype.saveRelatedUserStory=function(t,e){var r,n,i;if(this.validateExistingUserstoryForm())return this.loading=!0,n=function(t){return function(e){return t.loading=!1,t.confirm.notify("error"),t.setExistingUserstoryFormErrors(e)}}(this),i=function(t){return function(){return t.analytics.trackEvent("epic related user story","create","create related user story on epic",1),t.loading=!1,e&&e(),t.loadRelatedUserstories()}}(this),r=this.epic.get("id"),this.rs.epics.addRelatedUserstory(r,t).then(i,n)},t.prototype.bulkCreateRelatedUserStories=function(t,e,r){var n,i,o;if(this.validateNewUserstoryForm())return this.loading=!0,i=function(t){return function(e){return t.loading=!1,t.confirm.notify("error"),t.setNewUserstoryFormErrors(e)}}(this),o=function(t){return function(){return t.analytics.trackEvent("epic related user story","create","create related user story on epic",1),t.loading=!1,r&&r(),t.loadRelatedUserstories()}}(this),n=this.epic.get("id"),this.rs.epics.bulkCreateRelatedUserStories(n,t,e).then(o,i)},t}(),e.controller("RelatedUserstoriesCreateCtrl",t)}.call(this),function(){var t,e,r;r=angular.module("taigaEpics"),e=this.taiga.debounceLeading,t=function(t){var r;return this.lightboxService=t,r=function(t,r,n,i){var o,s;return s=r.find(".new-user-story-form").checksley(),o=r.find(".existing-user-story-form").checksley(),i.validateNewUserstoryForm=function(t){return function(){return s.validate()}}(this),i.setNewUserstoryFormErrors=function(t){return function(t){return s.setErrors(t)}}(this),i.validateExistingUserstoryForm=function(t){return function(){return o.validate()}}(this),i.setExistingUserstoryFormErrors=function(t){return function(t){return o.setErrors(t)}}(this),t.showLightbox=function(e){return i.loadProjects(),t.selectProject(e).then(function(t){return function(){return lightboxService.open(r.find(".lightbox-create-related-user-stories"))}}(this))},t.closeLightbox=function(){return t.selectedUserstory=null,t.searchUserstory="",t.relatedUserstoriesText="",lightboxService.close(r.find(".lightbox-create-related-user-stories"))},t.$watch("vm.project",function(e){if(null!=e)return t.selectedProject=e.get("id")}),t.selectProject=function(e){return t.selectedUserstory=null,t.searchUserstory="",i.filterUss(e,t.searchUserstory)},t.onUpdateSearchUserstory=e(300,function(){return t.selectedUserstory=null,i.filterUss(t.selectedProject,t.searchUserstory)})},{link:r,templateUrl:"epics/related-userstories/related-userstories-create/related-userstories-create.html",controller:"RelatedUserstoriesCreateCtrl",controllerAs:"vm",bindToController:!0,scope:{showCreateRelatedUserstoriesLightbox:"=",project:"=",epic:"=",epicUserstories:"=",loadRelatedUserstories:"&"}}},t.$inject=["lightboxService"],r.directive("tgRelatedUserstoriesCreate",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(t,e){var r;return r=function(r,n,i){var o,s,a;if(e.hasPermission("modify_epic"))return o=t(i.tgRelatedUserstoriesSortable),s=dragula([n[0]],{copySortSource:!1,copy:!1,mirrorContainer:n[0],moves:function(t){return $(t).is("tg-related-userstory-row")}}),s.on("dragend",function(t){var e,n,i;return e=$(t),i=e.scope().us,n=e.index(),r.$apply(function(){return o(r,{us:i,newIndex:n})})}),a=autoScroll(window,{margin:20,pixels:30,scrollWhenOutside:!0,autoScroll:function(){return this.down&&s.dragging}}),r.$on("$destroy",function(){return n.off(),s.destroy()})},{link:r}},t.$inject=["$parse","tgProjectService"],e.directive("tgRelatedUserstoriesSortable",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){return{templateUrl:"epics/related-userstories/related-userstories.html",controller:"RelatedUserStoriesCtrl",controllerAs:"vm",bindToController:!0,scope:{userstories:"=",project:"=",epic:"="}}},t.$inject=[],e.directive("tgRelatedUserstories",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){function t(t,e,r,n){this.avatarService=t,this.translate=e,this.confirm=r,this.rs=n}return t.$inject=["tgAvatarService","$translate","$tgConfirm","tgResources"],t.prototype.setAvatarData=function(){var t;return t=this.userstory.get("assigned_to_extra_info"),this.avatar=this.avatarService.getAvatar(t)},t.prototype.getAssignedToFullNameDisplay=function(){return this.userstory.get("assigned_to")?this.userstory.getIn(["assigned_to_extra_info","full_name_display"]):this.translate.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED")},t.prototype.onDeleteRelatedUserstory=function(){var t,e;return e=this.translate.instant("EPIC.TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY"),t=this.translate.instant("EPIC.MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY",{subject:this.userstory.get("subject")}),this.confirm.askOnDelete(e,t).then(function(e){return function(r){var n,i,o,s;return i=function(){return t=e.translate.instant("EPIC.ERROR_UNLINK_RELATED_USERSTORY",{errorMessage:t}),e.confirm.notify("error",null,t),r.finish(!1)},o=function(){return e.loadRelatedUserstories(),r.finish()},n=e.epic.get("id"),s=e.userstory.get("id"),e.rs.epics.deleteRelatedUserstory(n,s).then(o,i)}}(this))},t}(),e.controller("RelatedUserstoryRowCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaEpics"),t=function(){var t;return t=function(t,e,r,n){return n.setAvatarData()},{link:t,templateUrl:"epics/related-userstories/related-userstory-row/related-userstory-row.html",controller:"RelatedUserstoryRowCtrl",controllerAs:"vm",bindToController:!0,scope:{userstory:"=",epic:"=",project:"=",loadRelatedUserstories:"&"}}},t.$inject=[],e.directive("tgRelatedUserstoryRow",t)}.call(this),function(){var t,e,r=function(t,e){return function(){return t.apply(e,arguments)}},n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;e=this.taiga,t=function(t){function i(t,n,i,o,s,a,c,u){var l,p;this.routeParams=t,this.externalAppsService=n,this.window=i,this.currentUserService=o,this.location=s,this.navUrls=a,this.xhrError=c,this.loader=u,this.createApplicationToken=r(this.createApplicationToken,this),this._getApplicationToken=r(this._getApplicationToken,this),this._redirect=r(this._redirect,this),this.loader.start(!1),this._applicationId=this.routeParams.application,this._state=this.routeParams.state,this._getApplicationToken(),this._user=this.currentUserService.getUser(),this._application=null,p=encodeURIComponent(this.location.url()),l=this.navUrls.resolve("login"),this.loginWithAnotherUserUrl=l+"?next="+p,e.defineImmutableProperty(this,"user",function(t){return function(){return t._user}}(this)),e.defineImmutableProperty(this,"application",function(t){return function(){return t._application}}(this))}return n(i,t),i.$inject=["$routeParams","tgExternalAppsService","$window","tgCurrentUserService","$location","$tgNavUrls","tgXhrErrorService","tgLoader"],i.prototype._redirect=function(t){var e;return e=t.get("next_url"),this.window.open(e,"_self")},i.prototype._getApplicationToken=function(){return this.externalAppsService.getApplicationToken(this._applicationId,this._state).then(function(t){return function(e){return t._application=e.get("application"),e.get("auth_code")?t._redirect(e):t.loader.pageLoaded()}}(this))["catch"](function(t){return function(e){return t.loader.pageLoaded(),t.xhrError.response(e)}}(this))},i.prototype.cancel=function(){return this.window.history.back()},i.prototype.createApplicationToken=function(){return this.externalAppsService.authorizeApplicationToken(this._applicationId,this._state).then(function(t){return function(e){return t._redirect(e)}}(this))["catch"](function(t){return function(e){return t.xhrError.response(e)}}(this))},i}(e.Controller),angular.module("taigaExternalApps").controller("ExternalApp",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t){this.rs=t}return e(r,t),r.$inject=["tgResources"],r.prototype.getApplicationToken=function(t,e){return this.rs.externalapps.getApplicationToken(t,e)},r.prototype.authorizeApplicationToken=function(t,e){return this.rs.externalapps.authorizeApplicationToken(t,e)},r}(taiga.Service),angular.module("taigaExternalApps").service("tgExternalAppsService",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t){this.lightboxFactory=t}return e(r,t),r.$inject=["tgLightboxFactory"],r.prototype.sendFeedback=function(){return this.lightboxFactory.create("tg-lb-feedback",{"class":"lightbox lightbox-feedback lightbox-generic-form"})},r}(taiga.Service),angular.module("taigaFeedback").service("tgFeedbackService",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t,e,r){this.currentUserService=t,this.permissionService=e,this.lightboxFactory=r,this.hiddenDeletedComment=!0}return t.$inject=["tgCurrentUserService","tgCheckPermissionsService","tgLightboxFactory"],t.prototype.showDeletedComment=function(){return this.hiddenDeletedComment=!1},t.prototype.hideDeletedComment=function(){return this.hiddenDeletedComment=!0},t.prototype.checkCancelComment=function(t){if(27===t.keyCode)return this.onEditMode({commentId:this.comment.id})},t.prototype.canEditDeleteComment=function(){if(this.currentUserService.getUser())return this.user=this.currentUserService.getUser(),this.user.get("id")===this.comment.user.pk||this.permissionService.check("modify_project")},t.prototype.saveComment=function(t,e){return this.onEditComment({commentId:this.comment.id,commentData:t,callback:e})},t.prototype.displayCommentHistory=function(){return this.lightboxFactory.create("tg-lb-display-historic",{"class":"lightbox lightbox-display-historic",comment:"comment",name:"name",object:"object"},{comment:this.comment,name:this.name,object:this.object})},t}(),e.controller("CommentCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){return{scope:{name:"@",object:"@",comment:"<",type:"<",loading:"<",editing:"<",deleting:"<",objectId:"<",editMode:"<",onEditMode:"&",onDeleteComment:"&",onRestoreDeletedComment:"&",onEditComment:"&"},templateUrl:"history/comments/comment.html",bindToController:!0,controller:"CommentCtrl",controllerAs:"vm"}},e.directive("tgComment",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(){}return t.$inject=[],t.prototype.initializePermissions=function(){return this.canAddCommentPermission="comment_"+this.name},t}(),e.controller("CommentsCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return n.initializePermissions()},{scope:{type:"<",name:"@",object:"@",comments:"<",onEditMode:"&",onDeleteComment:"&",onRestoreDeletedComment:"&",onAddComment:"&",onEditComment:"&",editMode:"<",loading:"<",deleting:"<",editing:"<",projectId:"="},templateUrl:"history/comments/comments.html",bindToController:!0,controller:"CommentsCtrl",controllerAs:"vm",link:t}},e.directive("tgComments",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t){this.rs=t}return t.$inject=["$tgResources"],t.prototype._loadHistoric=function(){var t,e,r;return r=this.name,e=this.object,t=this.comment.id,this.rs.history.getCommentHistory(r,e,t).then(function(t){return function(e){return t.commentHistoryEntries=e}}(this))},t}(),e.controller("LightboxDisplayHistoricCtrl",t)}.call(this),function(){var t;t=function(t){var e;return e=function(e,r,n,i){return i._loadHistoric(),t.open(r)},{scope:{},bindToController:{name:"=",object:"=",comment:"="},templateUrl:"history/history-lightbox/comment-history-lightbox.html",controller:"LightboxDisplayHistoricCtrl",controllerAs:"vm",link:e}},t.$inject=["lightboxService"],angular.module("taigaHistory").directive("tgLbDisplayHistoric",t)}.call(this),function(){var t;t=function(){return{scope:{entry:"<"},templateUrl:"history/history-lightbox/history-entry.html"}},angular.module("taigaHistory").directive("tgHistoryEntry",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){return{templateUrl:"history/history-tabs/history-tabs.html",scope:{showCommentTab:"&",showActivityTab:"&",onActiveComments:"&",onActiveActivities:"&",onOrderComments:"&",activeTab:"<",commentsNum:"<",activitiesNum:"<",onReverse:"<"}}},e.directive("tgHistoryTabs",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(t,e,r,n){this.rs=t,this.repo=e,this.storage=r,this.projectService=n,this.editing=null,this.deleting=null,this.editMode={},this.viewComments=!0,this.reverse=this.storage.get("orderComments"),this._loadHistory()}return t.$inject=["$tgResources","$tgRepo","$tgStorage","tgProjectService"],t.prototype._loadHistory=function(){return this.rs.history.get(this.name,this.id).then(function(t){return function(e){return t._getComments(e),t._getActivities(e)}}(this))},t.prototype._getComments=function(t){ +return this.comments=_.filter(t,function(t){return""!==t.comment}),this.reverse&&this.comments-_.reverse(this.comments),this.commentsNum=this.comments.length},t.prototype._getActivities=function(t){return this.activities=_.filter(t,function(t){return Object.keys(t.values_diff).length>0}),this.activitiesNum=this.activities.length},t.prototype.showHistorySection=function(){return this.showCommentTab()||this.showActivityTab()},t.prototype.showCommentTab=function(){return this.commentsNum>0||this.projectService.hasPermission("comment_"+this.name)},t.prototype.showActivityTab=function(){return this.activitiesNum>0},t.prototype.toggleEditMode=function(t){return this.editMode[t]=!this.editMode[t]},t.prototype.onActiveHistoryTab=function(t){return this.viewComments=t},t.prototype.deleteComment=function(t){var e,r,n;return n=this.name,r=this.id,e=t,this.deleting=t,this.rs.history.deleteComment(n,r,e).then(function(t){return function(){return t._loadHistory(),t.deleting=null}}(this))},t.prototype.editComment=function(t,e){var r,n,i;return i=this.name,n=this.id,r=t,this.editing=t,this.rs.history.editComment(i,n,r,e).then(function(e){return function(){return e._loadHistory(),e.toggleEditMode(t),e.editing=null}}(this))},t.prototype.restoreDeletedComment=function(t){var e,r,n;return n=this.name,r=this.id,e=t,this.editing=t,this.rs.history.undeleteComment(n,r,e).then(function(t){return function(){return t._loadHistory(),t.editing=null}}(this))},t.prototype.addComment=function(t){return this.repo.save(this.type).then(function(e){return function(){return e._loadHistory(),t()}}(this))},t.prototype.onOrderComments=function(){return this.reverse=!this.reverse,this.storage.set("orderComments",this.reverse),this._loadHistory()},t}(),e.controller("HistorySection",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return t.$on("object:updated",function(){return n._loadHistory(t.type,t.id)})},{link:t,templateUrl:"history/history.html",controller:"HistorySection",controllerAs:"vm",bindToController:!0,scope:{type:"=",name:"@",id:"=",projectId:"="}}},t.$inject=[],e.directive("tgHistorySection",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){function t(){}return t.$inject=[],t.prototype.diffTags=function(){if("tags"===this.type)return this.diffRemoveTags=_.difference(this.diff[0],this.diff[1]).toString(),this.diffAddTags=_.difference(this.diff[1],this.diff[0]).toString()},t}(),e.controller("ActivitiesDiffCtrl",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r,n){return n.diffTags()},{scope:{type:"<",diff:"<"},templateUrl:"history/history/history-diff.html",controller:"ActivitiesDiffCtrl",controllerAs:"vm",bindToController:!0,link:t}},e.directive("tgHistoryDiff",t)}.call(this),function(){var t,e;e=angular.module("taigaHistory"),t=function(){var t;return t=function(t,e,r){},{scope:{activities:"<"},templateUrl:"history/history/history.html",link:t}},e.directive("tgHistory",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){return t.vm={},t.vm.duty=t.duty,t.vm.type=t.type,t.vm.getDutyType=function(){if(t.vm.duty){if("epics"===t.vm.duty.get("_name"))return e.instant("COMMON.EPIC");if("userstories"===t.vm.duty.get("_name"))return e.instant("COMMON.USER_STORY");if("tasks"===t.vm.duty.get("_name"))return e.instant("COMMON.TASK");if("issues"===t.vm.duty.get("_name"))return e.instant("COMMON.ISSUE")}}},{templateUrl:"home/duties/duty.html",scope:{duty:"=tgDuty",type:"@"},link:r}},t.$inject=["$tgNavUrls","$translate"],angular.module("taigaHome").directive("tgDuty",t)}.call(this),function(){var t;t=function(){function t(t,e,r){this.currentUserService=t,this.location=e,this.navUrls=r,this.currentUserService.getUser()||this.location.path(this.navUrls.resolve("discover"))}return t.$inject=["tgCurrentUserService","$location","$tgNavUrls"],t}(),angular.module("taigaHome").controller("Home",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga.groupBy,t=function(t){function n(t,e,r){this.navurls=t,this.rs=e,this.projectsService=r}return r(n,t),n.$inject=["$tgNavUrls","tgResources","tgProjectsService"],n.prototype._attachProjectInfoToWorkInProgress=function(t,e){var r,n,i,o,s;return r=function(t){return function(r,n){var i,o,s;return o=e.get(String(r.get("project"))),i={project:o.get("slug"),ref:r.get("ref")},s=t.navurls.resolve("project-"+n+"-detail",i),r=r.set("url",s),r=r.set("project",o),r=r.set("_name",n)}}(this),i=function(t,n){return t=t.filter(function(t){return e.get(String(t.get("project")))}),t=t.map(function(t){return r(t,n)})},o=t.get("assignedTo"),o.get("epics")&&(n=i(o.get("epics"),"epics"),o=o.set("epics",n)),o.get("userStories")&&(n=i(o.get("userStories"),"userstories"),o=o.set("userStories",n)),o.get("tasks")&&(n=i(o.get("tasks"),"tasks"),o=o.set("tasks",n)),o.get("issues")&&(n=i(o.get("issues"),"issues"),o=o.set("issues",n)),s=t.get("watching"),s.get("epics")&&(n=i(s.get("epics"),"epics"),s=s.set("epics",n)),s.get("userStories")&&(n=i(s.get("userStories"),"userstories"),s=s.set("userStories",n)),s.get("tasks")&&(n=i(s.get("tasks"),"tasks"),s=s.set("tasks",n)),s.get("issues")&&(n=i(s.get("issues"),"issues"),s=s.set("issues",n)),t=t.set("assignedTo",o),t=t.set("watching",s)},n.prototype.getWorkInProgress=function(t){var r,n,i,o,s,a,c,u,l,p,h,f,d,g,m,v,y;return p=Immutable.Map(),h=this.projectsService.getProjectsByUserId(t).then(function(t){return p=Immutable.fromJS(e(t.toJS(),function(t){return t.id}))}),o=Immutable.Map(),a={status__is_closed:!1,assigned_to:t},l={is_closed:!1,assigned_users:t},u={status__is_closed:!1,assigned_to:t},c={status__is_closed:!1,assigned_to:t},r=this.rs.epics.listInAllProjects(a).then(function(t){return o=o.set("epics",t)}),s=this.rs.userstories.listInAllProjects(l).then(function(t){return o=o.set("userStories",t)}),i=this.rs.tasks.listInAllProjects(u).then(function(t){return o=o.set("tasks",t)}),n=this.rs.issues.listInAllProjects(c).then(function(t){return o=o.set("issues",t)}),a={status__is_closed:!1,watchers:t},l={is_closed:!1,watchers:t},u={status__is_closed:!1,watchers:t},c={status__is_closed:!1,watchers:t},f=Immutable.Map(),d=this.rs.epics.listInAllProjects(a).then(function(t){return f=f.set("epics",t)}),v=this.rs.userstories.listInAllProjects(l).then(function(t){return f=f.set("userStories",t)}),m=this.rs.tasks.listInAllProjects(u).then(function(t){return f=f.set("tasks",t)}),g=this.rs.issues.listInAllProjects(c).then(function(t){return f=f.set("issues",t)}),y=Immutable.Map(),Promise.all([h,r,d,s,v,i,m,n,g]).then(function(t){return function(){return y=y.set("assignedTo",o),y=y.set("watching",f),y=t._attachProjectInfoToWorkInProgress(y,p)}}(this))},n}(taiga.Service),angular.module("taigaHome").service("tgHomeService",t)}.call(this),function(){var t;t=function(t){var e,r;return r=function(e,r,n,i){return e.vm={},taiga.defineImmutableProperty(e.vm,"projects",function(){return t.projects.get("recents")})},e={templateUrl:"home/projects/home-project-list.html",scope:{},link:r}},t.$inject=["tgCurrentUserService"],angular.module("taigaHome").directive("tgHomeProjectList",t)}.call(this),function(){var t;t=function(){function t(t){this.homeService=t,this.assignedTo=Immutable.Map(),this.watching=Immutable.Map()}return t.$inject=["tgHomeService"],t.prototype._setAssignedTo=function(t){var e,r,n,i;if(e=t.get("assignedTo").get("epics"),i=t.get("assignedTo").get("userStories"),n=t.get("assignedTo").get("tasks"),r=t.get("assignedTo").get("issues"),this.assignedTo=i.concat(n).concat(r).concat(e),this.assignedTo.size>0)return this.assignedTo=this.assignedTo.sortBy(function(t){return t.get("modified_date")}).reverse()},t.prototype._setWatching=function(t){var e,r,n,i;if(e=t.get("watching").get("epics"),i=t.get("watching").get("userStories"),n=t.get("watching").get("tasks"),r=t.get("watching").get("issues"),this.watching=i.concat(n).concat(r).concat(e),this.watching.size>0)return this.watching=this.watching.sortBy(function(t){return t.get("modified_date")}).reverse()},t.prototype.getWorkInProgress=function(t){return this.homeService.getWorkInProgress(t).then(function(t){return function(e){return t._setAssignedTo(e),t._setWatching(e)}}(this))},t}(),angular.module("taigaHome").controller("WorkingOn",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(t,r,n,i){var o,s;if(o=e.getUser())return s=o.get("id"),i.getWorkInProgress(s)},{controller:"WorkingOn",controllerAs:"vm",templateUrl:"home/working-on/working-on.html",scope:{},link:r}},t.$inject=["tgHomeService","tgCurrentUserService"],angular.module("taigaHome").directive("tgWorkingOn",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,e,r,n,i){this.projectService=t,this.rs=e,this.lightboxService=r,this.confirm=n,this.rootScope=i,this.project=this.projectService.project,this.roles=this.projectService.project.get("roles"),this.rolesValues={},this.loading=!1,this.defaultMaxInvites=4}return t.$inject=["tgProjectService","$tgResources","lightboxService","$tgConfirm","$rootScope"],t.prototype._areRolesValidated=function(){return Object.defineProperty(this,"areRolesValidated",{get:function(t){return function(){var e;return e=_.filter(Object.values(t.rolesValues),function(t){return t}),e.length===t.contactsToInvite.size+t.emailsToInvite.size}}(this)})},t.prototype._checkLimitMemberships=function(){var t;return null===this.project.get("max_memberships")?this.membersLimit=this.defaultMaxInvites:(t=Math.max(this.project.get("max_memberships")-this.project.get("total_memberships"),0),this.membersLimit=Math.min(t,this.defaultMaxInvites)),this.showWarningMessage=this.membersLimit=s.get("max_memberships_private_projects"),i&&n?(e="private-space-members",r=s.get("max_memberships_private_projects")):i?e="private-space":n&&(e="private-members",r=s.get("max_memberships_private_projects"))):(o=!this.currentUserService.canCreatePublicProjects().valid,n=null!==s.get("max_memberships_public_projects")&&t.headers.memberships>=s.get("max_memberships_public_projects"),o&&n?(e="public-space-members",r=s.get("max_memberships_public_projects")):o?e="public-space":n&&(e="public-members",r=s.get("max_memberships_public_projects"))),!!e&&{key:e,values:{max_memberships:r,members:t.headers.memberships}})},r}(taiga.Service),angular.module("taigaProjects").service("tgImportProjectService",t)}.call(this),function(){var t;t=function(){function t(){}return t.$inject=[],t.prototype.isDisabled=function(t){return this.invitedMembers.indexOf(t)===-1},t}(),angular.module("taigaProjects").controller("InviteMembersCtrl",t)}.call(this),function(){var t;t=function(){ +var t;return t=function(t,e,r,n){},{link:t,templateUrl:"projects/create/invite-members/invite-members.html",controller:"InviteMembersCtrl",controllerAs:"vm",bindToController:!0,scope:{invitedMembers:"<",members:"<",onToggleInvitedMember:"&"}}},t.$inject=[],angular.module("taigaProjects").directive("tgInviteMembers",t)}.call(this),function(){var t;t=function(){return{templateUrl:"projects/create/invite-members/single-member/single-member.html",scope:{disabled:"<",avatar:"="}}},t.$inject=[],angular.module("taigaProjects").directive("tgSingleMember",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,this.canCreatePublicProjects=this.currentUserService.canCreatePublicProjects(),this.canCreatePrivateProjects=this.currentUserService.canCreatePrivateProjects(),this.projectForm=this.project.toJS(),this.projectForm.is_private=!1,this.projectForm.keepExternalReference=!1,"agile"===this.projectForm.importer_type?this.projectForm.project_type=null:this.projectForm.project_type="scrum",this.projectForm.create_subissues=!0,!this.canCreatePublicProjects.valid&&this.canCreatePrivateProjects.valid&&(this.projectForm.is_private=!0)}return t.$inject=["tgCurrentUserService"],t.prototype.checkUsersLimit=function(){return this.limitMembersPrivateProject=this.currentUserService.canAddMembersPrivateProject(this.members.size),this.limitMembersPublicProject=this.currentUserService.canAddMembersPublicProject(this.members.size)},t.prototype.saveForm=function(){return this.onSaveProjectDetails({project:Immutable.fromJS(this.projectForm)})},t.prototype.canCreateProject=function(){return this.projectForm.is_private?this.canCreatePrivateProjects.valid:this.canCreatePublicProjects.valid},t.prototype.isDisabled=function(){return!this.canCreateProject()},t}(),angular.module("taigaProjects").controller("JiraImportProjectFormCtrl",t)}.call(this),function(){var t;t=function(){return{link:function(t,e,r,n){return t.$watch("vm.members",n.checkUsersLimit.bind(n))},templateUrl:"projects/create/jira-import/jira-import-project-form/jira-import-project-form.html",controller:"JiraImportProjectFormCtrl",controllerAs:"vm",bindToController:!0,scope:{members:"<",project:"<",onSaveProjectDetails:"&",onCancelForm:"&",fetchingUsers:"<"}}},t.$inject=[],angular.module("taigaProjects").directive("tgJiraImportProjectForm",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.jiraImportService=t,this.confirm=e,this.translate=r,this.importProjectService=n,this.step="autorization-jira",this.project=null,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.jiraImportService.projects}}(this)),taiga.defineImmutableProperty(this,"members",function(t){return function(){return t.jiraImportService.projectUsers}}(this))}return t.$inject=["tgJiraImportService","$tgConfirm","$translate","tgImportProjectService"],t.prototype.startProjectSelector=function(){return this.step="project-select-jira",this.jiraImportService.fetchProjects()},t.prototype.onSelectProject=function(t){return this.step="project-form-jira",this.project=t,this.fetchingUsers=!0,this.jiraImportService.fetchUsers(this.project.get("id")).then(function(t){return function(){return t.fetchingUsers=!1}}(this))},t.prototype.onSaveProjectDetails=function(t){return this.project=t,this.step="project-members-jira"},t.prototype.onCancelMemberSelection=function(){return this.step="project-form-jira"},t.prototype.startImport=function(t){var e,r,n;return e=this.confirm.loader(this.translate.instant("PROJECT.IMPORT.IN_PROGRESS.TITLE"),this.translate.instant("PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION"),!0),e.start(),r=this.project.get("project_type"),"issues"===r&&this.project.get("create_subissues")&&(r="issues-with-subissues"),n=this.jiraImportService.importProject(this.project.get("name"),this.project.get("description"),this.project.get("id"),t,this.project.get("keepExternalReference"),this.project.get("is_private"),r,this.project.get("importer_type")),this.importProjectService.importPromise(n).then(function(t){return function(){return e.stop()}}(this))},t.prototype.submitUserSelection=function(t){return this.startImport(t),null},t}(),angular.module("taigaProjects").controller("JiraImportCtrl",t)}.call(this),function(){var t;t=function(){return{link:function(t,e,r,n){return n.startProjectSelector()},templateUrl:"projects/create/jira-import/jira-import.html",controller:"JiraImportCtrl",controllerAs:"vm",bindToController:!0,scope:{onCancel:"&"}}},t.$inject=[],angular.module("taigaProjects").directive("tgJiraImport",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.resources=t,this.location=e,this.projects=Immutable.List(),this.projectUsers=Immutable.List()}return e(r,t),r.$inject=["tgResources","$location"],r.prototype.setToken=function(t,e){return this.token=t,this.url=e},r.prototype.fetchProjects=function(){return this.resources.jiraImporter.listProjects(this.url,this.token).then(function(t){return function(e){return t.projects=e}}(this))},r.prototype.fetchUsers=function(t){return this.resources.jiraImporter.listUsers(this.url,this.token,t).then(function(t){return function(e){return t.projectUsers=e}}(this))},r.prototype.importProject=function(t,e,r,n,i,o,s,a){return this.resources.jiraImporter.importProject(this.url,this.token,t,e,r,n,i,o,s,a)},r.prototype.getAuthUrl=function(t){return new Promise(function(e){return function(r,n){return e.resources.jiraImporter.getAuthUrl(t).then(function(t){return e.authUrl=t.data.url,r(e.authUrl)},function(t){return n(t.data._error_message)})}}(this))},r.prototype.authorize=function(t){return new Promise(function(e){return function(r,n){return e.resources.jiraImporter.authorize(t).then(function(t){return e.token=t.data.token,e.url=t.data.url,r(t.data)},function(t){return n(new Error(t.status))})}}(this))},r}(taiga.Service),angular.module("taigaProjects").service("tgJiraImportService",t)}.call(this),function(){var t;t=function(){function t(){}return t.$inject=[],t.prototype.start=function(){return this.mode="search",this.invalid=!1},t.prototype.assignUser=function(){return this.onSelectUser({user:this.user,taigaUser:this.userEmail})},t.prototype.selectUser=function(t){return this.onSelectUser({user:this.user,taigaUser:Immutable.fromJS(t)})},t}(),angular.module("taigaProjects").controller("SelectImportUserLightboxCtrl",t)}.call(this),function(){var t;t=function(t,e){var r;return r=function(r,n,i,o){return r.$watch("vm.visible",function(i){return i&&!n.hasClass("open")?(o.start(),t.open(n,null,r.vm.onClose).then(function(){return n.find("input").focus(),e.init(n)})):!i&&n.hasClass("open")?t.close(n).then(function(){return o.userEmail="",o.usersSearch=""}):void 0})},{controller:"SelectImportUserLightboxCtrl",controllerAs:"vm",bindToController:!0,scope:{user:"<",visible:"<",onClose:"&",onSelectUser:"&",selectableUsers:"<",isPrivate:"<",limitMembersPrivateProject:"<",limitMembersPublicProject:"<",displayEmailSelector:"<"},templateUrl:"projects/create/select-import-user-lightbox/select-import-user-lightbox.html",link:r}},t.$inject=["lightboxService","lightboxKeyboardNavigationService"],angular.module("taigaProjects").directive("tgSelectImportUserLightbox",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,this.canCreatePublicProjects=this.currentUserService.canCreatePublicProjects(),this.canCreatePrivateProjects=this.currentUserService.canCreatePrivateProjects(),this.projectForm=this.project.toJS(),this.platformName="Trello",this.projectForm.is_private=!1,this.projectForm.keepExternalReference=!1,!this.canCreatePublicProjects.valid&&this.canCreatePrivateProjects.valid&&(this.projectForm.is_private=!0)}return t.$inject=["tgCurrentUserService"],t.prototype.checkUsersLimit=function(){return this.limitMembersPrivateProject=this.currentUserService.canAddMembersPrivateProject(this.members.size),this.limitMembersPublicProject=this.currentUserService.canAddMembersPublicProject(this.members.size)},t.prototype.saveForm=function(){return this.onSaveProjectDetails({project:Immutable.fromJS(this.projectForm)})},t.prototype.canCreateProject=function(){return this.projectForm.is_private?this.canCreatePrivateProjects.valid:this.canCreatePublicProjects.valid},t.prototype.isDisabled=function(){return!this.canCreateProject()},t}(),angular.module("taigaProjects").controller("TrelloImportProjectFormCtrl",t)}.call(this),function(){var t;t=function(){return{link:function(t,e,r,n){return t.$watch("vm.members",n.checkUsersLimit.bind(n))},templateUrl:"projects/create/trello-import/trello-import-project-form/trello-import-project-form.html",controller:"TrelloImportProjectFormCtrl",controllerAs:"vm",bindToController:!0,scope:{members:"<",project:"<",onSaveProjectDetails:"&",onCancelForm:"&",fetchingUsers:"<"}}},t.$inject=[],angular.module("taigaProjects").directive("tgTrelloImportProjectForm",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n){this.trelloImportService=t,this.confirm=e,this.translate=r,this.importProjectService=n,this.project=null,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.trelloImportService.projects}}(this)),taiga.defineImmutableProperty(this,"members",function(t){return function(){return t.trelloImportService.projectUsers}}(this))}return t.$inject=["tgTrelloImportService","$tgConfirm","$translate","tgImportProjectService"],t.prototype.startProjectSelector=function(){return this.trelloImportService.fetchProjects().then(function(t){return function(){return t.step="project-select-trello"}}(this))},t.prototype.onSelectProject=function(t){return this.step="project-form-trello",this.project=t,this.fetchingUsers=!0,this.trelloImportService.fetchUsers(this.project.get("id")).then(function(t){return function(){return t.fetchingUsers=!1}}(this))},t.prototype.onSaveProjectDetails=function(t){return this.project=t,this.step="project-members-trello"},t.prototype.onCancelMemberSelection=function(){return this.step="project-form-trello"},t.prototype.startImport=function(t){var e,r;return e=this.confirm.loader(this.translate.instant("PROJECT.IMPORT.IN_PROGRESS.TITLE"),this.translate.instant("PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION"),!0),e.start(),r=this.trelloImportService.importProject(this.project.get("name"),this.project.get("description"),this.project.get("id"),t,this.project.get("keepExternalReference"),this.project.get("is_private")),this.importProjectService.importPromise(r).then(function(t){return function(){return e.stop()}}(this))},t.prototype.submitUserSelection=function(t){return this.startImport(t),null},t}(),angular.module("taigaProjects").controller("TrelloImportCtrl",t)}.call(this),function(){var t;t=function(){return{link:function(t,e,r,n){return n.startProjectSelector()},templateUrl:"projects/create/trello-import/trello-import.html",controller:"TrelloImportCtrl",controllerAs:"vm",bindToController:!0,scope:{onCancel:"&"}}},t.$inject=[],angular.module("taigaProjects").directive("tgTrelloImport",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t){this.resources=t,this.projects=Immutable.List(),this.projectUsers=Immutable.List(),this.token=null}return e(r,t),r.$inject=["tgResources"],r.prototype.setToken=function(t){return this.token=t},r.prototype.fetchProjects=function(){return this.resources.trelloImporter.listProjects(this.token).then(function(t){return function(e){return t.projects=e}}(this))},r.prototype.fetchUsers=function(t){return this.resources.trelloImporter.listUsers(this.token,t).then(function(t){return function(e){return t.projectUsers=e}}(this))},r.prototype.importProject=function(t,e,r,n,i,o){return this.resources.trelloImporter.importProject(this.token,t,e,r,n,i,o)},r.prototype.getAuthUrl=function(){return new Promise(function(t){return function(e){return t.resources.trelloImporter.getAuthUrl().then(function(r){return t.authUrl=r.data.url,e(t.authUrl)})}}(this))},r.prototype.authorize=function(t){return new Promise(function(e){return function(r,n){return e.resources.trelloImporter.authorize(t).then(function(t){return e.token=t.data.token,r(e.token)},function(t){return n(new Error(t.status))})}}(this))},r}(taiga.Service),angular.module("taigaProjects").service("tgTrelloImportService",t)}.call(this),function(){var t;t=function(t,e){return{link:function(r,n,i){return r.$watch("visible",function(i){return i&&!n.hasClass("open")?t.open(n,r.onClose).then(function(){return n.find("input").focus(),e.init(n)}):!i&&n.hasClass("open")?t.close(n):void 0})},templateUrl:"projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html",scope:{visible:"<",onClose:"&",onConfirm:"&"}}},t.$inject=["lightboxService","lightboxKeyboardNavigationService"],angular.module("taigaProjects").directive("tgWarningUserImportLightbox",t)}.call(this),function(){var t;t=function(){function t(t){this.currentUserService=t,taiga.defineImmutableProperty(this,"projects",function(t){return function(){return t.currentUserService.projects.get("all")}}(this))}return t.$inject=["tgCurrentUserService"],t}(),angular.module("taigaProjects").controller("ProjectsListing",t)}.call(this),function(){var t;t=function(){function t(t,e,r,n,i){this.routeParams=t,this.appMetaService=e,this.auth=r,this.translate=n,this.projectService=i,this.user=this.auth.userData,taiga.defineImmutableProperty(this,"project",function(t){return function(){return t.projectService.project}}(this)),taiga.defineImmutableProperty(this,"members",function(t){return function(){return t.projectService.activeMembers}}(this)),this.appMetaService.setfn(this._setMeta.bind(this))}return t.$inject=["$routeParams","tgAppMetaService","$tgAuth","$translate","tgProjectService"],t.prototype._setMeta=function(){var t;return this.project?(t={projectName:this.project.get("name")},{title:this.translate.instant("PROJECT.PAGE_TITLE",t),description:this.project.get("description")}):null},t}(),angular.module("taigaProjects").controller("Project",t)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,e=this.taiga.groupBy,t=function(t){function e(t,e){this.rs=t,this.projectUrl=e}return n(e,t),e.$inject=["tgResources","$projectUrl"],e.prototype.create=function(t){return this.rs.projects.create(t)},e.prototype.duplicate=function(t,e){return this.rs.projects.duplicate(t,e)},e.prototype.getProjectBySlug=function(t){return this.rs.projects.getProjectBySlug(t).then(function(t){return function(e){return t._decorate(e)}}(this))},e.prototype.getProjectStats=function(t){return this.rs.projects.getProjectStats(t)},e.prototype.getProjectsByUserId=function(t,e){return this.rs.projects.getProjectsByUserId(t,e).then(function(t){return function(e){return e.map(t._decorate.bind(t))}}(this))},e.prototype._decorate=function(t){var e;return e=this.projectUrl.get(t.toJS()),t=t.set("url",e)},e.prototype.bulkUpdateProjectsOrder=function(t){return this.rs.projects.bulkUpdateOrder(t)},e.prototype.transferValidateToken=function(t,e){return this.rs.projects.transferValidateToken(t,e)},e.prototype.transferAccept=function(t,e,r){return this.rs.projects.transferAccept(t,e,r)},e.prototype.transferReject=function(t,e,r){return this.rs.projects.transferReject(t,e,r)},e}(r.Service),angular.module("taigaProjects").service("tgProjectsService",t)}.call(this),function(){var t;t=function(){return{templateUrl:"projects/transfer/cant-own-project-explanation.html"}},angular.module("taigaProjects").directive("tgCantOwnProjectExplanation",t)}.call(this),function(){var t,e;e=angular.module("taigaProjects"),t=function(){function t(t,e,r,n,i,o,s,a,c){this.routeParams=t,this.projectService=e,this.location=r,this.authService=n,this.currentUserService=i,this.navUrls=o,this.translate=s,this.confirmService=a,this.errorHandlingService=c}return t.$inject=["$routeParams","tgProjectsService","$location","$tgAuth","tgCurrentUserService","$tgNavUrls","$translate","$tgConfirm","tgErrorHandlingService"],t.prototype.initialize=function(){return this.projectId=this.project.get("id"),this.token=this.routeParams.token,this.showAddComment=!1,this._refreshUserData()},t.prototype._validateToken=function(){return this.projectService.transferValidateToken(this.projectId,this.token).then(null,function(t){return function(e,r){return t.errorHandlingService.notfound()}}(this))},t.prototype._refreshUserData=function(){return this.authService.refresh().then(function(t){return function(){return t._validateToken(),t._setProjectData(),t._checkOwnerData()}}(this))},t.prototype._setProjectData=function(){return this.canBeOwnedByUser=this.currentUserService.canOwnProject(this.project)},t.prototype._checkOwnerData=function(){var t,e;return t=this.currentUserService.getUser(),this.project.get("is_private")?(this.ownerMessage="ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PRIVATE",this.maxProjects=t.get("max_private_projects"),null===this.maxProjects&&(this.maxProjects=this.translate.instant("ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS")),this.currentProjects=t.get("total_private_projects"),e=t.get("max_memberships_private_projects")):(this.ownerMessage="ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PUBLIC",this.maxProjects=t.get("max_public_projects"),null===this.maxProjects&&(this.maxProjects=this.translate.instant("ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS")),this.currentProjects=t.get("total_public_projects"),e=t.get("max_memberships_public_projects")),this.validNumberOfMemberships=null===e||this.project.get("total_memberships")<=e},t.prototype.transferAccept=function(t,e){return this.loadingAccept=!0,this.projectService.transferAccept(this.project.get("id"),t,e).then(function(t){return function(){var e;e=t.navUrls.resolve("project-admin-project-profile-details",{project:t.project.get("slug")}),t.loadingAccept=!1,t.location.path(e),t.confirmService.notify("success",t.translate.instant("ADMIN.PROJECT_TRANSFER.ACCEPTED_PROJECT_OWNERNSHIP"),"",5e3)}}(this))},t.prototype.transferReject=function(t,e){return this.loadingReject=!0,this.projectService.transferReject(this.project.get("id"),t,e).then(function(t){return function(){var e;e=t.navUrls.resolve("home",{project:t.project.get("slug")}),t.loadingReject=!1,t.location.path(e),t.confirmService.notify("success",t.translate.instant("ADMIN.PROJECT_TRANSFER.REJECTED_PROJECT_OWNERNSHIP"),"",5e3)}}(this))},t.prototype.addComment=function(){return this.showAddComment=!0},t.prototype.hideComment=function(){return this.showAddComment=!1,this.reason=""},t}(),e.controller("TransferProjectController",t)}.call(this),function(){var t,e;e=angular.module("taigaProjects"),t=function(){var t;return t=function(t,e,r,n){return n.initialize()},{link:t,scope:{},bindToController:{project:"="},templateUrl:"projects/transfer/transfer-project.html",controller:"TransferProjectController",controllerAs:"vm"}},e.directive("tgTransferProject",t)}.call(this),function(){var t,e,r,n;n=this.taiga,r=this.taiga.sizeFormat,t=function(t,e,n,i,o,s){var a;return a={},a.list=function(r,n,i){var o,s,a,c;return c="attachments/"+r,s={object_id:n,project:i},o={headers:{"x-disable-pagination":"1"}},a=t.resolve(c),e.get(a,s,o).then(function(t){return Immutable.fromJS(t.data)})},a["delete"]=function(r,n){var i,o;return o="attachments/"+r,i=t.resolve(o)+("/"+n),e["delete"](i)},a.patch=function(r,n,i){var o,s;return s="attachments/"+r,o=t.resolve(s)+("/"+n),e.patch(o,i)},a.create=function(e,a,c,u,l){var p,h,f,d,g,m,v,y,_,b,S;return b="attachments/"+e,_=t.resolve(b),h=o.defer(),void 0===u?(h.reject(null),h.promise):(f=n.get("maxUploadFileSize",null),f&&u.size>f?(d={status:413,data:{_error_message:"'"+u.name+"' ("+r(u.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+r(f)+")"}},h.reject(d),h.promise):(y=function(t){return function(t){return i.$apply(function(){return u.status="in-progress",u.size=r(t.total),u.progressMessage="upload "+r(t.loaded)+" of "+r(t.total),u.progressPercent=Math.round(t.loaded/t.total*100)+"%"})}}(this),m=function(t){return function(t){return i.$apply(function(){var e,r,n;u.status="done",n=t.target.status;try{e=JSON.parse(t.target.responseText)}catch(i){e={}}return n>=200&&n<400?(e=Immutable.fromJS(e),h.resolve(e)):(d={status:n,data:{_error_message:null!=(r=p.attached_file)?r[0]:void 0}},h.reject(d))})}}(this),v=function(t){return function(t){return i.$apply(function(){return u.status="error",h.reject("fail")})}}(this),p=new FormData,p.append("project",a),p.append("object_id",c),p.append("attached_file",u),p.append("from_comment",l),S=new XMLHttpRequest,S.upload.addEventListener("progress",y,!1),S.addEventListener("load",m,!1),S.addEventListener("error",v,!1),g=s.get("token"),S.open("POST",_),S.setRequestHeader("Authorization","Bearer "+g),S.setRequestHeader("Accept","application/json"),S.send(p),h.promise))},function(){return{attachments:a}}},t.$inject=["$tgUrls","$tgHttp","$tgConfig","$rootScope","$q","$tgStorage"],e=angular.module("taigaResources2"),e.factory("tgAttachmentsResource",t)}.call(this),function(){var t,e;t=function(t,e){var r;return r={},r.listInAllProjects=function(r){var n,i;return i=t.resolve("epics"),n={headers:{"x-disable-pagination":"1"}},e.get(i,r,n).then(function(t){return Immutable.fromJS(t.data)})},r.list=function(r,n){var i,o;return null==n&&(n=0),o=t.resolve("epics"),i={project:r,page:n},e.get(o,i).then(function(t){return{list:Immutable.fromJS(t.data),headers:t.headers}})},r.patch=function(r,n){var i;return i=t.resolve("epics")+("/"+r),e.patch(i,n).then(function(t){return Immutable.fromJS(t.data)})},r.post=function(r){var n;return n=t.resolve("epics"),e.post(n,r).then(function(t){return Immutable.fromJS(t.data)})},r.reorder=function(r,n,i){var o,s;return s=t.resolve("epics")+("/"+r),o={headers:{"set-orders":JSON.stringify(i)}},e.patch(s,n,null,o).then(function(t){return Immutable.fromJS(t.data)})},r.addRelatedUserstory=function(r,n){var i,o;return o=t.resolve("epic-related-userstories",r),i={user_story:n,epic:r},e.post(o,i)},r.reorderRelatedUserstory=function(r,n,i,o){var s,a;return a=t.resolve("epic-related-userstories",r)+("/"+n),s={headers:{"set-orders":JSON.stringify(o)}},e.patch(a,i,null,s)},r.bulkCreateRelatedUserStories=function(r,n,i){var o,s;return s=t.resolve("epic-related-userstories-bulk-create",r),o={bulk_userstories:i,project_id:n},e.post(s,o)},r.deleteRelatedUserstory=function(r,n){var i;return i=t.resolve("epic-related-userstories",r)+("/"+n),e["delete"](i)},function(){return{epics:r}}},t.$inject=["$tgUrls","$tgHttp"],e=angular.module("taigaResources2"),e.factory("tgEpicsResource",t)}.call(this),function(){var t,e;t=function(t,e){var r;return r={},r.getApplicationToken=function(r,n){var i;return i=t.resolve("applications"),i=i+"/"+r+"/token?state="+n,e.get(i).then(function(t){return Immutable.fromJS(t.data)})},r.authorizeApplicationToken=function(r,n){var i,o;return o=t.resolve("application-tokens"),o+="/authorize",i={state:n,application:r},e.post(o,i).then(function(t){return Immutable.fromJS(t.data)})},function(){return{externalapps:r}}},t.$inject=["$tgUrls","$tgHttp"],e=angular.module("taigaResources2"),e.factory("tgExternalAppsResource",t)}.call(this),function(){var t,e,r,n,i,o;o=this.taiga,n=function(t,e){var r;return r={},r.getAuthUrl=function(r){return r=t.resolve("importers-trello-auth-url"),e.get(r)},r.authorize=function(r){var n;return n=t.resolve("importers-trello-authorize"),e.post(n,{code:r})},r.listProjects=function(r){var n;return n=t.resolve("importers-trello-list-projects"),e.post(n,{token:r}).then(function(t){return Immutable.fromJS(t.data)})},r.listUsers=function(r,n){var i;return i=t.resolve("importers-trello-list-users"),e.post(i,{token:r,project:n}).then(function(t){return Immutable.fromJS(t.data)})},r.importProject=function(r,n,i,o,s,a,c){var u,l;return l=t.resolve("importers-trello-import-project"),u={token:r,name:n,description:i,project:o,users_bindings:s.toJS(),keep_external_reference:a,is_private:c,template:"kanban"},e.post(l,u)},function(){return{trelloImporter:r}}},n.$inject=["$tgUrls","$tgHttp"],r=function(t,e){var r;return r={},r.getAuthUrl=function(r){var n;return n=t.resolve("importers-jira-auth-url")+"?url="+r,e.get(n)},r.authorize=function(r){var n;return n=t.resolve("importers-jira-authorize"),e.post(n,{oauth_verifier:r})},r.listProjects=function(r,n){var i;return i=t.resolve("importers-jira-list-projects"),e.post(i,{url:r,token:n}).then(function(t){return Immutable.fromJS(t.data)})},r.listUsers=function(r,n,i){var o;return o=t.resolve("importers-jira-list-users"),e.post(o,{url:r,token:n,project:i}).then(function(t){return Immutable.fromJS(t.data)})},r.importProject=function(r,n,i,o,s,a,c,u,l,p){var h,f,d;return d=t.resolve("importers-jira-import-project"),f="kanban","kanban"!==l&&(f="scrum"),h={url:r,token:n,name:i,description:o,project:s,users_bindings:a.toJS(),keep_external_reference:c,is_private:u,project_type:l,importer_type:p,template:f},e.post(d,h)},function(){return{jiraImporter:r}}},r.$inject=["$tgUrls","$tgHttp"],e=function(t,e){var r;return r={},r.getAuthUrl=function(r){var n;return n=t.resolve("importers-github-auth-url")+"?uri="+r,e.get(n)},r.authorize=function(r){var n;return n=t.resolve("importers-github-authorize"),e.post(n,{code:r})},r.listProjects=function(r){var n;return n=t.resolve("importers-github-list-projects"),e.post(n,{token:r}).then(function(t){return Immutable.fromJS(t.data)})},r.listUsers=function(r,n){var i;return i=t.resolve("importers-github-list-users"),e.post(i,{token:r,project:n}).then(function(t){return Immutable.fromJS(t.data)})},r.importProject=function(r,n,i,o,s,a,c,u){var l,p;return p=t.resolve("importers-github-import-project"),l={token:r,name:n,description:i,project:o,users_bindings:s.toJS(),keep_external_reference:a,is_private:c,template:u},e.post(p,l)},function(){return{githubImporter:r}}},e.$inject=["$tgUrls","$tgHttp"],t=function(t,e){var r;return r={},r.getAuthUrl=function(){var r;return r=t.resolve("importers-asana-auth-url"),e.get(r)},r.authorize=function(r){var n;return n=t.resolve("importers-asana-authorize"),e.post(n,{code:r})},r.listProjects=function(r){var n;return n=t.resolve("importers-asana-list-projects"),e.post(n,{token:r}).then(function(t){return Immutable.fromJS(t.data)})},r.listUsers=function(r,n){var i;return i=t.resolve("importers-asana-list-users"),e.post(i,{token:r,project:n}).then(function(t){return Immutable.fromJS(t.data)})},r.importProject=function(r,n,i,o,s,a,c,u){var l,p;return p=t.resolve("importers-asana-import-project"),l={token:r,name:n,description:i,project:o,users_bindings:s.toJS(),keep_external_reference:a,is_private:c,template:u},e.post(p,l)},function(){return{asanaImporter:r}}},t.$inject=["$tgUrls","$tgHttp"],i=angular.module("taigaResources2"),i.factory("tgTrelloImportResource",n),i.factory("tgJiraImportResource",r),i.factory("tgGithubImportResource",e),i.factory("tgAsanaImportResource",t)}.call(this),function(){var t,e;t=function(t,e){var r;return r={},r.listInAllProjects=function(r){var n,i;return i=t.resolve("issues"),n={headers:{"x-disable-pagination":"1"}},e.get(i,r,n).then(function(t){return Immutable.fromJS(t.data)})},function(){return{issues:r}}},t.$inject=["$tgUrls","$tgHttp"],e=angular.module("taigaResources2"),e.factory("tgIssuesResource",t)}.call(this),function(){var t,e,r;r=function(){},t=function(t,e,r){var n;return n={},n.create=function(r){var n;return n=t.resolve("projects"),e.post(n,JSON.stringify(r)).then(function(t){return function(t){return Immutable.fromJS(t.data)}}(this))},n.duplicate=function(r,n){var i,o,s;return s=t.resolve("projects"),s=s+"/"+r+"/duplicate",i=n.users.map(function(t){return function(t){return{id:t}}}(this)),o={name:n.name,description:n.description,is_private:n.is_private,users:i},e.post(s,o)},n.getProjects=function(r,n){var i,o;return null==r&&(r={}),null==n&&(n=!0),o=t.resolve("projects"),i={},n||(i={headers:{"x-lazy-pagination":!0}}),e.get(o,r,i)},n.getProjectBySlug=function(r){var n;return n=t.resolve("projects"),n=n+"/by_slug?slug="+r,e.get(n).then(function(t){return Immutable.fromJS(t.data)})},n.getProjectsByUserId=function(r,n){var i,o,s;return null==n&&(n=!1),s=t.resolve("projects"),i={},n||(i.headers={"x-disable-pagination":"1"}),o={member:r,order_by:"user_order"},e.get(s,o,i).then(function(t){return Immutable.fromJS(t.data)})},n.getProjectStats=function(r){var n;return n=t.resolve("projects"),n=n+"/"+r,e.get(n).then(function(t){return Immutable.fromJS(t.data)})},n.bulkUpdateOrder=function(r){var n;return n=t.resolve("bulk-update-projects-order"),e.post(n,r)},n.getTimeline=function(n,i){var o,s;return o={page:i,only_relevant:!0},s=t.resolve("timeline-project"),s=s+"/"+n,e.get(s,o,{headers:{"x-lazy-pagination":!0}}).then(function(t){return t=Immutable.fromJS(t),r(t)})},n.likeProject=function(r){var n;return n=t.resolve("project-like",r),e.post(n)},n.unlikeProject=function(r){var n;return n=t.resolve("project-unlike",r),e.post(n)},n.watchProject=function(r,n){var i,o;return i={notify_level:n,live_notify_level:n},o=t.resolve("project-watch",r),e.post(o,i)},n.unwatchProject=function(r){var n;return n=t.resolve("project-unwatch",r),e.post(n)},n.contactProject=function(r,n){var i,o;return i={project:r,comment:n},o=t.resolve("project-contact"),e.post(o,i)},n.transferValidateToken=function(r,n){var i,o;return i={token:n},o=t.resolve("project-transfer-validate-token",r),e.post(o,i)},n.transferAccept=function(r,n,i){var o,s;return o={token:n,reason:i},s=t.resolve("project-transfer-accept",r),e.post(s,o)},n.transferReject=function(r,n,i){var o,s;return o={token:n,reason:i},s=t.resolve("project-transfer-reject",r),e.post(s,o)},n.transferRequest=function(r){var n;return n=t.resolve("project-transfer-request",r),e.post(n)},n.transferStart=function(r,n,i){var o,s;return o={user:n,reason:i},s=t.resolve("project-transfer-start",r),e.post(s,o)},function(){return{projects:n}}},t.$inject=["$tgUrls","$tgHttp","tgPaginateResponseService"],e=angular.module("taigaResources2"),e.factory("tgProjectsResources",t)}.call(this),function(){var t,e;e=["tgProjectsResources","tgUserResources","tgUsersResources","tgUserstoriesResource","tgTasksResource","tgIssuesResource","tgExternalAppsResource","tgAttachmentsResource","tgStatsResource","tgWikiHistory","tgEpicsResource","tgTrelloImportResource","tgJiraImportResource","tgGithubImportResource","tgAsanaImportResource"],t=function(t){var r,n,i,o,s,a,c,u,l;for(r=0,i=e.length;r"),$("head").append(r)),r.text(e||"")):0===t.indexOf("og:")?(r=$("head meta[property='"+t+"']"),0===r.length&&(r=$(""),$("head").append(r)),r.attr("content",e||"")):(r=$("head meta[name='"+t+"']"),0===r.length&&(r=$(""),$("head").append(r)),r.attr("content",e||""))},t.prototype.setTitle=function(t){return this._set("title",t)},t.prototype.setDescription=function(t){return this._set("description",r(t,250))},t.prototype.setTwitterMetas=function(t,e){return this._set("twitter:card","summary"),this._set("twitter:site","@taigaio"),this._set("twitter:title",t),this._set("twitter:description",r(e,300)),this._set("twitter:image",window.location.origin+"/"+window._version+"/images/logo-color.png")},t.prototype.setOpenGraphMetas=function(t,e){return this._set("og:type","object"),this._set("og:site_name","Taiga - Love your projects"),this._set("og:title",t),this._set("og:description",r(e,300)),this._set("og:image",window.location.origin+"/"+window._version+"/images/logo-color.png"),this._set("og:url",window.location.href)},t.prototype.setAll=function(t,e){return this.setTitle(t),this.setDescription(e),this.setTwitterMetas(t,e),this.setOpenGraphMetas(t,e)},t.prototype.addMobileViewport=function(){return $("head").append('')},t.prototype.removeMobileViewport=function(){return $('head meta[name="viewport"]').remove()},t.prototype.setfn=function(t){return this.listener&&this._listener(),this._listener=this.rootScope.$watchCollection(t,function(t){return function(e){if(e)return t.setAll(e.title,e.description),t._listener()}}(this))},t}(),angular.module("taigaCommon").service("tgAppMetaService",t)}.call(this),function(){var t,e;e=this.taiga.sizeFormat,t=function(){function t(t,r,n,i){this.confirm=t,this.config=r,this.translate=n,this.rs=i,this.maxFileSize=this.getMaxFileSize(),this.maxFileSize&&(this.maxFileSizeFormated=e(this.maxFileSize))}return t.$inject=["$tgConfirm","$tgConfig","$translate","tgResources"],t.prototype.sizeError=function(t){var r;return r=this.translate.instant("ATTACHMENT.ERROR_MAX_SIZE_EXCEEDED",{fileName:t.name,fileSize:e(t.size),maxFileSize:this.maxFileSizeFormated}),this.confirm.notify("error",r)},t.prototype.validate=function(t){return!(this.maxFileSize&&t.size>this.maxFileSize)||(this.sizeError(t),!1)},t.prototype.getMaxFileSize=function(){return this.config.get("maxUploadFileSize",null)},t.prototype.list=function(t,e,r){return this.rs.attachments.list(t,e,r).then(function(t){return function(t){return t.sortBy(function(t){return t.get("order")})}}(this))},t.prototype["delete"]=function(t,e){return this.rs.attachments["delete"](t,e)},t.prototype.saveError=function(t,e){var r;return r="",t&&(r=this.translate.instant("ATTACHMENT.ERROR_UPLOAD_ATTACHMENT",{fileName:t.name,errorMessage:e.data._error_message})),this.confirm.notify("error",r)},t.prototype.upload=function(t,e,r,n,i){var o;return null==i&&(i=!1),o=this.rs.attachments.create(n,r,e,t,i),o.then(null,this.saveError.bind(this,t)),o},t.prototype.patch=function(t,e,r){var n;return n=this.rs.attachments.patch(e,t,r),n.then(null,this.saveError.bind(this,null)),n},t}(),angular.module("taigaCommon").service("tgAttachmentsService",t)}.call(this),function(){var t,e=function(t,e){return(+t%(e=+e)+e)%e};t=function(){function t(t){var e,r;this.config=t,r=["/"+window._version+"/images/user-avatars/user-avatar-01.png","/"+window._version+"/images/user-avatars/user-avatar-02.png","/"+window._version+"/images/user-avatars/user-avatar-03.png","/"+window._version+"/images/user-avatars/user-avatar-04.png","/"+window._version+"/images/user-avatars/user-avatar-05.png"],e=["rgba( 178, 176, 204, 1 )","rgba( 183, 203, 131, 1 )","rgba( 210, 198, 139, 1 )","rgba( 214, 161, 212, 1 )","rgba( 247, 154, 154, 1 )"],this.logos=_.cartesianProduct(r,e)}return t.prototype.getDefault=function(t){var r,n;return r=e(murmurhash3_32_gc(t,42),this.logos.length),n=this.logos[r],{src:n[0],color:n[1]}},t.prototype.getUnnamed=function(){return{url:"/"+window._version+"/images/unnamed.png"}},t.prototype.getAvatar=function(t,e){var r,n,i,o,s,a;return t?(r="photo","avatarBig"===e&&(r="big_photo"),s=null,t instanceof Immutable.Map?(n=t.get("gravatar_id"),s=t.get(r)):(n=t.gravatar_id,s=t[r]),n?s?{url:s}:location.host.indexOf("localhost")===-1&&this.config.get("gravatar",!0)?(a=location.protocol+"//"+location.host,i=this.getDefault(n),o=encodeURIComponent(a+i.src),{url:"https://www.gravatar.com/avatar/"+n+"?s=200&d="+o,bg:i.color}):(a=location.protocol+"//"+location.host,i=this.getDefault(n),{url:a+i.src,bg:i.color}):this.getUnnamed()):this.getUnnamed()},t}(),angular.module("taigaCommon").service("tgAvatarService",["$tgConfig",t])}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t){this.projectService=t}return t.$inject=["tgProjectService"],t.prototype.check=function(t){return!!this.projectService.project&&this.projectService.project.get("my_permissions").indexOf(t)!==-1},t}(),angular.module("taigaCommon").service("tgCheckPermissionsService",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.groupBy,t=function(){function t(t,e,n){this.projectsService=t,this.storageService=e,this.rs=n,this._user=null,this._projects=Immutable.Map(),this._projectsById=Immutable.Map(),this._joyride=null,r.defineImmutableProperty(this,"projects",function(t){return function(){return t._projects}}(this)),r.defineImmutableProperty(this,"projectsById",function(t){return function(){return t._projectsById}}(this))}return t.$inject=["tgProjectsService","$tgStorage","tgResources"],t.prototype.isAuthenticated=function(){return null!==this.getUser()},t.prototype.getUser=function(){var t;return this._user||(t=this.storageService.get("userInfo"),t&&(t=Immutable.fromJS(t),this.setUser(t))),this._user},t.prototype.removeUser=function(){return this._user=null,this._projects=Immutable.Map(),this._projectsById=Immutable.Map(),this._joyride=null},t.prototype.setUser=function(t){return this._user=t,this._loadUserInfo()},t.prototype.bulkUpdateProjectsOrder=function(t){return this.projectsService.bulkUpdateProjectsOrder(t).then(function(t){return function(){return t.loadProjects()}}(this))},t.prototype.loadProjects=function(){return this.projectsService.getProjectsByUserId(this._user.get("id")).then(function(t){return function(e){return t.setProjects(e)}}(this))},t.prototype.disableJoyRide=function(t){if(this.isAuthenticated())return t?this._joyride[t]=!1:this._joyride={backlog:!1,kanban:!1,dashboard:!1},this.rs.user.setUserStorage("joyride",this._joyride)},t.prototype.loadJoyRideConfig=function(){return new Promise(function(t){return function(e){return null!==t._joyride?void e(t._joyride):t.rs.user.getUserStorage("joyride").then(function(r){return t._joyride=r,e(t._joyride)})["catch"](function(){return t._joyride={backlog:!0,kanban:!0,dashboard:!0},t.rs.user.createUserStorage("joyride",t._joyride),e(t._joyride)})}}(this))},t.prototype._loadUserInfo=function(){return Promise.all([this.loadProjects()])},t.prototype.setProjects=function(t){return this._projects=this._projects.set("all",t),this._projects=this._projects.set("recents",t.slice(0,10)),this._projectsById=Immutable.fromJS(e(t.toJS(),function(t){return t.id})),this.projects},t.prototype.canCreatePrivateProjects=function(){var t;return t=this.getUser(),null!==t.get("max_private_projects")&&t.get("total_private_projects")>=t.get("max_private_projects")?{valid:!1,reason:"max_private_projects",type:"private_project",current:t.get("total_private_projects"),max:t.get("max_private_projects")}:{valid:!0}},t.prototype.canCreatePublicProjects=function(){var t;return t=this.getUser(),null!==t.get("max_public_projects")&&t.get("total_public_projects")>=t.get("max_public_projects")?{valid:!1,reason:"max_public_projects",type:"public_project",current:t.get("total_public_projects"),max:t.get("max_public_projects")}:{valid:!0}},t.prototype.canAddMembersPublicProject=function(t){var e;return e=this.getUser(),null!==e.get("max_memberships_public_projects")&&t>e.get("max_memberships_public_projects")?{valid:!1,reason:"max_members_public_projects",type:"public_project",current:t,max:e.get("max_memberships_public_projects")}:{valid:!0}},t.prototype.canAddMembersPrivateProject=function(t){var e;return e=this.getUser(),null!==e.get("max_memberships_private_projects")&&t>e.get("max_memberships_private_projects")?{valid:!1,reason:"max_members_private_projects",type:"private_project",current:t,max:e.get("max_memberships_private_projects")}:{valid:!0}},t.prototype.canOwnProject=function(t){var e,r,n;if(n=this.getUser(),t.get("is_private")){if(r=this.canCreatePrivateProjects(),!r.valid)return r;if(e=this.canAddMembersPrivateProject(t.get("total_memberships")),!e.valid)return e}else{if(r=this.canCreatePublicProjects(),!r.valid)return r;if(e=this.canAddMembersPublicProject(t.get("total_memberships")),!e.valid)return e}return{valid:!0}},t}(),angular.module("taigaCommon").service("tgCurrentUserService",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t){this.rootScope=t}return t.$inject=["$rootScope"],t.prototype.init=function(){return this.rootScope.errorHandling={}},t.prototype.notfound=function(){return this.rootScope.errorHandling.showingError=!0,this.rootScope.errorHandling.notfound=!0},t.prototype.error=function(){return this.rootScope.errorHandling.showingError=!0,this.rootScope.errorHandling.error=!0},t.prototype.permissionDenied=function(){return this.rootScope.errorHandling.showingError=!0,this.rootScope.errorHandling.permissionDenied=!0},t.prototype.block=function(){return this.rootScope.errorHandling.showingError=!0,this.rootScope.errorHandling.blocked=!0},t}(),angular.module("taigaCommon").service("tgErrorHandlingService",t)}.call(this),function(){var t;t=function(){function t(t,e){this.rootScope=t,this.compile=e}return t.$inject=["$rootScope","$compile"],t.prototype.create=function(t,e,r){var n,i,o;o=this.rootScope.$new(),o=_.merge(o,r),n=$("
    ").attr(t,!0).attr("tg-bind-scope",!0),e&&n.attr(e),n.addClass("remove-on-close"),i=this.compile(n)(o),$(document.body).append(i)},t}(),angular.module("taigaCommon").service("tgLightboxFactory",t)}.call(this),function(){var t;t=function(){return function(t){var e;return e=Immutable.Map({data:t.get("data"),next:!!t.get("headers")("x-pagination-next"),prev:!!t.get("headers")("x-pagination-prev"),current:t.get("headers")("x-pagination-current"),count:t.get("headers")("x-pagination-count")})}},angular.module("taigaCommon").factory("tgPaginateResponseService",t)}.call(this),function(){var t,e=function(t,e){return(+t%(e=+e)+e)%e};t=function(){function t(){var t,e;e=["/"+window._version+"/images/project-logos/project-logo-01.png","/"+window._version+"/images/project-logos/project-logo-02.png","/"+window._version+"/images/project-logos/project-logo-03.png","/"+window._version+"/images/project-logos/project-logo-04.png","/"+window._version+"/images/project-logos/project-logo-05.png"],t=["rgba( 153, 214, 220, 1 )","rgba( 213, 156, 156, 1 )","rgba( 214, 161, 212, 1 )","rgba( 164, 162, 219, 1 )","rgba( 152, 224, 168, 1 )"],this.logos=_.cartesianProduct(e,t)}return t.prototype.getDefaultProjectLogo=function(t,r){var n,i,o;return i=t+"-"+r,n=e(murmurhash3_32_gc(i,42),this.logos.length),o=this.logos[n],{src:o[0],color:o[1]}},t}(),angular.module("taigaCommon").service("tgProjectLogoService",t)}.call(this),function(){var t,e;e=this.taiga,t=function(){function t(t,r,n,i){this.projectsService=t,this.xhrError=r,this.userActivityService=n,this.interval=i,this._project=null,this._section=null,this._sectionsBreadcrumb=Immutable.List(),this._activeMembers=Immutable.List(),e.defineImmutableProperty(this,"project",function(t){return function(){return t._project}}(this)),e.defineImmutableProperty(this,"section",function(t){return function(){return t._section}}(this)),e.defineImmutableProperty(this,"sectionsBreadcrumb",function(t){return function(){return t._sectionsBreadcrumb}}(this)),e.defineImmutableProperty(this,"activeMembers",function(t){return function(){return t._activeMembers}}(this)),window.localStorage.e2e||this.autoRefresh()}return t.$inject=["tgProjectsService","tgXhrErrorService","tgUserActivityService","$interval"],t.prototype.cleanProject=function(){return this._project=null,this._activeMembers=Immutable.List(),this._section=null,this._sectionsBreadcrumb=Immutable.List()},t.prototype.autoRefresh=function(){var t;return t=this.interval(function(t){return function(){return t.fetchProject()}}(this),6e5),this.userActivityService.onInactive(function(e){return function(){return e.interval.cancel(t)}}(this)),this.userActivityService.onActive(function(t){return function(){return t.fetchProject(),t.autoRefresh()}}(this))},t.prototype.setSection=function(t){return this._section=t,t?this._sectionsBreadcrumb=this._sectionsBreadcrumb.push(this._section):this._sectionsBreadcrumb=Immutable.List()},t.prototype.setProject=function(t){return this._project=t,this._activeMembers=this._project.get("members").filter(function(t){return t.get("is_active")})},t.prototype.setProjectBySlug=function(t){return new Promise(function(e){return function(r,n){return e.project&&e.project.get("slug")===t?r():e.projectsService.getProjectBySlug(t).then(function(t){return e.setProject(t),r()})["catch"](function(t){return e.xhrError.response(t)})}}(this))},t.prototype.fetchProject=function(){var t;if(this.project)return t=this.project.get("slug"),this.projectsService.getProjectBySlug(t).then(function(t){return function(e){return t.setProject(e)}}(this))},t.prototype.hasPermission=function(t){return this._project.get("my_permissions").indexOf(t)!==-1},t.prototype.isEpicsDashboardEnabled=function(){return this._project.get("is_epics_activated")},t}(),angular.module("taigaCommon").service("tgProjectService",t)}.call(this),function(){var t,e,r=function(t,e){function r(){this.constructor=t}for(var i in e)n.call(e,i)&&(t[i]=e[i]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},n={}.hasOwnProperty;e=this.taiga,t=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return r(e,t),e}(e.Service=function(){return{use:function(t){var e;return e=$("link[rel='stylesheet']:first"),0===e.length&&(e=$(""),$("head").append(e)),e.attr("href","/"+window._version+"/styles/theme-"+t+".css")}}}),angular.module("taigaCommon").service("tgThemeService",t)}.call(this),function(){var t,e,r;r=this.taiga,e=this.taiga.groupBy,t=function(){function t(t){return this.timeout=t,window.localStorage.e2e?null:(window.addEventListener("mousemove",this.resetTimer.bind(this),!1),window.addEventListener("mousedown",this.resetTimer.bind(this),!1),window.addEventListener("keypress",this.resetTimer.bind(this),!1),window.addEventListener("mousewheel",this.resetTimer.bind(this),!1),window.addEventListener("touchmove",this.resetTimer.bind(this),!1),this.subscriptionsActive=[],this.subscriptionsInactive=[],this.isActive=!0,void this.startTimer())}return t.$inject=["$timeout"],t.prototype.idleTimeout=3e5,t.prototype.startTimer=function(){return this.timerId=this.timeout(this._fireInactive.bind(this),this.idleTimeout)},t.prototype.resetTimer=function(){return this.isActive||this._fireActive(),this.timeout.cancel(this.timerId),this.startTimer(),this.isActive=!0},t.prototype.onActive=function(t){return this.subscriptionsActive.push(t),this._unSubscriptionsActive.bind(this,t)},t.prototype.onInactive=function(t){return this.subscriptionsInactive.push(t),this._unSubscriptionsInactive.bind(this,t)},t.prototype._fireActive=function(){return this.subscriptionsActive.forEach(function(t){return t()})},t.prototype._fireInactive=function(){return this.isActive=!1,this.subscriptionsInactive.forEach(function(t){return t()})},t.prototype._unSubscriptionsActive=function(t){return this.subscriptionsActive=this.subscriptionsActive.filter(function(e){return e!==t})},t.prototype._unSubscriptionsInactive=function(t){return this.subscriptionsInactive=this.subscriptionsInactive.filter(function(e){return e!==t})},t}(),angular.module("taigaCommon").service("tgUserActivityService",t)}.call(this),function(){var t,e,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)i.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},i={}.hasOwnProperty;r=this.taiga,e=r.bindMethods,t=function(t){function r(t){this.rs=t,e(this)}return n(r,t),r.$inject=["tgResources"],r.prototype.getUserByUserName=function(t){return this.rs.users.getUserByUsername(t)},r.prototype.getContacts=function(t,e){return this.rs.users.getContacts(t,e)},r.prototype.getLiked=function(t,e,r,n){return this.rs.users.getLiked(t,e,r,n)},r.prototype.getVoted=function(t,e,r,n){return this.rs.users.getVoted(t,e,r,n)},r.prototype.getWatched=function(t,e,r,n){return this.rs.users.getWatched(t,e,r,n)},r.prototype.getStats=function(t){return this.rs.users.getStats(t)},r.prototype.attachUserContactsToProjects=function(t,e){return this.getContacts(t).then(function(t){return e=e.map(function(e){var r;return r=t.filter(function(t){var r;return r=t.get("id"),e.get("members").indexOf(r)!==-1}),e=e.set("contacts",r)})})},r}(r.Service),angular.module("taigaCommon").service("tgUserService",t)}.call(this),function(){var t,e=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;t=function(t){function r(t,e){this.q=t,this.errorHandlingService=e}return e(r,t),r.$inject=["$q","tgErrorHandlingService"],r.prototype.notFound=function(){return this.errorHandlingService.notfound()},r.prototype.permissionDenied=function(){return this.errorHandlingService.permissionDenied()},r.prototype.response=function(t){return t&&(404===t.status?this.notFound():403===t.status&&this.permissionDenied()),this.q.reject(t)},r}(taiga.Service),angular.module("taigaCommon").service("tgXhrErrorService",t)}.call(this),function(){var t;t=function(t,e){var r,n,i;return i=[".jpg",".jpeg",".bmp",".gif",".png"],r=function(t){return t=t.toLowerCase(),_.some(i,function(e){return t.indexOf(e,t-e.length)!==-1})},n=function(n,i){var o,s;return o=r(n.attachment.get("url")),s=o?t.get("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html"):t.get("user-timeline/user-timeline-attachment/user-timeline-attachment.html"),i.html(s),e(i.contents())(n),i.find("img").error(function(){return this.remove()})},{link:n,scope:{attachment:"=tgUserTimelineAttachment"}}},t.$inject=["$tgTemplate","$compile"],angular.module("taigaUserTimeline").directive("tgUserTimelineAttachment",t)}.call(this),function(){var t,e;e=this.taiga.unslugify,t=function(){function t(t,e){this.translate=t,this.sce=e}return t.$inject=["$translate","$sce"],t.prototype._fieldTranslationKey={status:"COMMON.FIELDS.STATUS",subject:"COMMON.FIELDS.SUBJECT",description_diff:"COMMON.FIELDS.DESCRIPTION",points:"COMMON.FIELDS.POINTS",assigned_to:"COMMON.FIELDS.ASSIGNED_TO",assigned_users:"COMMON.FIELDS.ASSIGNED_USERS",severity:"ISSUES.FIELDS.SEVERITY",priority:"ISSUES.FIELDS.PRIORITY",type:"ISSUES.FIELDS.TYPE",is_iocaine:"TASK.FIELDS.IS_IOCAINE",is_blocked:"COMMON.FIELDS.IS_BLOCKED",color:"COMMON.FIELDS.COLOR",due_date:"COMMON.FIELDS.DUE_DATE",due_date_reason:"COMMON.FIELDS.DUE_DATE_REASON"},t.prototype._params={username:function(t,e){var r,n,i;return i=t.getIn(["data","user"]),i.get("is_profile_visible")?(r=this.translate.instant("COMMON.SEE_USER_PROFILE",{username:i.get("username")}),n="user-profile:username=timeline.getIn(['data', 'user', 'username'])",this._getLink(n,i.get("name"),r)):this._getUsernameSpan(i.get("name"))},field_name:function(t,e){var r;return r=t.getIn(["data","value_diff","key"]),this.translate.instant(this._fieldTranslationKey[r])},project_name:function(t,e){var r;return r="project:project=timeline.getIn(['data', 'project', 'slug'])",this._getLink(r,t.getIn(["data","project","name"]))},new_value:function(t,e){var r,n,i;return _.isArray(t.getIn(["data","value_diff","value"]).toJS())?(i=t.getIn(["data","value_diff","value"]).get(1),null===i&&"assigned_to"===t.getIn(["data","value_diff","key"])&&(i=this.translate.instant("ACTIVITY.VALUES.UNASSIGNED")),null===i&&"assigned_users"===t.getIn(["data","value_diff","key"])?i=this.translate.instant("ACTIVITY.VALUES.UNASSIGNED"):"due_date"===t.getIn(["data","value_diff","key"])&&(i?(n=this.translate.instant("COMMON.PICKERDATE.FORMAT"),i=moment(i,"YYYY-MM-DD").format(n)):i=this.translate.instant("ACTIVITY.VALUES.NOT_SET")),r=i):r=t.getIn(["data","value_diff","value"]).first().get(1),_.escape(r)},sprint_name:function(t,e){var r;return r="project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])",this._getLink(r,t.getIn(["data","milestone","name"]))},us_name:function(t,e){var r,n,i,o;return n=this._getTimelineObj(t,e).get("userstory"),r={obj:"parent_userstory"},o=this._getDetailObjUrl(r),i="#"+n.get("ref")+" "+n.get("subject"),this._getLink(o,i)},related_us_name:function(t,e){var r,n,i;return r=t.getIn(["data","userstory"]),i="project-userstories-detail:project=timeline.getIn(['data', 'userstory', 'project', 'slug']),ref=timeline.getIn(['data', 'userstory', 'ref'])",n="#"+r.get("ref")+" "+r.get("subject"),this._getLink(i,n)},epic_name:function(t,e){var r,n,i;return r=t.getIn(["data","epic"]),i="project-epics-detail:project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['data', 'epic', 'ref'])",n="#"+r.get("ref")+" "+r.get("subject"),this._getLink(i,n)},obj_name:function(t,r){var n,i,o;return n=this._getTimelineObj(t,r),o=this._getDetailObjUrl(r),i="wikipage"===r.obj?e(n.get("slug")):"milestone"===r.obj?n.get("name"):"#"+n.get("ref")+" "+n.get("subject"),this._getLink(o,i)},role_name:function(t,e){return _.escape(t.getIn(["data","value_diff","value"]).keySeq().first())}},t.prototype._translateTitleParams=function(t,e,r){return this._params[t].call(this,e,r)},t.prototype._getTimelineObj=function(t,e){return t.getIn(["data",e.obj])},t.prototype._getDetailObjUrl=function(t){var e;return e={issue:["project-issues-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],wikipage:["project-wiki-page",":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])"],task:["project-tasks-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],userstory:["project-userstories-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],parent_userstory:["project-userstories-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])"],milestone:["project-taskboard",":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])"],epic:["project-epics-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"]},e[t.obj][0]+e[t.obj][1]},t.prototype._getLink=function(t,e,r){var n;return r=r||e,n=$("").attr("ng-non-bindable",!0).text(e),$("").attr("tg-nav",t).attr("title",r).append(n).prop("outerHTML")},t.prototype._getUsernameSpan=function(t){var e;return e=e||t,$("").addClass("username").text(t).prop("outerHTML")},t.prototype._getParams=function(t,e,r){var n;return n={},r.translate_params.forEach(function(r){return function(i){return n[i]=r._translateTitleParams(i,t,e)}}(this)),n},t.prototype.getTitle=function(t,e,r){var n,i,o;return n=this._getParams(t,e,r),i={},Object.keys(n).forEach(function(t){return i[t]="{{"+t+"}}"}),o=this.translate.instant(r.key,i),Object.keys(n).forEach(function(t){var e;return e="{{"+t+"}}",o=o.replace(new RegExp(e,"g"),n[t])}),o},t}(),angular.module("taigaUserTimeline").service("tgUserTimelineItemTitle",t)}.call(this),function(){var t,e;e=function(t,e){var r;return r=[{check:function(t,e){return"membership"===e.obj},key:"TIMELINE.NEW_MEMBER",translate_params:["project_name"],member:function(t){return Immutable.Map({user:t.getIn(["data","user"]),role:t.getIn(["data","role"])})}},{check:function(t,e){return"project"===e.obj&&"create"===e.type},key:"TIMELINE.NEW_PROJECT",translate_params:["username","project_name"],description:function(t){return t.getIn(["data","project","description"])}},{check:function(t,e){return"change"===e.type&&t.hasIn(["data","value_diff"])&&"attachments"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.UPLOAD_ATTACHMENT",translate_params:["username","obj_name"]},{check:function(t,e){return"userstory"===e.obj&&"create"===e.type},key:"TIMELINE.US_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"issue"===e.obj&&"create"===e.type},key:"TIMELINE.ISSUE_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"wikipage"===e.obj&&"create"===e.type},key:"TIMELINE.WIKI_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"task"===e.obj&&"create"===e.type&&!t.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"task"===e.obj&&"create"===e.type&&t.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_CREATED_WITH_US",translate_params:["username","project_name","obj_name","us_name"]},{check:function(t,e){return"milestone"===e.obj&&"create"===e.type},key:"TIMELINE.MILESTONE_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"epic"===e.obj&&"create"===e.type},key:"TIMELINE.EPIC_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(t,e){return"relateduserstory"===e.obj&&"create"===e.type},key:"TIMELINE.EPIC_RELATED_USERSTORY_CREATED",translate_params:["username","project_name","related_us_name","epic_name"]},{check:function(t,e){return t.getIn(["data","comment"])&&"userstory"===e.obj},key:"TIMELINE.NEW_COMMENT_US",translate_params:["username","obj_name"],description:function(t){var e;return e=t.getIn(["data","comment_html"]),$($.parseHTML(e)).text()}},{check:function(t,e){return t.getIn(["data","comment"])&&"issue"===e.obj},key:"TIMELINE.NEW_COMMENT_ISSUE",translate_params:["username","obj_name"],description:function(t){var e;return e=t.getIn(["data","comment_html"]),$($.parseHTML(e)).text()}},{check:function(t,e){return t.getIn(["data","comment"])&&"task"===e.obj},key:"TIMELINE.NEW_COMMENT_TASK",translate_params:["username","obj_name"],description:function(t){var e;return e=t.getIn(["data","comment_html"]),$($.parseHTML(e)).text()}},{check:function(t,e){return t.getIn(["data","comment"])&&"epic"===e.obj},key:"TIMELINE.NEW_COMMENT_EPIC",translate_params:["username","obj_name"],description:function(t){var e;return e=t.getIn(["data","comment_html"]),$($.parseHTML(e)).text()}},{check:function(t,e){return t.hasIn(["data","value_diff"])&&"moveInBacklog"===t.getIn(["data","value_diff","key"])&&t.hasIn(["data","value_diff","value","backlog_order"])&&"change"===e.type},key:"TIMELINE.US_MOVED",translate_params:["username","obj_name"]},{check:function(t,e){return!(!t.hasIn(["data","value_diff"])||"moveInBacklog"!==t.getIn(["data","value_diff","key"])||"change"!==e.type||"userstory"!==e.obj)&&null===t.getIn(["data","value_diff","value","milestone"]).get(1)},key:"TIMELINE.US_REMOVED_FROM_MILESTONE",translate_params:["username","obj_name"]},{check:function(t,e){return t.hasIn(["data","value_diff"])&&"moveInBacklog"===t.getIn(["data","value_diff","key"])&&"change"===e.type&&"userstory"===e.obj},key:"TIMELINE.US_ADDED_MILESTONE",translate_params:["username","obj_name","sprint_name"]},{check:function(t,e){return!(!t.hasIn(["data","value_diff"])||"blocked"!==t.getIn(["data","value_diff","key"])||"change"!==e.type)&&t.getIn(["data","value_diff","value","is_blocked"]).get(1)===!0},key:"TIMELINE.BLOCKED",translate_params:["username","obj_name"],description:function(t){var e;return!!t.hasIn(["data","value_diff","value","blocked_note_html"])&&(e=t.getIn(["data","value_diff","value","blocked_note_html"]).get(1),$($.parseHTML(e)).text())}},{check:function(t,e){return!(!t.hasIn(["data","value_diff"])||"blocked"!==t.getIn(["data","value_diff","key"])||"change"!==e.type)&&t.getIn(["data","value_diff","value","is_blocked"]).get(1)===!1; +},key:"TIMELINE.UNBLOCKED",translate_params:["username","obj_name"]},{check:function(t,e){return"milestone"===e.obj&&"change"===e.type},key:"TIMELINE.MILESTONE_UPDATED",translate_params:["username","obj_name"]},{check:function(t,e){return"wikipage"===e.obj&&"change"===e.type},key:"TIMELINE.WIKI_UPDATED",translate_params:["username","obj_name"]},{check:function(t,e){return"userstory"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"points"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.US_UPDATED_POINTS",translate_params:["username","field_name","obj_name","new_value","role_name"]},{check:function(t,e){return"userstory"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.US_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(t,e){return"userstory"===e.obj&&"change"===e.type},key:"TIMELINE.US_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"issue"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.ISSUE_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(t,e){return"issue"===e.obj&&"change"===e.type},key:"TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"task"===e.obj&&"change"===e.type&&!t.getIn(["data","task","userstory"])&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.TASK_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(t,e){return"task"===e.obj&&"change"===e.type&&t.getIn(["data","task","userstory"])&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.TASK_UPDATED_WITH_US",translate_params:["username","field_name","obj_name","us_name"]},{check:function(t,e){return"task"===e.obj&&"change"===e.type&&!t.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"task"===e.obj&&"change"===e.type&&t.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE",translate_params:["username","field_name","obj_name","us_name","new_value"]},{check:function(t,e){return"epic"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"description_diff"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.EPIC_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(t,e){return"epic"===e.obj&&"change"===e.type&&t.hasIn(["data","value_diff"])&&"color"===t.getIn(["data","value_diff","key"])},key:"TIMELINE.EPIC_UPDATED_WITH_NEW_COLOR",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"epic"===e.obj&&"change"===e.type},key:"TIMELINE.EPIC_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(t,e){return"user"===e.obj&&"create"===e.type},key:"TIMELINE.NEW_USER",translate_params:["username"]}],_.find(r,function(r){return r.check(t,e)})},t=function(){function t(){}return t.prototype.getType=function(t,r){return e(t,r)},t}(),angular.module("taigaUserTimeline").service("tgUserTimelineItemType",t)}.call(this),function(){var t;t=function(){return{templateUrl:"user-timeline/user-timeline-item/user-timeline-item.html",scope:{timeline:"=tgUserTimelineItem"}}},angular.module("taigaUserTimeline").directive("tgUserTimelineItem",t)}.call(this),function(){var t;t=function(){var t;return t={},t.generate=function(t){var e,r,n,i;return i=1,r=Immutable.List(),t.minItems=t.minItems||20,n=function(){return r=Immutable.List(),e()},e=function(){return t.fetch(i).then(function(n){var o;return i++,o=n.get("data"),t.filter&&(o=t.filter(o)),t.map&&(o=o.map(t.map)),r=r.concat(o),r.size\n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: app.coffee\n */\n\n(function() {\n var configure, i18nInit, init, module, modules, pluginsModules, pluginsWithModule, taiga;\n\n this.taiga = taiga = {};\n\n taiga.emojis = window.emojis;\n\n this.taigaContribPlugins = this.taigaContribPlugins || window.taigaContribPlugins || [];\n\n taiga.generateHash = function(components) {\n if (components == null) {\n components = [];\n }\n components = _.map(components, function(x) {\n return JSON.stringify(x);\n });\n return hex_sha1(components.join(\":\"));\n };\n\n taiga.generateUniqueSessionIdentifier = function() {\n var date, randomNumber;\n date = (new Date()).getTime();\n randomNumber = Math.floor(Math.random() * 0x9000000);\n return taiga.generateHash([date, randomNumber]);\n };\n\n taiga.sessionId = taiga.generateUniqueSessionIdentifier();\n\n configure = function($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider, $compileProvider, $translateProvider, $translatePartialLoaderProvider, $animateProvider) {\n var authHttpIntercept, blockingIntercept, decorators, defaultHeaders, loaderIntercept, originalWhen, preferedLangCode, userInfo, versionCheckHttpIntercept;\n $animateProvider.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/);\n originalWhen = $routeProvider.when;\n $routeProvider.when = function(path, route) {\n route.resolve || (route.resolve = {});\n angular.extend(route.resolve, {\n languageLoad: [\n \"$q\", \"$translate\", function($q, $translate) {\n var deferred;\n deferred = $q.defer();\n $translate().then(function() {\n return deferred.resolve();\n });\n return deferred.promise;\n }\n ],\n projectLoaded: [\n \"$q\", \"tgProjectService\", \"$route\", function($q, projectService, $route) {\n var deferred, ref;\n deferred = $q.defer();\n projectService.setSection((ref = $route.current.$$route) != null ? ref.section : void 0);\n if ($route.current.params.pslug) {\n projectService.setProjectBySlug($route.current.params.pslug).then(deferred.resolve);\n } else {\n projectService.cleanProject();\n deferred.resolve();\n }\n return deferred.promise;\n }\n ]\n });\n return originalWhen.call($routeProvider, path, route);\n };\n $routeProvider.when(\"/\", {\n templateUrl: \"home/home.html\",\n controller: \"Home\",\n controllerAs: \"vm\",\n loader: true,\n title: \"HOME.PAGE_TITLE\",\n loader: true,\n description: \"HOME.PAGE_DESCRIPTION\",\n joyride: \"dashboard\"\n });\n $routeProvider.when(\"/discover\", {\n templateUrl: \"discover/discover-home/discover-home.html\",\n controller: \"DiscoverHome\",\n controllerAs: \"vm\",\n title: \"PROJECT.NAVIGATION.DISCOVER\",\n loader: true\n });\n $routeProvider.when(\"/discover/search\", {\n templateUrl: \"discover/discover-search/discover-search.html\",\n title: \"PROJECT.NAVIGATION.DISCOVER\",\n loader: true,\n controller: \"DiscoverSearch\",\n controllerAs: \"vm\",\n reloadOnSearch: false\n });\n $routeProvider.when(\"/projects/\", {\n templateUrl: \"projects/listing/projects-listing.html\",\n access: {\n requiresLogin: true\n },\n title: \"PROJECTS.PAGE_TITLE\",\n description: \"PROJECTS.PAGE_DESCRIPTION\",\n loader: true,\n controller: \"ProjectsListing\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/new\", {\n title: \"PROJECT.CREATE.TITLE\",\n templateUrl: \"projects/create/create-project.html\",\n loader: true,\n controller: \"CreateProjectCtrl\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/new/scrum\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/kanban\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/duplicate\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/new/import/:platform?\", {\n title: \"PROJECT.CREATE.TITLE\",\n template: \"\",\n loader: true\n });\n $routeProvider.when(\"/project/:pslug/\", {\n templateUrl: \"projects/project/project.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\",\n section: \"project-timeline\"\n });\n $routeProvider.when(\"/project/:pslug/t/:ref\", {\n loader: true,\n controller: \"DetailController\",\n template: \"\"\n });\n $routeProvider.when(\"/project/:pslug/search\", {\n templateUrl: \"search/search.html\",\n reloadOnSearch: false,\n section: \"search\",\n loader: true\n });\n $routeProvider.when(\"/project/:pslug/epics\", {\n section: \"epics\",\n templateUrl: \"epics/dashboard/epics-dashboard.html\",\n loader: true,\n controller: \"EpicsDashboardCtrl\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/:pslug/epic/:epicref\", {\n templateUrl: \"epic/epic-detail.html\",\n loader: true,\n section: \"epics\"\n });\n $routeProvider.when(\"/project/:pslug/backlog\", {\n templateUrl: \"backlog/backlog.html\",\n loader: true,\n section: \"backlog\",\n joyride: \"backlog\"\n });\n $routeProvider.when(\"/project/:pslug/kanban\", {\n templateUrl: \"kanban/kanban.html\",\n loader: true,\n section: \"kanban\",\n joyride: \"kanban\"\n });\n $routeProvider.when(\"/project/:pslug/taskboard/:sslug\", {\n templateUrl: \"taskboard/taskboard.html\",\n loader: true,\n section: \"backlog\"\n });\n $routeProvider.when(\"/project/:pslug/us/:usref\", {\n templateUrl: \"us/us-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n });\n $routeProvider.when(\"/project/:pslug/task/:taskref\", {\n templateUrl: \"task/task-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n });\n $routeProvider.when(\"/project/:pslug/wiki\", {\n redirectTo: function(params) {\n return \"/project/\" + params.pslug + \"/wiki/home\";\n }\n });\n $routeProvider.when(\"/project/:pslug/wiki-list\", {\n templateUrl: \"wiki/wiki-list.html\",\n loader: true,\n section: \"wiki\"\n });\n $routeProvider.when(\"/project/:pslug/wiki/:slug\", {\n templateUrl: \"wiki/wiki.html\",\n loader: true,\n section: \"wiki\"\n });\n $routeProvider.when(\"/project/:pslug/team\", {\n templateUrl: \"team/team.html\",\n loader: true,\n section: \"team\"\n });\n $routeProvider.when(\"/project/:pslug/issues\", {\n templateUrl: \"issue/issues.html\",\n loader: true,\n section: \"issues\"\n });\n $routeProvider.when(\"/project/:pslug/issue/:issueref\", {\n templateUrl: \"issue/issues-detail.html\",\n loader: true,\n section: \"issues\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/details\", {\n templateUrl: \"admin/admin-project-profile.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/default-values\", {\n templateUrl: \"admin/admin-project-default-values.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/modules\", {\n templateUrl: \"admin/admin-project-modules.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/export\", {\n templateUrl: \"admin/admin-project-export.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/reports\", {\n templateUrl: \"admin/admin-project-reports.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/status\", {\n templateUrl: \"admin/admin-project-values-status.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/points\", {\n templateUrl: \"admin/admin-project-values-points.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/priorities\", {\n templateUrl: \"admin/admin-project-values-priorities.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/severities\", {\n templateUrl: \"admin/admin-project-values-severities.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/types\", {\n templateUrl: \"admin/admin-project-values-types.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/custom-fields\", {\n templateUrl: \"admin/admin-project-values-custom-fields.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/tags\", {\n templateUrl: \"admin/admin-project-values-tags.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/memberships\", {\n templateUrl: \"admin/admin-memberships.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/roles\", {\n templateUrl: \"admin/admin-roles.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/webhooks\", {\n templateUrl: \"admin/admin-third-parties-webhooks.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/github\", {\n templateUrl: \"admin/admin-third-parties-github.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/gitlab\", {\n templateUrl: \"admin/admin-third-parties-gitlab.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/bitbucket\", {\n templateUrl: \"admin/admin-third-parties-bitbucket.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/gogs\", {\n templateUrl: \"admin/admin-third-parties-gogs.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/contrib/:plugin\", {\n templateUrl: \"contrib/main.html\"\n });\n $routeProvider.when(\"/project/:pslug/transfer/:token\", {\n templateUrl: \"projects/transfer/transfer-page.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/user-settings/user-profile\", {\n templateUrl: \"user/user-profile.html\"\n });\n $routeProvider.when(\"/user-settings/user-change-password\", {\n templateUrl: \"user/user-change-password.html\"\n });\n $routeProvider.when(\"/user-settings/mail-notifications\", {\n templateUrl: \"user/mail-notifications.html\"\n });\n $routeProvider.when(\"/user-settings/live-notifications\", {\n templateUrl: \"user/live-notifications.html\"\n });\n $routeProvider.when(\"/change-email/:email_token\", {\n templateUrl: \"user/change-email.html\"\n });\n $routeProvider.when(\"/cancel-account/:cancel_token\", {\n templateUrl: \"user/cancel-account.html\"\n });\n $routeProvider.when(\"/user-settings/contrib/:plugin\", {\n templateUrl: \"contrib/user-settings.html\"\n });\n $routeProvider.when(\"/profile\", {\n templateUrl: \"profile/profile.html\",\n loader: true,\n access: {\n requiresLogin: true\n },\n controller: \"Profile\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/profile/:slug\", {\n templateUrl: \"profile/profile.html\",\n loader: true,\n controller: \"Profile\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/login\", {\n templateUrl: \"auth/login.html\",\n title: \"LOGIN.PAGE_TITLE\",\n description: \"LOGIN.PAGE_DESCRIPTION\",\n disableHeader: true,\n controller: \"LoginPage\"\n });\n $routeProvider.when(\"/register\", {\n templateUrl: \"auth/register.html\",\n title: \"REGISTER.PAGE_TITLE\",\n description: \"REGISTER.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/forgot-password\", {\n templateUrl: \"auth/forgot-password.html\",\n title: \"FORGOT_PASSWORD.PAGE_TITLE\",\n description: \"FORGOT_PASSWORD.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/change-password/:token\", {\n templateUrl: \"auth/change-password-from-recovery.html\",\n title: \"CHANGE_PASSWORD.PAGE_TITLE\",\n description: \"CHANGE_PASSWORD.PAGE_TITLE\",\n disableHeader: true\n });\n $routeProvider.when(\"/invitation/:token\", {\n templateUrl: \"auth/invitation.html\",\n title: \"INVITATION.PAGE_TITLE\",\n description: \"INVITATION.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/external-apps\", {\n templateUrl: \"external-apps/external-app.html\",\n title: \"EXTERNAL_APP.PAGE_TITLE\",\n description: \"EXTERNAL_APP.PAGE_DESCRIPTION\",\n controller: \"ExternalApp\",\n controllerAs: \"vm\",\n disableHeader: true,\n mobileViewport: true\n });\n $routeProvider.when(\"/blocked-project/:pslug/\", {\n templateUrl: \"projects/project/blocked-project.html\",\n loader: true\n });\n $routeProvider.when(\"/error\", {\n templateUrl: \"error/error.html\"\n });\n $routeProvider.when(\"/not-found\", {\n templateUrl: \"error/not-found.html\"\n });\n $routeProvider.when(\"/permission-denied\", {\n templateUrl: \"error/permission-denied.html\"\n });\n $routeProvider.otherwise({\n templateUrl: \"error/not-found.html\"\n });\n $locationProvider.html5Mode({\n enabled: true,\n requireBase: false\n });\n defaultHeaders = {\n \"Content-Type\": \"application/json\",\n \"Accept-Language\": window.taigaConfig.defaultLanguage || \"en\",\n \"X-Session-Id\": taiga.sessionId\n };\n $httpProvider.defaults.headers[\"delete\"] = defaultHeaders;\n $httpProvider.defaults.headers.patch = defaultHeaders;\n $httpProvider.defaults.headers.post = defaultHeaders;\n $httpProvider.defaults.headers.put = defaultHeaders;\n $httpProvider.defaults.headers.get = {\n \"X-Session-Id\": taiga.sessionId\n };\n $httpProvider.useApplyAsync(true);\n $tgEventsProvider.setSessionId(taiga.sessionId);\n authHttpIntercept = function($q, $location, $navUrls, $lightboxService, errorHandlingService) {\n var httpResponseError;\n httpResponseError = function(response) {\n var nextUrl, search;\n if (response.status === 0 || (response.status === -1 && !response.config.cancelable)) {\n $lightboxService.closeAll();\n errorHandlingService.error();\n } else if (response.status === 401 && $location.url().indexOf('/login') === -1) {\n nextUrl = $location.url();\n search = $location.search();\n if (search.force_next) {\n $location.url($navUrls.resolve(\"login\")).search(\"force_next\", search.force_next);\n } else {\n $location.url($navUrls.resolve(\"login\")).search({\n \"unauthorized\": true,\n \"next\": nextUrl\n });\n }\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"authHttpIntercept\", [\"$q\", \"$location\", \"$tgNavUrls\", \"lightboxService\", \"tgErrorHandlingService\", authHttpIntercept]);\n $httpProvider.interceptors.push(\"authHttpIntercept\");\n loaderIntercept = function($q, loaderService) {\n return {\n request: function(config) {\n loaderService.logRequest();\n return config;\n },\n requestError: function(rejection) {\n loaderService.logResponse();\n return $q.reject(rejection);\n },\n responseError: function(rejection) {\n loaderService.logResponse();\n return $q.reject(rejection);\n },\n response: function(response) {\n loaderService.logResponse();\n return response;\n }\n };\n };\n $provide.factory(\"loaderIntercept\", [\"$q\", \"tgLoader\", loaderIntercept]);\n $httpProvider.interceptors.push(\"loaderIntercept\");\n versionCheckHttpIntercept = function($q) {\n var httpResponseError;\n httpResponseError = function(response) {\n var $injector;\n if (response.status === 400 && response.data.version) {\n $injector = angular.element(\"body\").injector();\n $injector.invoke([\n \"$tgConfirm\", \"$translate\", (function(_this) {\n return function($confirm, $translate) {\n var versionErrorMsg;\n versionErrorMsg = $translate.instant(\"ERROR.VERSION_ERROR\");\n return $confirm.notify(\"error\", versionErrorMsg, null, 10000);\n };\n })(this)\n ]);\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"versionCheckHttpIntercept\", [\"$q\", versionCheckHttpIntercept]);\n $httpProvider.interceptors.push(\"versionCheckHttpIntercept\");\n blockingIntercept = function($q, errorHandlingService) {\n var redirectToBlockedPage, responseError, responseOk;\n redirectToBlockedPage = function() {\n return errorHandlingService.block();\n };\n responseOk = function(response) {\n if (response.data.blocked_code) {\n redirectToBlockedPage();\n }\n return response;\n };\n responseError = function(response) {\n if (response.status === 451) {\n redirectToBlockedPage();\n }\n return $q.reject(response);\n };\n return {\n response: responseOk,\n responseError: responseError\n };\n };\n $provide.factory(\"blockingIntercept\", [\"$q\", \"tgErrorHandlingService\", blockingIntercept]);\n $httpProvider.interceptors.push(\"blockingIntercept\");\n $compileProvider.debugInfoEnabled(window.taigaConfig.debugInfo || false);\n if (localStorage.userInfo) {\n userInfo = JSON.parse(localStorage.userInfo);\n }\n preferedLangCode = (userInfo != null ? userInfo.lang : void 0) || window.taigaConfig.defaultLanguage || \"en\";\n $translatePartialLoaderProvider.addPart('taiga');\n $translateProvider.useLoader('$translatePartialLoader', {\n urlTemplate: '/' + window._version + '/locales/{part}/locale-{lang}.json'\n }).useSanitizeValueStrategy('escapeParameters').addInterpolation('$translateMessageFormatInterpolation').preferredLanguage(preferedLangCode);\n $translateProvider.fallbackLanguage(preferedLangCode);\n decorators = window.getDecorators();\n return _.each(decorators, function(decorator) {\n return $provide.decorator(decorator.provider, decorator.decorator);\n });\n };\n\n i18nInit = function(lang, $translate) {\n var messages;\n moment.locale(lang);\n if (lang !== 'en') {\n ljs.load((\"/\" + window._version + \"/locales/moment-locales/\") + lang + \".js\");\n }\n messages = {\n defaultMessage: $translate.instant(\"COMMON.FORM_ERRORS.DEFAULT_MESSAGE\"),\n type: {\n email: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_EMAIL\"),\n url: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URL\"),\n urlstrict: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URLSTRICT\"),\n number: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_NUMBER\"),\n digits: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DIGITS\"),\n dateIso: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DATEISO\"),\n alphanum: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_ALPHANUM\"),\n phone: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_PHONE\")\n },\n notnull: $translate.instant(\"COMMON.FORM_ERRORS.NOTNULL\"),\n notblank: $translate.instant(\"COMMON.FORM_ERRORS.NOT_BLANK\"),\n required: $translate.instant(\"COMMON.FORM_ERRORS.REQUIRED\"),\n regexp: $translate.instant(\"COMMON.FORM_ERRORS.REGEXP\"),\n min: $translate.instant(\"COMMON.FORM_ERRORS.MIN\"),\n max: $translate.instant(\"COMMON.FORM_ERRORS.MAX\"),\n range: $translate.instant(\"COMMON.FORM_ERRORS.RANGE\"),\n minlength: $translate.instant(\"COMMON.FORM_ERRORS.MIN_LENGTH\"),\n maxlength: $translate.instant(\"COMMON.FORM_ERRORS.MAX_LENGTH\"),\n rangelength: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_LENGTH\"),\n mincheck: $translate.instant(\"COMMON.FORM_ERRORS.MIN_CHECK\"),\n maxcheck: $translate.instant(\"COMMON.FORM_ERRORS.MAX_CHECK\"),\n rangecheck: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_CHECK\"),\n equalto: $translate.instant(\"COMMON.FORM_ERRORS.EQUAL_TO\"),\n linewidth: $translate.instant(\"COMMON.FORM_ERRORS.LINEWIDTH\"),\n pikaday: $translate.instant(\"COMMON.FORM_ERRORS.PIKADAY\")\n };\n return checksley.updateMessages('default', messages);\n };\n\n init = function($log, $rootscope, $auth, $events, $analytics, $translate, $location, $navUrls, appMetaService, loaderService, navigationBarService, errorHandlingService, lightboxService, $tgConfig) {\n var un, user, validators;\n $log.debug(\"Initialize application\");\n $rootscope.$on('$translatePartialLoaderStructureChanged', function() {\n return $translate.refresh();\n });\n validators = {\n linewidth: function(val, width) {\n var lines, valid;\n lines = taiga.nl2br(val).split(\"
    \");\n valid = _.every(lines, function(line) {\n return line.length < width;\n });\n return valid;\n },\n pikaday: function(val) {\n var prettyDate;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n return moment(val, prettyDate).isValid();\n }\n };\n checksley.updateValidators(validators);\n $rootscope.contribPlugins = this.taigaContribPlugins;\n $rootscope.adminPlugins = _.filter(this.taigaContribPlugins, {\n \"type\": \"admin\"\n });\n $rootscope.userSettingsPlugins = _.filter(this.taigaContribPlugins, {\n \"type\": \"userSettings\"\n });\n $rootscope.$on(\"$translateChangeEnd\", function(e, ctx) {\n var lang, rtlLanguages;\n lang = ctx.language;\n i18nInit(lang, $translate);\n rtlLanguages = $tgConfig.get(\"rtlLanguages\", []);\n return $rootscope.isRTL = rtlLanguages.indexOf(lang) > -1;\n });\n Promise.setScheduler(function(cb) {\n return $rootscope.$evalAsync(cb);\n });\n $events.setupConnection();\n if ($auth.isAuthenticated()) {\n user = $auth.getUser();\n $auth.showTerms();\n }\n $analytics.initialize();\n $rootscope.$on('$locationChangeStart', function(event) {\n errorHandlingService.init();\n if (lightboxService.getLightboxOpen().length) {\n event.preventDefault();\n return lightboxService.closeAll();\n }\n });\n un = $rootscope.$on('$routeChangeStart', function(event, next) {\n if (next.loader) {\n loaderService.start(true);\n }\n return un();\n });\n return $rootscope.$on('$routeChangeSuccess', function(event, next) {\n var description, title;\n if (next.loader) {\n loaderService.start(true);\n }\n if (next.access && next.access.requiresLogin) {\n if (!$auth.isAuthenticated()) {\n $location.path($navUrls.resolve(\"login\"));\n }\n }\n if (next.title || next.description) {\n title = $translate.instant(next.title || \"\");\n description = $translate.instant(next.description || \"\");\n appMetaService.setAll(title, description);\n }\n if (next.mobileViewport) {\n appMetaService.addMobileViewport();\n } else {\n appMetaService.removeMobileViewport();\n }\n if (next.disableHeader) {\n return navigationBarService.disableHeader();\n } else {\n return navigationBarService.enableHeader();\n }\n });\n };\n\n angular.module('infinite-scroll').value('THROTTLE_MILLISECONDS', 500);\n\n pluginsWithModule = _.filter(this.taigaContribPlugins, function(plugin) {\n return plugin.module;\n });\n\n pluginsModules = _.map(pluginsWithModule, function(plugin) {\n return plugin.module;\n });\n\n modules = [\"taigaBase\", \"taigaCommon\", \"taigaResources\", \"taigaResources2\", \"taigaAuth\", \"taigaEvents\", \"taigaHome\", \"taigaNavigationBar\", \"taigaProjects\", \"taigaRelatedTasks\", \"taigaBacklog\", \"taigaTaskboard\", \"taigaKanban\", \"taigaIssues\", \"taigaUserStories\", \"taigaTasks\", \"taigaTeam\", \"taigaWiki\", \"taigaSearch\", \"taigaAdmin\", \"taigaProject\", \"taigaUserSettings\", \"taigaFeedback\", \"taigaPlugins\", \"taigaIntegrations\", \"taigaComponents\", \"taigaProfile\", \"taigaHome\", \"taigaUserTimeline\", \"taigaExternalApps\", \"taigaDiscover\", \"taigaHistory\", \"taigaWikiHistory\", \"taigaEpics\", \"taigaUtils\", \"templates\", \"ngSanitize\", \"ngRoute\", \"ngAnimate\", \"ngAria\", \"pascalprecht.translate\", \"infinite-scroll\", \"tgRepeat\"].concat(pluginsModules);\n\n module = angular.module(\"taiga\", modules);\n\n module.config([\"$routeProvider\", \"$locationProvider\", \"$httpProvider\", \"$provide\", \"$tgEventsProvider\", \"$compileProvider\", \"$translateProvider\", \"$translatePartialLoaderProvider\", \"$animateProvider\", configure]);\n\n module.run([\"$log\", \"$rootScope\", \"$tgAuth\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"tgLoader\", \"tgNavigationBarService\", \"tgErrorHandlingService\", \"lightboxService\", \"$tgConfig\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: classes.coffee\n */\n\n(function() {\n var TaigaBase, TaigaController, TaigaService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n TaigaBase = (function() {\n function TaigaBase() {}\n\n return TaigaBase;\n\n })();\n\n TaigaService = (function(superClass) {\n extend(TaigaService, superClass);\n\n function TaigaService() {\n return TaigaService.__super__.constructor.apply(this, arguments);\n }\n\n return TaigaService;\n\n })(TaigaBase);\n\n TaigaController = (function(superClass) {\n extend(TaigaController, superClass);\n\n function TaigaController() {\n this.onInitialDataError = bind(this.onInitialDataError, this);\n return TaigaController.__super__.constructor.apply(this, arguments);\n }\n\n TaigaController.prototype.onInitialDataError = function(xhr) {\n if (xhr) {\n if (xhr.status === 404) {\n this.errorHandlingService.notfound();\n } else if (xhr.status === 403) {\n this.errorHandlingService.permissionDenied();\n }\n }\n return this.q.reject(xhr);\n };\n\n return TaigaController;\n\n })(TaigaBase);\n\n this.taiga.Base = TaigaBase;\n\n this.taiga.Service = TaigaService;\n\n this.taiga.Controller = TaigaController;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: utils.coffee\n */\n\n(function() {\n var DEFAULT_COLOR_LIST, addClass, bindMethods, bindOnce, cancelTimeout, debounce, debounceLeading, defineImmutableProperty, getDefaulColorList, getMatches, getRandomDefaultColor, groupBy, isEmail, isImage, isPdf, joinStr, mixOf, nl2br, patch, replaceTags, scopeDefer, sizeFormat, slugify, startswith, stripTags, taiga, timeout, toString, toggleText, trim, truncate, unslugify,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n slice = [].slice,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n addClass = function(el, className) {\n if (el.classList) {\n return el.classList.add(className);\n } else {\n return el.className += ' ' + className;\n }\n };\n\n nl2br = (function(_this) {\n return function(str) {\n var breakTag;\n breakTag = '
    ';\n return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + breakTag + '$2');\n };\n })(this);\n\n bindMethods = (function(_this) {\n return function(object) {\n var dependencies, methods;\n dependencies = _.keys(object);\n methods = [];\n _.forIn(object, function(value, key) {\n if (indexOf.call(dependencies, key) < 0 && _.isFunction(value)) {\n return methods.push(key);\n }\n });\n return _.bindAll(object, methods);\n };\n })(this);\n\n bindOnce = (function(_this) {\n return function(scope, attr, continuation) {\n var delBind, val;\n val = scope.$eval(attr);\n if (val !== void 0) {\n return continuation(val);\n }\n delBind = null;\n return delBind = scope.$watch(attr, function(val) {\n if (val === void 0) {\n return;\n }\n continuation(val);\n if (delBind) {\n return delBind();\n }\n });\n };\n })(this);\n\n mixOf = function() {\n var Mixed, base, i, method, mixin, mixins, name, ref;\n base = arguments[0], mixins = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n Mixed = (function(superClass) {\n extend(Mixed, superClass);\n\n function Mixed() {\n return Mixed.__super__.constructor.apply(this, arguments);\n }\n\n return Mixed;\n\n })(base);\n for (i = mixins.length - 1; i >= 0; i += -1) {\n mixin = mixins[i];\n ref = mixin.prototype;\n for (name in ref) {\n method = ref[name];\n Mixed.prototype[name] = method;\n }\n }\n return Mixed;\n };\n\n trim = function(data, char) {\n return _.trim(data, char);\n };\n\n slugify = function(data) {\n return data.toString().toLowerCase().trim().replace(/\\s+/g, '-').replace(/&/g, '-and-').replace(/[^\\w\\-]+/g, '').replace(/\\-\\-+/g, '-');\n };\n\n unslugify = function(data) {\n if (data) {\n return _.capitalize(data.replace(/-/g, ' '));\n }\n return data;\n };\n\n toggleText = function(element, texts) {\n var nextTextPosition, text;\n nextTextPosition = element.data('nextTextPosition');\n if ((nextTextPosition == null) || nextTextPosition >= texts.length) {\n nextTextPosition = 0;\n }\n text = texts[nextTextPosition];\n element.data('nextTextPosition', nextTextPosition + 1);\n return element.text(text);\n };\n\n groupBy = function(coll, pred) {\n var i, item, len, result;\n result = {};\n for (i = 0, len = coll.length; i < len; i++) {\n item = coll[i];\n result[pred(item)] = item;\n }\n return result;\n };\n\n timeout = function(wait, continuation) {\n return window.setTimeout(continuation, wait);\n };\n\n cancelTimeout = function(timeoutVar) {\n return window.clearTimeout(timeoutVar);\n };\n\n scopeDefer = function(scope, func) {\n return _.defer((function(_this) {\n return function() {\n return scope.$apply(func);\n };\n })(this));\n };\n\n toString = function(value) {\n if (_.isNumber(value)) {\n return value + \"\";\n } else if (_.isString(value)) {\n return value;\n } else if (_.isPlainObject(value)) {\n return JSON.stringify(value);\n } else if (_.isUndefined(value)) {\n return \"\";\n }\n return value.toString();\n };\n\n joinStr = function(str, coll) {\n return coll.join(str);\n };\n\n debounce = function(wait, func) {\n return _.debounce(func, wait, {\n leading: true,\n trailing: false\n });\n };\n\n debounceLeading = function(wait, func) {\n return _.debounce(func, wait, {\n leading: false,\n trailing: true\n });\n };\n\n startswith = function(str1, str2) {\n return _.startsWith(str1, str2);\n };\n\n truncate = function(str, maxLength, suffix) {\n var out;\n if (suffix == null) {\n suffix = \"...\";\n }\n if ((typeof str !== \"string\") && !(str instanceof String)) {\n return str;\n }\n out = str.slice(0);\n if (out.length > maxLength) {\n out = out.substring(0, maxLength + 1);\n out = out.substring(0, Math.min(out.length, out.lastIndexOf(\" \")));\n out = out + suffix;\n }\n return out;\n };\n\n sizeFormat = function(input, precision) {\n var number, size, units;\n if (precision == null) {\n precision = 1;\n }\n if (isNaN(parseFloat(input)) || !isFinite(input)) {\n return \"-\";\n }\n if (input === 0) {\n return \"0 bytes\";\n }\n units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n number = Math.floor(Math.log(input) / Math.log(1024));\n if (number > 5) {\n number = 5;\n }\n size = (input / Math.pow(1024, number)).toFixed(precision);\n return size + \" \" + units[number];\n };\n\n stripTags = function(str, exception) {\n var pattern;\n if (exception) {\n pattern = new RegExp('<(?!' + exception + '\\s*\\/?)[^>]+>', 'gi');\n return String(str).replace(pattern, '');\n } else {\n return String(str).replace(/<\\/?[^>]+>/g, '');\n }\n };\n\n replaceTags = function(str, tags, replace) {\n var pattern;\n pattern = new RegExp('<(' + tags + ')>', 'gi');\n str = str.replace(pattern, '<' + replace + '>');\n pattern = new RegExp('<\\/(' + tags + ')>', 'gi');\n str = str.replace(pattern, '');\n return str;\n };\n\n defineImmutableProperty = (function(_this) {\n return function(obj, name, fn) {\n return Object.defineProperty(obj, name, {\n get: function() {\n var fn_result;\n if (!_.isFunction(fn)) {\n throw \"defineImmutableProperty third param must be a function\";\n }\n fn_result = fn();\n if (fn_result && _.isObject(fn_result)) {\n if (fn_result.size === void 0) {\n throw \"defineImmutableProperty must return immutable data\";\n }\n }\n return fn_result;\n }\n });\n };\n })(this);\n\n _.mixin({\n removeKeys: function(obj, keys) {\n return _.chain([keys]).flatten().reduce(function(obj, key) {\n delete obj[key];\n return obj;\n }, obj).value();\n },\n cartesianProduct: function() {\n return _.reduceRight(arguments, function(a, b) {\n return _.flatten(_.map(a, function(x) {\n return _.map(b, function(y) {\n return [y].concat(x);\n });\n }), true);\n }, [[]]);\n }\n });\n\n isImage = function(name) {\n return name.match(/\\.(jpe?g|png|gif|gifv|webm|svg|psd)/i) !== null;\n };\n\n isEmail = function(name) {\n return (name != null) && name.match(/^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/) !== null;\n };\n\n isPdf = function(name) {\n return name.match(/\\.(pdf)/i) !== null;\n };\n\n patch = function(oldImmutable, newImmutable) {\n var pathObj;\n pathObj = {};\n newImmutable.forEach(function(newValue, key) {\n if (newValue !== oldImmutable.get(key)) {\n if (newValue.toJS) {\n return pathObj[key] = newValue.toJS();\n } else {\n return pathObj[key] = newValue;\n }\n }\n });\n return pathObj;\n };\n\n DEFAULT_COLOR_LIST = ['#fce94f', '#edd400', '#c4a000', '#8ae234', '#73d216', '#4e9a06', '#d3d7cf', '#fcaf3e', '#f57900', '#ce5c00', '#729fcf', '#3465a4', '#204a87', '#888a85', '#ad7fa8', '#75507b', '#5c3566', '#ef2929', '#cc0000', '#a40000', '#222222'];\n\n getRandomDefaultColor = function() {\n return _.sample(DEFAULT_COLOR_LIST);\n };\n\n getDefaulColorList = function() {\n return _.clone(DEFAULT_COLOR_LIST);\n };\n\n getMatches = function(string, regex, index) {\n var match, matches;\n index || (index = 1);\n matches = [];\n match = null;\n while (match = regex.exec(string)) {\n if (index === -1) {\n matches.push(match);\n } else {\n matches.push(match[index]);\n }\n }\n return matches;\n };\n\n taiga = this.taiga;\n\n taiga.addClass = addClass;\n\n taiga.nl2br = nl2br;\n\n taiga.bindMethods = bindMethods;\n\n taiga.bindOnce = bindOnce;\n\n taiga.mixOf = mixOf;\n\n taiga.trim = trim;\n\n taiga.slugify = slugify;\n\n taiga.unslugify = unslugify;\n\n taiga.toggleText = toggleText;\n\n taiga.groupBy = groupBy;\n\n taiga.timeout = timeout;\n\n taiga.cancelTimeout = cancelTimeout;\n\n taiga.scopeDefer = scopeDefer;\n\n taiga.toString = toString;\n\n taiga.joinStr = joinStr;\n\n taiga.truncate = truncate;\n\n taiga.debounce = debounce;\n\n taiga.debounceLeading = debounceLeading;\n\n taiga.startswith = startswith;\n\n taiga.sizeFormat = sizeFormat;\n\n taiga.stripTags = stripTags;\n\n taiga.replaceTags = replaceTags;\n\n taiga.defineImmutableProperty = defineImmutableProperty;\n\n taiga.isImage = isImage;\n\n taiga.isEmail = isEmail;\n\n taiga.isPdf = isPdf;\n\n taiga.patch = patch;\n\n taiga.getRandomDefaultColor = getRandomDefaultColor;\n\n taiga.getDefaulColorList = getDefaulColorList;\n\n taiga.getMatches = getMatches;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/controllerMixins.coffee\n */\n\n(function() {\n var FiltersMixin, PageMixin, UsFiltersMixin, groupBy, joinStr, taiga, toString, trim;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n joinStr = this.taiga.joinStr;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n PageMixin = (function() {\n function PageMixin() {}\n\n PageMixin.prototype.fillUsersAndRoles = function(users, roles) {\n var activeUsers, computableRoles;\n activeUsers = _.filter(users, (function(_this) {\n return function(user) {\n return user.is_active;\n };\n })(this));\n this.scope.activeUsers = _.sortBy(activeUsers, \"full_name_display\");\n this.scope.activeUsersById = groupBy(this.scope.activeUsers, function(e) {\n return e.id;\n });\n this.scope.users = _.sortBy(users, \"full_name_display\");\n this.scope.usersById = groupBy(this.scope.users, function(e) {\n return e.id;\n });\n this.scope.roles = _.sortBy(roles, \"order\");\n computableRoles = _(this.scope.project.members).map(\"role\").uniq().value();\n return this.scope.computableRoles = _(roles).filter(\"computable\").filter(function(x) {\n return _.includes(computableRoles, x.id);\n }).value();\n };\n\n PageMixin.prototype.loadUsersAndRoles = function() {\n var promise;\n promise = this.q.all([this.rs.projects.usersList(this.scope.projectId), this.rs.projects.rolesList(this.scope.projectId)]);\n return promise.then((function(_this) {\n return function(results) {\n var roles, users;\n users = results[0], roles = results[1];\n _this.fillUsersAndRoles(users, roles);\n return results;\n };\n })(this));\n };\n\n return PageMixin;\n\n })();\n\n taiga.PageMixin = PageMixin;\n\n FiltersMixin = (function() {\n function FiltersMixin() {}\n\n FiltersMixin.prototype.selectFilter = function(name, value, load) {\n var existing, location, params;\n if (load == null) {\n load = false;\n }\n params = this.location.search();\n if (params[name] !== void 0 && name !== \"page\") {\n existing = _.map(taiga.toString(params[name]).split(\",\"), function(x) {\n return trim(x);\n });\n existing.push(taiga.toString(value));\n existing = _.compact(existing);\n value = joinStr(\",\", _.uniq(existing));\n }\n if (!this.location.isInCurrentRouteParams(name, value)) {\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n }\n };\n\n FiltersMixin.prototype.replaceFilter = function(name, value, load) {\n var location;\n if (load == null) {\n load = false;\n }\n if (!this.location.isInCurrentRouteParams(name, value)) {\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n }\n };\n\n FiltersMixin.prototype.replaceAllFilters = function(filters, load) {\n var location;\n if (load == null) {\n load = false;\n }\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(filters);\n };\n\n FiltersMixin.prototype.unselectFilter = function(name, value, load) {\n var location, newValues, params, parsedValues;\n if (load == null) {\n load = false;\n }\n params = this.location.search();\n if (params[name] === void 0) {\n return;\n }\n if (value === void 0 || value === null) {\n delete params[name];\n }\n parsedValues = _.map(taiga.toString(params[name]).split(\",\"), function(x) {\n return trim(x);\n });\n newValues = _.reject(parsedValues, function(x) {\n return x === taiga.toString(value);\n });\n newValues = _.compact(newValues);\n if (_.isEmpty(newValues)) {\n value = null;\n } else {\n value = joinStr(\",\", _.uniq(newValues));\n }\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n };\n\n FiltersMixin.prototype.applyStoredFilters = function(projectSlug, key) {\n var filters;\n if (_.isEmpty(this.location.search())) {\n filters = this.getFilters(projectSlug, key);\n if (Object.keys(filters).length) {\n this.location.search(filters);\n this.location.replace();\n return true;\n }\n }\n return false;\n };\n\n FiltersMixin.prototype.storeFilters = function(projectSlug, params, filtersHashSuffix) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = taiga.generateHash([projectSlug, ns]);\n return this.storage.set(hash, params);\n };\n\n FiltersMixin.prototype.getFilters = function(projectSlug, filtersHashSuffix) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = taiga.generateHash([projectSlug, ns]);\n return this.storage.get(hash) || {};\n };\n\n FiltersMixin.prototype.formatSelectedFilters = function(type, list, urlIds) {\n var invalidAppliedTags, invalidTags, selectedFilters, selectedIds, validAppliedTags;\n selectedIds = urlIds.split(',');\n selectedFilters = _.filter(list, function(it) {\n return selectedIds.indexOf(_.toString(it.id)) !== -1;\n });\n invalidTags = _.filter(selectedIds, function(it) {\n return !_.find(selectedFilters, function(sit) {\n return _.toString(sit.id) === it;\n });\n });\n invalidAppliedTags = _.map(invalidTags, function(it) {\n return {\n id: it,\n key: type + \":\" + it,\n dataType: type,\n name: it\n };\n });\n validAppliedTags = _.map(selectedFilters, function(it) {\n return {\n id: it.id,\n key: type + \":\" + it.id,\n dataType: type,\n name: it.name,\n color: it.color\n };\n });\n return invalidAppliedTags.concat(validAppliedTags);\n };\n\n return FiltersMixin;\n\n })();\n\n taiga.FiltersMixin = FiltersMixin;\n\n UsFiltersMixin = (function() {\n function UsFiltersMixin() {}\n\n UsFiltersMixin.prototype.changeQ = function(q) {\n this.replaceFilter(\"q\", q);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.removeFilter = function(filter) {\n this.unselectFilter(filter.dataType, filter.id);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.addFilter = function(newFilter) {\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.selectCustomFilter = function(customFilter) {\n this.replaceAllFilters(customFilter.filter);\n this.filtersReloadContent();\n return this.generateFilters();\n };\n\n UsFiltersMixin.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.epic = urlfilters.epic;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName).then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.storeCustomFiltersName).then(_this.generateFilters);\n };\n })(this));\n };\n\n UsFiltersMixin.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName).then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.storeCustomFiltersName).then(_this.generateFilters);\n return _this.generateFilters();\n };\n })(this));\n };\n\n UsFiltersMixin.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, i, len, ref;\n ref = this.selectedFilters;\n for (i = 0, len = ref.length; i < len; i++) {\n filter = ref[i];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n UsFiltersMixin.prototype.generateFilters = function(milestone) {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), this.storeFiltersName);\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.epic = urlfilters.epic;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n if (milestone) {\n loadFilters.milestone = milestone;\n }\n return this.q.all([this.rs.userstories.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, this.storeCustomFiltersName)]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, epic, owner, role, selected, statuses, tags, tagsWithAtLeastOneElement;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n epic = _.map(data.epics, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n it.name = \"#\" + it.ref + \" \" + it.subject;\n } else {\n it.id = \"null\";\n it.name = \"Not in an epic\";\n }\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.epic) {\n selected = _this.formatSelectedFilters(\"epic\", epic, loadFilters.epic);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.EPIC\"),\n dataType: \"epic\",\n content: epic\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(this));\n };\n\n return UsFiltersMixin;\n\n })();\n\n taiga.UsFiltersMixin = UsFiltersMixin;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaAdmin\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/auth.coffee\n */\n\n(function() {\n var AuthService, CancelAccountDirective, ChangeEmailDirective, ChangePasswordFromRecoveryDirective, ForgotPasswordDirective, InvitationDirective, LoginDirective, LoginPage, PublicRegisterMessageDirective, RegisterDirective, debounce, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAuth\", [\"taigaResources\"]);\n\n LoginPage = (function() {\n LoginPage.$inject = ['tgCurrentUserService', '$location', '$tgNavUrls', '$routeParams', '$tgAuth'];\n\n function LoginPage(currentUserService, $location, $navUrls, $routeParams, $auth) {\n var url;\n if (currentUserService.isAuthenticated()) {\n if (!$routeParams['force_login']) {\n url = $navUrls.resolve(\"home\");\n if ($routeParams['next']) {\n url = decodeURIComponent($routeParams['next']);\n $location.search('next', null);\n }\n if ($routeParams['unauthorized']) {\n $auth.clear();\n $auth.removeToken();\n } else {\n $location.url(url);\n }\n }\n }\n }\n\n return LoginPage;\n\n })();\n\n module.controller('LoginPage', LoginPage);\n\n AuthService = (function(superClass) {\n extend(AuthService, superClass);\n\n AuthService.$inject = [\"$rootScope\", \"$tgStorage\", \"$tgModel\", \"$tgResources\", \"$tgHttp\", \"$tgUrls\", \"$tgConfig\", \"$translate\", \"tgCurrentUserService\", \"tgThemeService\", \"$tgAnalytics\", \"tgTermsAnnouncementService\"];\n\n function AuthService(rootscope, storage, model, rs, http, urls, config1, translate, currentUserService1, themeService, analytics, termsAnnouncementService) {\n var userModel;\n this.rootscope = rootscope;\n this.storage = storage;\n this.model = model;\n this.rs = rs;\n this.http = http;\n this.urls = urls;\n this.config = config1;\n this.translate = translate;\n this.currentUserService = currentUserService1;\n this.themeService = themeService;\n this.analytics = analytics;\n this.termsAnnouncementService = termsAnnouncementService;\n AuthService.__super__.constructor.call(this);\n userModel = this.getUser();\n this._currentTheme = this._getUserTheme();\n this.setUserdata(userModel);\n }\n\n AuthService.prototype.setUserdata = function(userModel) {\n if (userModel) {\n this.userData = Immutable.fromJS(userModel.getAttrs());\n this.currentUserService.setUser(this.userData);\n } else {\n this.userData = null;\n }\n return this.analytics.setUserId();\n };\n\n AuthService.prototype._getUserTheme = function() {\n var ref;\n return ((ref = this.rootscope.user) != null ? ref.theme : void 0) || this.config.get(\"defaultTheme\") || \"taiga\";\n };\n\n AuthService.prototype._setTheme = function() {\n var newTheme;\n newTheme = this._getUserTheme();\n if (this._currentTheme !== newTheme) {\n this._currentTheme = newTheme;\n return this.themeService.use(this._currentTheme);\n }\n };\n\n AuthService.prototype._setLocales = function() {\n var lang, ref;\n lang = ((ref = this.rootscope.user) != null ? ref.lang : void 0) || this.config.get(\"defaultLanguage\") || \"en\";\n this.translate.preferredLanguage(lang);\n return this.translate.use(lang);\n };\n\n AuthService.prototype.getUser = function() {\n var user, userData;\n if (this.rootscope.user) {\n return this.rootscope.user;\n }\n userData = this.storage.get(\"userInfo\");\n if (userData) {\n user = this.model.make_model(\"users\", userData);\n this.rootscope.user = user;\n this._setLocales();\n this._setTheme();\n return user;\n } else {\n this._setTheme();\n }\n return null;\n };\n\n AuthService.prototype.setUser = function(user) {\n this.rootscope.auth = user;\n this.storage.set(\"userInfo\", user.getAttrs());\n this.rootscope.user = user;\n this.setUserdata(user);\n this._setLocales();\n return this._setTheme();\n };\n\n AuthService.prototype.clear = function() {\n this.rootscope.auth = null;\n this.rootscope.user = null;\n return this.storage.remove(\"userInfo\");\n };\n\n AuthService.prototype.setToken = function(token) {\n return this.storage.set(\"token\", token);\n };\n\n AuthService.prototype.getToken = function() {\n return this.storage.get(\"token\");\n };\n\n AuthService.prototype.removeToken = function() {\n return this.storage.remove(\"token\");\n };\n\n AuthService.prototype.isAuthenticated = function() {\n if (this.getUser() !== null) {\n return true;\n }\n return false;\n };\n\n AuthService.prototype.refresh = function() {\n var url;\n url = this.urls.resolve(\"user-me\");\n return this.http.get(url).then((function(_this) {\n return function(data, status) {\n var user;\n user = data.data;\n user.token = _this.getUser().auth_token;\n user = _this.model.make_model(\"users\", user);\n _this.setUser(user);\n _this.rootscope.$broadcast(\"auth:refresh\", user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.login = function(data, type) {\n var url;\n url = this.urls.resolve(\"auth\");\n data = _.clone(data, false);\n data.type = type ? type : \"normal\";\n this.removeToken();\n return this.http.post(url, data).then((function(_this) {\n return function(data, status) {\n var user;\n user = _this.model.make_model(\"users\", data.data);\n _this.setToken(user.auth_token);\n _this.setUser(user);\n _this.rootscope.$broadcast(\"auth:login\", user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.logout = function() {\n this.removeToken();\n this.clear();\n this.currentUserService.removeUser();\n this._setTheme();\n this._setLocales();\n this.rootscope.$broadcast(\"auth:logout\");\n return this.analytics.setUserId();\n };\n\n AuthService.prototype.register = function(data, type, existing) {\n var url;\n url = this.urls.resolve(\"auth-register\");\n data = _.clone(data, false);\n data.type = type ? type : \"public\";\n if (type === \"private\") {\n data.existing = existing ? existing : false;\n }\n this.removeToken();\n return this.http.post(url, data).then((function(_this) {\n return function(response) {\n var user;\n user = _this.model.make_model(\"users\", response.data);\n _this.setToken(user.auth_token);\n _this.setUser(user);\n _this.rootscope.$broadcast(\"auth:register\", user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.getInvitation = function(token) {\n return this.rs.invitations.get(token);\n };\n\n AuthService.prototype.acceptInvitiationWithNewUser = function(data) {\n return this.register(data, \"private\", false);\n };\n\n AuthService.prototype.forgotPassword = function(data) {\n var url;\n url = this.urls.resolve(\"users-password-recovery\");\n data = _.clone(data, false);\n this.removeToken();\n return this.http.post(url, data);\n };\n\n AuthService.prototype.changePasswordFromRecovery = function(data) {\n var url;\n url = this.urls.resolve(\"users-change-password-from-recovery\");\n data = _.clone(data, false);\n this.removeToken();\n return this.http.post(url, data);\n };\n\n AuthService.prototype.changeEmail = function(data) {\n var url;\n url = this.urls.resolve(\"users-change-email\");\n data = _.clone(data, false);\n return this.http.post(url, data);\n };\n\n AuthService.prototype.cancelAccount = function(data) {\n var url;\n url = this.urls.resolve(\"users-cancel-account\");\n data = _.clone(data, false);\n return this.http.post(url, data);\n };\n\n AuthService.prototype.exportProfile = function() {\n var url;\n url = this.urls.resolve(\"users-export\");\n return this.http.post(url);\n };\n\n AuthService.prototype.showTerms = function(data) {\n var user;\n user = this.getUser();\n if (!user || user.read_new_terms) {\n return;\n }\n return this.termsAnnouncementService.show();\n };\n\n return AuthService;\n\n })(taiga.Service);\n\n module.service(\"$tgAuth\", AuthService);\n\n PublicRegisterMessageDirective = function($config, $navUrls, $routeParams, templates) {\n var template, templateFn;\n template = templates.get(\"auth/login-text.html\", true);\n templateFn = function() {\n var nextUrl, publicRegisterEnabled, url;\n publicRegisterEnabled = $config.get(\"publicRegisterEnabled\");\n if (!publicRegisterEnabled) {\n return \"\";\n }\n url = $navUrls.resolve(\"register\");\n if ($routeParams['force_next']) {\n nextUrl = encodeURIComponent($routeParams['force_next']);\n url += \"?next=\" + nextUrl;\n }\n return template({\n url: url\n });\n };\n return {\n restrict: \"AE\",\n scope: {},\n template: templateFn\n };\n };\n\n module.directive(\"tgPublicRegisterMessage\", [\"$tgConfig\", \"$tgNavUrls\", \"$routeParams\", \"$tgTemplate\", PublicRegisterMessageDirective]);\n\n LoginDirective = function($auth, $confirm, $location, $config, $routeParams, $navUrls, $events, $translate, $window, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onError, onSuccess, submit;\n form = new checksley.Form($el.find(\"form.login-form\"));\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"login\")) {\n $scope.nextUrl = decodeURIComponent($routeParams['next']);\n } else {\n $scope.nextUrl = $navUrls.resolve(\"home\");\n }\n if ($routeParams['force_next']) {\n $scope.nextUrl = decodeURIComponent($routeParams['force_next']);\n }\n onSuccess = function(response) {\n $events.setupConnection();\n $analytics.trackEvent(\"auth\", \"login\", \"user login\", 1);\n $auth.showTerms();\n if ($scope.nextUrl.indexOf('http') === 0) {\n return $window.location.href = $scope.nextUrl;\n } else {\n return $location.url($scope.nextUrl);\n }\n };\n onError = function(response) {\n return $confirm.notify(\"light-error\", $translate.instant(\"LOGIN_FORM.ERROR_AUTH_INCORRECT\"));\n };\n $scope.onKeyUp = function(event) {\n var target, value;\n target = angular.element(event.currentTarget);\n value = target.val();\n $scope.iscapsLockActivated = false;\n if (value !== value.toLowerCase()) {\n return $scope.iscapsLockActivated = true;\n }\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var data, loginFormType, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n data = {\n \"username\": $el.find(\"form.login-form input[name=username]\").val(),\n \"password\": $el.find(\"form.login-form input[name=password]\").val()\n };\n loginFormType = $config.get(\"loginFormType\", \"normal\");\n promise = $auth.login(data, loginFormType);\n return promise.then(onSuccess, onError);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n window.prerenderReady = true;\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLogin\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgConfig\", \"$routeParams\", \"$tgNavUrls\", \"$tgEvents\", \"$translate\", \"$window\", \"$tgAnalytics\", LoginDirective]);\n\n RegisterDirective = function($auth, $confirm, $location, $navUrls, $config, $routeParams, $analytics, $translate, $window) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n if (!$config.get(\"publicRegisterEnabled\")) {\n $location.path($navUrls.resolve(\"not-found\"));\n $location.replace();\n }\n $scope.data = {};\n form = $el.find(\"form\").checksley({\n onlyOneErrorElement: true\n });\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"login\")) {\n $scope.nextUrl = decodeURIComponent($routeParams['next']);\n } else {\n $scope.nextUrl = $navUrls.resolve(\"home\");\n }\n onSuccessSubmit = function(response) {\n $analytics.trackEvent(\"auth\", \"register\", \"user registration\", 1);\n if ($scope.nextUrl.indexOf('http') === 0) {\n return $window.location.href = $scope.nextUrl;\n } else {\n return $location.url($scope.nextUrl);\n }\n };\n onErrorSubmit = function(response) {\n var text;\n if (response.data._error_message) {\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n $confirm.notify(\"light-error\", text);\n }\n return form.setErrors(response.data);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.register($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return window.prerenderReady = true;\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRegister\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfig\", \"$routeParams\", \"$tgAnalytics\", \"$translate\", \"$window\", RegisterDirective]);\n\n ForgotPasswordDirective = function($auth, $confirm, $location, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var message, title;\n $location.path($navUrls.resolve(\"login\"));\n title = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS_TITLE\");\n message = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS_TEXT\");\n return $confirm.success(title, message);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.ERROR\");\n return $confirm.notify(\"light-error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.forgotPassword($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return window.prerenderReady = true;\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgForgotPassword\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$translate\", ForgotPasswordDirective]);\n\n ChangePasswordFromRecoveryDirective = function($auth, $confirm, $location, $params, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit, text;\n $scope.data = {};\n if ($params.token != null) {\n $scope.tokenInParams = true;\n $scope.data.token = $params.token;\n } else {\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\");\n $confirm.notify(\"light-error\", text);\n }\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\");\n return $confirm.notify(\"light-error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.changePasswordFromRecovery($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgChangePasswordFromRecovery\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangePasswordFromRecoveryDirective]);\n\n InvitationDirective = function($auth, $confirm, $location, $config, $params, $navUrls, $analytics, $translate, config) {\n var link;\n link = function($scope, $el, $attrs) {\n var loginForm, onErrorSubmitLogin, onErrorSubmitRegister, onSuccessSubmitLogin, onSuccessSubmitRegister, promise, registerForm, submitLogin, submitRegister, token;\n token = $params.token;\n promise = $auth.getInvitation(token);\n promise.then(function(invitation) {\n $scope.invitation = invitation;\n return $scope.publicRegisterEnabled = config.get(\"publicRegisterEnabled\");\n });\n promise.then(null, function(response) {\n var text;\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"INVITATION_LOGIN_FORM.NOT_FOUND\");\n return $confirm.notify(\"light-error\", text);\n });\n $scope.dataLogin = {\n token: token\n };\n loginForm = $el.find(\"form.login-form\").checksley({\n onlyOneErrorElement: true\n });\n onSuccessSubmitLogin = function(response) {\n var text;\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with existing user\", 1);\n $location.path($navUrls.resolve(\"project\", {\n project: $scope.invitation.project_slug\n }));\n text = $translate.instant(\"INVITATION_LOGIN_FORM.SUCCESS\", {\n \"project_name\": $scope.invitation.project_name\n });\n return $confirm.notify(\"success\", text);\n };\n onErrorSubmitLogin = function(response) {\n return $confirm.notify(\"light-error\", response.data._error_message);\n };\n submitLogin = debounce(2000, (function(_this) {\n return function(event) {\n var data, loginFormType;\n event.preventDefault();\n if (!loginForm.validate()) {\n return;\n }\n loginFormType = $config.get(\"loginFormType\", \"normal\");\n data = $scope.dataLogin;\n promise = $auth.login({\n username: data.username,\n password: data.password,\n invitation_token: data.token\n }, loginFormType);\n return promise.then(onSuccessSubmitLogin, onErrorSubmitLogin);\n };\n })(this));\n $el.on(\"submit\", \"form.login-form\", submitLogin);\n $el.on(\"click\", \".button-login\", submitLogin);\n $scope.dataRegister = {\n token: token\n };\n registerForm = $el.find(\"form.register-form\").checksley({\n onlyOneErrorElement: true\n });\n onSuccessSubmitRegister = function(response) {\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with new user\", 1);\n $location.path($navUrls.resolve(\"project\", {\n project: $scope.invitation.project_slug\n }));\n return $confirm.notify(\"success\", \"You've successfully joined this project\", \"Welcome to \" + (_.escape($scope.invitation.project_name)));\n };\n onErrorSubmitRegister = function(response) {\n var text;\n if (response.data._error_message) {\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n $confirm.notify(\"light-error\", text);\n }\n return registerForm.setErrors(response.data);\n };\n submitRegister = debounce(2000, (function(_this) {\n return function(event) {\n event.preventDefault();\n if (!registerForm.validate()) {\n return;\n }\n promise = $auth.acceptInvitiationWithNewUser($scope.dataRegister);\n return promise.then(onSuccessSubmitRegister, onErrorSubmitRegister);\n };\n })(this));\n $el.on(\"submit\", \"form.register-form\", submitRegister);\n $el.on(\"click\", \".button-register\", submitRegister);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgInvitation\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgConfig\", \"$routeParams\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"$tgConfig\", InvitationDirective]);\n\n ChangeEmailDirective = function($repo, $model, $auth, $confirm, $location, $params, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n $scope.data.email_token = $params.email_token;\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n if ($auth.isAuthenticated()) {\n $repo.queryOne(\"users\", $auth.getUser().id).then((function(_this) {\n return function(data) {\n $auth.setUser(data);\n $location.path($navUrls.resolve(\"home\"));\n return $location.replace();\n };\n })(this));\n } else {\n $location.path($navUrls.resolve(\"login\"));\n $location.replace();\n }\n text = $translate.instant(\"CHANGE_EMAIL_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n return $confirm.notify(\"light-error\", text);\n };\n submit = function() {\n var promise;\n if (!form.validate()) {\n return;\n }\n promise = $auth.changeEmail($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n $el.on(\"submit\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \"a.button-change-email\", function(event) {\n event.preventDefault();\n return submit();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgChangeEmail\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangeEmailDirective]);\n\n CancelAccountDirective = function($repo, $model, $auth, $confirm, $location, $params, $navUrls) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n $scope.data.cancel_token = $params.cancel_token;\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n $auth.logout();\n $location.path($navUrls.resolve(\"home\"));\n text = $translate.instant(\"CANCEL_ACCOUNT.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n return $confirm.notify(\"error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.cancelAccount($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCancelAccount\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", CancelAccountDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaBacklog\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base.coffee\n */\n\n(function() {\n var TaigaMainDirective, bindOnce, groupBy, init, module, taiga, urls;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBase\", []);\n\n TaigaMainDirective = function($rootscope, $window) {\n var link;\n link = function($scope, $el, $attrs) {\n return $window.onresize = function() {\n return $rootscope.$broadcast(\"resize\");\n };\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMain\", [\"$rootScope\", \"$window\", TaigaMainDirective]);\n\n urls = {\n \"home\": \"/\",\n \"projects\": \"/projects\",\n \"error\": \"/error\",\n \"not-found\": \"/not-found\",\n \"permission-denied\": \"/permission-denied\",\n \"discover\": \"/discover\",\n \"discover-search\": \"/discover/search\",\n \"login\": \"/login\",\n \"forgot-password\": \"/forgot-password\",\n \"change-password\": \"/change-password/:token\",\n \"change-email\": \"/change-email/:token\",\n \"cancel-account\": \"/cancel-account/:token\",\n \"register\": \"/register\",\n \"invitation\": \"/invitation/:token\",\n \"create-project\": \"/project/new\",\n \"create-project-scrum\": \"/project/new/scrum\",\n \"create-project-kanban\": \"/project/new/kanban\",\n \"create-project-duplicate\": \"/project/new/duplicate\",\n \"create-project-import\": \"/project/new/import\",\n \"create-project-import-platform\": \"/project/new/import/:platform\",\n \"profile\": \"/profile\",\n \"user-profile\": \"/profile/:username\",\n \"blocked-project\": \"/blocked-project/:project\",\n \"project\": \"/project/:project\",\n \"project-detail-ref\": \"/project/:project/t/:ref\",\n \"project-backlog\": \"/project/:project/backlog\",\n \"project-taskboard\": \"/project/:project/taskboard/:sprint\",\n \"project-kanban\": \"/project/:project/kanban\",\n \"project-issues\": \"/project/:project/issues\",\n \"project-epics\": \"/project/:project/epics\",\n \"project-search\": \"/project/:project/search\",\n \"project-epics-detail\": \"/project/:project/epic/:ref\",\n \"project-userstories-detail\": \"/project/:project/us/:ref\",\n \"project-tasks-detail\": \"/project/:project/task/:ref\",\n \"project-issues-detail\": \"/project/:project/issue/:ref\",\n \"project-wiki\": \"/project/:project/wiki\",\n \"project-wiki-list\": \"/project/:project/wiki-list\",\n \"project-wiki-page\": \"/project/:project/wiki/:slug\",\n \"project-team\": \"/project/:project/team\",\n \"project-admin-home\": \"/project/:project/admin/project-profile/details\",\n \"project-admin-project-profile-details\": \"/project/:project/admin/project-profile/details\",\n \"project-admin-project-profile-default-values\": \"/project/:project/admin/project-profile/default-values\",\n \"project-admin-project-profile-modules\": \"/project/:project/admin/project-profile/modules\",\n \"project-admin-project-profile-export\": \"/project/:project/admin/project-profile/export\",\n \"project-admin-project-profile-reports\": \"/project/:project/admin/project-profile/reports\",\n \"project-admin-project-values-status\": \"/project/:project/admin/project-values/status\",\n \"project-admin-project-values-points\": \"/project/:project/admin/project-values/points\",\n \"project-admin-project-values-priorities\": \"/project/:project/admin/project-values/priorities\",\n \"project-admin-project-values-severities\": \"/project/:project/admin/project-values/severities\",\n \"project-admin-project-values-types\": \"/project/:project/admin/project-values/types\",\n \"project-admin-project-values-custom-fields\": \"/project/:project/admin/project-values/custom-fields\",\n \"project-admin-project-values-tags\": \"/project/:project/admin/project-values/tags\",\n \"project-admin-memberships\": \"/project/:project/admin/memberships\",\n \"project-admin-roles\": \"/project/:project/admin/roles\",\n \"project-admin-third-parties-webhooks\": \"/project/:project/admin/third-parties/webhooks\",\n \"project-admin-third-parties-github\": \"/project/:project/admin/third-parties/github\",\n \"project-admin-third-parties-gitlab\": \"/project/:project/admin/third-parties/gitlab\",\n \"project-admin-third-parties-bitbucket\": \"/project/:project/admin/third-parties/bitbucket\",\n \"project-admin-third-parties-gogs\": \"/project/:project/admin/third-parties/gogs\",\n \"project-admin-contrib\": \"/project/:project/admin/contrib/:plugin\",\n \"user-settings-user-profile\": \"/user-settings/user-profile\",\n \"user-settings-user-change-password\": \"/user-settings/user-change-password\",\n \"user-settings-user-avatar\": \"/user-settings/user-avatar\",\n \"user-settings-mail-notifications\": \"/user-settings/mail-notifications\",\n \"user-settings-live-notifications\": \"/user-settings/live-notifications\",\n \"user-settings-contrib\": \"/user-settings/contrib/:plugin\"\n };\n\n init = function($log, $navurls) {\n $log.debug(\"Initialize navigation urls\");\n return $navurls.update(urls);\n };\n\n module.run([\"$log\", \"$tgNavUrls\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common.coffee\n */\n\n(function() {\n var AnimationFrame, Autofocus, Capslock, CheckPermissionDirective, ClassPermissionDirective, CtrlClickDisable, DataPickerConfig, LightboxClose, ProjectUrl, Qqueue, QueueModelTransformation, SelectedText, Svg, Template, ToggleCommentDirective, module, taiga,\n slice = [].slice,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\", []);\n\n DataPickerConfig = function($translate, $config, $auth) {\n return {\n get: function() {\n var isRTL, lang, rtlLanguages, user;\n user = $auth.getUser();\n lang = user.lang || $translate.preferredLanguage();\n rtlLanguages = $config.get(\"rtlLanguages\", []);\n isRTL = rtlLanguages.indexOf(lang) > -1;\n return {\n i18n: {\n previousMonth: $translate.instant(\"COMMON.PICKERDATE.PREV_MONTH\"),\n nextMonth: $translate.instant(\"COMMON.PICKERDATE.NEXT_MONTH\"),\n months: [$translate.instant(\"COMMON.PICKERDATE.MONTHS.JAN\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.FEB\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAR\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.APR\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAY\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUN\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUL\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.AUG\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.SEP\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.OCT\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.NOV\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.DEC\")],\n weekdays: [$translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SUN\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.MON\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.TUE\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.WED\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.THU\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.FRI\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SAT\")],\n weekdaysShort: [$translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT\")]\n },\n isRTL: isRTL,\n firstDay: parseInt($translate.instant(\"COMMON.PICKERDATE.FIRST_DAY_OF_WEEK\"), 10),\n format: $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n };\n }\n };\n };\n\n module.factory(\"tgDatePickerConfigService\", [\"$translate\", \"$tgConfig\", \"$tgAuth\", DataPickerConfig]);\n\n SelectedText = function($window, $document) {\n var get;\n get = function() {\n if ($window.getSelection) {\n return $window.getSelection().toString();\n } else if ($document.selection) {\n return $document.selection.createRange().text;\n }\n return \"\";\n };\n return {\n get: get\n };\n };\n\n module.factory(\"$selectedText\", [\"$window\", \"$document\", SelectedText]);\n\n CheckPermissionDirective = function(projectService) {\n var link, render;\n render = function($el, project, permission) {\n if (project && permission) {\n if (project.get('my_permissions').indexOf(permission) > -1) {\n return $el.removeClass('hidden');\n }\n }\n };\n link = function($scope, $el, $attrs) {\n var permission, unObserve, unwatch;\n $el.addClass('hidden');\n permission = $attrs.tgCheckPermission;\n unwatch = $scope.$watch(function() {\n return projectService.project;\n }, function() {\n if (!projectService.project) {\n return;\n }\n render($el, projectService.project, permission);\n return unwatch();\n });\n unObserve = $attrs.$observe(\"tgCheckPermission\", function(permission) {\n if (!permission) {\n return;\n }\n render($el, projectService.project, permission);\n return unObserve();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CheckPermissionDirective.$inject = [\"tgProjectService\"];\n\n module.directive(\"tgCheckPermission\", CheckPermissionDirective);\n\n ClassPermissionDirective = function() {\n var link, name;\n name = \"tgClassPermission\";\n link = function($scope, $el, $attrs) {\n var checkPermissions, tgClassPermissionWatchAction, unbindWatcher;\n checkPermissions = function(project, className, permission) {\n var negation;\n negation = permission[0] === \"!\";\n if (negation) {\n permission = permission.slice(1);\n }\n if (negation && project.my_permissions.indexOf(permission) === -1) {\n return $el.addClass(className);\n } else if (!negation && project.my_permissions.indexOf(permission) !== -1) {\n return $el.addClass(className);\n } else {\n return $el.removeClass(className);\n }\n };\n tgClassPermissionWatchAction = function(project) {\n var className, classes, permission, results;\n if (project) {\n unbindWatcher();\n classes = $scope.$eval($attrs[name]);\n results = [];\n for (className in classes) {\n permission = classes[className];\n results.push(checkPermissions(project, className, permission));\n }\n return results;\n }\n };\n return unbindWatcher = $scope.$watch(\"project\", tgClassPermissionWatchAction);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgClassPermission\", ClassPermissionDirective);\n\n AnimationFrame = function() {\n var add, animationFrame, performAnimation, tail;\n animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n performAnimation = (function(_this) {\n return function(time) {\n var fn;\n fn = tail.shift();\n fn();\n if (tail.length) {\n return animationFrame(performAnimation);\n }\n };\n })(this);\n tail = [];\n add = function() {\n var fn, i, len, results;\n results = [];\n for (i = 0, len = arguments.length; i < len; i++) {\n fn = arguments[i];\n tail.push(fn);\n if (tail.length === 1) {\n results.push(animationFrame(performAnimation));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n return {\n add: add\n };\n };\n\n module.factory(\"animationFrame\", AnimationFrame);\n\n ToggleCommentDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.find(\"textarea\").on(\"focus\", function() {\n return $el.addClass(\"active\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgToggleComment\", ToggleCommentDirective);\n\n ProjectUrl = function($navurls) {\n var get;\n get = function(project) {\n var ctx;\n if (project.toJS) {\n project = project.toJS();\n }\n ctx = {\n project: project.slug\n };\n if (project.is_backlog_activated && project.my_permissions.indexOf(\"view_us\") > -1) {\n return $navurls.resolve(\"project-backlog\", ctx);\n }\n if (project.is_kanban_activated && project.my_permissions.indexOf(\"view_us\") > -1) {\n return $navurls.resolve(\"project-kanban\", ctx);\n }\n if (project.is_wiki_activated && project.my_permissions.indexOf(\"view_wiki_pages\") > -1) {\n return $navurls.resolve(\"project-wiki\", ctx);\n }\n if (project.is_issues_activated && project.my_permissions.indexOf(\"view_issues\") > -1) {\n return $navurls.resolve(\"project-issues\", ctx);\n }\n return $navurls.resolve(\"project\", ctx);\n };\n return {\n get: get\n };\n };\n\n module.factory(\"$projectUrl\", [\"$tgNavUrls\", ProjectUrl]);\n\n Qqueue = function($q) {\n var deferred, lastPromise, qqueue;\n deferred = $q.defer();\n deferred.resolve();\n lastPromise = deferred.promise;\n qqueue = {\n bindAdd: (function(_this) {\n return function(fn) {\n return function() {\n var args;\n args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n return lastPromise = lastPromise.then(function() {\n return fn.apply(_this, args);\n });\n };\n };\n })(this),\n add: (function(_this) {\n return function(fn) {\n if (!lastPromise) {\n lastPromise = fn();\n } else {\n lastPromise = lastPromise.then(fn);\n }\n return qqueue;\n };\n })(this)\n };\n return qqueue;\n };\n\n module.factory(\"$tgQqueue\", [\"$q\", Qqueue]);\n\n QueueModelTransformation = (function(superClass) {\n extend(QueueModelTransformation, superClass);\n\n QueueModelTransformation.$inject = [\"$tgQqueue\", \"$tgRepo\", \"$q\", \"$tgModel\"];\n\n function QueueModelTransformation(qqueue1, repo, q, model1) {\n this.qqueue = qqueue1;\n this.repo = repo;\n this.q = q;\n this.model = model1;\n }\n\n QueueModelTransformation.prototype.setObject = function(scope1, prop) {\n this.scope = scope1;\n this.prop = prop;\n };\n\n QueueModelTransformation.prototype.clone = function() {\n var attrs, model;\n attrs = _.cloneDeep(this.scope[this.prop]._attrs);\n model = this.model.make_model(this.scope[this.prop]._name, attrs);\n return model;\n };\n\n QueueModelTransformation.prototype.getObj = function() {\n return this.scope[this.prop];\n };\n\n QueueModelTransformation.prototype.save = function(transformation) {\n var defered;\n defered = this.q.defer();\n this.qqueue.add((function(_this) {\n return function() {\n var clone, comment, modified, obj, success;\n obj = _this.getObj();\n comment = obj.comment;\n obj.comment = '';\n clone = _this.clone();\n modified = _.omit(obj._modifiedAttrs, ['version']);\n clone = _.assign(clone, modified);\n transformation(clone);\n if (comment.length) {\n clone.comment = comment;\n }\n success = function() {\n _this.scope[_this.prop] = clone;\n return defered.resolve.apply(null, arguments);\n };\n return _this.repo.save(clone).then(success, defered.reject);\n };\n })(this));\n return defered.promise;\n };\n\n return QueueModelTransformation;\n\n })(taiga.Service);\n\n module.service(\"$tgQueueModelTransformation\", QueueModelTransformation);\n\n Template = function($templateCache) {\n return {\n get: (function(_this) {\n return function(name, lodash) {\n var tmp;\n if (lodash == null) {\n lodash = false;\n }\n tmp = $templateCache.get(name);\n if (lodash) {\n tmp = _.template(tmp);\n }\n return tmp;\n };\n })(this)\n };\n };\n\n module.factory(\"$tgTemplate\", [\"$templateCache\", Template]);\n\n Capslock = function() {\n var template;\n template = \"\";\n return {\n template: template\n };\n };\n\n module.directive(\"tgCapslock\", [Capslock]);\n\n LightboxClose = function() {\n var link, template;\n template = \"
    \\n \\n\";\n link = function(scope, elm, attrs) {};\n return {\n scope: {\n onClose: '&'\n },\n link: link,\n template: template\n };\n };\n\n module.directive(\"tgLightboxClose\", [LightboxClose]);\n\n Svg = function() {\n var template;\n template = \"\\n \\n {{svgTitle}}\\n {{svgTitleTranslate | translate: svgTitleTranslateValues}}\\n \\n\";\n return {\n scope: {\n svgIcon: \"@\",\n svgTitle: \"@\",\n svgTitleTranslate: \"@\",\n svgTitleTranslateValues: \"=\"\n },\n template: template\n };\n };\n\n module.directive(\"tgSvg\", [Svg]);\n\n Autofocus = function($timeout, $parse, animationFrame) {\n return {\n restrict: 'A',\n link: function($scope, $element, attrs) {\n var model;\n if (attrs.ngShow) {\n model = $parse(attrs.ngShow);\n return $scope.$watch(model, function(value) {\n if (value === true) {\n return $timeout(function() {\n return $element[0].focus();\n });\n }\n });\n } else {\n return $timeout(function() {\n return $element[0].focus();\n });\n }\n }\n };\n };\n\n module.directive('tgAutofocus', ['$timeout', '$parse', \"animationFrame\", Autofocus]);\n\n module.directive('tgPreloadImage', function() {\n var preload, spinner, template;\n spinner = \"loading...\";\n template = \"
    \\n \\n
    \";\n preload = function(src, onLoad) {\n var image;\n image = new Image();\n image.onload = onLoad;\n image.src = src;\n return image;\n };\n return {\n template: template,\n transclude: true,\n replace: true,\n link: function(scope, el, attrs) {\n var image, onLoad, timeout;\n image = el.find('img:last');\n timeout = null;\n onLoad = function() {\n el.find('.loading-spinner').remove();\n image.show();\n if (timeout) {\n clearTimeout(timeout);\n return timeout = null;\n }\n };\n return attrs.$observe('preloadSrc', function(src) {\n if (timeout) {\n clearTimeout(timeout);\n }\n el.find('.loading-spinner').remove();\n timeout = setTimeout(function() {\n return el.prepend(spinner);\n }, 200);\n image.hide();\n return preload(src, onLoad);\n });\n }\n };\n });\n\n CtrlClickDisable = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", function($event) {\n if ($event.ctrlKey || $event.metaKey) {\n return $event.preventDefault();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCtrlClickDisable\", CtrlClickDisable);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/detail.coffee\n */\n\n(function() {\n var DetailController, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaCommon\");\n\n DetailController = (function() {\n DetailController.$inject = ['$routeParams', '$tgRepo', \"tgProjectService\", \"$tgNavUrls\", \"$location\"];\n\n function DetailController(params, repo, projectService, navurls, location) {\n this.params = params;\n this.repo = repo;\n this.projectService = projectService;\n this.navurls = navurls;\n this.location = location;\n this.repo.resolve({\n pslug: this.params.pslug,\n ref: this.params.ref\n }).then((function(_this) {\n return function(result) {\n var url;\n if (result.issue) {\n url = _this.navurls.resolve('project-issues-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.task) {\n url = _this.navurls.resolve('project-tasks-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.us) {\n url = _this.navurls.resolve('project-userstories-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.epic) {\n url = _this.navurls.resolve('project-epics-detail', {\n project: _this.projectService.project.get('slug'),\n ref: _this.params.ref\n });\n } else if (result.wikipage) {\n url = _this.navurls.resolve('project-wiki-page', {\n project: _this.projectService.project.get('slug'),\n slug: _this.params.ref\n });\n }\n return _this.location.path(url);\n };\n })(this));\n }\n\n return DetailController;\n\n })();\n\n module.controller(\"DetailController\", DetailController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/epics.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaEpics\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/events.coffee\n */\n\n(function() {\n var EventsProvider, EventsService, bindMethods, module, startswith, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n startswith = this.taiga.startswith;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaEvents\", []);\n\n EventsService = (function() {\n function EventsService(win, log, config, auth, liveAnnouncementService1, rootScope) {\n this.win = win;\n this.log = log;\n this.config = config;\n this.auth = auth;\n this.liveAnnouncementService = liveAnnouncementService1;\n this.rootScope = rootScope;\n this.processMessage = bind(this.processMessage, this);\n bindMethods(this);\n }\n\n EventsService.prototype.initialize = function(sessionId) {\n this.sessionId = sessionId;\n this.subscriptions = {};\n this.connected = false;\n this.error = false;\n this.pendingMessages = [];\n this.missedHeartbeats = 0;\n this.heartbeatInterval = null;\n if (this.win.WebSocket === void 0) {\n return this.log.info(\"WebSockets not supported on your browser\");\n }\n };\n\n EventsService.prototype.setupConnection = function() {\n var loc, path, scheme, url;\n this.stopExistingConnection();\n url = this.config.get(\"eventsUrl\");\n if (!url) {\n return;\n }\n if (!startswith(url, \"ws:\") && !startswith(url, \"wss:\")) {\n loc = this.win.location;\n scheme = loc.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n path = _.trimStart(url, \"/\");\n url = scheme + \"//\" + loc.host + \"/\" + path;\n }\n this.error = false;\n this.ws = new this.win.WebSocket(url);\n this.ws.addEventListener(\"open\", this.onOpen);\n this.ws.addEventListener(\"message\", this.onMessage);\n this.ws.addEventListener(\"error\", this.onError);\n return this.ws.addEventListener(\"close\", this.onClose);\n };\n\n EventsService.prototype.stopExistingConnection = function() {\n if (this.ws === void 0) {\n return;\n }\n this.ws.removeEventListener(\"open\", this.onOpen);\n this.ws.removeEventListener(\"close\", this.onClose);\n this.ws.removeEventListener(\"error\", this.onError);\n this.ws.removeEventListener(\"message\", this.onMessage);\n this.stopHeartBeatMessages();\n this.ws.close();\n return delete this.ws;\n };\n\n EventsService.prototype.notifications = function() {\n return this.subscribe(null, 'notifications', (function(_this) {\n return function(data) {\n _this.liveAnnouncementService.show(data.title, data.desc);\n return _this.rootScope.$digest();\n };\n })(this));\n };\n\n EventsService.prototype.liveNotifications = function() {\n var subscribe, userId;\n if (this.auth.userData == null) {\n return;\n }\n userId = this.auth.userData.get('id');\n subscribe = (function(_this) {\n return function() {\n return _this.subscribe(null, \"live_notifications.\" + userId, function(data) {\n var notification;\n notification = new Notification(data.title, {\n icon: \"/\" + window._version + \"/images/favicon.png\",\n body: data.body,\n tag: data.id\n });\n notification.onshow = function() {\n if (data.timeout && data.timeout > 0) {\n return setTimeout(function() {\n return notification.close();\n }, data.timeout);\n }\n };\n if (data.url) {\n return notification.onclick = function() {\n return window.open(data.url);\n };\n }\n });\n };\n })(this);\n if (!Notification) {\n return console.log(\"This browser does not support desktop notification\");\n } else if (Notification.permission === \"granted\") {\n return subscribe();\n } else if (Notification.permission !== 'denied') {\n return Notification.requestPermission((function(_this) {\n return function(permission) {\n if (permission === \"granted\") {\n return subscribe();\n }\n };\n })(this));\n }\n };\n\n EventsService.prototype.startHeartBeatMessages = function() {\n var heartbeatIntervalTime, maxMissedHeartbeats, reconnectTryInterval;\n if (this.heartbeatInterval) {\n return;\n }\n maxMissedHeartbeats = this.config.get(\"eventsMaxMissedHeartbeats\", 5);\n heartbeatIntervalTime = this.config.get(\"eventsHeartbeatIntervalTime\", 60000);\n reconnectTryInterval = this.config.get(\"eventsReconnectTryInterval\", 10000);\n this.missedHeartbeats = 0;\n this.heartbeatInterval = setInterval((function(_this) {\n return function() {\n var e;\n try {\n if (_this.missedHeartbeats >= maxMissedHeartbeats) {\n throw new Error(\"Too many missed heartbeats PINGs.\");\n }\n _this.missedHeartbeats++;\n _this.sendMessage({\n cmd: \"ping\"\n });\n return _this.log.debug(\"HeartBeat send PING\");\n } catch (error1) {\n e = error1;\n _this.log.error(\"HeartBeat error: \" + e.message);\n return _this.setupConnection();\n }\n };\n })(this), heartbeatIntervalTime);\n return this.log.debug(\"HeartBeat enabled\");\n };\n\n EventsService.prototype.stopHeartBeatMessages = function() {\n if (!this.heartbeatInterval) {\n return;\n }\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n return this.log.debug(\"HeartBeat disabled\");\n };\n\n EventsService.prototype.processHeartBeatPongMessage = function(data) {\n this.missedHeartbeats = 0;\n return this.log.debug(\"HeartBeat recived PONG\");\n };\n\n EventsService.prototype.serialize = function(message) {\n if (_.isObject(message)) {\n return JSON.stringify(message);\n }\n return message;\n };\n\n EventsService.prototype.sendMessage = function(message) {\n var i, len, messages, msg, results;\n this.pendingMessages.push(message);\n if (!this.connected) {\n return;\n }\n messages = _.map(this.pendingMessages, this.serialize);\n this.pendingMessages = [];\n results = [];\n for (i = 0, len = messages.length; i < len; i++) {\n msg = messages[i];\n results.push(this.ws.send(msg));\n }\n return results;\n };\n\n EventsService.prototype.processMessage = function(data) {\n var routingKey, subscription;\n routingKey = data.routing_key;\n if (this.subscriptions[routingKey] == null) {\n return;\n }\n subscription = this.subscriptions[routingKey];\n if (subscription.scope) {\n return subscription.scope.$apply(function() {\n return subscription.callback(data.data);\n });\n } else {\n return subscription.callback(data.data);\n }\n };\n\n EventsService.prototype.subscribe = function(scope, routingKey, callback) {\n var message, subscription;\n if (this.error) {\n return;\n }\n this.log.debug(\"Subscribe to: \" + routingKey);\n subscription = {\n scope: scope,\n routingKey: routingKey,\n callback: _.debounce(callback, 500, {\n \"leading\": true,\n \"trailing\": false\n })\n };\n message = {\n \"cmd\": \"subscribe\",\n \"routing_key\": routingKey\n };\n this.subscriptions[routingKey] = subscription;\n this.sendMessage(message);\n if (scope) {\n return scope.$on(\"$destroy\", (function(_this) {\n return function() {\n return _this.unsubscribe(routingKey);\n };\n })(this));\n }\n };\n\n EventsService.prototype.unsubscribe = function(routingKey) {\n var message;\n if (this.error) {\n return;\n }\n this.log.debug(\"Unsubscribe from: \" + routingKey);\n message = {\n \"cmd\": \"unsubscribe\",\n \"routing_key\": routingKey\n };\n return this.sendMessage(message);\n };\n\n EventsService.prototype.onOpen = function() {\n var message, token;\n this.connected = true;\n this.log.debug(\"WebSocket connection opened\");\n token = this.auth.getToken();\n message = {\n cmd: \"auth\",\n data: {\n token: token,\n sessionId: this.sessionId\n }\n };\n this.sendMessage(message);\n this.startHeartBeatMessages();\n this.notifications();\n return this.liveNotifications();\n };\n\n EventsService.prototype.onMessage = function(event) {\n var data;\n this.log.debug(\"WebSocket message received: \" + event.data);\n data = JSON.parse(event.data);\n if (data.cmd === \"pong\") {\n return this.processHeartBeatPongMessage(data);\n } else {\n return this.processMessage(data);\n }\n };\n\n EventsService.prototype.onError = function(error) {\n this.log.error(\"WebSocket error: \" + error);\n this.error = true;\n return setTimeout(this.setupConnection, this.reconnectTryInterval);\n };\n\n EventsService.prototype.onClose = function() {\n this.log.debug(\"WebSocket closed.\");\n this.connected = false;\n this.stopHeartBeatMessages();\n return setTimeout(this.setupConnection, this.reconnectTryInterval);\n };\n\n return EventsService;\n\n })();\n\n EventsProvider = (function() {\n function EventsProvider() {}\n\n EventsProvider.prototype.setSessionId = function(sessionId) {\n return this.sessionId = sessionId;\n };\n\n EventsProvider.prototype.$get = function($win, $log, $conf, $auth, liveAnnouncementService, $rootScope) {\n var service;\n service = new EventsService($win, $log, $conf, $auth, liveAnnouncementService, $rootScope);\n service.initialize(this.sessionId);\n return service;\n };\n\n EventsProvider.prototype.$get.$inject = [\"$window\", \"$log\", \"$tgConfig\", \"$tgAuth\", \"tgLiveAnnouncementService\", \"$rootScope\"];\n\n return EventsProvider;\n\n })();\n\n module.provider(\"$tgEvents\", EventsProvider);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/feedback.coffee\n */\n\n(function() {\n var FeedbackDirective, bindOnce, debounce, groupBy, mixOf, module, taiga, trim;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n mixOf = this.taiga.mixOf;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n module = angular.module(\"taigaFeedback\", []);\n\n FeedbackDirective = function($lightboxService, $repo, $confirm, $loading, feedbackService) {\n var directive, link;\n link = function($scope, $el, $attrs) {\n var form, openLightbox, submit, submitButton;\n form = $el.find(\"form\").checksley();\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"feedback\", $scope.feedback);\n promise.then(function(data) {\n currentLoading.finish();\n $lightboxService.close($el);\n return $confirm.notify(\"success\", \"\\\\o/ we'll be happy to read your\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n openLightbox = function() {\n $scope.feedback = {};\n $lightboxService.open($el);\n return $el.find(\"textarea\").focus();\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return openLightbox();\n };\n directive = {\n link: link,\n templateUrl: \"common/lightbox-feedback.html\",\n scope: {}\n };\n return directive;\n };\n\n module.directive(\"tgLbFeedback\", [\"lightboxService\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgFeedbackService\", FeedbackDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/integrations.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaIntegrations\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaIssues\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaKanban\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaPlugins\", [\"ngRoute\"]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/projects.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaProject\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/related-tasks.coffee\n */\n\n(function() {\n var RelatedTaskAssignedToInlineEditionDirective, RelatedTaskCreateButtonDirective, RelatedTaskCreateFormDirective, RelatedTaskRowDirective, RelatedTasksDirective, debounce, module, taiga, trim;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaRelatedTasks\", []);\n\n RelatedTaskRowDirective = function($repo, $compile, $confirm, $rootscope, $loading, $template, $translate, $emojis) {\n var link, templateEdit, templateView;\n templateView = $template.get(\"task/related-task-row.html\", true);\n templateEdit = $template.get(\"task/related-task-row-edit.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var renderEdit, renderView, saveTask;\n this.childScope = $scope.$new();\n saveTask = debounce(2000, function(task) {\n var currentLoading, promise;\n task.subject = $el.find('input').val();\n currentLoading = $loading().target($el.find('.task-name')).start();\n promise = $repo.save(task);\n promise.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"related-tasks:update\");\n };\n })(this));\n promise.then(null, (function(_this) {\n return function() {\n currentLoading.finish();\n $el.find('input').val(task.subject);\n return $confirm.notify(\"error\");\n };\n })(this));\n return promise;\n });\n renderEdit = function(task) {\n this.childScope.$destroy();\n this.childScope = $scope.$new();\n $el.off();\n $el.html($compile(templateEdit({\n task: task\n }))(childScope));\n $el.find(\".task-name input\").val(task.subject);\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return saveTask($model.$modelValue).then(function() {\n return renderView($model.$modelValue);\n });\n } else if (event.keyCode === 27) {\n return renderView($model.$modelValue);\n }\n });\n $el.on(\"click\", \".save-task\", function(event) {\n return saveTask($model.$modelValue).then(function() {\n return renderView($model.$modelValue);\n });\n });\n return $el.on(\"click\", \".cancel-edit\", function(event) {\n return renderView($model.$modelValue);\n });\n };\n renderView = function(task) {\n var perms;\n perms = {\n modify_task: $scope.project.my_permissions.indexOf(\"modify_task\") !== -1,\n delete_task: $scope.project.my_permissions.indexOf(\"delete_task\") !== -1\n };\n $el.html($compile(templateView({\n task: task,\n perms: perms,\n emojify: function(text) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(text));\n }\n }))($scope));\n $el.on(\"click\", \".edit-task\", function() {\n renderEdit($model.$modelValue);\n return $el.find('input').focus().select();\n });\n return $el.on(\"click\", \".delete-task\", function(event) {\n var message, title;\n title = $translate.instant(\"TASK.TITLE_DELETE_ACTION\");\n task = $model.$modelValue;\n message = task.subject;\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = $repo.remove(task);\n promise.then(function() {\n askResponse.finish();\n return $scope.$emit(\"related-tasks:delete\");\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n });\n });\n };\n $scope.$watch($attrs.ngModel, function(val) {\n if (!val) {\n return;\n }\n return renderView(val);\n });\n $scope.$on(\"related-tasks:assigned-to-changed\", function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n $scope.$on(\"related-tasks:status-changed\", function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgRelatedTaskRow\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"$tgTemplate\", \"$translate\", \"$tgEmojis\", RelatedTaskRowDirective]);\n\n RelatedTaskCreateFormDirective = function($repo, $compile, $confirm, $tgmodel, $loading, $analytics) {\n var link, newTask;\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n link = function($scope, $el, $attrs) {\n var close, createTask, render, reset;\n createTask = function(task) {\n var currentLoading, promise;\n task.subject = $el.find('input').val();\n task.assigned_to = $scope.newTask.assigned_to;\n task.status = $scope.newTask.status;\n $scope.newTask.status = $scope.project.default_task_status;\n $scope.newTask.assigned_to = null;\n currentLoading = $loading().target($el.find('.task-name')).start();\n promise = $repo.create(\"tasks\", task);\n promise.then(function() {\n $analytics.trackEvent(\"task\", \"create\", \"create task on userstory\", 1);\n currentLoading.finish();\n return $scope.$emit(\"related-tasks:add\");\n });\n promise.then(null, function() {\n $el.find('input').val(task.subject);\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n return promise;\n };\n close = function() {\n $el.off();\n return $scope.openNewRelatedTask = false;\n };\n reset = function() {\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n newTask[\"status\"] = $scope.project.default_task_status;\n newTask[\"project\"] = $scope.project.id;\n newTask[\"user_story\"] = $scope.us.id;\n return $scope.newTask = $tgmodel.make_model(\"tasks\", newTask);\n };\n render = function() {\n if ($scope.openNewRelatedTask) {\n return;\n }\n $scope.openNewRelatedTask = true;\n return $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return createTask(newTask).then(function() {\n reset();\n return $el.find('input').focus();\n });\n } else if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return close();\n });\n }\n });\n };\n $scope.save = function() {\n return createTask(newTask).then(function() {\n return close();\n });\n };\n taiga.bindOnce($scope, \"us\", reset);\n $scope.$on(\"related-tasks:show-form\", function() {\n return $scope.$apply(render);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n link: link,\n templateUrl: 'task/related-task-create-form.html'\n };\n };\n\n module.directive(\"tgRelatedTaskCreateForm\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgLoading\", \"$tgAnalytics\", RelatedTaskCreateFormDirective]);\n\n RelatedTaskCreateButtonDirective = function($repo, $compile, $confirm, $tgmodel, $template) {\n var link, template;\n template = $template.get(\"common/components/add-button.html\", true);\n link = function($scope, $el, $attrs) {\n $scope.$watch(\"project\", function(val) {\n if (!val) {\n return;\n }\n $el.off();\n if ($scope.project.my_permissions.indexOf(\"add_task\") !== -1) {\n $el.html($compile(template())($scope));\n } else {\n $el.html(\"\");\n }\n return $el.on(\"click\", \".add-button\", function(event) {\n return $scope.$emit(\"related-tasks:add-new-clicked\");\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskCreateButton\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgTemplate\", RelatedTaskCreateButtonDirective]);\n\n RelatedTasksDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var _isEditable, _isVisible, loadTasks;\n loadTasks = function() {\n return $rs.tasks.list($scope.projectId, null, $scope.usId).then((function(_this) {\n return function(tasks) {\n $scope.tasks = _.sortBy(tasks, function(x) {\n return [x.us_order, x.ref];\n });\n return tasks;\n };\n })(this));\n };\n _isVisible = function() {\n if ($scope.project) {\n return $scope.project.my_permissions.indexOf(\"view_tasks\") !== -1;\n }\n return false;\n };\n _isEditable = function() {\n if ($scope.project) {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n }\n return false;\n };\n $scope.showRelatedTasks = function() {\n var ref;\n return _isVisible() && (_isEditable() || ((ref = $scope.tasks) != null ? ref.length : void 0));\n };\n $scope.$on(\"related-tasks:add\", function() {\n return loadTasks().then(function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n });\n $scope.$on(\"related-tasks:delete\", function() {\n return loadTasks().then(function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n });\n $scope.$on(\"related-tasks:add-new-clicked\", function() {\n return $scope.$broadcast(\"related-tasks:show-form\");\n });\n taiga.bindOnce($scope, \"us\", function(val) {\n return loadTasks();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", RelatedTasksDirective]);\n\n RelatedTaskAssignedToInlineEditionDirective = function($repo, $rootscope, $translate, avatarService) {\n var link, template;\n template = _.template(\"\\\" src=\\\"<%- imgurl %>\\\" alt=\\\"<%- name %>\\\"/>\\n
    <%- name %>
    \");\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task, updateRelatedTask;\n updateRelatedTask = function(task) {\n var avatar, ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\")\n };\n member = $scope.usersById[task.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = avatar.bg;\n if (member) {\n ctx.name = member.full_name_display;\n }\n $el.find(\".avatar\").html(template(ctx));\n return $el.find(\".task-assignedto\").attr('title', ctx.name);\n };\n $ctrl = $el.controller();\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition);\n notAutoSave = $scope.$eval($attrs.notAutoSave);\n autoSave = !notAutoSave;\n $scope.$watch($attrs.tgRelatedTaskAssignedToInlineEdition, function() {\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition);\n return updateRelatedTask(task);\n });\n updateRelatedTask(task);\n $el.on(\"click\", \".task-assignedto\", function(event) {\n return $rootscope.$broadcast(\"assigned-to:add\", task);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_task\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"assigned-to:added\", debounce(2000, (function(_this) {\n return function(ctx, userId, updatedRelatedTask) {\n if (updatedRelatedTask.id === task.id) {\n updatedRelatedTask.assigned_to = userId;\n if (autoSave) {\n $repo.save(updatedRelatedTask).then(function() {\n return $scope.$emit(\"related-tasks:assigned-to-changed\");\n });\n }\n return updateRelatedTask(updatedRelatedTask);\n }\n };\n })(this)));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", \"$translate\", \"tgAvatarService\", RelatedTaskAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources.coffee\n */\n\n(function() {\n var ResourcesService, initResources, initUrls, module, taiga, urls,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ResourcesService = (function(superClass) {\n extend(ResourcesService, superClass);\n\n function ResourcesService() {\n return ResourcesService.__super__.constructor.apply(this, arguments);\n }\n\n return ResourcesService;\n\n })(taiga.Service);\n\n urls = {\n \"auth\": \"/auth\",\n \"auth-register\": \"/auth/register\",\n \"invitations\": \"/invitations\",\n \"users\": \"/users\",\n \"by_username\": \"/users/by_username\",\n \"users-password-recovery\": \"/users/password_recovery\",\n \"users-change-password-from-recovery\": \"/users/change_password_from_recovery\",\n \"users-change-password\": \"/users/change_password\",\n \"users-change-email\": \"/users/change_email\",\n \"users-cancel-account\": \"/users/cancel\",\n \"users-export\": \"/users/export\",\n \"user-stats\": \"/users/%s/stats\",\n \"user-liked\": \"/users/%s/liked\",\n \"user-voted\": \"/users/%s/voted\",\n \"user-watched\": \"/users/%s/watched\",\n \"user-contacts\": \"/users/%s/contacts\",\n \"user-me\": \"/users/me\",\n \"permissions\": \"/permissions\",\n \"notify-policies\": \"/notify-policies\",\n \"user-storage\": \"/user-storage\",\n \"memberships\": \"/memberships\",\n \"bulk-create-memberships\": \"/memberships/bulk_create\",\n \"roles\": \"/roles\",\n \"permissions\": \"/permissions\",\n \"resolver\": \"/resolver\",\n \"projects\": \"/projects\",\n \"project-templates\": \"/project-templates\",\n \"project-modules\": \"/projects/%s/modules\",\n \"bulk-update-projects-order\": \"/projects/bulk_update_order\",\n \"project-like\": \"/projects/%s/like\",\n \"project-unlike\": \"/projects/%s/unlike\",\n \"project-watch\": \"/projects/%s/watch\",\n \"project-unwatch\": \"/projects/%s/unwatch\",\n \"project-contact\": \"contact\",\n \"project-transfer-validate-token\": \"/projects/%s/transfer_validate_token\",\n \"project-transfer-accept\": \"/projects/%s/transfer_accept\",\n \"project-transfer-reject\": \"/projects/%s/transfer_reject\",\n \"project-transfer-request\": \"/projects/%s/transfer_request\",\n \"project-transfer-start\": \"/projects/%s/transfer_start\",\n \"epic-statuses\": \"/epic-statuses\",\n \"userstory-statuses\": \"/userstory-statuses\",\n \"points\": \"/points\",\n \"task-statuses\": \"/task-statuses\",\n \"issue-statuses\": \"/issue-statuses\",\n \"issue-types\": \"/issue-types\",\n \"priorities\": \"/priorities\",\n \"severities\": \"/severities\",\n \"milestones\": \"/milestones\",\n \"epics\": \"/epics\",\n \"epic-upvote\": \"/epics/%s/upvote\",\n \"epic-downvote\": \"/epics/%s/downvote\",\n \"epic-watch\": \"/epics/%s/watch\",\n \"epic-unwatch\": \"/epics/%s/unwatch\",\n \"epic-related-userstories\": \"/epics/%s/related_userstories\",\n \"epic-related-userstories-bulk-create\": \"/epics/%s/related_userstories/bulk_create\",\n \"userstories\": \"/userstories\",\n \"bulk-create-us\": \"/userstories/bulk_create\",\n \"bulk-update-us-backlog-order\": \"/userstories/bulk_update_backlog_order\",\n \"bulk-update-us-milestone\": \"/userstories/bulk_update_milestone\",\n \"bulk-update-us-miles-order\": \"/userstories/bulk_update_sprint_order\",\n \"bulk-update-us-kanban-order\": \"/userstories/bulk_update_kanban_order\",\n \"bulk-update-us-milestone\": \"/userstories/bulk_update_milestone\",\n \"userstories-filters\": \"/userstories/filters_data\",\n \"userstory-upvote\": \"/userstories/%s/upvote\",\n \"userstory-downvote\": \"/userstories/%s/downvote\",\n \"userstory-watch\": \"/userstories/%s/watch\",\n \"userstory-unwatch\": \"/userstories/%s/unwatch\",\n \"tasks\": \"/tasks\",\n \"bulk-create-tasks\": \"/tasks/bulk_create\",\n \"bulk-update-task-taskboard-order\": \"/tasks/bulk_update_taskboard_order\",\n \"task-upvote\": \"/tasks/%s/upvote\",\n \"task-downvote\": \"/tasks/%s/downvote\",\n \"task-watch\": \"/tasks/%s/watch\",\n \"task-unwatch\": \"/tasks/%s/unwatch\",\n \"task-filters\": \"/tasks/filters_data\",\n \"issues\": \"/issues\",\n \"bulk-create-issues\": \"/issues/bulk_create\",\n \"issues-filters\": \"/issues/filters_data\",\n \"issue-upvote\": \"/issues/%s/upvote\",\n \"issue-downvote\": \"/issues/%s/downvote\",\n \"issue-watch\": \"/issues/%s/watch\",\n \"issue-unwatch\": \"/issues/%s/unwatch\",\n \"wiki\": \"/wiki\",\n \"wiki-restore\": \"/wiki/%s/restore\",\n \"wiki-links\": \"/wiki-links\",\n \"history/epic\": \"/history/epic\",\n \"history/us\": \"/history/userstory\",\n \"history/issue\": \"/history/issue\",\n \"history/task\": \"/history/task\",\n \"history/wiki\": \"/history/wiki/%s\",\n \"attachments/epic\": \"/epics/attachments\",\n \"attachments/us\": \"/userstories/attachments\",\n \"attachments/issue\": \"/issues/attachments\",\n \"attachments/task\": \"/tasks/attachments\",\n \"attachments/wiki_page\": \"/wiki/attachments\",\n \"custom-attributes/epic\": \"/epic-custom-attributes\",\n \"custom-attributes/userstory\": \"/userstory-custom-attributes\",\n \"custom-attributes/task\": \"/task-custom-attributes\",\n \"custom-attributes/issue\": \"/issue-custom-attributes\",\n \"custom-attributes-values/epic\": \"/epics/custom-attributes-values\",\n \"custom-attributes-values/userstory\": \"/userstories/custom-attributes-values\",\n \"custom-attributes-values/task\": \"/tasks/custom-attributes-values\",\n \"custom-attributes-values/issue\": \"/issues/custom-attributes-values\",\n \"webhooks\": \"/webhooks\",\n \"webhooks-test\": \"/webhooks/%s/test\",\n \"webhooklogs\": \"/webhooklogs\",\n \"webhooklogs-resend\": \"/webhooklogs/%s/resend\",\n \"epics-csv\": \"/epics/csv?uuid=%s\",\n \"userstories-csv\": \"/userstories/csv?uuid=%s\",\n \"tasks-csv\": \"/tasks/csv?uuid=%s\",\n \"issues-csv\": \"/issues/csv?uuid=%s\",\n \"timeline-profile\": \"/timeline/profile\",\n \"timeline-user\": \"/timeline/user\",\n \"timeline-project\": \"/timeline/project\",\n \"search\": \"/search\",\n \"exporter\": \"/exporter\",\n \"importer\": \"/importer/load_dump\",\n \"feedback\": \"/feedback\",\n \"locales\": \"/locales\",\n \"applications\": \"/applications\",\n \"application-tokens\": \"/application-tokens\",\n \"stats-discover\": \"/stats/discover\",\n \"importers-trello-auth-url\": \"/importers/trello/auth_url\",\n \"importers-trello-authorize\": \"/importers/trello/authorize\",\n \"importers-trello-list-projects\": \"/importers/trello/list_projects\",\n \"importers-trello-list-users\": \"/importers/trello/list_users\",\n \"importers-trello-import-project\": \"/importers/trello/import_project\",\n \"importers-jira-auth-url\": \"/importers/jira/auth_url\",\n \"importers-jira-authorize\": \"/importers/jira/authorize\",\n \"importers-jira-list-projects\": \"/importers/jira/list_projects\",\n \"importers-jira-list-users\": \"/importers/jira/list_users\",\n \"importers-jira-import-project\": \"/importers/jira/import_project\",\n \"importers-github-auth-url\": \"/importers/github/auth_url\",\n \"importers-github-authorize\": \"/importers/github/authorize\",\n \"importers-github-list-projects\": \"/importers/github/list_projects\",\n \"importers-github-list-users\": \"/importers/github/list_users\",\n \"importers-github-import-project\": \"/importers/github/import_project\",\n \"importers-asana-auth-url\": \"/importers/asana/auth_url\",\n \"importers-asana-authorize\": \"/importers/asana/authorize\",\n \"importers-asana-list-projects\": \"/importers/asana/list_projects\",\n \"importers-asana-list-users\": \"/importers/asana/list_users\",\n \"importers-asana-import-project\": \"/importers/asana/import_project\"\n };\n\n initUrls = function($log, $urls) {\n $log.debug(\"Initialize api urls\");\n return $urls.update(urls);\n };\n\n initResources = function($log, $rs) {\n var i, len, provider, providers, results;\n $log.debug(\"Initialize resources\");\n providers = _.toArray(arguments).slice(2);\n results = [];\n for (i = 0, len = providers.length; i < len; i++) {\n provider = providers[i];\n results.push(provider($rs));\n }\n return results;\n };\n\n module = angular.module(\"taigaResources\", [\"taigaBase\"]);\n\n module.service(\"$tgResources\", ResourcesService);\n\n module.run([\"$log\", \"$tgUrls\", initUrls]);\n\n module.run([\"$log\", \"$tgResources\", \"$tgProjectsResourcesProvider\", \"$tgCustomAttributesResourcesProvider\", \"$tgCustomAttributesValuesResourcesProvider\", \"$tgMembershipsResourcesProvider\", \"$tgNotifyPoliciesResourcesProvider\", \"$tgInvitationsResourcesProvider\", \"$tgRolesResourcesProvider\", \"$tgUserSettingsResourcesProvider\", \"$tgSprintsResourcesProvider\", \"$tgEpicsResourcesProvider\", \"$tgUserstoriesResourcesProvider\", \"$tgTasksResourcesProvider\", \"$tgIssuesResourcesProvider\", \"$tgWikiResourcesProvider\", \"$tgSearchResourcesProvider\", \"$tgMdRenderResourcesProvider\", \"$tgHistoryResourcesProvider\", \"$tgKanbanResourcesProvider\", \"$tgModulesResourcesProvider\", \"$tgWebhooksResourcesProvider\", \"$tgWebhookLogsResourcesProvider\", \"$tgLocalesResourcesProvider\", \"$tgUsersResourcesProvider\", initResources]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/search.coffee\n */\n\n(function() {\n var SearchBoxDirective, SearchController, SearchDirective, bindOnce, debounce, debounceLeading, groupBy, mixOf, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n mixOf = this.taiga.mixOf;\n\n debounceLeading = this.taiga.debounceLeading;\n\n trim = this.taiga.trim;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaSearch\", []);\n\n SearchController = (function(superClass) {\n extend(SearchController, superClass);\n\n SearchController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function SearchController(scope1, repo, rs, params, q, location, appMetaService, navUrls, translate, errorHandlingService, projectService1) {\n var description, loadSearchData, title;\n this.scope = scope1;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.scope.sectionName = \"Search\";\n this.loadInitialData();\n title = this.translate.instant(\"SEARCH.PAGE_TITLE\", {\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"SEARCH.PAGE_DESCRIPTION\", {\n projectName: this.scope.project.name,\n projectDescription: this.scope.project.description\n });\n this.appMetaService.setAll(title, description);\n this.scope.searchTerm = null;\n loadSearchData = debounceLeading(100, (function(_this) {\n return function(t) {\n return _this.loadSearchData(t);\n };\n })(this));\n bindOnce(this.scope, \"projectId\", (function(_this) {\n return function(projectId) {\n if (!_this.scope.searchResults && _this.scope.searchTerm) {\n return _this.loadSearchData();\n }\n };\n })(this));\n this.scope.$watch(\"searchTerm\", (function(_this) {\n return function(term) {\n if (term !== void 0 && _this.scope.projectId) {\n return _this.loadSearchData(term);\n }\n };\n })(this));\n }\n\n SearchController.prototype.loadFilters = function() {\n var defered;\n defered = this.q.defer();\n defered.resolve();\n return defered.promise;\n };\n\n SearchController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.epicStatusById = groupBy(project.epic_statuses, function(x) {\n return x.id;\n });\n this.scope.issueStatusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n this.scope.taskStatusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n\n SearchController.prototype.loadSearchData = function(term) {\n if (term == null) {\n term = \"\";\n }\n this.scope.loading = true;\n return this._loadSearchData(term).then((function(_this) {\n return function(data) {\n _this.scope.searchResults = data;\n return _this.scope.loading = false;\n };\n })(this));\n };\n\n SearchController.prototype._loadSearchData = function(term) {\n if (term == null) {\n term = \"\";\n }\n if (this._promise) {\n this._promise.abort();\n }\n this._promise = this.rs.search[\"do\"](this.scope.projectId, term);\n return this._promise;\n };\n\n SearchController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.scope.projectId = project.id;\n return this.fillUsersAndRoles(project.members, project.roles);\n };\n\n return SearchController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"SearchController\", SearchController);\n\n SearchBoxDirective = function(projectService, $lightboxService, $navurls, $location, $route) {\n var link;\n link = function($scope, $el, $attrs) {\n var openLightbox, project, submit;\n project = null;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var form, text, url;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n text = $el.find(\"#search-text\").val();\n url = $navurls.resolve(\"project-search\", {\n project: project.get(\"slug\")\n });\n return $scope.$apply(function() {\n $lightboxService.close($el);\n $location.path(url);\n $location.search(\"text\", text).path(url);\n return $route.reload();\n });\n };\n })(this));\n openLightbox = function() {\n project = projectService.project;\n return $lightboxService.open($el).then(function() {\n return $el.find(\"#search-text\").focus();\n });\n };\n $el.on(\"submit\", \"form\", submit);\n return openLightbox();\n };\n return {\n templateUrl: \"search/lightbox-search.html\",\n link: link\n };\n };\n\n SearchBoxDirective.$inject = [\"tgProjectService\", \"lightboxService\", \"$tgNavUrls\", \"$tgLocation\", \"$route\"];\n\n module.directive(\"tgSearchBox\", SearchBoxDirective);\n\n SearchDirective = function($log, $compile, $templatecache, $routeparams, $location, $analytics) {\n var link, linkTable;\n linkTable = function($scope, $el, $attrs, $ctrl) {\n var activeSectionName, applyAutoTab, getActiveSection, lastSearchResults, markSectionTabActive, renderFilterTabs, renderTableContent, tabsDom, templates;\n applyAutoTab = true;\n activeSectionName = \"userstories\";\n tabsDom = $el.find(\".search-filter\");\n lastSearchResults = null;\n getActiveSection = function(data) {\n var i, len, maxVal, name, ref, selectedSection, value;\n maxVal = 0;\n selectedSection = {};\n selectedSection.name = \"userstories\";\n selectedSection.value = [];\n if (!applyAutoTab) {\n selectedSection.name = activeSectionName;\n selectedSection.value = data[activeSectionName];\n return selectedSection;\n }\n if (data) {\n ref = [\"userstories\", \"epics\", \"issues\", \"tasks\", \"wikipages\"];\n for (i = 0, len = ref.length; i < len; i++) {\n name = ref[i];\n value = data[name];\n if (value.length > maxVal) {\n maxVal = value.length;\n selectedSection.name = name;\n selectedSection.value = value;\n break;\n }\n }\n }\n if (maxVal === 0) {\n return selectedSection;\n }\n return selectedSection;\n };\n renderFilterTabs = function(data) {\n var name, results, value;\n results = [];\n for (name in data) {\n value = data[name];\n tabsDom.find(\"li.\" + name).show();\n results.push(tabsDom.find(\"li.\" + name + \" .num\").html(value.length));\n }\n return results;\n };\n markSectionTabActive = function(section) {\n tabsDom.find(\"a.active\").removeClass(\"active\");\n tabsDom.find(\"li.\" + section.name + \" a\").addClass(\"active\");\n applyAutoTab = false;\n return activeSectionName = section.name;\n };\n templates = {\n epics: $templatecache.get(\"search-epics\"),\n issues: $templatecache.get(\"search-issues\"),\n tasks: $templatecache.get(\"search-tasks\"),\n userstories: $templatecache.get(\"search-userstories\"),\n wikipages: $templatecache.get(\"search-wikipages\")\n };\n renderTableContent = function(section) {\n var element, oldElements, oldScope, scope, template;\n oldElements = $el.find(\".search-result-table\").children();\n oldScope = oldElements.scope();\n if (oldScope) {\n oldScope.$destroy();\n oldElements.remove();\n }\n scope = $scope.$new();\n scope[section.name] = section.value;\n template = angular.element.parseHTML(trim(templates[section.name]));\n element = $compile(template)(scope);\n return $el.find(\".search-result-table\").html(element);\n };\n $scope.$watch(\"searchResults\", function(data) {\n var activeSection;\n lastSearchResults = data;\n if (!lastSearchResults) {\n return;\n }\n activeSection = getActiveSection(data);\n renderFilterTabs(data);\n renderTableContent(activeSection);\n return markSectionTabActive(activeSection);\n });\n $scope.$watch(\"searchTerm\", function(searchTerm) {\n if (searchTerm !== void 0) {\n $location.search(\"text\", searchTerm);\n }\n return $analytics.trackPage($location.url(), \"Search\");\n });\n return $el.on(\"click\", \".search-filter li > a\", function(event) {\n var section, sectionData, sectionName, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n sectionName = target.parent().data(\"name\");\n sectionData = !lastSearchResults ? [] : lastSearchResults[sectionName];\n section = {\n name: sectionName,\n value: sectionData\n };\n return $scope.$apply(function() {\n renderTableContent(section);\n return markSectionTabActive(section);\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, searchText;\n $ctrl = $el.controller();\n linkTable($scope, $el, $attrs, $ctrl);\n searchText = $routeparams.text;\n return $scope.$watch(\"projectId\", function(projectId) {\n if (projectId != null) {\n return $scope.searchTerm = searchText;\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSearch\", [\"$log\", \"$compile\", \"$templateCache\", \"$routeParams\", \"$tgLocation\", \"$tgAnalytics\", SearchDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTaskboard\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/tasks.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTasks\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/team.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTeam\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUserSettings\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/userstories.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUserStories\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaWiki\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/analytics.coffee\n */\n\n(function() {\n var AnalyticsService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n AnalyticsService = (function(superClass) {\n extend(AnalyticsService, superClass);\n\n AnalyticsService.$inject = [\"$rootScope\", \"$log\", \"$tgConfig\", \"$window\", \"$document\", \"$location\"];\n\n function AnalyticsService(rootscope, log, config, win, doc, location) {\n var conf;\n this.rootscope = rootscope;\n this.log = log;\n this.config = config;\n this.win = win;\n this.doc = doc;\n this.location = location;\n this.initialized = false;\n conf = this.config.get(\"analytics\", {});\n this.accountId = conf.accountId;\n this.pageEvent = conf.pageEvent || \"$routeChangeSuccess\";\n this.trackRoutes = conf.trackRoutes || true;\n this.ignoreFirstPageLoad = conf.ignoreFirstPageLoad || false;\n }\n\n AnalyticsService.prototype.initialize = function() {\n if (!this.accountId) {\n this.log.debug(\"Analytics: no acount id provided. Disabling.\");\n return;\n }\n this.injectAnalytics();\n this.win.ga(\"create\", this.accountId, \"auto\");\n this.win.ga(\"require\", \"ec\");\n this.win.ga(\"require\", \"displayfeatures\");\n if (this.trackRoutes && (!this.ignoreFirstPageLoad)) {\n this.win.ga(\"send\", \"pageview\", this.getUrl());\n }\n if (this.trackRoutes) {\n this.rootscope.$on(this.pageEvent, (function(_this) {\n return function() {\n return _this.trackPage(_this.getUrl(), \"Taiga\");\n };\n })(this));\n }\n this.initialized = true;\n return this.setUserId();\n };\n\n AnalyticsService.prototype.setUserId = function() {\n var ref, ref1;\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n return this.win.ga('set', 'userId', (ref = this.rootscope) != null ? (ref1 = ref.user) != null ? ref1.uuid : void 0 : void 0);\n };\n\n AnalyticsService.prototype.getUrl = function() {\n return this.location.path();\n };\n\n AnalyticsService.prototype.injectAnalytics = function() {\n var fn;\n fn = (function(i,s,o,g,r,a,m){i[\"GoogleAnalyticsObject\"]=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);});\n return fn(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\");\n };\n\n AnalyticsService.prototype.trackPage = function(url, title) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n title = title || this.doc[0].title;\n return this.win.ga(\"send\", \"pageview\", {\n \"page\": url,\n \"title\": title\n });\n };\n\n AnalyticsService.prototype.trackEvent = function(category, action, label, value) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n return this.win.ga(\"send\", \"event\", category, action, label, value);\n };\n\n AnalyticsService.prototype.ecViewPlan = function(plan) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'detail');\n return this.trackEvent(\"ecommerce\", \"view-product-detail\", plan.name, plan.plan_id);\n };\n\n AnalyticsService.prototype.ecClickPlan = function(plan) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'click');\n return this.trackEvent(\"ecommerce\", \"click-product\", plan.name, plan.plan_id);\n };\n\n AnalyticsService.prototype.ecListPlans = function(arg, page) {\n var i, len, plan, plans, position;\n plans = arg[0];\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n position = 1;\n for (i = 0, len = plans.length; i < len; i++) {\n plan = plans[i];\n this.win.ga('ec:addImpression', {\n 'id': plan.plan_id,\n 'name': plan.name,\n 'list': page,\n 'position': position\n });\n position++;\n }\n return this.trackEvent(\"ecommerce\", \"list-plans\");\n };\n\n AnalyticsService.prototype.ecAddToCart = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'add');\n return this.trackEvent('ecommerce', 'add-to-cart', 'Collect Payment Info', null);\n };\n\n AnalyticsService.prototype.ecConfirmChange = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'checkout', {\n 'step': 1\n });\n return this.trackEvent(\"ecommerce\", \"start-checkout\", \"start\", 1);\n };\n\n AnalyticsService.prototype.ecPurchase = function(plan_id, plan_name, plan_price) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'checkout', {\n 'step': 2\n });\n this.trackEvent(\"ecommerce\", \"end-checkout\", \"end\", 2);\n this.win.ga('ec:addProduct', {\n 'id': plan_id,\n 'name': plan_name,\n 'price': plan_price,\n 'category': \"plans\",\n 'quantity': 1,\n 'position': 1\n });\n this.win.ga('ec:setAction', 'purchase', {\n 'id': plan_id,\n 'revenue': plan_price\n });\n return this.trackEvent('ecommerce', 'checkout', 'Plan checkout', null);\n };\n\n return AnalyticsService;\n\n })(taiga.Service);\n\n module.service(\"$tgAnalytics\", AnalyticsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: bind-scope.coffee\n */\n\n(function() {\n var BindScope, module;\n\n module = angular.module(\"taigaCommon\");\n\n BindScope = function(config) {\n var link;\n if (!config.debugInfo) {\n jQuery.fn.scope = function() {\n return this.data('scope');\n };\n }\n link = function($scope, $el) {\n if (!config.debugInfo) {\n return $el.data('scope', $scope).addClass('tg-scope');\n }\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBindScope\", [\"$tgConfig\", BindScope]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: compile-html.directive.coffee\n */\n\n(function() {\n var CompileHtmlDirective;\n\n CompileHtmlDirective = function($compile) {\n var link;\n link = function(scope, element, attrs) {\n return scope.$watch(attrs.tgCompileHtml, function(newValue, oldValue) {\n element.html(newValue);\n return $compile(element.contents())(scope);\n });\n };\n return {\n link: link\n };\n };\n\n CompileHtmlDirective.$inject = [\"$compile\"];\n\n angular.module(\"taigaCommon\").directive(\"tgCompileHtml\", CompileHtmlDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/components.coffee\n */\n\n(function() {\n var AssignedToDirective, AssignedUsersDirective, BlockButtonDirective, CreatedByDisplayDirective, DateRangeDirective, DateSelectorDirective, DeleteButtonDirective, ListItemAssignedtoDirective, ListItemEpicStatusDirective, ListItemIssueStatusDirective, ListItemPriorityDirective, ListItemSeverityDirective, ListItemTaskStatusDirective, ListItemTypeDirective, ListItemUsStatusDirective, SprintProgressBarDirective, TgMainTitleDirective, TgProgressBarDirective, UserDisplayDirective, WatchersDirective, bindOnce, module, taiga,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n DateRangeDirective = function($translate) {\n var link, renderRange;\n renderRange = function($el, first, second) {\n var endDate, initDate, prettyDate;\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\");\n initDate = moment(first).format(prettyDate);\n endDate = moment(second).format(prettyDate);\n return $el.html(initDate + \"-\" + endDate);\n };\n link = function($scope, $el, $attrs) {\n var first, ref, second;\n ref = $attrs.tgDateRange.split(\",\"), first = ref[0], second = ref[1];\n return bindOnce($scope, first, function(valFirst) {\n return bindOnce($scope, second, function(valSecond) {\n return renderRange($el, valFirst, valSecond);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgDateRange\", [\"$translate\", DateRangeDirective]);\n\n DateSelectorDirective = function($rootscope, datePickerConfigService) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var initialize, selectedDate, unbind;\n selectedDate = null;\n initialize = function() {\n var datePickerConfig;\n datePickerConfig = datePickerConfigService.get();\n _.merge(datePickerConfig, {\n field: $el[0]\n });\n return $el.picker = new Pikaday(datePickerConfig);\n };\n unbind = $rootscope.$on(\"$translateChangeEnd\", (function(_this) {\n return function(ctx) {\n if ($el.picker) {\n $el.picker.destroy();\n }\n return initialize();\n };\n })(this));\n $attrs.$observe(\"pickerValue\", function(val) {\n $el.val(val);\n if (val != null) {\n if ($el.picker) {\n $el.picker.destroy();\n }\n initialize();\n }\n return $el.picker.setDate(val);\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n unbind();\n return $el.picker.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgDateSelector\", [\"$rootScope\", \"tgDatePickerConfigService\", DateSelectorDirective]);\n\n SprintProgressBarDirective = function() {\n var link, renderProgress;\n renderProgress = function($el, percentage, visual_percentage) {\n if ($el.hasClass(\".current-progress\")) {\n return $el.css(\"width\", percentage + \"%\");\n } else {\n $el.find(\".current-progress\").css(\"width\", visual_percentage + \"%\");\n return $el.find(\".number\").html(percentage + \" %\");\n }\n };\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.tgSprintProgressbar, function(sprint) {\n var closedPoints, percentage, totalPoints, visual_percentage;\n closedPoints = sprint.closed_points;\n totalPoints = sprint.total_points;\n percentage = 0;\n if (totalPoints !== 0) {\n percentage = Math.round(100 * (closedPoints / totalPoints));\n }\n visual_percentage = 0;\n if (totalPoints !== 0) {\n visual_percentage = Math.round(98 * (closedPoints / totalPoints));\n }\n return renderProgress($el, percentage, visual_percentage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSprintProgressbar\", SprintProgressBarDirective);\n\n CreatedByDisplayDirective = function($template, $compile, $translate, $navUrls, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.ngModel, function(model) {\n var avatar, ref;\n if (model != null) {\n avatar = avatarService.getAvatar(model.owner_extra_info);\n $scope.owner = model.owner_extra_info || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n };\n $scope.owner.avatar = avatar.url;\n $scope.owner.bg = avatar.bg;\n $scope.url = ((ref = $scope.owner) != null ? ref.is_active : void 0) ? $navUrls.resolve(\"user-profile\", {\n username: $scope.owner.username\n }) : \"\";\n return $scope.date = moment(model.created_date).format($translate.instant(\"COMMON.DATETIME\"));\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n scope: true,\n templateUrl: \"common/components/created-by.html\"\n };\n };\n\n module.directive(\"tgCreatedByDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\", \"tgAvatarService\", CreatedByDisplayDirective]);\n\n UserDisplayDirective = function($template, $compile, $translate, $navUrls, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var avatar, id;\n id = $attrs.tgUserId;\n $scope.user = $scope.usersById[id] || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\")\n };\n avatar = avatarService.getAvatar($scope.usersById[id] || null);\n $scope.user.avatar = avatar.url;\n $scope.user.bg = avatar.bg;\n $scope.url = $scope.user.is_active ? $navUrls.resolve(\"user-profile\", {\n username: $scope.user.username\n }) : \"\";\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n scope: true,\n templateUrl: \"common/components/user-display.html\"\n };\n };\n\n module.directive(\"tgUserDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\", \"tgAvatarService\", UserDisplayDirective]);\n\n WatchersDirective = function($rootscope, $confirm, $repo, $modelTransform, $template, $compile, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var deleteWatcher, isEditable, renderWatchers, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n save = function(watchers) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.watchers = watchers;\n return item;\n });\n transform.then(function() {\n watchers = _.map(watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n renderWatchers(watchers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n deleteWatcher = function(watcherIds) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.watchers = watcherIds;\n return item;\n });\n transform.then(function() {\n var item, watchers;\n item = $modelTransform.getObj();\n watchers = _.map(item.watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n renderWatchers(watchers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return transform.then(null, function() {\n item.revert();\n return $confirm.notify(\"error\");\n });\n };\n renderWatchers = function(watchers) {\n $scope.watchers = watchers;\n return $scope.isEditable = isEditable();\n };\n $el.on(\"click\", \".js-delete-watcher\", function(event) {\n var message, target, title, watcherId;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n watcherId = target.data(\"watcher-id\");\n title = $translate.instant(\"COMMON.WATCHERS.TITLE_LIGHTBOX_DELETE_WARTCHER\");\n message = $scope.usersById[watcherId].full_name_display;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var watcherIds;\n askResponse.finish();\n watcherIds = _.clone($model.$modelValue.watchers, false);\n watcherIds = _.pull(watcherIds, watcherId);\n return deleteWatcher(watcherIds);\n };\n })(this));\n });\n $scope.$on(\"watcher:added\", function(ctx, watcherId) {\n var watchers;\n watchers = _.clone($model.$modelValue.watchers, false);\n watchers.push(watcherId);\n watchers = _.uniq(watchers);\n return save(watchers);\n });\n $scope.$watch($attrs.ngModel, function(item) {\n var watchers;\n if (item == null) {\n return;\n }\n watchers = _.map(item.watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n watchers = _.filter(watchers, function(it) {\n return !!it;\n });\n return renderWatchers(watchers);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n templateUrl: \"common/components/watchers.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWatchers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", \"$translate\", WatchersDirective]);\n\n AssignedUsersDirective = function($rootscope, $confirm, $repo, $modelTransform, $template, $compile, $translate, $currentUserService) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var assignToMe, deleteAssignedUser, isAssigned, isEditable, openAssignedUsers, renderAssignedUsers, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n isAssigned = function() {\n return $scope.assignedUsers.length > 0;\n };\n save = function(assignedUsers, assignedToUser) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.assigned_users = assignedUsers;\n if (!item.assigned_to) {\n item.assigned_to = assignedToUser;\n }\n return item;\n });\n transform.then(function() {\n var result;\n assignedUsers = _.map(assignedUsers, function(assignedUserId) {\n return $scope.usersById[assignedUserId];\n });\n renderAssignedUsers(assignedUsers);\n return result = $rootscope.$broadcast(\"object:updated\");\n });\n return transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n openAssignedUsers = function() {\n var item;\n item = _.clone($model.$modelValue, false);\n return $rootscope.$broadcast(\"assigned-user:add\", item);\n };\n assignToMe = function() {\n var assignedUsers, currentUserId;\n if (!isEditable()) {\n return;\n }\n currentUserId = $currentUserService.getUser().get('id');\n assignedUsers = _.clone($model.$modelValue.assigned_users, false);\n assignedUsers.push(currentUserId);\n assignedUsers = _.uniq(assignedUsers);\n return save(assignedUsers, currentUserId);\n };\n deleteAssignedUser = function(assignedUserIds) {\n var transform;\n transform = $modelTransform.save(function(item) {\n var ref;\n item.assigned_users = assignedUserIds;\n if ((ref = item.assigned_to, indexOf.call(assignedUserIds, ref) < 0) && assignedUserIds.length > 0) {\n item.assigned_to = assignedUserIds[0];\n }\n if (assignedUserIds.length === 0) {\n item.assigned_to = null;\n }\n return item;\n });\n transform.then(function() {\n var assignedUsers, item;\n item = $modelTransform.getObj();\n assignedUsers = _.map(item.assignedUsers, function(assignedUserId) {\n return $scope.usersById[assignedUserId];\n });\n renderAssignedUsers(assignedUsers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return transform.then(null, function() {\n item.revert();\n return $confirm.notify(\"error\");\n });\n };\n renderAssignedUsers = function(assignedUsers) {\n $scope.assignedUsers = assignedUsers;\n $scope.isEditable = isEditable();\n $scope.isAssigned = isAssigned();\n $scope.openAssignedUsers = openAssignedUsers;\n return $scope.assignToMe = assignToMe;\n };\n $el.on(\"click\", \".remove-user\", function(event) {\n var assignedUserId, message, target, title;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n assignedUserId = target.data(\"assigned-user-id\");\n title = $translate.instant(\"COMMON.ASSIGNED_USERS.TITLE_LIGHTBOX_DELETE_ASSIGNED\");\n message = $scope.usersById[assignedUserId].full_name_display;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var assignedUserIds;\n askResponse.finish();\n assignedUserIds = _.clone($model.$modelValue.assigned_users, false);\n assignedUserIds = _.pull(assignedUserIds, assignedUserId);\n return deleteAssignedUser(assignedUserIds);\n };\n })(this));\n });\n $scope.$on(\"assigned-user:deleted\", function(ctx, assignedUserId) {\n var assignedUsersIds;\n assignedUsersIds = _.clone($model.$modelValue.assigned_users, false);\n assignedUsersIds = _.pull(assignedUsersIds, assignedUserId);\n assignedUsersIds = _.uniq(assignedUsersIds);\n return deleteAssignedUser(assignedUsersIds);\n });\n $scope.$on(\"assigned-user:added\", function(ctx, assignedUserId) {\n var assignedUsers;\n assignedUsers = _.clone($model.$modelValue.assigned_users, false);\n assignedUsers.push(assignedUserId);\n assignedUsers = _.uniq(assignedUsers);\n return save(assignedUsers, assignedUserId);\n });\n $scope.$watch($attrs.ngModel, function(item) {\n var assignedUsers;\n if (item == null) {\n return;\n }\n assignedUsers = _.map(item.assigned_users, function(assignedUserId) {\n return $scope.usersById[assignedUserId];\n });\n assignedUsers = _.filter(assignedUsers, function(it) {\n return !!it;\n });\n return renderAssignedUsers(assignedUsers);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n scope: true,\n templateUrl: \"common/components/assigned-users.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgAssignedUsers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", \"$translate\", \"tgCurrentUserService\", AssignedUsersDirective]);\n\n AssignedToDirective = function($rootscope, $confirm, $repo, $loading, $modelTransform, $template, $translate, $compile, $currentUserService, avatarService) {\n var link, template;\n template = $template.get(\"common/components/assigned-to.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, renderAssignedTo, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n save = function(userId) {\n var currentLoading, item, transform;\n item = $model.$modelValue.clone();\n item.assigned_to = userId;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(item) {\n item.assigned_to = userId;\n return item;\n });\n transform.then(function() {\n currentLoading.finish();\n renderAssignedTo($modelTransform.getObj());\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n });\n return transform;\n };\n renderAssignedTo = function(assignedObject) {\n var avatar, bg, ctx, fullName, html, isIocaine, isUnassigned;\n avatar = avatarService.getAvatar(assignedObject != null ? assignedObject.assigned_to_extra_info : void 0);\n bg = null;\n if ((assignedObject != null ? assignedObject.assigned_to : void 0) != null) {\n fullName = assignedObject.assigned_to_extra_info.full_name_display;\n isUnassigned = false;\n bg = avatar.bg;\n } else {\n fullName = $translate.instant(\"COMMON.ASSIGNED_TO.ASSIGN\");\n isUnassigned = true;\n }\n isIocaine = assignedObject != null ? assignedObject.is_iocaine : void 0;\n ctx = {\n fullName: fullName,\n avatar: avatar.url,\n bg: bg,\n isUnassigned: isUnassigned,\n isEditable: isEditable(),\n isIocaine: isIocaine,\n fullNameVisible: !(isUnassigned && !$currentUserService.isAuthenticated())\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n $el.on(\"click\", \".user-assigned\", function(event) {\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n return $scope.$apply(function() {\n return $rootscope.$broadcast(\"assigned-to:add\", $model.$modelValue);\n });\n });\n $el.on(\"click\", \".assign-to-me\", function(event) {\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n $model.$modelValue.assigned_to = $currentUserService.getUser().get('id');\n return save($currentUserService.getUser().get('id'));\n });\n $el.on(\"click\", \".remove-user\", function(event) {\n var title;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n title = $translate.instant(\"COMMON.ASSIGNED_TO.CONFIRM_UNASSIGNED\");\n return $confirm.ask(title).then((function(_this) {\n return function(response) {\n response.finish();\n $model.$modelValue.assigned_to = null;\n return save(null);\n };\n })(this));\n });\n $scope.$on(\"assigned-to:added\", function(ctx, userId, item) {\n if (item.id !== $model.$modelValue.id) {\n return;\n }\n return save(userId);\n });\n $scope.$watch($attrs.ngModel, function(instance) {\n return renderAssignedTo(instance);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgAssignedTo\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$translate\", \"$compile\", \"tgCurrentUserService\", \"tgAvatarService\", AssignedToDirective]);\n\n BlockButtonDirective = function($rootscope, $loading, $template) {\n var link, template;\n template = $template.get(\"common/components/block-button.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n $scope.$watch($attrs.ngModel, function(item) {\n if (!item) {\n return;\n }\n if (isEditable()) {\n $el.find('.item-block').addClass('editable');\n }\n if (item.is_blocked) {\n $el.find('.item-block').removeClass('is-active');\n return $el.find('.item-unblock').addClass('is-active');\n } else {\n $el.find('.item-block').addClass('is-active');\n return $el.find('.item-unblock').removeClass('is-active');\n }\n });\n $el.on(\"click\", \".item-block\", function(event) {\n event.preventDefault();\n return $rootscope.$broadcast(\"block\", $model.$modelValue);\n });\n $el.on(\"click\", \".item-unblock\", function(event) {\n var currentLoading, finish;\n event.preventDefault();\n currentLoading = $loading().target($el.find(\".item-unblock\")).start();\n finish = function() {\n return currentLoading.finish();\n };\n return $rootscope.$broadcast(\"unblock\", $model.$modelValue, finish);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgBlockButton\", [\"$rootScope\", \"$tgLoading\", \"$tgTemplate\", BlockButtonDirective]);\n\n DeleteButtonDirective = function($log, $repo, $confirm, $location, $template) {\n var link, template;\n template = $template.get(\"common/components/delete-button.html\");\n link = function($scope, $el, $attrs, $model) {\n if (!$attrs.onDeleteGoToUrl) {\n return $log.error(\"DeleteButtonDirective requires on-delete-go-to-url set in scope.\");\n }\n if (!$attrs.onDeleteTitle) {\n return $log.error(\"DeleteButtonDirective requires on-delete-title set in scope.\");\n }\n $el.on(\"click\", \".button-delete\", function(event) {\n var subtitle, title;\n title = $attrs.onDeleteTitle;\n subtitle = $model.$modelValue.subject;\n return $confirm.askOnDelete(title, subtitle).then((function(_this) {\n return function(askResponse) {\n var promise;\n promise = $repo.remove($model.$modelValue);\n promise.then(function() {\n var url;\n askResponse.finish();\n url = $scope.$eval($attrs.onDeleteGoToUrl);\n return $location.path(url);\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgDeleteButton\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgTemplate\", DeleteButtonDirective]);\n\n ListItemEpicStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var epic;\n epic = $scope.$eval($attrs.tgListitemEpicStatus);\n return bindOnce($scope, \"epicStatusById\", function(epicStatusById) {\n return $el.html(epicStatusById[epic.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemEpicStatus\", ListItemEpicStatusDirective);\n\n ListItemUsStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var us;\n us = $scope.$eval($attrs.tgListitemUsStatus);\n return bindOnce($scope, \"usStatusById\", function(usStatusById) {\n return $el.html(usStatusById[us.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemUsStatus\", ListItemUsStatusDirective);\n\n ListItemTaskStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var task;\n task = $scope.$eval($attrs.tgListitemTaskStatus);\n return bindOnce($scope, \"taskStatusById\", function(taskStatusById) {\n return $el.html(taskStatusById[task.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemTaskStatus\", ListItemTaskStatusDirective);\n\n ListItemAssignedtoDirective = function($template, $translate, avatarService) {\n var link, template;\n template = $template.get(\"common/components/list-item-assigned-to-avatar.html\", true);\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"usersById\", function(usersById) {\n var avatar, ctx, item, member;\n item = $scope.$eval($attrs.tgListitemAssignedto);\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\")\n };\n member = usersById[item.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = avatar.bg;\n if (member) {\n ctx.name = member.full_name_display;\n }\n return $el.html(template(ctx));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemAssignedto\", [\"$tgTemplate\", \"$translate\", \"tgAvatarService\", ListItemAssignedtoDirective]);\n\n ListItemIssueStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemIssueStatus);\n return bindOnce($scope, \"issueStatusById\", function(issueStatusById) {\n return $el.html(issueStatusById[issue.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemIssueStatus\", ListItemIssueStatusDirective);\n\n ListItemTypeDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(issueTypeById, issue) {\n var domNode, type;\n type = issueTypeById[issue.type];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", type.color);\n return domNode.attr(\"title\", type.name);\n };\n bindOnce($scope, \"issueTypeById\", function(issueTypeById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemType);\n return render(issueTypeById, issue);\n });\n return $scope.$watch($attrs.tgListitemType, function(issue) {\n return render($scope.issueTypeById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemType\", ListItemTypeDirective);\n\n ListItemPriorityDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(priorityById, issue) {\n var domNode, priority;\n priority = priorityById[issue.priority];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", priority.color);\n return domNode.attr(\"title\", priority.name);\n };\n bindOnce($scope, \"priorityById\", function(priorityById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemPriority);\n return render(priorityById, issue);\n });\n return $scope.$watch($attrs.tgListitemPriority, function(issue) {\n return render($scope.priorityById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemPriority\", ListItemPriorityDirective);\n\n ListItemSeverityDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(severityById, issue) {\n var domNode, severity;\n severity = severityById[issue.severity];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", severity.color);\n return domNode.attr(\"title\", severity.name);\n };\n bindOnce($scope, \"severityById\", function(severityById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemSeverity);\n return render(severityById, issue);\n });\n return $scope.$watch($attrs.tgListitemSeverity, function(issue) {\n return render($scope.severityById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemSeverity\", ListItemSeverityDirective);\n\n TgProgressBarDirective = function($template) {\n var link, render, template;\n template = $template.get(\"common/components/progress-bar.html\", true);\n render = function(el, percentage) {\n return el.html(template({\n percentage: percentage\n }));\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch($attrs.tgProgressBar, function(percentage) {\n percentage = _.max([0, percentage]);\n percentage = _.min([100, percentage]);\n return render($el, percentage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProgressBar\", [\"$tgTemplate\", TgProgressBarDirective]);\n\n TgMainTitleDirective = function($translate) {\n var link;\n link = function($scope, $el, $attrs) {\n $attrs.$observe(\"i18nSectionName\", function(i18nSectionName) {\n return $scope.sectionName = i18nSectionName;\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/main-title.html\",\n scope: {\n projectName: \"=projectName\"\n }\n };\n };\n\n module.directive(\"tgMainTitle\", [\"$translate\", TgMainTitleDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/confirm.coffee\n */\n\n(function() {\n var ConfirmService, NOTIFICATION_MSG, bindMethods, cancelTimeout, debounce, module, taiga, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n timeout = this.taiga.timeout;\n\n cancelTimeout = this.taiga.cancelTimeout;\n\n debounce = this.taiga.debounce;\n\n bindMethods = this.taiga.bindMethods;\n\n NOTIFICATION_MSG = {\n \"success\": {\n title: \"NOTIFICATION.OK\",\n message: \"NOTIFICATION.SAVED\"\n },\n \"error\": {\n title: \"NOTIFICATION.WARNING\",\n message: \"NOTIFICATION.WARNING_TEXT\"\n },\n \"light-error\": {\n title: \"NOTIFICATION.WARNING\",\n message: \"NOTIFICATION.WARNING_TEXT\"\n }\n };\n\n ConfirmService = (function(superClass) {\n extend(ConfirmService, superClass);\n\n ConfirmService.$inject = [\"$q\", \"lightboxService\", \"$tgLoading\", \"$translate\"];\n\n function ConfirmService(q, lightboxService, loading, translate) {\n this.q = q;\n this.lightboxService = lightboxService;\n this.loading = loading;\n this.translate = translate;\n bindMethods(this);\n }\n\n ConfirmService.prototype.hide = function(el) {\n if (el) {\n this.lightboxService.close(el);\n return el.off(\".confirm-dialog\");\n }\n };\n\n ConfirmService.prototype.ask = function(title, subtitle, message, lightboxSelector) {\n var defered, el;\n if (lightboxSelector == null) {\n lightboxSelector = \".lightbox-generic-ask\";\n }\n defered = this.q.defer();\n el = angular.element(lightboxSelector);\n if (title) {\n el.find(\".title\").text(title);\n }\n if (subtitle) {\n el.find(\".subtitle\").text(subtitle);\n }\n if (message) {\n el.find(\".message\").text(message);\n }\n el.on(\"click.confirm-dialog\", \".button-green\", debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n currentLoading = _this.loading().target(target).start();\n return defered.resolve({\n finish: function(ok) {\n if (ok == null) {\n ok = true;\n }\n currentLoading.finish();\n if (ok) {\n return _this.hide(el);\n }\n }\n });\n };\n })(this)));\n el.on(\"click.confirm-dialog\", \".button-red\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.reject();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.askOnDelete = function(title, message, subtitle) {\n if (subtitle == null) {\n subtitle = this.translate.instant(\"NOTIFICATION.ASK_DELETE\");\n }\n return this.ask(title, subtitle, message);\n };\n\n ConfirmService.prototype.askChoice = function(title, subtitle, choices, replacement, warning, lightboxSelector) {\n var choicesField, defered, el;\n if (lightboxSelector == null) {\n lightboxSelector = \".lightbox-ask-choice\";\n }\n defered = this.q.defer();\n el = angular.element(lightboxSelector);\n el.find(\".title\").text(title);\n el.find(\".subtitle\").text(subtitle);\n if (replacement) {\n el.find(\".replacement\").text(replacement);\n } else {\n el.find(\".replacement\").remove();\n }\n if (warning) {\n el.find(\".warning\").text(warning);\n } else {\n el.find(\".warning\").remove();\n }\n choicesField = el.find(\".choices\");\n choicesField.html('');\n _.each(choices, function(value, key) {\n value = _.escape(value);\n return choicesField.append(angular.element(\"\"));\n });\n el.on(\"click.confirm-dialog\", \"a.button-green\", debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n currentLoading = _this.loading().target(target).start();\n return defered.resolve({\n selected: choicesField.val(),\n finish: function(ok) {\n if (ok == null) {\n ok = true;\n }\n currentLoading.finish();\n if (ok) {\n return _this.hide(el);\n }\n }\n });\n };\n })(this)));\n el.on(\"click.confirm-dialog\", \".button-red\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.reject();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.error = function(message) {\n var defered, el;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-error\");\n el.find(\".title\").html(message);\n el.on(\"click.confirm-dialog\", \".button-green\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n el.on(\"click.confirm-dialog\", \".close\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.success = function(title, message, icon) {\n var defered, detailImage, el, svgContainer, useSVG;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-success\");\n el.find(\"img\").remove();\n el.find(\"svg\").remove();\n if (icon) {\n if (icon.type === \"img\") {\n detailImage = $('').addClass('lb-icon').attr('src', icon.name);\n } else if (icon.type === \"svg\") {\n detailImage = document.createElement(\"div\");\n taiga.addClass(detailImage, \"icon\");\n taiga.addClass(detailImage, icon.name);\n taiga.addClass(detailImage, \"lb-icon\");\n svgContainer = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n useSVG = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n useSVG.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#' + icon.name);\n detailImage.appendChild(svgContainer).appendChild(useSVG);\n }\n if (detailImage) {\n el.find('section').prepend(detailImage);\n }\n }\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n el.on(\"click.confirm-dialog\", \".button-green\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n el.on(\"click.confirm-dialog\", \".close\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.loader = function(title, message, spin) {\n var el;\n if (spin == null) {\n spin = false;\n }\n el = angular.element(\".lightbox-generic-loading\");\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n if (spin) {\n el.find(\".spin\").removeClass(\"hidden\");\n }\n return {\n start: (function(_this) {\n return function() {\n return _this.lightboxService.open(el);\n };\n })(this),\n stop: (function(_this) {\n return function() {\n return _this.lightboxService.close(el);\n };\n })(this),\n update: (function(_this) {\n return function(status, title, message, percent) {\n if (title) {\n el.find(\".title\").html(title);\n }\n if (message) {\n el.find(\".message\").html(message);\n }\n if (percent) {\n el.find(\".spin\").addClass(\"hidden\");\n el.find(\".progress-bar-wrapper\").removeClass(\"hidden\");\n el.find(\".progress-bar-wrapper > .bar\").width(percent + '%');\n return el.find(\".progress-bar-wrapper > span\").html(percent + '%').css('left', (percent - 9) + '%');\n } else {\n el.find(\".spin\").removeClass(\"hidden\");\n return el.find(\".progress-bar-wrapper\").addClass(\"hidden\");\n }\n };\n })(this)\n };\n };\n\n ConfirmService.prototype.notify = function(type, message, title, time) {\n var body, el, selector;\n selector = \".notification-message-\" + type;\n el = angular.element(selector);\n if (el.hasClass(\"active\")) {\n return;\n }\n if (title) {\n el.find(\"h4\").html(title);\n } else {\n el.find(\"h4\").html(this.translate.instant(NOTIFICATION_MSG[type].title));\n }\n if (message) {\n el.find(\"p\").html(message);\n } else {\n el.find(\"p\").html(this.translate.instant(NOTIFICATION_MSG[type].message));\n }\n body = angular.element(\"body\");\n body.find(\".notification-message .notification-light\").removeClass('active').addClass('inactive');\n body.find(selector).removeClass('inactive').addClass('active');\n if (this.tsem) {\n cancelTimeout(this.tsem);\n }\n if (!time) {\n time = type === 'error' || type === 'light-error' ? 3500 : 1500;\n }\n this.tsem = timeout(time, (function(_this) {\n return function() {\n body.find(selector).removeClass('active').addClass('inactive').one('animationend', function() {\n return $(this).removeClass('inactive');\n });\n return delete _this.tsem;\n };\n })(this));\n return el.on(\"click\", \".icon-close, .close\", (function(_this) {\n return function(event) {\n return body.find(selector).removeClass('active').addClass('inactive');\n };\n })(this));\n };\n\n return ConfirmService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaCommon\");\n\n module.service(\"$tgConfirm\", ConfirmService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/custom-field-values.coffee\n */\n\n(function() {\n var CustomAttributeValueDirective, CustomAttributesValuesController, CustomAttributesValuesDirective, DATE_TYPE, MULTILINE_TYPE, RICHTEXT_TYPE, TEXT_TYPE, TYPE_CHOICES, URL_TYPE, bindMethods, bindOnce, debounce, generateHash, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n bindMethods = this.taiga.bindMethods;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n generateHash = taiga.generateHash;\n\n module = angular.module(\"taigaCommon\");\n\n TEXT_TYPE = \"text\";\n\n RICHTEXT_TYPE = \"url\";\n\n MULTILINE_TYPE = \"multiline\";\n\n DATE_TYPE = \"date\";\n\n URL_TYPE = \"url\";\n\n TYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n }, {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }, {\n key: URL_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL\"\n }, {\n key: RICHTEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT\"\n }\n ];\n\n CustomAttributesValuesController = (function(superClass) {\n extend(CustomAttributesValuesController, superClass);\n\n CustomAttributesValuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$q\"];\n\n function CustomAttributesValuesController(scope1, rootscope, repo, rs, confirm, q) {\n this.scope = scope1;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.confirm = confirm;\n this.q = q;\n bindMethods(this);\n this.type = null;\n this.objectId = null;\n this.projectId = null;\n this.customAttributes = [];\n this.customAttributesValues = null;\n }\n\n CustomAttributesValuesController.prototype.initialize = function(type, objectId) {\n this.project = this.scope.project;\n this.type = type;\n this.objectId = objectId;\n return this.projectId = this.scope.projectId;\n };\n\n CustomAttributesValuesController.prototype.loadCustomAttributesValues = function() {\n if (!this.objectId) {\n return this.customAttributesValues;\n }\n return this.rs.customAttributesValues[this.type].get(this.objectId).then((function(_this) {\n return function(customAttributesValues) {\n _this.customAttributes = _this.project[_this.type + \"_custom_attributes\"];\n _this.customAttributesValues = customAttributesValues;\n return customAttributesValues;\n };\n })(this));\n };\n\n CustomAttributesValuesController.prototype.getAttributeValue = function(attribute) {\n var attributeValue;\n attributeValue = _.clone(attribute, false);\n attributeValue.value = this.customAttributesValues.attributes_values[attribute.id];\n return attributeValue;\n };\n\n CustomAttributesValuesController.prototype.updateAttributeValue = function(attributeValue) {\n var attributesValues, onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"custom-attributes-values:edit\");\n };\n })(this);\n onError = (function(_this) {\n return function(response) {\n _this.confirm.notify(\"error\");\n return _this.q.reject();\n };\n })(this);\n attributesValues = _.clone(this.customAttributesValues.attributes_values, true);\n attributesValues[attributeValue.id] = attributeValue.value;\n this.customAttributesValues.attributes_values = attributesValues;\n this.customAttributesValues.id = this.objectId;\n return this.repo.save(this.customAttributesValues).then(onSuccess, onError);\n };\n\n return CustomAttributesValuesController;\n\n })(taiga.Controller);\n\n CustomAttributesValuesDirective = function($templates, $storage) {\n var collapsedHash, link, template, templateFn;\n template = $templates.get(\"custom-attributes/custom-attributes-values.html\", true);\n collapsedHash = function(type) {\n return generateHash([\"custom-attributes-collapsed\", type]);\n };\n link = function($scope, $el, $attrs, $ctrls) {\n var $ctrl, $model, hash;\n $ctrl = $ctrls[0];\n $model = $ctrls[1];\n hash = collapsedHash($attrs.type);\n $scope.collapsed = $storage.get(hash) || false;\n bindOnce($scope, $attrs.ngModel, function(value) {\n $ctrl.initialize($attrs.type, value.id);\n return $ctrl.loadCustomAttributesValues();\n });\n $scope.toggleCollapse = function() {\n $scope.collapsed = !$scope.collapsed;\n return $storage.set(hash, $scope.collapsed);\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n templateFn = function($el, $attrs) {\n return template({\n requiredEditionPerm: $attrs.requiredEditionPerm\n });\n };\n return {\n require: [\"tgCustomAttributesValues\", \"ngModel\"],\n controller: CustomAttributesValuesController,\n controllerAs: \"ctrl\",\n restrict: \"AE\",\n scope: true,\n link: link,\n template: templateFn\n };\n };\n\n module.directive(\"tgCustomAttributesValues\", [\"$tgTemplate\", \"$tgStorage\", \"$translate\", CustomAttributesValuesDirective]);\n\n CustomAttributeValueDirective = function($template, $selectedText, $compile, $translate, datePickerConfigService, wysiwygService) {\n var link, template, templateEdit;\n template = $template.get(\"custom-attributes/custom-attribute-value.html\", true);\n templateEdit = $template.get(\"custom-attributes/custom-attribute-value-edit.html\", true);\n link = function($scope, $el, $attrs, $ctrl) {\n var attributeValue, isEditable, prettyDate, render, setFocusAndSelectOnInputField, submit;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n render = function(attributeValue, edit) {\n var ctx, datePickerConfig, editable, html, scope, value;\n if (edit == null) {\n edit = false;\n }\n if (attributeValue.type === DATE_TYPE && attributeValue.value) {\n value = moment(attributeValue.value, \"YYYY-MM-DD\").format(prettyDate);\n } else {\n value = attributeValue.value;\n }\n editable = isEditable();\n ctx = {\n id: attributeValue.id,\n name: attributeValue.name,\n description: attributeValue.description,\n value: value,\n isEditable: editable,\n type: attributeValue.type\n };\n scope = $scope.$new();\n scope.attributeHtml = wysiwygService.getHTML(value);\n if (editable && (edit || !value)) {\n html = templateEdit(ctx);\n html = $compile(html)(scope);\n $el.html(html);\n if (attributeValue.type === DATE_TYPE) {\n datePickerConfig = datePickerConfigService.get();\n _.merge(datePickerConfig, {\n field: $el.find(\"input[name=value]\")[0],\n onSelect: (function(_this) {\n return function(date) {\n var selectedDate;\n return selectedDate = date;\n };\n })(this),\n onOpen: (function(_this) {\n return function() {\n if (typeof selectedDate !== \"undefined\" && selectedDate !== null) {\n return $el.picker.setDate(selectedDate);\n }\n };\n })(this)\n });\n return $el.picker = new Pikaday(datePickerConfig);\n }\n } else {\n html = template(ctx);\n html = $compile(html)(scope);\n return $el.html(html);\n }\n };\n isEditable = function() {\n var permissions, requiredEditionPerm;\n permissions = $scope.project.my_permissions;\n requiredEditionPerm = $attrs.requiredEditionPerm;\n return permissions.indexOf(requiredEditionPerm) > -1;\n };\n $scope.saveCustomRichText = (function(_this) {\n return function(markdown, callback) {\n attributeValue.value = markdown;\n return $ctrl.updateAttributeValue(attributeValue).then(function() {\n callback();\n return render(attributeValue, false);\n });\n };\n })(this);\n $scope.cancelCustomRichText = (function(_this) {\n return function() {\n render(attributeValue, false);\n return null;\n };\n })(this);\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var form, input;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n input = $el.find(\"input[name=value], textarea[name='value']\");\n attributeValue.value = input.val();\n if (attributeValue.type === DATE_TYPE) {\n if (moment(attributeValue.value, prettyDate).isValid()) {\n attributeValue.value = moment(attributeValue.value, prettyDate).format(\"YYYY-MM-DD\");\n }\n }\n return $scope.$apply(function() {\n return $ctrl.updateAttributeValue(attributeValue).then(function() {\n return render(attributeValue, false);\n });\n });\n };\n })(this));\n setFocusAndSelectOnInputField = function() {\n return $el.find(\"input[name='value'], textarea[name='value']\").focus().select();\n };\n attributeValue = $scope.$eval($attrs.tgCustomAttributeValue);\n if (attributeValue.value === null || attributeValue.value === void 0) {\n attributeValue.value = \"\";\n }\n $scope.customAttributeValue = attributeValue;\n render(attributeValue);\n $el.on(\"click\", \".js-value-view-mode span a\", function(event) {\n return event.stopPropagation();\n });\n $el.on(\"click\", \".js-value-view-mode\", function() {\n if (!isEditable()) {\n return;\n }\n if ($selectedText.get().length) {\n return;\n }\n render(attributeValue, true);\n return setFocusAndSelectOnInputField();\n });\n $el.on(\"click\", \".js-edit-description\", function(event) {\n event.preventDefault();\n render(attributeValue, true);\n return setFocusAndSelectOnInputField();\n });\n $el.on(\"keyup\", \"input[name=value], textarea[name='value']\", function(event) {\n if (event.keyCode === 13 && event.currentTarget.type !== \"textarea\") {\n return submit(event);\n } else if (event.keyCode === 27) {\n return render(attributeValue, false);\n }\n });\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".js-save-description\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"^tgCustomAttributesValues\",\n restrict: \"AE\"\n };\n };\n\n module.directive(\"tgCustomAttributeValue\", [\"$tgTemplate\", \"$selectedText\", \"$compile\", \"$translate\", \"tgDatePickerConfigService\", \"tgWysiwygService\", CustomAttributeValueDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/analytics.coffee\n */\n\n(function() {\n var EmojisService, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n EmojisService = (function(superClass) {\n extend(EmojisService, superClass);\n\n EmojisService.$inject = [];\n\n function EmojisService() {\n this.replaceEmojiNameByHtmlImgs = bind(this.replaceEmojiNameByHtmlImgs, this);\n this.replaceEmojiNameByImgs = bind(this.replaceEmojiNameByImgs, this);\n this.replaceImgsByEmojiName = bind(this.replaceImgsByEmojiName, this);\n this.getEmojiByName = bind(this.getEmojiByName, this);\n this.getEmojiById = bind(this.getEmojiById, this);\n this.searchByName = bind(this.searchByName, this);\n this.emojis = _.map(taiga.emojis, function(it) {\n it.image = (\"/\" + window._version + \"/emojis/\") + it.image;\n return it;\n });\n this.emojisById = _.keyBy(this.emojis, 'id');\n this.emojisByName = _.keyBy(this.emojis, 'name');\n }\n\n EmojisService.prototype.searchByName = function(name) {\n return _.filter(this.emojis, function(it) {\n return it.name.indexOf(name) !== -1;\n });\n };\n\n EmojisService.prototype.getEmojiById = function(id) {\n return this.emojisById[id];\n };\n\n EmojisService.prototype.getEmojiByName = function(name) {\n return this.emojisByName[name];\n };\n\n EmojisService.prototype.replaceImgsByEmojiName = function(html) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(html, /emojis\\/([^\"]+).png\"/gi);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(']+\\>', 'g');\n emoji = this.getEmojiById(emojiId);\n html = html.replace(regexImgs, ':' + emoji.name + ':');\n }\n return html;\n };\n\n EmojisService.prototype.replaceEmojiNameByImgs = function(text) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(text, /:([\\w +-]*):/g);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(':' + emojiId + ':', 'g');\n emoji = this.getEmojiByName(emojiId);\n if (emoji) {\n text = text.replace(regexImgs, '![alt](' + emoji.image + ')');\n }\n }\n return text;\n };\n\n EmojisService.prototype.replaceEmojiNameByHtmlImgs = function(text) {\n var emoji, emojiId, emojiIds, i, len, regexImgs;\n emojiIds = taiga.getMatches(text, /:([\\w +-]*):/g);\n for (i = 0, len = emojiIds.length; i < len; i++) {\n emojiId = emojiIds[i];\n regexImgs = new RegExp(':' + _.escapeRegExp(emojiId) + ':', 'g');\n emoji = this.getEmojiByName(emojiId);\n if (emoji) {\n text = text.replace(regexImgs, '');\n }\n }\n return text;\n };\n\n return EmojisService;\n\n })(taiga.Service);\n\n module.service(\"$tgEmojis\", EmojisService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/estimation.coffee\n */\n\n(function() {\n var EstimationsService, LbUsEstimationDirective, UsEstimationDirective, groupBy, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaCommon\");\n\n LbUsEstimationDirective = function($tgEstimationsService, $rootScope, $repo, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $scope.$watch($attrs.ngModel, function(us) {\n var estimationProcess;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId, points) {\n us.points = points;\n estimationProcess.render();\n return $scope.$apply(function() {\n return $model.$setViewValue(us);\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, template;\n ctx = {\n totalPoints: this.calculateTotalPoints(),\n roles: this.calculateRoles(),\n editable: this.isEditable,\n loading: false\n };\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\";\n template = $template.get(mainTemplate, true);\n html = template(ctx);\n html = $compile(html)($scope);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgLbUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgTemplate\", \"$compile\", LbUsEstimationDirective]);\n\n UsEstimationDirective = function($tgEstimationsService, $rootScope, $repo, $template, $compile, $modelTransform, $confirm) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = function(points) {\n var onError, transform;\n transform = $modelTransform.save((function(_this) {\n return function(us) {\n us.points = points;\n return us;\n };\n })(this));\n onError = (function(_this) {\n return function() {\n return $confirm.notify(\"error\");\n };\n })(this);\n return transform.then(null, onError);\n };\n $scope.$watchCollection(function() {\n return $model.$modelValue && $model.$modelValue.points;\n }, function() {\n var estimationProcess, us;\n us = $model.$modelValue;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId, points) {\n estimationProcess.loading = roleId;\n estimationProcess.render();\n return save(points).then(function() {\n estimationProcess.loading = false;\n $rootScope.$broadcast(\"object:updated\");\n return estimationProcess.render();\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, template;\n ctx = {\n totalPoints: this.calculateTotalPoints(),\n roles: this.calculateRoles(),\n editable: this.isEditable,\n loading: estimationProcess.loading\n };\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\";\n template = $template.get(mainTemplate, true);\n html = template(ctx);\n html = $compile(html)($scope);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgTemplate\", \"$compile\", \"$tgQueueModelTransformation\", \"$tgConfirm\", UsEstimationDirective]);\n\n EstimationsService = function($template, $repo, $confirm, $q, $qqueue) {\n var EstimationProcess, create, pointsTemplate;\n pointsTemplate = $template.get(\"common/estimation/us-estimation-points.html\", true);\n EstimationProcess = (function() {\n function EstimationProcess($el1, us1, project1) {\n this.$el = $el1;\n this.us = us1;\n this.project = project1;\n this.bindClickEvents = bind(this.bindClickEvents, this);\n this.isEditable = this.project.my_permissions.indexOf(\"modify_us\") !== -1;\n this.roles = this.project.roles;\n this.points = this.project.points;\n this.loading = false;\n this.pointsById = groupBy(this.points, function(x) {\n return x.id;\n });\n this.onSelectedPointForRole = function(roleId, pointId) {};\n this.render = function() {};\n }\n\n EstimationProcess.prototype.save = function(roleId, pointId) {\n var deferred;\n deferred = $q.defer();\n $qqueue.add((function(_this) {\n return function() {\n var onError, onSuccess;\n onSuccess = function() {\n deferred.resolve();\n return _this.render();\n };\n onError = function() {\n $confirm.notify(\"error\");\n _this.us.revert();\n _this.render();\n return deferred.reject();\n };\n return $repo.save(_this.us).then(onSuccess, onError);\n };\n })(this));\n return deferred.promise;\n };\n\n EstimationProcess.prototype.calculateTotalPoints = function() {\n var notNullValues, values;\n values = _.map(this.us.points, (function(_this) {\n return function(v, k) {\n var ref;\n return (ref = _this.pointsById[v]) != null ? ref.value : void 0;\n };\n })(this));\n if (values.length === 0) {\n return \"?\";\n }\n notNullValues = _.filter(values, function(v) {\n return v != null;\n });\n if (notNullValues.length === 0) {\n return \"?\";\n }\n return _.reduce(notNullValues, function(acc, num) {\n return acc + num;\n });\n };\n\n EstimationProcess.prototype.calculateRoles = function() {\n var computableRoles, roles;\n computableRoles = _.filter(this.project.roles, \"computable\");\n roles = _.map(computableRoles, (function(_this) {\n return function(role) {\n var pointId, pointObj;\n pointId = _this.us.points[role.id];\n pointObj = _this.pointsById[pointId];\n role = _.clone(role, true);\n role.points = (pointObj != null) && (pointObj.name != null) ? pointObj.name : \"?\";\n return role;\n };\n })(this));\n return roles;\n };\n\n EstimationProcess.prototype.bindClickEvents = function() {\n this.$el.on(\"click\", \".total.clickable\", (function(_this) {\n return function(event) {\n var roleId, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n roleId = target.data(\"role-id\");\n _this.renderPointsSelector(roleId, target);\n target.siblings().removeClass('active');\n return target.addClass('active');\n };\n })(this));\n return this.$el.on(\"click\", \".point\", (function(_this) {\n return function(event) {\n var pointId, points, roleId, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n roleId = target.data(\"role-id\");\n pointId = target.data(\"point-id\");\n _this.$el.find(\".popover\").popover().close();\n points = _.clone(_this.us.points, true);\n points[roleId] = pointId;\n return _this.onSelectedPointForRole(roleId, pointId, points);\n };\n })(this));\n };\n\n EstimationProcess.prototype.renderPointsSelector = function(roleId, target) {\n var horizontalList, html, maxPointLength, points, pop;\n points = _.map(this.points, (function(_this) {\n return function(point) {\n point = _.clone(point, true);\n point.selected = _this.us.points[roleId] === point.id ? false : true;\n return point;\n };\n })(this));\n maxPointLength = 5;\n horizontalList = _.some(points, (function(_this) {\n return function(point) {\n return point.name.length > maxPointLength;\n };\n })(this));\n html = pointsTemplate({\n \"points\": points,\n roleId: roleId,\n horizontal: horizontalList\n });\n this.$el.find(\".popover\").popover().close();\n this.$el.find(\".pop-points-open\").remove();\n if (target != null) {\n this.$el.find(target).append(html);\n } else {\n this.$el.append(html);\n }\n this.$el.find(\".pop-points-open\").popover().open(function() {\n return $(this).removeClass(\"active\").closest(\"li\").removeClass(\"active\");\n });\n this.$el.find(\".pop-points-open\").show();\n pop = this.$el.find(\".pop-points-open\");\n if (pop.offset().top + pop.height() > document.body.clientHeight) {\n return pop.addClass('pop-bottom');\n }\n };\n\n return EstimationProcess;\n\n })();\n create = function($el, us, project) {\n var estimationProcess;\n $el.unbind(\"click\");\n estimationProcess = new EstimationProcess($el, us, project);\n if (estimationProcess.isEditable) {\n estimationProcess.bindClickEvents();\n }\n return estimationProcess;\n };\n return {\n create: create\n };\n };\n\n module.factory(\"$tgEstimationsService\", [\"$tgTemplate\", \"$tgRepo\", \"$tgConfirm\", \"$q\", \"$tgQqueue\", EstimationsService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/filters.coffee\n */\n\n(function() {\n var byRefFilter, darkerFilter, defaultFilter, emojify, inArray, markdownToHTML, module, momentFormat, momentFromNow, sizeFormat, taiga, toMutableFilter, unslugify, yesNoFilter;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n defaultFilter = function() {\n return function(value, defaultValue) {\n if (value === [null, void 0]) {\n return defaultValue;\n }\n return value;\n };\n };\n\n module.filter(\"default\", defaultFilter);\n\n yesNoFilter = function($translate) {\n return function(value) {\n if (value) {\n return $translate.instant(\"COMMON.YES\");\n }\n return $translate.instant(\"COMMON.NO\");\n };\n };\n\n module.filter(\"yesNo\", [\"$translate\", yesNoFilter]);\n\n unslugify = function() {\n return taiga.unslugify;\n };\n\n module.filter(\"unslugify\", unslugify);\n\n momentFormat = function() {\n return function(input, format) {\n if (input) {\n return moment(input).format(format);\n }\n return \"\";\n };\n };\n\n module.filter(\"momentFormat\", momentFormat);\n\n momentFromNow = function() {\n return function(input, without_suffix) {\n if (input) {\n return moment(input).fromNow(without_suffix || false);\n }\n return \"\";\n };\n };\n\n module.filter(\"momentFromNow\", momentFromNow);\n\n sizeFormat = (function(_this) {\n return function() {\n return _this.taiga.sizeFormat;\n };\n })(this);\n\n module.filter(\"sizeFormat\", sizeFormat);\n\n toMutableFilter = function() {\n var memoizedMutable, toMutable;\n toMutable = function(js) {\n return js.toJS();\n };\n memoizedMutable = _.memoize(toMutable);\n return function(input) {\n if (input instanceof Immutable.List) {\n return memoizedMutable(input);\n }\n return input;\n };\n };\n\n module.filter(\"toMutable\", toMutableFilter);\n\n byRefFilter = function($filterFilter) {\n return function(userstories, filter) {\n var cleanRef;\n if (filter != null ? filter.startsWith(\"#\") : void 0) {\n cleanRef = filter.substr(1);\n return _.filter(userstories, (function(_this) {\n return function(us) {\n return String(us.ref).startsWith(cleanRef);\n };\n })(this));\n }\n return $filterFilter(userstories, filter);\n };\n };\n\n module.filter(\"byRef\", [\"filterFilter\", byRefFilter]);\n\n darkerFilter = function() {\n return function(color, luminosity) {\n var black, c, i, j, len, newColor, ref, white;\n color = new String(color).replace(/[^0-9a-f]/gi, '');\n if (color.length < 6) {\n color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];\n }\n luminosity = luminosity || 0;\n newColor = \"#\";\n c = 0;\n i = 0;\n black = 0;\n white = 255;\n ref = [0, 1, 2];\n for (j = 0, len = ref.length; j < len; j++) {\n i = ref[j];\n c = parseInt(color.substr(i * 2, 2), 16);\n c = Math.round(Math.min(Math.max(black, c + (luminosity * white)), white)).toString(16);\n newColor += (\"00\" + c).substr(c.length);\n }\n return newColor;\n };\n };\n\n module.filter(\"darker\", darkerFilter);\n\n markdownToHTML = function(wysiwigService) {\n return function(input) {\n if (input) {\n return wysiwigService.getHTML(input);\n }\n return \"\";\n };\n };\n\n module.filter(\"markdownToHTML\", [\"tgWysiwygService\", markdownToHTML]);\n\n inArray = function($filter) {\n return function(list, arrayFilter, element) {\n var filter;\n if (arrayFilter) {\n filter = $filter(\"filter\");\n return filter(list, function(listItem) {\n return arrayFilter.indexOf(listItem[element]) !== -1;\n });\n }\n };\n };\n\n module.filter(\"inArray\", [\"$filter\", inArray]);\n\n emojify = function($emojis) {\n return function(input) {\n if (input) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(input));\n }\n return \"\";\n };\n };\n\n module.filter(\"emojify\", [\"$tgEmojis\", emojify]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/lightboxes.coffee\n */\n\n(function() {\n var AssignedToLightboxDirective, AssignedUsersLightboxDirective, BlockLightboxDirective, BlockingMessageInputDirective, CreateBulkUserstoriesDirective, CreateEditUserstoryDirective, LightboxDirective, LightboxKeyboardNavigationService, LightboxLeaveProjectWarningDirective, LightboxService, SetDueDateDirective, WatchersLightboxDirective, bindOnce, debounce, module, sizeFormat, timeout, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n module = angular.module(\"taigaCommon\");\n\n bindOnce = this.taiga.bindOnce;\n\n timeout = this.taiga.timeout;\n\n debounce = this.taiga.debounce;\n\n sizeFormat = this.taiga.sizeFormat;\n\n trim = this.taiga.trim;\n\n LightboxService = (function(superClass) {\n extend(LightboxService, superClass);\n\n function LightboxService(animationFrame, q, rootScope) {\n this.animationFrame = animationFrame;\n this.q = q;\n this.rootScope = rootScope;\n }\n\n LightboxService.prototype.open = function($el, onClose, onEsc) {\n var defered, docEl, lightboxContent;\n this.onClose = onClose;\n if (_.isString($el)) {\n $el = $($el);\n }\n defered = this.q.defer();\n lightboxContent = $el.children().not(\".close\");\n lightboxContent.hide();\n this.animationFrame.add(function() {\n return $el.css('display', 'flex');\n });\n this.animationFrame.add(function() {\n $el.addClass(\"open\");\n return $el.one(\"transitionend\", (function(_this) {\n return function() {\n var firstField;\n firstField = $el.find('input:not(.no-focus),textarea:not(.no-focus)').first();\n if (firstField.length) {\n return firstField.focus();\n } else if (document.activeElement) {\n return $(document.activeElement).blur();\n }\n };\n })(this));\n });\n this.animationFrame.add((function(_this) {\n return function() {\n lightboxContent.show();\n return defered.resolve();\n };\n })(this));\n docEl = angular.element(document);\n docEl.on(\"keydown.lightbox\", (function(_this) {\n return function(e) {\n var code;\n code = e.keyCode ? e.keyCode : e.which;\n if (code === 27) {\n if (onEsc) {\n return _this.rootScope.$applyAsync(onEsc);\n } else {\n return _this.close($el);\n }\n }\n };\n })(this));\n return defered.promise;\n };\n\n LightboxService.prototype.close = function($el) {\n return new Promise((function(_this) {\n return function(resolve) {\n var docEl, scope;\n if (_.isString($el)) {\n $el = $($el);\n }\n docEl = angular.element(document);\n docEl.off(\".lightbox\");\n docEl.off(\".keyboard-navigation\");\n $el.addClass('close-started');\n _this.animationFrame.add(function() {\n $el.addClass('close');\n return $el.one(\"transitionend\", function() {\n $el.removeAttr('style');\n $el.removeClass(\"open\").removeClass('close').removeClass('close-started');\n if (_this.onClose) {\n _this.rootScope.$apply(_this.onClose);\n }\n return resolve();\n });\n });\n if ($el.hasClass(\"remove-on-close\")) {\n scope = $el.data(\"scope\");\n if (scope) {\n scope.$destroy();\n }\n return $el.remove();\n }\n };\n })(this));\n };\n\n LightboxService.prototype.getLightboxOpen = function() {\n return $(\".lightbox.open:not(.close-started)\");\n };\n\n LightboxService.prototype.closeAll = function() {\n var docEl, i, len, lightboxEl, ref, results;\n docEl = angular.element(document);\n ref = docEl.find(\".lightbox.open\");\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n lightboxEl = ref[i];\n results.push(this.close($(lightboxEl)));\n }\n return results;\n };\n\n return LightboxService;\n\n })(taiga.Service);\n\n module.service(\"lightboxService\", [\"animationFrame\", \"$q\", \"$rootScope\", LightboxService]);\n\n LightboxKeyboardNavigationService = (function(superClass) {\n extend(LightboxKeyboardNavigationService, superClass);\n\n function LightboxKeyboardNavigationService() {\n return LightboxKeyboardNavigationService.__super__.constructor.apply(this, arguments);\n }\n\n LightboxKeyboardNavigationService.prototype.stop = function() {\n var docEl;\n docEl = angular.element(document);\n return docEl.off(\".keyboard-navigation\");\n };\n\n LightboxKeyboardNavigationService.prototype.dispatch = function($el, code) {\n var activeElement, next, prev;\n activeElement = $el.find(\".selected\");\n if (code === 13) {\n if ($el.find(\".user-list-single\").length === 1) {\n return $el.find('.user-list-single:first').trigger(\"click\");\n } else {\n return activeElement.trigger(\"click\");\n }\n } else if (code === 40) {\n if (!activeElement.length) {\n return $el.find('.user-list-single:not(\".is-active\"):first').addClass('selected');\n } else {\n next = activeElement.next('.user-list-single');\n if (next.length) {\n activeElement.removeClass('selected');\n return next.addClass('selected');\n }\n }\n } else if (code === 38) {\n if (!activeElement.length) {\n return $el.find('.user-list-single:last').addClass('selected');\n } else {\n prev = activeElement.prev('.user-list-single:not(\".is-active\")');\n if (prev.length) {\n activeElement.removeClass('selected');\n return prev.addClass('selected');\n }\n }\n }\n };\n\n LightboxKeyboardNavigationService.prototype.init = function($el) {\n var docEl;\n this.stop();\n docEl = angular.element(document);\n return docEl.on(\"keydown.keyboard-navigation\", (function(_this) {\n return function(event) {\n var code;\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 40 || code === 38 || code === 13) {\n event.preventDefault();\n return _this.dispatch($el, code);\n }\n };\n })(this));\n };\n\n return LightboxKeyboardNavigationService;\n\n })(taiga.Service);\n\n module.service(\"lightboxKeyboardNavigationService\", LightboxKeyboardNavigationService);\n\n LightboxDirective = function(lightboxService) {\n var link;\n link = function($scope, $el, $attrs) {\n if (!$attrs.$attr.visible) {\n return $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n }\n };\n return {\n restrict: \"C\",\n link: link\n };\n };\n\n module.directive(\"lightbox\", [\"lightboxService\", LightboxDirective]);\n\n BlockLightboxDirective = function($rootscope, $tgrepo, $confirm, lightboxService, $loading, $modelTransform, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var block, title, unblock;\n title = $translate.instant($attrs.title);\n $el.find(\"h2.title\").text(title);\n unblock = (function(_this) {\n return function(finishCallback) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.is_blocked = false;\n item.blocked_note = \"\";\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n return finishCallback();\n });\n transform.then(null, function() {\n $confirm.notify(\"error\");\n return item.revert();\n });\n transform[\"finally\"](function() {\n return finishCallback();\n });\n return transform;\n };\n })(this);\n block = function() {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\".button-green\")).start();\n transform = $modelTransform.save(function(item) {\n item.is_blocked = true;\n item.blocked_note = $el.find(\".reason\").val();\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n $scope.$on(\"block\", function() {\n $el.find(\".reason\").val($model.$modelValue.blocked_note);\n return lightboxService.open($el);\n });\n $scope.$on(\"unblock\", (function(_this) {\n return function(event, model, finishCallback) {\n return unblock(finishCallback);\n };\n })(this));\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return block();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-block.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgLbBlock\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"lightboxService\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$translate\", BlockLightboxDirective]);\n\n BlockingMessageInputDirective = function($log, $template, $compile) {\n var link, template, templateFn;\n template = $template.get(\"common/lightbox/lightbox-blocking-message-input.html\", true);\n link = function($scope, $el, $attrs, $model) {\n if (!$attrs.watch) {\n return $log.error(\"No watch attribute on tg-blocking-message-input directive\");\n }\n return $scope.$watch($attrs.watch, function(value) {\n if (value === !void 0 && value === true) {\n return $el.find(\".blocked-note\").removeClass(\"hidden\");\n } else {\n return $el.find(\".blocked-note\").addClass(\"hidden\");\n }\n });\n };\n templateFn = function($el, $attrs) {\n return template({\n ngmodel: $attrs.ngModel\n });\n };\n return {\n template: templateFn,\n link: link,\n require: \"ngModel\",\n restrict: \"EA\"\n };\n };\n\n module.directive(\"tgBlockingMessageInput\", [\"$log\", \"$tgTemplate\", \"$compile\", BlockingMessageInputDirective]);\n\n CreateEditUserstoryDirective = function($repo, $model, $rs, $rootScope, lightboxService, $loading, $translate, $confirm, $q, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, close, createAttachments, deleteAttachments, form, resetAttachments, submit, submitButton;\n form = null;\n $scope.createEditUs = {};\n $scope.isNew = true;\n attachmentsToAdd = Immutable.List();\n attachmentsToDelete = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return attachmentsToDelete = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n if (attachment.get(\"id\")) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n }\n };\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.us.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([value, color]);\n return $scope.us.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.us.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.us.tags = itemtags;\n return _.pull($scope.us.tags, value);\n };\n $scope.$on(\"usform:new\", function(ctx, projectId, status, statusList) {\n if (form) {\n form.reset();\n }\n $scope.isNew = true;\n $scope.usStatusList = statusList;\n $scope.attachments = Immutable.List();\n resetAttachments();\n $scope.us = $model.make_model(\"userstories\", {\n project: projectId,\n points: {},\n status: status,\n is_archived: false,\n tags: [],\n subject: \"\",\n description: \"\"\n });\n $el.find(\".button-green\").html($translate.instant(\"COMMON.CREATE\"));\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.NEW_US\"));\n $el.find(\".tag-input\").val(\"\");\n $el.find(\".blocked-note\").addClass(\"hidden\");\n $el.find(\"label.blocked\").removeClass(\"selected\");\n $el.find(\"label.team-requirement\").removeClass(\"selected\");\n $el.find(\"label.client-requirement\").removeClass(\"selected\");\n $scope.createEditUsOpen = true;\n return lightboxService.open($el, function() {\n return $scope.createEditUsOpen = false;\n });\n });\n $scope.$on(\"usform:edit\", function(ctx, us, attachments) {\n if (form) {\n form.reset();\n }\n $scope.us = us;\n $scope.attachments = Immutable.fromJS(attachments);\n $scope.isNew = false;\n resetAttachments();\n $el.find(\".button-green\").html($translate.instant(\"COMMON.SAVE\"));\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.EDIT_US\"));\n $el.find(\".tag-input\").val(\"\");\n if (us.is_blocked) {\n $el.find(\".blocked-note\").removeClass(\"hidden\");\n $el.find(\"label.blocked\").addClass(\"selected\");\n } else {\n $el.find(\".blocked-note\").addClass(\"hidden\");\n $el.find(\"label.blocked\").removeClass(\"selected\");\n }\n if (us.team_requirement) {\n $el.find(\"label.team-requirement\").addClass(\"selected\");\n } else {\n $el.find(\"label.team-requirement\").removeClass(\"selected\");\n }\n if (us.client_requirement) {\n $el.find(\"label.client-requirement\").addClass(\"selected\");\n } else {\n $el.find(\"label.client-requirement\").removeClass(\"selected\");\n }\n $scope.createEditUsOpen = true;\n return lightboxService.open($el, function() {\n return $scope.createEditUsOpen = false;\n });\n });\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.us.project, 'us');\n });\n return $q.all(promises);\n };\n deleteAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"us\", attachment.id);\n });\n return $q.all(promises);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, params, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n params = {\n include_attachments: true,\n include_tasks: true\n };\n if ($scope.isNew) {\n promise = $repo.create(\"userstories\", $scope.us);\n broadcastEvent = \"usform:new:success\";\n } else {\n promise = $repo.save($scope.us, true);\n broadcastEvent = \"usform:edit:success\";\n }\n promise.then(function(data) {\n return deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this)).then((function(_this) {\n return function() {\n currentLoading.finish();\n lightboxService.close($el);\n return $rs.userstories.getByRef(data.project, data.ref, params).then(function(us) {\n return $rootScope.$broadcast(broadcastEvent, us);\n });\n };\n })(this));\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n close = (function(_this) {\n return function() {\n if (!$scope.us.isModified()) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.us.revert();\n });\n } else {\n return $confirm.ask($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.CONFIRM_CLOSE\")).then(function(result) {\n lightboxService.close($el);\n $scope.us.revert();\n return result.finish();\n });\n }\n };\n })(this);\n $el.on(\"submit\", \"form\", submit);\n $el.find('.close').on(\"click\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return close();\n });\n $el.keydown(function(event) {\n var code;\n event.stopPropagation();\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n return close();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.find('.close').off();\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateEditUserstory\", [\"$tgRepo\", \"$tgModel\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$translate\", \"$tgConfirm\", \"$q\", \"tgAttachmentsService\", CreateEditUserstoryDirective]);\n\n CreateBulkUserstoriesDirective = function($repo, $rs, $rootscope, lightboxService, $loading, $model) {\n var link;\n link = function($scope, $el, attrs) {\n var form, submit, submitButton;\n form = null;\n $scope.$on(\"usform:bulk\", function(ctx, projectId, status) {\n if (form) {\n form.reset();\n }\n $scope[\"new\"] = {\n projectId: projectId,\n statusId: status,\n bulk: \"\"\n };\n return lightboxService.open($el);\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley({\n onlyOneErrorElement: true\n });\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $rs.userstories.bulkCreate($scope[\"new\"].projectId, $scope[\"new\"].statusId, $scope[\"new\"].bulk);\n promise.then(function(result) {\n result = _.map(result.data, (function(_this) {\n return function(x) {\n return $model.make_model('userstories', x);\n };\n })(this));\n currentLoading.finish();\n $rootscope.$broadcast(\"usform:bulk:success\", result);\n return lightboxService.close($el);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateBulkUserstories\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$tgModel\", CreateBulkUserstoriesDirective]);\n\n AssignedToLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, filterUsers, normalizeString, render, selectedItem, selectedUser, usersTemplate;\n selectedUser = null;\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true);\n normalizeString = function(string) {\n var normalizedString;\n normalizedString = string;\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\");\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\");\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\");\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\");\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\");\n return normalizedString;\n };\n filterUsers = function(text, user) {\n var username;\n username = user.full_name_display.toUpperCase();\n username = normalizeString(username);\n text = text.toUpperCase();\n text = normalizeString(text);\n return _.includes(username, text);\n };\n render = function(selected, text) {\n var ctx, html, users, visibleUsers;\n users = _.clone($scope.activeUsers, true);\n if (selected != null) {\n users = _.reject(users, {\n \"id\": selected.id\n });\n }\n users = _.sortBy(users, function(o) {\n if (o.id === $scope.user.id) {\n return 0;\n } else {\n return o.id;\n }\n });\n if (text != null) {\n users = _.filter(users, _.partial(filterUsers, text));\n }\n visibleUsers = _.slice(users, 0, 5);\n visibleUsers = _.map(visibleUsers, function(user) {\n return user.avatar = avatarService.getAvatar(user);\n });\n if (selected) {\n if (selected) {\n selected.avatar = avatarService.getAvatar(selected);\n }\n }\n ctx = {\n selected: selected,\n users: _.slice(users, 0, 5),\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".assigned-to-list\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"assigned-to:add\", function(ctx, item) {\n var assignedToId;\n selectedItem = item;\n assignedToId = item.assigned_to;\n selectedUser = $scope.usersById[assignedToId];\n render(selectedUser);\n return lightboxService.open($el).then(function() {\n $el.find('input').focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n if (searchingText != null) {\n render(selectedUser, searchingText);\n return $el.find('input').focus();\n }\n });\n $el.on(\"click\", \".user-list-single\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n closeLightbox();\n return $scope.$apply(function() {\n $scope.$broadcast(\"assigned-to:added\", target.data(\"user-id\"), selectedItem);\n return $scope.usersSearch = null;\n });\n });\n $el.on(\"click\", \".remove-assigned-to\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n closeLightbox();\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"assigned-to:added\", null, selectedItem);\n });\n });\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n closeLightbox();\n return $scope.$apply(function() {\n return $scope.usersSearch = null;\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-assigned-to.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbAssignedto\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", \"tgAvatarService\", AssignedToLightboxDirective]);\n\n AssignedUsersLightboxDirective = function($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, filterUsers, normalizeString, render, selectedItem, selectedUsers, usersTemplate;\n selectedUsers = [];\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-users-users.html\", true);\n normalizeString = function(string) {\n var normalizedString;\n normalizedString = string;\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\");\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\");\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\");\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\");\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\");\n return normalizedString;\n };\n filterUsers = function(text, user) {\n var username;\n username = user.full_name_display.toUpperCase();\n username = normalizeString(username);\n text = text.toUpperCase();\n text = normalizeString(text);\n return _.includes(username, text);\n };\n render = function(assignedUsersIds, text) {\n var ctx, html, selected, users, visible;\n users = _.clone($scope.activeUsers, true);\n users = _.sortBy(users, function(o) {\n if (o.id === $scope.user.id) {\n return 0;\n } else {\n return o.id;\n }\n });\n if (text != null) {\n users = _.filter(users, _.partial(filterUsers, text));\n }\n selected = [];\n _.map(users, function(user) {\n var ref;\n if (ref = user.id, indexOf.call(assignedUsersIds, ref) >= 0) {\n user.avatar = avatarService.getAvatar(user);\n return selected.push(user);\n }\n });\n visible = [];\n _.map(users, function(user) {\n var ref;\n if (ref = user.id, indexOf.call(assignedUsersIds, ref) < 0) {\n user.avatar = avatarService.getAvatar(user);\n return visible.push(user);\n }\n });\n ctx = {\n selected: selected,\n users: _.slice(visible, 0, 5),\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".assigned-to-list\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"assigned-user:add\", function(ctx, item) {\n selectedItem = item;\n selectedUsers = item.assigned_users;\n render(selectedUsers);\n return lightboxService.open($el).then(function() {\n $el.find(\"input\").focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n if (searchingText != null) {\n render(selectedUsers, searchingText);\n return $el.find('input').focus();\n }\n });\n $el.on(\"click\", \".user-list-single\", debounce(200, function(event) {\n var target;\n closeLightbox();\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"assigned-user:added\", target.data(\"user-id\"), selectedItem);\n });\n }));\n $el.on(\"click\", \".remove-assigned-to\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n event.stopPropagation();\n $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"assigned-user:deleted\", target.data(\"user-id\"), selectedItem);\n });\n return closeLightbox();\n });\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return closeLightbox();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-assigned-users.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbAssignedUsers\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", \"tgAvatarService\", AssignedUsersLightboxDirective]);\n\n WatchersLightboxDirective = function($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile, avatarService) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, getFilteredUsers, render, selectedItem, usersTemplate;\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true);\n getFilteredUsers = function(text) {\n var _filterUsers, users;\n if (text == null) {\n text = \"\";\n }\n _filterUsers = function(text, user) {\n var username;\n if (selectedItem && _.find(selectedItem.watchers, function(x) {\n return x === user.id;\n })) {\n return false;\n }\n username = user.full_name_display.toUpperCase();\n text = text.toUpperCase();\n return _.includes(username, text);\n };\n users = _.clone($scope.activeUsers, true);\n users = _.filter(users, _.partial(_filterUsers, text));\n return users;\n };\n render = function(users) {\n var ctx, html, visibleUsers;\n visibleUsers = _.slice(users, 0, 5);\n visibleUsers = _.map(visibleUsers, function(user) {\n user.avatar = avatarService.getAvatar(user);\n return user;\n });\n ctx = {\n selected: false,\n users: visibleUsers,\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".ticket-watchers\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"watcher:add\", function(ctx, item) {\n var users;\n selectedItem = item;\n users = getFilteredUsers();\n render(users);\n return lightboxService.open($el).then(function() {\n $el.find(\"input\").focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n var users;\n if (searchingText == null) {\n return;\n }\n users = getFilteredUsers(searchingText);\n render(users);\n return $el.find(\"input\").focus();\n });\n $el.on(\"click\", \".user-list-single\", debounce(200, function(event) {\n var target;\n closeLightbox();\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"watcher:added\", target.data(\"user-id\"));\n });\n }));\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n closeLightbox();\n return $scope.$apply(function() {\n return $scope.usersSearch = null;\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-users.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbWatchers\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", \"tgAvatarService\", WatchersLightboxDirective]);\n\n LightboxLeaveProjectWarningDirective = function(lightboxService, $template, $compile) {\n var link;\n link = function($scope, $el, attrs) {\n return lightboxService.open($el);\n };\n return {\n templateUrl: 'common/lightbox/lightbox-leave-project-warning.html',\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgLightboxLeaveProjectWarning\", [\"lightboxService\", LightboxLeaveProjectWarningDirective]);\n\n SetDueDateDirective = function(lightboxService, $loading, $translate, $confirm, $modelTransform) {\n var link;\n link = function($scope, $el, attrs) {\n var prettyDate, remove, save;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n lightboxService.open($el);\n if ($scope.object.due_date) {\n $scope.new_due_date = moment($scope.object.due_date).format(prettyDate);\n }\n $el.on(\"click\", \".suggestion\", function(event) {\n var quantity, target, unit, value;\n target = angular.element(event.currentTarget);\n quantity = target.data('quantity');\n unit = target.data('unit');\n value = moment().add(quantity, unit).format(prettyDate);\n return $el.find(\".due-date\").val(value);\n });\n save = function() {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\".submit-button\")).start();\n transform = $modelTransform.save(function(object) {\n var new_due_date;\n new_due_date = $('.due-date').val();\n object.due_date = new_due_date ? moment(new_due_date, prettyDate).format(\"YYYY-MM-DD\") : null;\n return object;\n });\n transform.then(function() {\n return $confirm.notify(\"success\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n $el.on(\"click\", \".submit-button\", function(event) {\n event.preventDefault();\n return save();\n });\n remove = function() {\n var message, subtitle, title;\n title = $translate.instant(\"LIGHTBOX.DELETE_DUE_DATE.TITLE\");\n subtitle = $translate.instant(\"LIGHTBOX.DELETE_DUE_DATE.SUBTITLE\");\n message = moment($scope.object.due_date).format(prettyDate);\n return $confirm.askOnDelete(title, message, subtitle).then(function(askResponse) {\n askResponse.finish();\n $('.due-date').val(null);\n $scope.object.due_date_reason = null;\n return save();\n });\n };\n return $el.on(\"click\", \".delete-due-date\", function(event) {\n event.preventDefault();\n return remove();\n });\n };\n return {\n templateUrl: 'common/lightbox/lightbox-due-date.html',\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgLbSetDueDate\", [\"lightboxService\", \"$tgLoading\", \"$translate\", \"$tgConfirm\", \"$tgQueueModelTransformation\", SetDueDateDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/loader.coffee\n */\n\n(function() {\n var Loader, LoaderDirective, module, sizeFormat, taiga, timeout;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaCommon\");\n\n LoaderDirective = function(tgLoader, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n tgLoader.onStart(function() {\n $(document.body).addClass(\"loader-active\");\n return $el.addClass(\"active\");\n });\n return tgLoader.onEnd(function() {\n $(document.body).removeClass(\"loader-active\");\n return $el.removeClass(\"active\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLoader\", [\"tgLoader\", \"$rootScope\", LoaderDirective]);\n\n Loader = function($rootscope) {\n var autoClose, config, lastResponseDate, open, pageLoaded, requestCount, start, startLoadTime;\n config = {\n minTime: 300\n };\n open = false;\n startLoadTime = 0;\n requestCount = 0;\n lastResponseDate = 0;\n pageLoaded = function(force) {\n var diff, endTime, timeoutValue;\n if (force == null) {\n force = false;\n }\n if (startLoadTime) {\n timeoutValue = 0;\n if (!force) {\n endTime = new Date().getTime();\n diff = endTime - startLoadTime;\n if (diff < config.minTime) {\n timeoutValue = config.minTime - diff;\n }\n }\n timeout(timeoutValue, function() {\n $rootscope.$broadcast(\"loader:end\");\n open = false;\n return window.prerenderReady = true;\n });\n }\n startLoadTime = 0;\n requestCount = 0;\n return lastResponseDate = 0;\n };\n autoClose = function() {\n var intervalAuto;\n return intervalAuto = setInterval((function() {\n if (lastResponseDate && requestCount === 0) {\n pageLoaded();\n return clearInterval(intervalAuto);\n }\n }), 50);\n };\n start = function() {\n startLoadTime = new Date().getTime();\n $rootscope.$broadcast(\"loader:start\");\n return open = true;\n };\n return {\n pageLoaded: pageLoaded,\n open: function() {\n return open;\n },\n start: function(auto) {\n if (auto == null) {\n auto = false;\n }\n if (!open) {\n start();\n if (auto) {\n return autoClose();\n }\n }\n },\n onStart: function(fn) {\n return $rootscope.$on(\"loader:start\", fn);\n },\n onEnd: function(fn) {\n return $rootscope.$on(\"loader:end\", fn);\n },\n logRequest: function() {\n return requestCount++;\n },\n logResponse: function() {\n requestCount--;\n return lastResponseDate = new Date().getTime();\n }\n };\n };\n\n Loader.$inject = [\"$rootScope\"];\n\n module.factory(\"tgLoader\", Loader);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/lightboxes.coffee\n */\n\n(function() {\n var LoadingDirective, TgLoadingService, module,\n slice = [].slice;\n\n module = angular.module(\"taigaCommon\");\n\n TgLoadingService = function($compile) {\n var spinner;\n spinner = \"loading...\";\n return function() {\n var service;\n service = {\n settings: {\n target: null,\n scope: null,\n classes: [],\n timeout: 0,\n template: null\n },\n target: function(target) {\n service.settings.target = target;\n return service;\n },\n scope: function(scope) {\n service.settings.scope = scope;\n return service;\n },\n template: function(template) {\n service.settings.template = template;\n return service;\n },\n removeClasses: function() {\n var classess;\n classess = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n service.settings.classes = classess;\n return service;\n },\n timeout: function(timeout) {\n service.settings.timeout = timeout;\n return service;\n },\n start: function() {\n var target, timeoutId;\n target = service.settings.target;\n service.settings.classes.map(function(className) {\n return target.removeClass(className);\n });\n if (!target.hasClass('loading') && !service.settings.template) {\n service.settings.template = target.html();\n }\n timeoutId = setTimeout((function() {\n if (!target.hasClass('loading')) {\n target.addClass('loading');\n return target.html(spinner);\n }\n }), service.settings.timeout);\n service.settings.timeoutId = timeoutId;\n return service;\n },\n finish: function() {\n var removeClasses, target, timeoutId;\n target = service.settings.target;\n timeoutId = service.settings.timeoutId;\n if (timeoutId) {\n clearTimeout(timeoutId);\n removeClasses = service.settings.classes;\n removeClasses.map(function(className) {\n return service.settings.target.addClass(className);\n });\n target.html(service.settings.template);\n target.removeClass('loading');\n if (service.settings.scope) {\n $compile(target.contents())(service.settings.scope);\n }\n }\n return service;\n }\n };\n return service;\n };\n };\n\n TgLoadingService.$inject = [\"$compile\"];\n\n module.factory(\"$tgLoading\", TgLoadingService);\n\n LoadingDirective = function($loading) {\n var link;\n link = function($scope, $el, attr) {\n var currentLoading, template;\n currentLoading = null;\n template = $el.html();\n return $scope.$watch(attr.tgLoading, (function(_this) {\n return function(showLoading) {\n if (showLoading) {\n return currentLoading = $loading().target($el).timeout(100).template(template).scope($scope).start();\n } else if (currentLoading) {\n return currentLoading.finish();\n }\n };\n })(this));\n };\n return {\n priority: 99999,\n link: link\n };\n };\n\n module.directive(\"tgLoading\", [\"$tgLoading\", LoadingDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/popovers.coffee\n */\n\n(function() {\n var RelatedTaskStatusDirective, UsStatusDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaCommon\");\n\n UsStatusDirective = function($repo, $template) {\n\n /*\n Print the status of a US and a popover to change it.\n - tg-us-status: The user story\n - on-update: Method call after US is updated\n \n Example:\n \n div.status(tg-us-status=\"us\" on-update=\"ctrl.loadSprintState()\")\n a.us-status(href=\"\", title=\"Status Name\")\n \n NOTE: This directive need 'usStatusById' and 'project'.\n */\n var link, template;\n template = $template.get(\"common/popover/popover-us-status.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, render, us;\n $ctrl = $el.controller();\n render = function(us) {\n var usStatusById, usStatusDom, usStatusDomParent;\n usStatusDomParent = $el.find(\".us-status\");\n usStatusDom = $el.find(\".us-status .us-status-bind\");\n usStatusById = $scope.usStatusById;\n if (usStatusById[us.status]) {\n usStatusDom.text(usStatusById[us.status].name);\n return usStatusDomParent.css(\"color\", usStatusById[us.status].color);\n }\n };\n $el.on(\"click\", \".us-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", debounce(2000, function(event) {\n var target, us;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n us = $scope.$eval($attrs.tgUsStatus);\n us.status = target.data(\"status-id\");\n render(us);\n $el.find(\".pop-status\").popover().close();\n return $scope.$apply(function() {\n return $repo.save(us).then(function() {\n return $scope.$eval($attrs.onUpdate);\n });\n });\n }));\n $scope.$on(\"userstories:loaded\", function() {\n return render($scope.$eval($attrs.tgUsStatus));\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n us = $scope.$eval($attrs.tgUsStatus);\n render(us);\n return bindOnce($scope, \"project\", function(project) {\n var html;\n html = template({\n \"statuses\": project.us_statuses\n });\n $el.append(html);\n if ($scope.project.my_permissions.indexOf(\"modify_us\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUsStatus\", [\"$tgRepo\", \"$tgTemplate\", UsStatusDirective]);\n\n RelatedTaskStatusDirective = function($repo, $template) {\n\n /*\n Print the status of a related task and a popover to change it.\n - tg-related-task-status: The related task\n - on-update: Method call after US is updated\n \n Example:\n \n div.status(tg-related-task-status=\"task\" on-update=\"ctrl.loadSprintState()\")\n a.task-status(href=\"\", title=\"Status Name\")\n \n NOTE: This directive need 'taskStatusById' and 'project'.\n */\n var link, selectionTemplate, updateTaskStatus;\n selectionTemplate = $template.get(\"common/popover/popover-related-task-status.html\", true);\n updateTaskStatus = function($el, task, taskStatusById) {\n var taskStatusDom, taskStatusDomParent;\n taskStatusDomParent = $el.find(\".us-status\");\n taskStatusDom = $el.find(\".task-status .task-status-bind\");\n if (taskStatusById[task.status]) {\n taskStatusDom.text(taskStatusById[task.status].name);\n return taskStatusDomParent.css('color', taskStatusById[task.status].color);\n }\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task;\n $ctrl = $el.controller();\n task = $scope.$eval($attrs.tgRelatedTaskStatus);\n notAutoSave = $scope.$eval($attrs.notAutoSave);\n autoSave = !notAutoSave;\n $el.on(\"click\", \".task-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n task.status = target.data(\"status-id\");\n $el.find(\".pop-status\").popover().close();\n updateTaskStatus($el, task, $scope.taskStatusById);\n if (autoSave) {\n return $scope.$apply(function() {\n return $repo.save(task).then(function() {\n $scope.$eval($attrs.onUpdate);\n return $scope.$emit(\"related-tasks:status-changed\");\n });\n });\n }\n }));\n $scope.$watch($attrs.tgRelatedTaskStatus, function() {\n task = $scope.$eval($attrs.tgRelatedTaskStatus);\n return updateTaskStatus($el, task, $scope.taskStatusById);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n $el.append(selectionTemplate({\n 'statuses': project.task_statuses\n }));\n updateTaskStatus($el, task, $scope.taskStatusById);\n if (project.my_permissions.indexOf(\"modify_task\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskStatus\", [\"$tgRepo\", \"$tgTemplate\", RelatedTaskStatusDirective]);\n\n $.fn.popover = function() {\n var $el, close, closeAll, closePopover, isVisible, open;\n $el = this;\n isVisible = (function(_this) {\n return function() {\n var docViewBottom, docViewLeft, docViewRight, docViewTop, docViewWidth, elemBottom, elemLeft, elemRight, elemTop, elemWidth;\n $el.css({\n \"display\": \"block\",\n \"visibility\": \"hidden\"\n });\n docViewTop = $(window).scrollTop();\n docViewBottom = docViewTop + $(window).height();\n docViewWidth = $(window).width();\n docViewRight = docViewWidth;\n docViewLeft = 0;\n elemTop = $el.offset().top;\n elemBottom = elemTop + $el.height();\n elemWidth = $el.width();\n elemLeft = $el.offset().left;\n elemRight = $el.offset().left + elemWidth;\n $el.css({\n \"display\": \"none\",\n \"visibility\": \"visible\"\n });\n return (elemBottom <= docViewBottom) && (elemTop >= docViewTop) && (elemLeft >= docViewLeft) && (elemRight <= docViewRight);\n };\n })(this);\n closePopover = (function(_this) {\n return function(onClose) {\n if (onClose) {\n onClose.call($el);\n }\n $el.fadeOut(function() {\n return $el.removeClass(\"active\").removeClass(\"fix\");\n });\n return $el.off(\"popup:close\");\n };\n })(this);\n closeAll = (function(_this) {\n return function() {\n return $(\".popover.active\").each(function() {\n return $(this).trigger(\"popup:close\");\n });\n };\n })(this);\n open = (function(_this) {\n return function(onClose) {\n if ($el.hasClass(\"active\")) {\n return close();\n } else {\n closeAll();\n if (!isVisible()) {\n $el.addClass(\"fix\");\n }\n $el.fadeIn(function() {\n $el.addClass(\"active\");\n $(document.body).off(\"popover\");\n return $(document.body).one(\"click.popover\", function() {\n return closeAll();\n });\n });\n return $el.on(\"popup:close\", function(e) {\n return closePopover(onClose);\n });\n }\n };\n })(this);\n close = (function(_this) {\n return function() {\n return $el.trigger(\"popup:close\");\n };\n })(this);\n return {\n open: open,\n close: close,\n closeAll: closeAll\n };\n };\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/raven-logger.coffee\n */\n\n(function() {\n var ExceptionHandlerFactory, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n ExceptionHandlerFactory = function($log, config) {\n var ravenConfig;\n this.config = config;\n ravenConfig = this.config.get(\"ravenConfig\", null);\n if (ravenConfig) {\n $log.debug(\"Using the RavenJS exception handler.\");\n Raven.config(ravenConfig).install();\n return function(exception, cause) {\n $log.error.apply($log, arguments);\n return Raven.captureException(exception);\n };\n } else {\n $log.debug(\"Using the default logging exception handler.\");\n return function(exception, cause) {\n return $log.error.apply($log, arguments);\n };\n }\n };\n\n module.factory(\"$exceptionHandler\", [\"$log\", \"$tgConfig\", ExceptionHandlerFactory]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/tags.coffee\n */\n\n(function() {\n var ColorizeTagsBacklogDirective, LbTagLineDirective, TagsDirective, bindOnce, module, taiga, trim,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n TagsDirective = function() {\n var formatter, link, parser;\n formatter = function(v) {\n if (_.isArray(v)) {\n return v.join(\", \");\n }\n return \"\";\n };\n parser = function(v) {\n var result;\n if (!v) {\n return [];\n }\n result = _(v.split(\",\")).map(function(x) {\n return _.trim(x);\n });\n return result.value();\n };\n link = function($scope, $el, $attrs, $ctrl) {\n $ctrl.$formatters.push(formatter);\n $ctrl.$parsers.push(parser);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n require: \"ngModel\",\n link: link\n };\n };\n\n module.directive(\"tgTags\", TagsDirective);\n\n ColorizeTagsBacklogDirective = function($emojis) {\n var link, template;\n template = _.template(\"<% _.each(tags, function(tag) { %>\\n <% if (tag[1] !== null) { %>\\n \\\"\\n title=\\\"<%- tag[0] %>\\\">\\n <%= emojify(tag[0]) %>\\n \\n <% } %>\\n<% }) %>\\n<% _.each(tags, function(tag) { %>\\n <% if (tag[1] === null) { %>\\n \\\">\\n <%= emojify(tag[0]) %>\\n \\n <% } %>\\n<% }) %>\");\n link = function($scope, $el, $attrs, $ctrl) {\n var render;\n render = function(tags) {\n var html;\n html = template({\n tags: tags,\n emojify: function(text) {\n return $emojis.replaceEmojiNameByHtmlImgs(_.escape(text));\n }\n });\n return $el.html(html);\n };\n $scope.$watch($attrs.tgColorizeBacklogTags, function(tags) {\n if (tags != null) {\n return render(tags);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgColorizeBacklogTags\", [\"$tgEmojis\", ColorizeTagsBacklogDirective]);\n\n LbTagLineDirective = function($rs, $template, $compile) {\n var COMMA_KEY, ENTER_KEY, autocomplete, link, templateTags;\n ENTER_KEY = 13;\n COMMA_KEY = 188;\n templateTags = $template.get(\"common/tag/lb-tag-line-tags.html\", true);\n autocomplete = null;\n link = function($scope, $el, $attrs, $model) {\n var addValue, deleteValue, hideSaveButton, renderTags, resetInput, saveInputTag, showSaveButton, withoutColors;\n withoutColors = _.has($attrs, \"withoutColors\");\n renderTags = function(tags, tagsColors) {\n var color, ctx, html;\n if (tagsColors == null) {\n tagsColors = [];\n }\n color = !withoutColors ? tagsColors[t] : null;\n ctx = {\n tags: _.map(tags, function(t) {\n return {\n name: t,\n style: color ? \"border-left: 5px solid \" + color : \"\"\n };\n })\n };\n html = $compile(templateTags(ctx))($scope);\n return $el.find(\".tags-container\").html(html);\n };\n showSaveButton = function() {\n return $el.find(\".save\").removeClass(\"hidden\");\n };\n hideSaveButton = function() {\n return $el.find(\".save\").addClass(\"hidden\");\n };\n resetInput = function() {\n $el.find(\"input\").val(\"\");\n return autocomplete.close();\n };\n addValue = function(value) {\n var tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue, false);\n if (tags == null) {\n tags = [];\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n $scope.$apply(function() {\n return $model.$setViewValue(tags);\n });\n return hideSaveButton();\n };\n deleteValue = function(value) {\n var tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue, false);\n tags = _.pull(tags, value);\n return $scope.$apply(function() {\n return $model.$setViewValue(tags);\n });\n };\n saveInputTag = function() {\n var value;\n value = $el.find(\"input\").val();\n addValue(value);\n return resetInput();\n };\n $el.on(\"keypress\", \"input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === ENTER_KEY) {\n event.preventDefault();\n return saveInputTag();\n } else if (String.fromCharCode(event.keyCode) === ',') {\n event.preventDefault();\n return saveInputTag();\n } else {\n if (target.val().length) {\n return showSaveButton();\n } else {\n return hideSaveButton();\n }\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return saveInputTag();\n });\n $el.on(\"click\", \".remove-tag\", function(event) {\n var target, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n value = target.siblings(\".tag-name\").text();\n return deleteValue(value);\n });\n bindOnce($scope, \"project\", function(project) {\n var input;\n input = $el.find(\"input\");\n autocomplete = new Awesomplete(input[0], {\n list: _.keys(project.tags_colors)\n });\n return input.on(\"awesomplete-selectcomplete\", function() {\n addValue(input.val());\n return input.val(\"\");\n });\n });\n $scope.$watch($attrs.ngModel, function(tags) {\n var ref, tagsColors;\n tagsColors = ((ref = $scope.project) != null ? ref.tags_colors : void 0) || [];\n return renderTags(tags, tagsColors);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\",\n templateUrl: \"common/tag/lb-tag-line.html\"\n };\n };\n\n module.directive(\"tgLbTagLine\", [\"$tgResources\", \"$tgTemplate\", \"$compile\", LbTagLineDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/lightboxes.coffee\n */\n\n(function() {\n var CreateEditSprint, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaBacklog\");\n\n CreateEditSprint = function($repo, $confirm, $rs, $rootscope, lightboxService, $loading, $translate) {\n var link;\n link = function($scope, $el, attrs) {\n var createSprint, form, getLastSprint, hasErrors, remove, resetSprint, submit, ussToAdd;\n hasErrors = false;\n createSprint = true;\n form = null;\n $scope.newSprint = {};\n ussToAdd = null;\n resetSprint = function() {\n if (form) {\n form.reset();\n }\n return $scope.newSprint = {\n project: null,\n name: null,\n estimated_start: null,\n estimated_finish: null\n };\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, estimated_end, estimated_start, newSprint, prettyDate, promise, submitButton, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n submitButton = $el.find(\".submit-button\");\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n hasErrors = true;\n $el.find(\".last-sprint-name\").addClass(\"disappear\");\n return;\n }\n hasErrors = false;\n broadcastEvent = null;\n estimated_start = $('.date-start').val();\n estimated_end = $('.date-end').val();\n if (createSprint) {\n newSprint = angular.copy($scope.newSprint);\n newSprint.estimated_start = moment(estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(estimated_end, prettyDate).format(\"YYYY-MM-DD\");\n promise = $repo.create(\"milestones\", newSprint);\n broadcastEvent = \"sprintform:create:success\";\n } else {\n newSprint = $scope.newSprint.realClone();\n newSprint.estimated_start = moment(estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(estimated_end, prettyDate).format(\"YYYY-MM-DD\");\n promise = $repo.save(newSprint);\n broadcastEvent = \"sprintform:edit:success\";\n }\n currentLoading = $loading().target(submitButton).start();\n promise.then(function(data) {\n currentLoading.finish();\n if (createSprint) {\n $scope.sprintsCounter += 1;\n }\n $scope.sprints = _.map($scope.sprints, function(it) {\n if (it.id === data.id) {\n return data;\n } else {\n return it;\n }\n });\n if (broadcastEvent === \"sprintform:create:success\" && ussToAdd) {\n $rootscope.$broadcast(broadcastEvent, data, ussToAdd);\n } else {\n $rootscope.$broadcast(broadcastEvent, data);\n }\n return lightboxService.close($el);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"light-error\", data._error_message);\n } else if (data.__all__) {\n return $confirm.notify(\"light-error\", data.__all__[0]);\n }\n });\n };\n })(this));\n remove = function() {\n var message, title;\n title = $translate.instant(\"LIGHTBOX.DELETE_SPRINT.TITLE\");\n message = $scope.newSprint.name;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onSuccess = function() {\n askResponse.finish();\n $scope.milestonesCounter -= 1;\n lightboxService.close($el);\n return $rootscope.$broadcast(\"sprintform:remove:success\", $scope.newSprint);\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove($scope.newSprint).then(onSuccess, onError);\n };\n })(this));\n };\n getLastSprint = function() {\n var openSprints, sortedSprints;\n openSprints = _.filter($scope.sprints, function(sprint) {\n return !sprint.closed;\n });\n sortedSprints = _.sortBy(openSprints, function(sprint) {\n return moment(sprint.estimated_finish, 'YYYY-MM-DD').format('X');\n });\n return sortedSprints[sortedSprints.length - 1];\n };\n $scope.$on(\"sprintform:create\", function(event, projectId, uss) {\n var estimatedFinish, estimatedStart, lastSprint, lastSprintNameDom, prettyDate, text;\n ussToAdd = uss;\n resetSprint();\n form = $el.find(\"form\").checksley();\n form.reset();\n createSprint = true;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.newSprint.project = projectId;\n $scope.newSprint.name = null;\n $scope.newSprint.slug = null;\n lastSprint = getLastSprint();\n estimatedStart = moment();\n if (lastSprint) {\n estimatedStart = moment(lastSprint.estimated_finish);\n } else if ($scope.newSprint.estimated_start) {\n estimatedStart = moment($scope.newSprint.estimated_start);\n }\n $scope.newSprint.estimated_start = estimatedStart.format(prettyDate);\n estimatedFinish = moment().add(2, \"weeks\");\n if (lastSprint) {\n estimatedFinish = moment(lastSprint.estimated_finish).add(2, \"weeks\");\n } else if ($scope.newSprint.estimated_finish) {\n estimatedFinish = moment($scope.newSprint.estimated_finish);\n }\n $scope.newSprint.estimated_finish = estimatedFinish.format(prettyDate);\n lastSprintNameDom = $el.find(\".last-sprint-name\");\n if ((lastSprint != null ? lastSprint.name : void 0) != null) {\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME\", {\n lastSprint: lastSprint.name\n });\n lastSprintNameDom.html(text);\n }\n $el.find(\".delete-sprint\").addClass(\"hidden\");\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.TITLE\");\n $el.find(\".title\").text(text);\n text = $translate.instant(\"COMMON.CREATE\");\n $el.find(\".button-green\").text(text);\n lightboxService.open($el);\n $el.find(\".sprint-name\").focus();\n return $el.find(\".last-sprint-name\").removeClass(\"disappear\");\n });\n $scope.$on(\"sprintform:edit\", function(ctx, sprint) {\n var editSprint, prettyDate, save;\n resetSprint();\n createSprint = false;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.$apply(function() {\n $scope.newSprint = sprint.realClone();\n $scope.newSprint.estimated_start = moment($scope.newSprint.estimated_start).format(prettyDate);\n return $scope.newSprint.estimated_finish = moment($scope.newSprint.estimated_finish).format(prettyDate);\n });\n $el.find(\".delete-sprint\").removeClass(\"hidden\");\n editSprint = $translate.instant(\"BACKLOG.EDIT_SPRINT\");\n $el.find(\".title\").text(editSprint);\n save = $translate.instant(\"COMMON.SAVE\");\n $el.find(\".button-green\").text(save);\n lightboxService.open($el);\n $el.find(\".sprint-name\").focus().select();\n return $el.find(\".last-sprint-name\").addClass(\"disappear\");\n });\n $el.on(\"keyup\", \".sprint-name\", function(event) {\n if ($el.find(\".sprint-name\").val().length > 0 || hasErrors) {\n return $el.find(\".last-sprint-name\").addClass(\"disappear\");\n } else {\n return $el.find(\".last-sprint-name\").removeClass(\"disappear\");\n }\n });\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".delete-sprint\", function(event) {\n event.preventDefault();\n return remove();\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return resetSprint();\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateEditSprint\", [\"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$translate\", CreateEditSprint]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/main.coffee\n */\n\n(function() {\n var BacklogController, BacklogDirective, BurndownBacklogGraphDirective, TgBacklogProgressBarDirective, ToggleBurndownVisibility, UsPointsDirective, UsRolePointsSelectorDirective, bindMethods, bindOnce, generateHash, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n generateHash = this.taiga.generateHash;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogController = (function(superClass) {\n extend(BacklogController, superClass);\n\n BacklogController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"$tgLoading\", \"tgResources\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\"];\n\n BacklogController.prototype.storeCustomFiltersName = 'backlog-custom-filters';\n\n BacklogController.prototype.storeFiltersName = 'backlog-filters';\n\n BacklogController.prototype.backlogOrder = {};\n\n BacklogController.prototype.milestonesOrder = {};\n\n function BacklogController(scope1, rootscope, repo, confirm, rs, params1, q, location, appMetaService, navUrls, events, analytics, translate, loading, rs2, modelTransform, errorHandlingService, storage, filterRemoteStorageService, projectService) {\n var promise;\n this.scope = scope1;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params1;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.loading = loading;\n this.rs2 = rs2;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService;\n bindMethods(this);\n this.backlogOrder = {};\n this.milestonesOrder = {};\n this.page = 1;\n this.disablePagination = false;\n this.firstLoadComplete = false;\n this.scope.userstories = [];\n if (this.applyStoredFilters(this.params.pslug, \"backlog-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"BACKLOG.SECTION_NAME\");\n this.showTags = false;\n this.activeFilters = false;\n this.scope.showGraphPlaceholder = null;\n this.displayVelocity = false;\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n _this.firstLoadComplete = true;\n title = _this.translate.instant(\"BACKLOG.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"BACKLOG.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n _this.appMetaService.setAll(title, description);\n if (_this.rs.userstories.getShowTags(_this.scope.projectId)) {\n _this.showTags = true;\n return _this.scope.$broadcast(\"showTags\", _this.showTags);\n }\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n BacklogController.prototype.filtersReloadContent = function() {\n return this.loadUserstories(true);\n };\n\n BacklogController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function() {\n _this.loadUserstories(true);\n _this.loadProjectStats();\n _this.confirm.notify(\"success\");\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"sprintform:create:success\", (function(_this) {\n return function(e, data, ussToMove) {\n _this.loadSprints().then(function() {\n return _this.scope.$broadcast(\"sprintform:create:success:callback\", ussToMove);\n });\n _this.loadProjectStats();\n _this.confirm.notify(\"success\");\n return _this.analytics.trackEvent(\"sprint\", \"create\", \"create sprint on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function() {\n _this.loadUserstories(true);\n _this.loadProjectStats();\n _this.rootscope.$broadcast(\"filters:update\");\n _this.confirm.notify(\"success\");\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"create userstory on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"sprintform:edit:success\", (function(_this) {\n return function() {\n return _this.loadProjectStats();\n };\n })(this));\n this.scope.$on(\"sprintform:remove:success\", (function(_this) {\n return function(event, sprint) {\n _this.loadSprints();\n _this.loadProjectStats();\n _this.loadUserstories(true);\n if (sprint.closed) {\n _this.loadClosedSprints();\n }\n return _this.rootscope.$broadcast(\"filters:update\");\n };\n })(this));\n this.scope.$on(\"usform:edit:success\", (function(_this) {\n return function(event, data) {\n var index;\n index = _.findIndex(_this.scope.userstories, function(us) {\n return us.id === data.id;\n });\n _this.scope.userstories[index] = data;\n return _this.rootscope.$broadcast(\"filters:update\");\n };\n })(this));\n this.scope.$on(\"sprint:us:move\", this.moveUs);\n this.scope.$on(\"sprint:us:moved\", (function(_this) {\n return function() {\n _this.loadSprints();\n return _this.loadProjectStats();\n };\n })(this));\n this.scope.$on(\"backlog:load-closed-sprints\", this.loadClosedSprints);\n return this.scope.$on(\"backlog:unload-closed-sprints\", this.unloadClosedSprints);\n };\n\n BacklogController.prototype.initializeSubscription = function() {\n var routingKey1, routingKey2;\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n _this.loadAllPaginatedUserstories();\n return _this.loadSprints();\n };\n })(this));\n routingKey2 = \"changes.project.\" + this.scope.projectId + \".milestones\";\n return this.events.subscribe(this.scope, routingKey2, (function(_this) {\n return function(message) {\n return _this.loadSprints();\n };\n })(this));\n };\n\n BacklogController.prototype.toggleShowTags = function() {\n return this.scope.$apply((function(_this) {\n return function() {\n _this.showTags = !_this.showTags;\n return _this.rs.userstories.storeShowTags(_this.scope.projectId, _this.showTags);\n };\n })(this));\n };\n\n BacklogController.prototype.toggleActiveFilters = function() {\n return this.activeFilters = !this.activeFilters;\n };\n\n BacklogController.prototype.toggleVelocityForecasting = function() {\n this.displayVelocity = !this.displayVelocity;\n if (!this.displayVelocity) {\n this.scope.visibleUserStories = _.map(this.scope.userstories, function(it) {\n return it.ref;\n });\n } else {\n this.scope.visibleUserStories = _.map(this.forecastedStories, function(it) {\n return it.ref;\n });\n }\n return scopeDefer(this.scope, (function(_this) {\n return function() {\n return _this.scope.$broadcast(\"userstories:loaded\");\n };\n })(this));\n };\n\n BacklogController.prototype.loadProjectStats = function() {\n return this.rs.projects.stats(this.scope.projectId).then((function(_this) {\n return function(stats) {\n var totalPoints;\n _this.scope.stats = stats;\n totalPoints = stats.total_points ? stats.total_points : stats.defined_points;\n if (totalPoints) {\n _this.scope.stats.completedPercentage = Math.round(100 * stats.closed_points / totalPoints);\n } else {\n _this.scope.stats.completedPercentage = 0;\n }\n _this.scope.showGraphPlaceholder = !((stats.total_points != null) && (stats.total_milestones != null));\n _this.calculateForecasting();\n return stats;\n };\n })(this));\n };\n\n BacklogController.prototype.setMilestonesOrder = function(sprints) {\n var it, j, len, results, sprint;\n results = [];\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n this.milestonesOrder[sprint.id] = {};\n results.push((function() {\n var l, len1, ref1, results1;\n ref1 = sprint.user_stories;\n results1 = [];\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n it = ref1[l];\n results1.push(this.milestonesOrder[sprint.id][it.id] = it.sprint_order);\n }\n return results1;\n }).call(this));\n }\n return results;\n };\n\n BacklogController.prototype.unloadClosedSprints = function() {\n return this.scope.$apply((function(_this) {\n return function() {\n _this.scope.closedSprints = [];\n return _this.rootscope.$broadcast(\"closed-sprints:reloaded\", []);\n };\n })(this));\n };\n\n BacklogController.prototype.loadClosedSprints = function() {\n var params;\n params = {\n closed: true\n };\n return this.rs.sprints.list(this.scope.projectId, params).then((function(_this) {\n return function(result) {\n var j, len, sprint, sprints;\n sprints = result.milestones;\n _this.setMilestonesOrder(sprints);\n _this.scope.totalClosedMilestones = result.closed;\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\");\n }\n _this.scope.closedSprints = sprints;\n _this.scope.closedSprintsById = groupBy(sprints, function(x) {\n return x.id;\n });\n _this.rootscope.$broadcast(\"closed-sprints:reloaded\", sprints);\n return sprints;\n };\n })(this));\n };\n\n BacklogController.prototype.loadSprints = function() {\n var params;\n params = {\n closed: false\n };\n return this.rs.sprints.list(this.scope.projectId, params).then((function(_this) {\n return function(result) {\n var j, len, sprint, sprints;\n sprints = result.milestones;\n _this.setMilestonesOrder(sprints);\n _this.scope.totalMilestones = sprints;\n _this.scope.totalClosedMilestones = result.closed;\n _this.scope.totalOpenMilestones = result.open;\n _this.scope.totalMilestones = _this.scope.totalOpenMilestones + _this.scope.totalClosedMilestones;\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\");\n }\n _this.scope.sprints = sprints;\n if (!_this.scope.closedSprints) {\n _this.scope.closedSprints = [];\n }\n _this.scope.sprintsCounter = sprints.length;\n _this.scope.sprintsById = groupBy(sprints, function(x) {\n return x.id;\n });\n _this.rootscope.$broadcast(\"sprints:loaded\", sprints);\n _this.scope.currentSprint = _this.findCurrentSprint();\n return sprints;\n };\n })(this));\n };\n\n BacklogController.prototype.openSprints = function() {\n return _.filter(this.scope.sprints, (function(_this) {\n return function(sprint) {\n return !sprint.closed;\n };\n })(this)).reverse();\n };\n\n BacklogController.prototype.loadAllPaginatedUserstories = function() {\n var page;\n page = this.page;\n return this.loadUserstories(true, this.scope.userstories.length).then((function(_this) {\n return function() {\n return _this.page = page;\n };\n })(this));\n };\n\n BacklogController.prototype.loadUserstories = function(resetPagination, pageSize) {\n var params, promise;\n if (resetPagination == null) {\n resetPagination = false;\n }\n if (!this.scope.projectId) {\n return null;\n }\n this.loadingUserstories = true;\n this.disablePagination = true;\n params = _.clone(this.location.search());\n this.rs.userstories.storeQueryParams(this.scope.projectId, params);\n if (resetPagination) {\n this.page = 1;\n }\n params.page = this.page;\n promise = this.rs.userstories.listUnassigned(this.scope.projectId, params, pageSize);\n return promise.then((function(_this) {\n return function(result) {\n var header, it, j, len, ref1, userstories;\n userstories = result[0];\n header = result[1];\n if (resetPagination) {\n _this.scope.userstories = [];\n }\n _this.scope.userstories = _this.scope.userstories.concat(_.sortBy(userstories, \"backlog_order\"));\n _this.scope.visibleUserStories = _.map(_this.scope.userstories, function(it) {\n return it.ref;\n });\n ref1 = _this.scope.userstories;\n for (j = 0, len = ref1.length; j < len; j++) {\n it = ref1[j];\n _this.backlogOrder[it.id] = it.backlog_order;\n }\n _this.loadingUserstories = false;\n if (header('x-pagination-next')) {\n _this.disablePagination = false;\n _this.page++;\n }\n scopeDefer(_this.scope, function() {\n return _this.scope.$broadcast(\"userstories:loaded\");\n });\n return userstories;\n };\n })(this));\n };\n\n BacklogController.prototype.loadBacklog = function() {\n return this.q.all([this.loadProjectStats(), this.loadSprints(), this.loadUserstories()]).then(this.calculateForecasting);\n };\n\n BacklogController.prototype.calculateForecasting = function() {\n var backlog_points_sum, current_sum, j, len, ref1, results, stats, total_points, us;\n stats = this.scope.stats;\n total_points = stats.total_points;\n current_sum = stats.assigned_points;\n backlog_points_sum = 0;\n this.forecastedStories = [];\n ref1 = this.scope.userstories;\n results = [];\n for (j = 0, len = ref1.length; j < len; j++) {\n us = ref1[j];\n current_sum += us.total_points;\n backlog_points_sum += us.total_points;\n this.forecastedStories.push(us);\n if (stats.speed > 0 && backlog_points_sum > stats.speed) {\n break;\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n BacklogController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_backlog_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.closedMilestones = !!project.total_closed_milestones;\n this.scope.$emit('project:loaded', project);\n this.scope.points = _.sortBy(project.points, \"order\");\n this.scope.pointsById = groupBy(project.points, function(x) {\n return x.id;\n });\n this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n this.scope.usStatusList = _.sortBy(project.us_statuses, \"id\");\n return project;\n };\n\n BacklogController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n return this.loadBacklog().then((function(_this) {\n return function() {\n var milestone;\n return _this.generateFilters(milestone = \"null\");\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.scope.$emit(\"backlog:loaded\");\n };\n })(this));\n };\n\n BacklogController.prototype.prepareBulkUpdateData = function(uses, field) {\n if (field == null) {\n field = \"backlog_order\";\n }\n return _.map(uses, function(x) {\n return {\n \"us_id\": x.id,\n \"order\": x[field]\n };\n });\n };\n\n BacklogController.prototype.moveUs = function(ctx, usList, newUsIndex, newSprintId) {\n var afterDestination, beforeDestination, currentSprintId, data, it, j, key, l, len, len1, len2, len3, len4, len5, len6, list, m, modifiedUs, n, newSprint, o, oldSprintId, options, orderField, orderList, p, previous, previousWithTheSameOrder, project, promise, q, ref1, ref2, setOrders, setPreviousOrders, sprint, startIndex, us;\n oldSprintId = usList[0].milestone;\n project = usList[0].project;\n if (oldSprintId) {\n sprint = this.scope.sprintsById[oldSprintId] || this.scope.closedSprintsById[oldSprintId];\n }\n if (newSprintId) {\n newSprint = this.scope.sprintsById[newSprintId] || this.scope.closedSprintsById[newSprintId];\n }\n currentSprintId = newSprintId !== oldSprintId ? newSprintId : oldSprintId;\n orderList = null;\n orderField = \"\";\n if (newSprintId !== oldSprintId) {\n if (newSprintId === null) {\n for (key = j = 0, len = usList.length; j < len; key = ++j) {\n us = usList[key];\n _.remove(sprint.user_stories, function(it) {\n return it.id === us.id;\n });\n }\n orderField = \"backlog_order\";\n orderList = this.backlogOrder;\n beforeDestination = _.slice(this.scope.userstories, 0, newUsIndex);\n afterDestination = _.slice(this.scope.userstories, newUsIndex);\n this.scope.userstories = this.scope.userstories.concat(usList);\n } else {\n for (l = 0, len1 = usList.length; l < len1; l++) {\n us = usList[l];\n _.remove(this.scope.userstories, function(it) {\n return it.id === us.id;\n });\n }\n orderField = \"sprint_order\";\n orderList = this.milestonesOrder[newSprint.id];\n beforeDestination = _.slice(newSprint.user_stories, 0, newUsIndex);\n afterDestination = _.slice(newSprint.user_stories, newUsIndex);\n newSprint.user_stories = newSprint.user_stories.concat(usList);\n }\n } else {\n if (oldSprintId === null) {\n orderField = \"backlog_order\";\n orderList = this.backlogOrder;\n list = _.filter(this.scope.userstories, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(list, 0, newUsIndex);\n afterDestination = _.slice(list, newUsIndex);\n } else {\n orderField = \"sprint_order\";\n orderList = this.milestonesOrder[sprint.id];\n list = _.filter(newSprint.user_stories, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(list, 0, newUsIndex);\n afterDestination = _.slice(list, newUsIndex);\n }\n }\n previous = beforeDestination[beforeDestination.length - 1];\n setPreviousOrders = [];\n if (!previous) {\n startIndex = 0;\n } else if (previous) {\n startIndex = orderList[previous.id] + 1;\n previousWithTheSameOrder = _.filter(beforeDestination, function(it) {\n return it[orderField] === orderList[previous.id];\n });\n if (previousWithTheSameOrder.length > 1) {\n setPreviousOrders = _.map(previousWithTheSameOrder, function(it) {\n return {\n us_id: it.id,\n order: orderList[it.id]\n };\n });\n }\n }\n modifiedUs = [];\n for (key = m = 0, len2 = usList.length; m < len2; key = ++m) {\n us = usList[key];\n us.milestone = currentSprintId;\n us[orderField] = startIndex + key;\n orderList[us.id] = us[orderField];\n modifiedUs.push({\n us_id: us.id,\n order: us[orderField]\n });\n }\n startIndex = orderList[usList[usList.length - 1].id];\n for (key = n = 0, len3 = afterDestination.length; n < len3; key = ++n) {\n it = afterDestination[key];\n orderList[it.id] = startIndex + key + 1;\n }\n this.scope.userstories = _.sortBy(this.scope.userstories, (function(_this) {\n return function(it) {\n return _this.backlogOrder[it.id];\n };\n })(this));\n this.scope.visibleUserStories = _.map(this.scope.userstories, function(it) {\n return it.ref;\n });\n ref1 = this.scope.sprints;\n for (o = 0, len4 = ref1.length; o < len4; o++) {\n sprint = ref1[o];\n sprint.user_stories = _.sortBy(sprint.user_stories, (function(_this) {\n return function(it) {\n return _this.milestonesOrder[sprint.id][it.id];\n };\n })(this));\n }\n ref2 = this.scope.closedSprints;\n for (p = 0, len5 = ref2.length; p < len5; p++) {\n sprint = ref2[p];\n sprint.user_stories = _.sortBy(sprint.user_stories, (function(_this) {\n return function(it) {\n return _this.milestonesOrder[sprint.id][it.id];\n };\n })(this));\n }\n if (usList.length > 1 && (newSprintId !== oldSprintId)) {\n data = modifiedUs.concat(setPreviousOrders);\n promise = this.rs.userstories.bulkUpdateMilestone(project, newSprintId, data);\n } else if (usList.length > 1) {\n data = modifiedUs.concat(setPreviousOrders);\n promise = this.rs.userstories.bulkUpdateBacklogOrder(project, data);\n } else {\n setOrders = {};\n for (q = 0, len6 = setPreviousOrders.length; q < len6; q++) {\n it = setPreviousOrders[q];\n setOrders[it.us_id] = it.order;\n }\n options = {\n headers: {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n promise = this.repo.save(usList[0], true, {}, options, true);\n }\n promise.then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"sprint:us:moved\");\n if (_this.scope.closedSprintsById && _this.scope.closedSprintsById[oldSprintId]) {\n return _this.rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n };\n })(this));\n return promise;\n };\n\n BacklogController.prototype.updateUserStoryStatus = function() {\n return this.generateFilters().then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"filters:update\");\n _this.loadProjectStats();\n if (_this.isFilterDataTypeSelected('status')) {\n return _this.filtersReloadContent();\n }\n };\n })(this));\n };\n\n BacklogController.prototype.editUserStory = function(projectId, ref, $event) {\n var currentLoading, target;\n target = $($event.target);\n currentLoading = this.loading().target(target).removeClasses(\"edit-story\").timeout(200).start();\n return this.rs.userstories.getByRef(projectId, ref).then((function(_this) {\n return function(us) {\n return _this.rs2.attachments.list(\"us\", us.id, projectId).then(function(attachments) {\n _this.rootscope.$broadcast(\"usform:edit\", us, attachments.toJS());\n return currentLoading.finish();\n });\n };\n })(this));\n };\n\n BacklogController.prototype.deleteUserStory = function(us) {\n var message, title;\n title = this.translate.instant(\"US.TITLE_DELETE_ACTION\");\n message = us.subject;\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var promise;\n _this.scope.userstories = _.without(_this.scope.userstories, us);\n promise = _this.repo.remove(us);\n promise.then(function() {\n askResponse.finish();\n return _this.q.all([_this.loadProjectStats(), _this.loadSprints()]);\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return _this.confirm.notify(\"error\");\n });\n };\n })(this));\n };\n\n BacklogController.prototype.addNewUs = function(type) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"usform:new\", this.scope.projectId, this.scope.project.default_us_status, this.scope.usStatusList);\n case \"bulk\":\n return this.rootscope.$broadcast(\"usform:bulk\", this.scope.projectId, this.scope.project.default_us_status);\n }\n };\n\n BacklogController.prototype.addNewSprint = function() {\n return this.rootscope.$broadcast(\"sprintform:create\", this.scope.projectId);\n };\n\n BacklogController.prototype.findCurrentSprint = function() {\n var currentDate;\n currentDate = new Date().getTime();\n return _.find(this.scope.sprints, function(sprint) {\n var end, start;\n start = moment(sprint.estimated_start, 'YYYY-MM-DD').format('x');\n end = moment(sprint.estimated_finish, 'YYYY-MM-DD').format('x');\n return currentDate >= start && currentDate <= end;\n });\n };\n\n return BacklogController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin, taiga.UsFiltersMixin));\n\n module.controller(\"BacklogController\", BacklogController);\n\n BacklogDirective = function($repo, $rootscope, $translate, $rs) {\n var doomLineTemplate, link, linkDoomLine, linkFilters, linkToolbar, openFilterInit, showHideFilter, showHideTags;\n doomLineTemplate = _.template(\"
    <%- text %>
    \");\n linkDoomLine = function($scope, $el, $attrs, $ctrl) {\n var addDoomLineDom, getUsItems, reloadDoomLine, removeDoomlineDom;\n reloadDoomLine = function() {\n var current_sum, domElement, i, j, len, ref1, results, stats, total_points, us;\n if ($scope.displayVelocity) {\n removeDoomlineDom();\n }\n if (($scope.stats != null) && ($scope.stats.total_points != null) && $scope.stats.total_points !== 0 && ($scope.displayVelocity == null)) {\n removeDoomlineDom();\n stats = $scope.stats;\n total_points = stats.total_points;\n current_sum = stats.assigned_points;\n if (!$scope.userstories) {\n return;\n }\n ref1 = $scope.userstories;\n results = [];\n for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n us = ref1[i];\n current_sum += us.total_points;\n if (current_sum > total_points) {\n domElement = $el.find('.backlog-table-body .us-item-row')[i];\n addDoomLineDom(domElement);\n break;\n } else {\n results.push(void 0);\n }\n }\n return results;\n }\n };\n removeDoomlineDom = function() {\n return $el.find(\".doom-line\").remove();\n };\n addDoomLineDom = function(element) {\n var text;\n text = $translate.instant(\"BACKLOG.DOOMLINE\");\n return $(element).before(doomLineTemplate({\n \"text\": text\n }));\n };\n getUsItems = function() {\n var rowElements;\n rowElements = $el.find('.backlog-table-body .us-item-row');\n return _.map(rowElements, function(x) {\n return angular.element(x);\n });\n };\n $scope.$on(\"userstories:loaded\", reloadDoomLine);\n $scope.$on(\"userstories:forecast\", removeDoomlineDom);\n return $scope.$watch(\"stats\", reloadDoomLine);\n };\n linkToolbar = function($scope, $el, $attrs, $ctrl) {\n var checkSelected, getUsToMove, lastChecked, moveToCurrentSprint, moveToLatestSprint, moveUssToSprint, shiftPressed;\n getUsToMove = function() {\n var ussDom;\n ussDom = $el.find(\".backlog-table-body input:checkbox:checked\");\n return _.map(ussDom, function(item) {\n var itemScope;\n item = $(item).closest('.tg-scope');\n itemScope = item.scope();\n itemScope.us.milestone = $scope.sprints[0].id;\n return itemScope.us;\n });\n };\n moveUssToSprint = function(selectedUss, sprint) {\n var data, extraPoints, totalExtraPoints, ussCurrent;\n ussCurrent = _($scope.userstories);\n $scope.userstories = ussCurrent.without.apply(ussCurrent, selectedUss).value();\n extraPoints = _.map(selectedUss, function(v, k) {\n return v.total_points;\n });\n totalExtraPoints = _.reduce(extraPoints, function(acc, num) {\n return acc + num;\n });\n sprint.user_stories = _.union(sprint.user_stories, selectedUss);\n sprint.total_points += totalExtraPoints;\n data = _.map(selectedUss, function(us) {\n return {\n us_id: us.id,\n order: us.sprint_order\n };\n });\n $rs.userstories.bulkUpdateMilestone($scope.project.id, $scope.sprints[0].id, data).then((function(_this) {\n return function() {\n $ctrl.loadSprints();\n $ctrl.loadProjectStats();\n $ctrl.toggleVelocityForecasting();\n return $ctrl.calculateForecasting();\n };\n })(this));\n return $el.find(\".move-to-sprint\").hide();\n };\n moveToCurrentSprint = function(selectedUss) {\n return moveUssToSprint(selectedUss, $scope.currentSprint);\n };\n moveToLatestSprint = function(selectedUss) {\n return moveUssToSprint(selectedUss, $scope.sprints[0]);\n };\n $scope.$on(\"sprintform:create:success:callback\", function(e, ussToMove) {\n return _.partial(moveToCurrentSprint, ussToMove)();\n });\n shiftPressed = false;\n lastChecked = null;\n checkSelected = function(target) {\n var moveToSprintDom, selectedUsDom;\n lastChecked = target.closest(\".us-item-row\");\n target.closest('.us-item-row').toggleClass('ui-multisortable-multiple');\n moveToSprintDom = $el.find(\".move-to-sprint\");\n selectedUsDom = $el.find(\".backlog-table-body input:checkbox:checked\");\n if (selectedUsDom.length > 0 && $scope.sprints.length > 0) {\n return moveToSprintDom.show();\n } else {\n return moveToSprintDom.hide();\n }\n };\n $(window).on(\"keydown.shift-pressed keyup.shift-pressed\", function(event) {\n shiftPressed = !!event.shiftKey;\n return true;\n });\n $el.on(\"change\", \".backlog-table-body input:checkbox\", function(event) {\n var current, elements, nextAll, prevAll, target;\n if (lastChecked && shiftPressed) {\n elements = [];\n current = $(event.currentTarget).closest(\".us-item-row\");\n nextAll = lastChecked.nextAll();\n prevAll = lastChecked.prevAll();\n if (_.some(nextAll, function(next) {\n return next === current[0];\n })) {\n elements = lastChecked.nextUntil(current);\n } else if (_.some(prevAll, function(prev) {\n return prev === current[0];\n })) {\n elements = lastChecked.prevUntil(current);\n }\n _.map(elements, function(elm) {\n var input;\n input = $(elm).find(\"input:checkbox\");\n input.prop('checked', true);\n return checkSelected(input);\n });\n }\n target = angular.element(event.currentTarget);\n target.closest(\".us-item-row\").toggleClass('is-checked');\n return checkSelected(target);\n });\n $el.on(\"click\", \"#move-to-latest-sprint\", (function(_this) {\n return function(event) {\n var ussToMove;\n ussToMove = getUsToMove();\n return $scope.$apply(_.partial(moveToLatestSprint, ussToMove));\n };\n })(this));\n $el.on(\"click\", \"#move-to-current-sprint\", (function(_this) {\n return function(event) {\n var ussToMove;\n ussToMove = getUsToMove();\n return $scope.$apply(_.partial(moveToCurrentSprint, ussToMove));\n };\n })(this));\n $el.on(\"click\", \"#show-tags\", function(event) {\n event.preventDefault();\n $ctrl.toggleShowTags();\n return showHideTags($ctrl);\n });\n return $el.on(\"click\", \".forecasting-add-sprint\", function(event) {\n var ussToMove, ussToMoveList;\n ussToMoveList = $ctrl.forecastedStories;\n if ($scope.currentSprint) {\n ussToMove = _.map(ussToMoveList, function(us, index) {\n us.milestone = $scope.currentSprint.id;\n us.order = index;\n return us;\n });\n return $scope.$apply(_.partial(moveToCurrentSprint, ussToMove));\n } else {\n ussToMove = _.map(ussToMoveList, function(us, index) {\n us.order = index;\n return us;\n });\n return $rootscope.$broadcast(\"sprintform:create\", $scope.projectId, ussToMove);\n }\n });\n };\n showHideTags = function($ctrl) {\n var elm, text;\n elm = angular.element(\"#show-tags\");\n if ($ctrl.showTags) {\n elm.addClass(\"active\");\n text = $translate.instant(\"BACKLOG.TAGS.HIDE\");\n return elm.text(text);\n } else {\n elm.removeClass(\"active\");\n text = $translate.instant(\"BACKLOG.TAGS.SHOW\");\n return elm.text(text);\n }\n };\n openFilterInit = function($scope, $el, $ctrl) {\n var sidebar;\n sidebar = $el.find(\"sidebar.backlog-filter\");\n sidebar.addClass(\"active\");\n return $ctrl.activeFilters = true;\n };\n showHideFilter = function($scope, $el, $ctrl) {\n var hideText, showText, sidebar, target;\n sidebar = $el.find(\"sidebar.backlog-filter\");\n sidebar.one(\"transitionend\", function() {\n return timeout(150, function() {\n $rootscope.$broadcast(\"resize\");\n return $('.burndown').css(\"visibility\", \"visible\");\n });\n });\n target = angular.element(\"#show-filters-button\");\n $('.burndown').css(\"visibility\", \"hidden\");\n sidebar.toggleClass(\"active\");\n target.toggleClass(\"active\");\n hideText = $translate.instant(\"BACKLOG.FILTERS.HIDE\");\n showText = $translate.instant(\"BACKLOG.FILTERS.SHOW\");\n toggleText(target, [hideText, showText]);\n return $ctrl.toggleActiveFilters();\n };\n linkFilters = function($scope, $el, $attrs, $ctrl) {\n $scope.filtersSearch = {};\n return $el.on(\"click\", \"#show-filters-button\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n return showHideFilter($scope, $el, $ctrl);\n });\n });\n };\n link = function($scope, $el, $attrs, $rootscope) {\n var $ctrl, filters;\n $ctrl = $el.controller();\n linkToolbar($scope, $el, $attrs, $ctrl);\n linkFilters($scope, $el, $attrs, $ctrl);\n linkDoomLine($scope, $el, $attrs, $ctrl);\n filters = $ctrl.location.search();\n if (filters.status || filters.tags || filters.q || filters.assigned_to || filters.owner) {\n openFilterInit($scope, $el, $ctrl);\n }\n $scope.$on(\"showTags\", function() {\n return showHideTags($ctrl);\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return $(window).off(\".shift-pressed\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklog\", [\"$tgRepo\", \"$rootScope\", \"$translate\", \"$tgResources\", BacklogDirective]);\n\n UsRolePointsSelectorDirective = function($rootscope, $template, $compile, $translate) {\n var link, selectionTemplate;\n selectionTemplate = $template.get(\"backlog/us-role-points-popover.html\", true);\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n var numberOfRoles, roles;\n roles = _.filter(project.roles, \"computable\");\n numberOfRoles = _.size(roles);\n if (numberOfRoles > 1) {\n return $el.append($compile(selectionTemplate({\n \"roles\": roles\n }))($scope));\n } else {\n $el.find(\".icon-arrow-down\").remove();\n return $el.find(\".header-points\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"uspoints:select\", function(ctx, roleId, roleName) {\n $el.find(\".popover\").popover().close();\n return $el.find(\".header-points\").html(roleName + \"/Total\");\n });\n $scope.$on(\"uspoints:clear-selection\", function(ctx, roleId) {\n var text;\n $el.find(\".popover\").popover().close();\n text = $translate.instant(\"COMMON.FIELDS.POINTS\");\n return $el.find(\".header-points\").text(text);\n });\n $el.on(\"click\", function(event) {\n var target;\n target = angular.element(event.target);\n if (target.is(\"span\") || target.is(\"div\")) {\n event.stopPropagation();\n }\n return $el.find(\".popover\").popover().open();\n });\n $el.on(\"click\", \".clear-selection\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $rootscope.$broadcast(\"uspoints:clear-selection\");\n });\n $el.on(\"click\", \".role\", function(event) {\n var rolScope, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n rolScope = target.scope();\n return $rootscope.$broadcast(\"uspoints:select\", target.data(\"role-id\"), target.text());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUsRolePointsSelector\", [\"$rootScope\", \"$tgTemplate\", \"$compile\", \"$translate\", UsRolePointsSelectorDirective]);\n\n UsPointsDirective = function($tgEstimationsService, $repo, $tgTemplate) {\n var link, rolesTemplate;\n rolesTemplate = $tgTemplate.get(\"common/estimation/us-points-roles-popover.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, bindClickElements, estimationProcess, filteringRoleId, renderRolesSelector, selectedRoleId, updatingSelectedRoleId;\n $ctrl = $el.controller();\n updatingSelectedRoleId = null;\n selectedRoleId = null;\n filteringRoleId = null;\n estimationProcess = null;\n $scope.$on(\"uspoints:select\", function(ctx, roleId, roleName) {\n var us;\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n selectedRoleId = roleId;\n return estimationProcess.render();\n });\n $scope.$on(\"uspoints:clear-selection\", function(ctx) {\n var us;\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n selectedRoleId = null;\n return estimationProcess.render();\n });\n $scope.$watch($attrs.tgBacklogUsPoints, function(us) {\n var roles;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n roles = estimationProcess.calculateRoles();\n if (roles.length === 0) {\n $el.find(\".icon-arrow-bottom\").remove();\n $el.find(\"a.us-points\").addClass(\"not-clickable\");\n } else if (roles.length === 1) {\n selectedRoleId = _.keys(us.points)[0];\n }\n if (estimationProcess.isEditable) {\n bindClickElements();\n }\n estimationProcess.onSelectedPointForRole = function(roleId, pointId, points) {\n us.points = points;\n estimationProcess.render();\n return this.save(roleId, pointId).then(function() {\n return $ctrl.loadProjectStats();\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, pointId, pointObj, template, text, title, totalPoints;\n totalPoints = this.calculateTotalPoints();\n if ((selectedRoleId == null) || roles.length === 1) {\n text = totalPoints;\n title = totalPoints;\n } else {\n pointId = this.us.points[selectedRoleId];\n pointObj = this.pointsById[pointId];\n text = pointObj.name + \" / \" + totalPoints + \"\";\n title = pointObj.name + \" / \" + totalPoints;\n }\n ctx = {\n totalPoints: totalPoints,\n roles: this.calculateRoles(),\n editable: this.isEditable,\n text: text,\n title: title\n };\n mainTemplate = \"common/estimation/us-estimation-total.html\";\n template = $tgTemplate.get(mainTemplate, true);\n html = template(ctx);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n renderRolesSelector = function() {\n var html, roles;\n roles = estimationProcess.calculateRoles();\n html = rolesTemplate({\n \"roles\": roles\n });\n $el.append(html);\n return $el.find(\".pop-role\").popover().open(function() {\n return $(this).remove();\n });\n };\n bindClickElements = function() {\n $el.on(\"click\", \"a.us-points\", function(event) {\n var us;\n event.preventDefault();\n event.stopPropagation();\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n updatingSelectedRoleId = selectedRoleId;\n if (selectedRoleId != null) {\n return estimationProcess.renderPointsSelector(selectedRoleId);\n } else {\n return renderRolesSelector();\n }\n });\n return $el.on(\"click\", \".role\", function(event) {\n var popRolesDom, target, us;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n updatingSelectedRoleId = target.data(\"role-id\");\n popRolesDom = $el.find(\".pop-role\");\n popRolesDom.find(\"a\").removeClass(\"active\");\n popRolesDom.find(\"a[data-role-id='\" + updatingSelectedRoleId + \"']\").addClass(\"active\");\n return estimationProcess.renderPointsSelector(updatingSelectedRoleId);\n });\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogUsPoints\", [\"$tgEstimationsService\", \"$tgRepo\", \"$tgTemplate\", UsPointsDirective]);\n\n ToggleBurndownVisibility = function($storage) {\n var hide, link, show;\n hide = function() {\n $(\".js-burndown-graph\").removeClass(\"shown\");\n $(\".js-toggle-burndown-visibility-button\").removeClass(\"active\");\n return $(\".js-burndown-graph\").removeClass(\"open\");\n };\n show = function(firstLoad) {\n $(\".js-toggle-burndown-visibility-button\").addClass(\"active\");\n if (firstLoad) {\n return $(\".js-burndown-graph\").addClass(\"shown\");\n } else {\n return $(\".js-burndown-graph\").addClass(\"open\");\n }\n };\n link = function($scope, $el, $attrs) {\n var firstLoad, hash, toggleGraph;\n firstLoad = true;\n hash = generateHash([\"is-burndown-grpahs-collapsed\"]);\n $scope.isBurndownGraphCollapsed = $storage.get(hash) || false;\n toggleGraph = function() {\n if ($scope.isBurndownGraphCollapsed) {\n hide(firstLoad);\n } else {\n show(firstLoad);\n }\n return firstLoad = false;\n };\n $scope.$watch(\"showGraphPlaceholder\", function() {\n if ($scope.showGraphPlaceholder != null) {\n $scope.isBurndownGraphCollapsed = $scope.isBurndownGraphCollapsed || $scope.showGraphPlaceholder;\n return toggleGraph();\n }\n });\n $el.on(\"click\", \".js-toggle-burndown-visibility-button\", function() {\n $scope.isBurndownGraphCollapsed = !$scope.isBurndownGraphCollapsed;\n $storage.set(hash, $scope.isBurndownGraphCollapsed);\n return toggleGraph();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgToggleBurndownVisibility\", [\"$tgStorage\", ToggleBurndownVisibility]);\n\n BurndownBacklogGraphDirective = function($translate) {\n var link, redrawChart;\n redrawChart = function(element, dataToDraw) {\n var client_increment_line, colors, data, evolution_line, j, milestonesRange, optimal_line, options, ref1, results, team_increment_line, width, zero_line;\n width = element.width();\n element.height(width / 6);\n milestonesRange = (function() {\n results = [];\n for (var j = 0, ref1 = dataToDraw.milestones.length - 1; 0 <= ref1 ? j <= ref1 : j >= ref1; 0 <= ref1 ? j++ : j--){ results.push(j); }\n return results;\n }).apply(this);\n data = [];\n zero_line = _.map(dataToDraw.milestones, function(ml) {\n return 0;\n });\n data.push({\n data: _.zip(milestonesRange, zero_line),\n lines: {\n fillColor: \"rgba(0,0,0,0)\"\n },\n points: {\n show: false\n }\n });\n optimal_line = _.map(dataToDraw.milestones, function(ml) {\n return ml.optimal;\n });\n data.push({\n data: _.zip(milestonesRange, optimal_line),\n lines: {\n fillColor: \"rgba(120,120,120,0.2)\"\n }\n });\n evolution_line = _.filter(_.map(dataToDraw.milestones, function(ml) {\n return ml.evolution;\n }), function(evolution) {\n return evolution != null;\n });\n data.push({\n data: _.zip(milestonesRange, evolution_line),\n lines: {\n fillColor: \"rgba(102,153,51,0.3)\"\n }\n });\n client_increment_line = _.map(dataToDraw.milestones, function(ml) {\n return -ml[\"team-increment\"] - ml[\"client-increment\"];\n });\n data.push({\n data: _.zip(milestonesRange, client_increment_line),\n lines: {\n fillColor: \"rgba(255,51,51,0.3)\"\n }\n });\n team_increment_line = _.map(dataToDraw.milestones, function(ml) {\n return -ml[\"team-increment\"];\n });\n data.push({\n data: _.zip(milestonesRange, team_increment_line),\n lines: {\n fillColor: \"rgba(153,51,51,0.3)\"\n }\n });\n colors = [\"rgba(0,0,0,1)\", \"rgba(120,120,120,0.2)\", \"rgba(102,153,51,1)\", \"rgba(153,51,51,1)\", \"rgba(255,51,51,1)\"];\n options = {\n grid: {\n borderWidth: {\n top: 0,\n right: 1,\n left: 0,\n bottom: 0\n },\n borderColor: \"#ccc\",\n hoverable: true\n },\n xaxis: {\n ticks: dataToDraw.milestones.length,\n axisLabel: $translate.instant(\"BACKLOG.CHART.XAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\",\n axisLabelPadding: 5,\n tickFormatter: function(val, axis) {\n return \"\";\n }\n },\n yaxis: {\n axisLabel: $translate.instant(\"BACKLOG.CHART.YAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\",\n axisLabelPadding: 5\n },\n series: {\n shadowSize: 0,\n lines: {\n show: true,\n fill: true\n },\n points: {\n show: true,\n fill: true,\n radius: 4,\n lineWidth: 2\n }\n },\n colors: colors,\n tooltip: true,\n tooltipOpts: {\n content: function(label, xval, yval, flotItem) {\n var ctx;\n if (flotItem.seriesIndex === 1) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.OPTIMAL\", ctx);\n } else if (flotItem.seriesIndex === 2) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.REAL\", ctx);\n } else if (flotItem.seriesIndex === 3) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_CLIENT\", ctx);\n } else {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_TEAM\", ctx);\n }\n }\n }\n };\n element.empty();\n return element.plot(data, options).data(\"plot\");\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch(\"stats\", function(value) {\n if ($scope.stats != null) {\n redrawChart(element, $scope.stats);\n return $scope.$on(\"resize\", function() {\n return redrawChart(element, $scope.stats);\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBurndownBacklogGraph\", [\"$translate\", BurndownBacklogGraphDirective]);\n\n TgBacklogProgressBarDirective = function($template, $compile) {\n var adjustPercentaje, link, render, template;\n template = $template.get(\"backlog/progress-bar.html\", true);\n render = function(scope, el, projectPointsPercentaje, closedPointsPercentaje) {\n var html;\n html = template({\n projectPointsPercentaje: projectPointsPercentaje,\n closedPointsPercentaje: closedPointsPercentaje\n });\n html = $compile(html)(scope);\n return el.html(html);\n };\n adjustPercentaje = function(percentage) {\n var adjusted;\n adjusted = _.max([0, percentage]);\n adjusted = _.min([100, adjusted]);\n return Math.round(adjusted);\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch($attrs.tgBacklogProgressBar, function(stats) {\n var closedPoints, closedPointsPercentaje, definedPoints, projectPointsPercentaje, totalPoints;\n if (stats != null) {\n totalPoints = stats.total_points ? stats.total_points : stats.defined_points;\n definedPoints = stats.defined_points;\n closedPoints = stats.closed_points;\n if (definedPoints > totalPoints) {\n projectPointsPercentaje = totalPoints * 100 / definedPoints;\n closedPointsPercentaje = closedPoints * 100 / definedPoints;\n } else {\n projectPointsPercentaje = 100;\n closedPointsPercentaje = closedPoints * 100 / totalPoints;\n }\n projectPointsPercentaje = adjustPercentaje(projectPointsPercentaje - 3);\n closedPointsPercentaje = adjustPercentaje(closedPointsPercentaje - 3);\n return render($scope, $el, projectPointsPercentaje, closedPointsPercentaje);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogProgressBar\", [\"$tgTemplate\", \"$compile\", TgBacklogProgressBarDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/sortable.coffee\n */\n\n(function() {\n var BacklogSortableDirective, bindOnce, deleteElement, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBacklog\");\n\n deleteElement = function(el) {\n $(el).scope().$destroy();\n $(el).off();\n return $(el).remove();\n };\n\n BacklogSortableDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"project\", function(project) {\n var drake, initIsBacklog, scroll;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n initIsBacklog = false;\n drake = dragula([$el[0], $('.js-empty-backlog')[0]], {\n copySortSource: false,\n copy: false,\n isContainer: function(el) {\n return el.classList.contains('sprint-table');\n },\n moves: function(item) {\n if (!$(item).hasClass('row')) {\n return false;\n }\n return true;\n }\n });\n drake.on('drag', function(item, container) {\n var isChecked, parent;\n parent = $(item).parent();\n initIsBacklog = parent.hasClass('backlog-table-body');\n $(document.body).addClass(\"drag-active\");\n isChecked = $(item).find(\"input[type='checkbox']\").is(\":checked\");\n return window.dragMultiple.start(item, container);\n });\n drake.on('cloned', function(item) {\n return $(item).addClass('multiple-drag-mirror');\n });\n drake.on('dragend', function(item) {\n var dragMultipleItems, firstElement, index, isBacklog, parent, sameContainer, sprint, usList;\n parent = $(item).parent();\n $('.doom-line').remove();\n parent = $(item).parent();\n isBacklog = parent.hasClass('backlog-table-body') || parent.hasClass('js-empty-backlog');\n if (initIsBacklog || isBacklog) {\n sameContainer = initIsBacklog === isBacklog;\n } else {\n sameContainer = $(item).scope().sprint.id === parent.scope().sprint.id;\n }\n dragMultipleItems = window.dragMultiple.stop();\n $(document.body).removeClass(\"drag-active\");\n sprint = null;\n firstElement = dragMultipleItems.length ? dragMultipleItems[0] : item;\n if (isBacklog) {\n index = $(firstElement).index(\".backlog-table-body .row\");\n } else {\n index = $(firstElement).index();\n sprint = parent.scope().sprint.id;\n }\n if (!sameContainer) {\n if (dragMultipleItems.length) {\n usList = _.map(dragMultipleItems, function(item) {\n return item = $(item).scope().us;\n });\n } else {\n usList = [$(item).scope().us];\n }\n if (dragMultipleItems.length) {\n _.each(dragMultipleItems, function(item) {\n return deleteElement(item);\n });\n } else {\n deleteElement(item);\n }\n } else {\n if (dragMultipleItems.length) {\n usList = _.map(dragMultipleItems, function(item) {\n return item = $(item).scope().us;\n });\n } else {\n usList = [$(item).scope().us];\n }\n }\n return $scope.$emit(\"sprint:us:move\", usList, index, sprint);\n });\n scroll = autoScroll([window], {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSortable\", BacklogSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/sprints.coffee\n */\n\n(function() {\n var BacklogSprintDirective, BacklogSprintHeaderDirective, ToggleExcludeClosedSprintsVisualization, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogSprintDirective = function($repo, $rootscope) {\n var link, slideOptions, sprintTableMinHeight, toggleSprint;\n sprintTableMinHeight = 50;\n slideOptions = {\n duration: 500,\n easing: 'linear'\n };\n toggleSprint = (function(_this) {\n return function($el) {\n var sprintArrow, sprintTable;\n sprintTable = $el.find(\".sprint-table\");\n sprintArrow = $el.find(\".compact-sprint\");\n sprintArrow.toggleClass('active');\n return sprintTable.toggleClass('open');\n };\n })(this);\n link = function($scope, $el, $attrs) {\n $scope.$watch($attrs.tgBacklogSprint, function(sprint) {\n sprint = $scope.$eval($attrs.tgBacklogSprint);\n if (sprint.closed) {\n return $el.addClass(\"sprint-closed\");\n } else {\n return toggleSprint($el);\n }\n });\n $el.on(\"click\", \".sprint-name > .compact-sprint\", function(event) {\n event.preventDefault();\n toggleSprint($el);\n return $el.find(\".sprint-table\").slideToggle(slideOptions);\n });\n $el.on(\"click\", \".edit-sprint\", function(event) {\n var sprint;\n event.preventDefault();\n sprint = $scope.$eval($attrs.tgBacklogSprint);\n return $rootscope.$broadcast(\"sprintform:edit\", sprint);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSprint\", [\"$tgRepo\", \"$rootScope\", BacklogSprintDirective]);\n\n BacklogSprintHeaderDirective = function($navUrls, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"backlog/sprint-header.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable, isVisible, prettyDate, render;\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\");\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_milestone\") !== -1;\n };\n isVisible = function() {\n return $scope.project.my_permissions.indexOf(\"view_milestones\") !== -1;\n };\n render = function(sprint) {\n var compiledTemplate, ctx, estimatedDateRange, finish, start, taskboardUrl, templateScope;\n taskboardUrl = $navUrls.resolve(\"project-taskboard\", {\n project: $scope.project.slug,\n sprint: sprint.slug\n });\n start = moment(sprint.estimated_start).format(prettyDate);\n finish = moment(sprint.estimated_finish).format(prettyDate);\n estimatedDateRange = start + \"-\" + finish;\n ctx = {\n name: sprint.name,\n taskboardUrl: taskboardUrl,\n estimatedDateRange: estimatedDateRange,\n closedPoints: sprint.closed_points || 0,\n totalPoints: sprint.total_points || 0,\n isVisible: isVisible(),\n isEditable: isEditable()\n };\n templateScope = $scope.$new();\n _.assign(templateScope, ctx);\n compiledTemplate = $compile(template)(templateScope);\n return $el.html(compiledTemplate);\n };\n $scope.$watch(\"sprint\", function(sprint) {\n return render(sprint);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\"\n };\n };\n\n module.directive(\"tgBacklogSprintHeader\", [\"$tgNavUrls\", \"$tgTemplate\", \"$compile\", \"$translate\", BacklogSprintHeaderDirective]);\n\n ToggleExcludeClosedSprintsVisualization = function($rootscope, $loading, $translate) {\n var excludeClosedSprints, link;\n excludeClosedSprints = true;\n link = function($scope, $el, $attrs) {\n var currentLoading, loadingElm;\n loadingElm = $(\"
    \");\n $el.after(loadingElm);\n currentLoading = null;\n $el.on(\"click\", function(event) {\n event.preventDefault();\n excludeClosedSprints = !excludeClosedSprints;\n currentLoading = $loading().target(loadingElm).start();\n if (excludeClosedSprints) {\n return $rootscope.$broadcast(\"backlog:unload-closed-sprints\");\n } else {\n return $rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $scope.$on(\"closed-sprints:reloaded\", (function(_this) {\n return function(ctx, sprints) {\n var key, text;\n currentLoading.finish();\n if (sprints.length > 0) {\n key = \"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS\";\n } else {\n key = \"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS\";\n }\n text = $translate.instant(key);\n return $el.find(\".text\").text(text);\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogToggleClosedSprintsVisualization\", [\"$rootScope\", \"$tgLoading\", \"$translate\", ToggleExcludeClosedSprintsVisualization]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/charts.coffee\n */\n\n(function() {\n var SprintGraphDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaTaskboard\");\n\n SprintGraphDirective = function($translate) {\n var link, redrawChart;\n redrawChart = function(element, dataToDraw) {\n var data, days, options, width;\n width = element.width();\n element.height(240);\n days = _.map(dataToDraw, function(x) {\n return moment(new Date(x.day).getTime());\n });\n data = [];\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, function(d) {\n return d.optimal_points;\n })),\n lines: {\n fillColor: \"rgba(120,120,120,0.2)\"\n }\n });\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, function(d) {\n return d.open_points;\n })),\n lines: {\n fillColor: \"rgba(102,153,51,0.3)\"\n }\n });\n options = {\n grid: {\n borderWidth: {\n top: 0,\n right: 1,\n left: 0,\n bottom: 0\n },\n borderColor: '#ccc',\n hoverable: true\n },\n xaxis: {\n tickSize: [1, \"day\"],\n min: days[0],\n max: _.last(days),\n mode: \"time\",\n daysNames: days,\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.XAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif',\n axisLabelPadding: 5\n },\n yaxis: {\n min: 0,\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.YAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif',\n axisLabelPadding: 5\n },\n series: {\n shadowSize: 0,\n lines: {\n show: true,\n fill: true\n },\n points: {\n show: true,\n fill: true,\n radius: 4,\n lineWidth: 2\n }\n },\n colors: [\"rgba(102,153,51,1)\", \"rgba(120,120,120,0.2)\"],\n tooltip: true,\n tooltipOpts: {\n content: function(label, xval, yval, flotItem) {\n var formattedDate, roundedValue;\n formattedDate = moment(xval).format($translate.instant(\"TASKBOARD.CHARTS.DATE\"));\n roundedValue = Math.round(yval);\n if (flotItem.seriesIndex === 1) {\n return $translate.instant(\"TASKBOARD.CHARTS.OPTIMAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n });\n } else {\n return $translate.instant(\"TASKBOARD.CHARTS.REAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n });\n }\n }\n }\n };\n element.empty();\n return element.plot(data, options).data(\"plot\");\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$on(\"resize\", function() {\n if ($scope.stats) {\n return redrawChart(element, $scope.stats.days);\n }\n });\n $scope.$on(\"taskboard:graph:toggle-visibility\", function() {\n $el.parent().toggleClass('open');\n return timeout(100, function() {\n if ($scope.stats) {\n return redrawChart(element, $scope.stats.days);\n }\n });\n });\n $scope.$watch('stats', function(value) {\n if ($scope.stats == null) {\n return;\n }\n return redrawChart(element, $scope.stats.days);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSprintGraph\", [\"$translate\", SprintGraphDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/lightboxes.coffee\n */\n\n(function() {\n var CreateBulkTasksDirective, CreateEditTaskDirective, bindOnce, debounce, module, taiga, trim,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n CreateEditTaskDirective = function($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate, $q, $confirm, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, close, createAttachments, deleteAttachments, resetAttachments, submit, submitButton, tagsToAdd;\n $scope.isNew = true;\n attachmentsToAdd = Immutable.List();\n attachmentsToDelete = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return attachmentsToDelete = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n if (attachment.get(\"id\")) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n }\n };\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.task.project, 'task');\n });\n return $q.all(promises);\n };\n deleteAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"task\", attachment.id);\n });\n return $q.all(promises);\n };\n tagsToAdd = [];\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.task.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([tag, color]);\n return $scope.task.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.task.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.task.tags = itemtags;\n return _.pull($scope.task.tags, value);\n };\n $scope.$on(\"taskform:new\", function(ctx, sprintId, usId) {\n var create, newTask;\n $scope.task = $model.make_model('tasks', {\n project: $scope.projectId,\n milestone: sprintId,\n user_story: usId,\n is_archived: false,\n status: $scope.project.default_task_status,\n assigned_to: null,\n tags: [],\n subject: \"\",\n description: \"\"\n });\n $scope.isNew = true;\n $scope.attachments = Immutable.List();\n resetAttachments();\n create = $translate.instant(\"COMMON.CREATE\");\n $el.find(\".button-green\").html(create);\n newTask = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.TITLE\");\n $el.find(\".title\").html(newTask + \" \");\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el, function() {\n return $scope.createEditTaskOpen = false;\n });\n return $scope.createEditTaskOpen = true;\n });\n $scope.$on(\"taskform:edit\", function(ctx, task, attachments) {\n var edit, save;\n $scope.task = task;\n $scope.isNew = false;\n $scope.attachments = Immutable.fromJS(attachments);\n resetAttachments();\n save = $translate.instant(\"COMMON.SAVE\");\n edit = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.ACTION_EDIT\");\n $el.find(\".button-green\").html(save);\n $el.find(\".title\").html(edit + \" \");\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el, function() {\n return $scope.createEditTaskOpen = false;\n });\n return $scope.createEditTaskOpen = true;\n });\n submitButton = $el.find(\".submit-button\");\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, params, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n params = {\n include_attachments: true,\n include_tasks: true\n };\n if ($scope.isNew) {\n promise = $repo.create(\"tasks\", $scope.task);\n broadcastEvent = \"taskform:new:success\";\n } else {\n promise = $repo.save($scope.task);\n broadcastEvent = \"taskform:edit:success\";\n }\n promise.then(function(data) {\n return deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this)).then((function(_this) {\n return function() {\n return $rs.tasks.getByRef(data.project, data.ref, params).then(function(task) {\n return $rootscope.$broadcast(broadcastEvent, task);\n });\n };\n })(this));\n });\n currentLoading = $loading().target(submitButton).start();\n return promise.then(function(data) {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n close = (function(_this) {\n return function() {\n if (!$scope.task.isModified()) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.task.revert();\n });\n } else {\n return $confirm.ask($translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.CONFIRM_CLOSE\")).then(function(result) {\n lightboxService.close($el);\n $scope.task.revert();\n return result.finish();\n });\n }\n };\n })(this);\n $el.find('.close').on(\"click\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return close();\n });\n $el.keydown(function(event) {\n var code;\n event.stopPropagation();\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n return close();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.find('.close').off();\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CreateBulkTasksDirective = function($repo, $rs, $rootscope, $loading, lightboxService, $model) {\n var link;\n link = function($scope, $el, attrs) {\n var submit, submitButton;\n $scope.form = {\n data: \"\",\n usId: null\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, data, form, projectId, promise, sprintId, usId;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n data = $scope.form.data;\n projectId = $scope.projectId;\n sprintId = $scope.form.sprintId;\n usId = $scope.form.usId;\n promise = $rs.tasks.bulkCreate(projectId, sprintId, usId, data);\n promise.then(function(result) {\n result = _.map(result, (function(_this) {\n return function(x) {\n return $model.make_model('tasks', x);\n };\n })(this));\n currentLoading.finish();\n $rootscope.$broadcast(\"taskform:bulk:success\", result);\n return lightboxService.close($el);\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return console.log(\"FAIL\");\n });\n };\n })(this));\n $scope.$on(\"taskform:bulk\", function(ctx, sprintId, usId) {\n lightboxService.open($el);\n return $scope.form = {\n data: \"\",\n sprintId: sprintId,\n usId: usId\n };\n });\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaTaskboard\");\n\n module.directive(\"tgLbCreateEditTask\", [\"$tgRepo\", \"$tgModel\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", \"$translate\", \"$q\", \"$tgConfirm\", \"tgAttachmentsService\", CreateEditTaskDirective]);\n\n module.directive(\"tgLbCreateBulkTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", \"$tgModel\", CreateBulkTasksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard.coffee\n */\n\n(function() {\n var TaskboardController, TaskboardDirective, TaskboardSquishColumnDirective, bindMethods, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n toggleText = this.taiga.toggleText;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n scopeDefer = this.taiga.scopeDefer;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaTaskboard\");\n\n TaskboardController = (function(superClass) {\n extend(TaskboardController, superClass);\n\n TaskboardController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"tgAppMetaService\", \"$tgLocation\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"tgTaskboardTasks\", \"$tgStorage\", \"tgFilterRemoteStorageService\"];\n\n function TaskboardController(scope, rootscope, repo, confirm, rs1, rs2, params1, q1, appMetaService, location, navUrls, events, analytics, translate, errorHandlingService, taskboardTasksService, storage, filterRemoteStorageService) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.rs2 = rs2;\n this.params = params1;\n this.q = q1;\n this.appMetaService = appMetaService;\n this.location = location;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.taskboardTasksService = taskboardTasksService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n bindMethods(this);\n this.taskboardTasksService.reset();\n this.scope.userstories = [];\n this.openFilter = false;\n if (this.applyStoredFilters(this.params.pslug, \"tasks-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"TASKBOARD.SECTION_NAME\");\n this.initializeEventHandlers();\n taiga.defineImmutableProperty(this.scope, \"usTasks\", (function(_this) {\n return function() {\n return _this.taskboardTasksService.usTasks;\n };\n })(this));\n }\n\n TaskboardController.prototype.firstLoad = function() {\n var promise;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n return promise.then(null, this.onInitialDataError.bind(this));\n };\n\n TaskboardController.prototype.setZoom = function(zoomLevel, zoom) {\n var previousZoomLevel;\n if (this.zoomLevel === zoomLevel) {\n return null;\n }\n this.isFirstLoad = !this.zoomLevel;\n previousZoomLevel = this.zoomLevel;\n this.zoomLevel = zoomLevel;\n this.zoom = zoom;\n if (this.isFirstLoad) {\n this.firstLoad().then((function(_this) {\n return function() {\n _this.isFirstLoad = false;\n return _this.taskboardTasksService.resetFolds();\n };\n })(this));\n } else if (this.zoomLevel > 1 && previousZoomLevel <= 1) {\n this.zoomLoading = true;\n this.loadTasks().then((function(_this) {\n return function() {\n _this.zoomLoading = false;\n return _this.taskboardTasksService.resetFolds();\n };\n })(this));\n }\n if (this.zoomLevel === '0') {\n return this.rootscope.$broadcast(\"sprint:zoom0\");\n }\n };\n\n TaskboardController.prototype.changeQ = function(q) {\n this.replaceFilter(\"q\", q);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.removeFilter = function(filter) {\n this.unselectFilter(filter.dataType, filter.id);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.addFilter = function(newFilter) {\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.selectCustomFilter = function(customFilter) {\n this.replaceAllFilters(customFilter.filter);\n this.loadTasks();\n return this.generateFilters();\n };\n\n TaskboardController.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters').then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, 'tasks-custom-filters').then(_this.generateFilters);\n };\n })(this));\n };\n\n TaskboardController.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, i, len, ref;\n ref = this.selectedFilters;\n for (i = 0, len = ref.length; i < len; i++) {\n filter = ref[i];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n TaskboardController.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters').then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, 'tasks-custom-filters').then(_this.generateFilters);\n };\n })(this));\n };\n\n TaskboardController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), \"tasks-filters\");\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.milestone = this.scope.sprintId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n return this.q.all([this.rs.tasks.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, 'tasks-custom-filters')]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, owner, role, selected, statuses, tags, tagsWithAtLeastOneElement;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(this));\n };\n\n TaskboardController.prototype._setMeta = function() {\n var description, prettyDate, title;\n prettyDate = this.translate.instant(\"BACKLOG.SPRINTS.DATE\");\n title = this.translate.instant(\"TASKBOARD.PAGE_TITLE\", {\n projectName: this.scope.project.name,\n sprintName: this.scope.sprint.name\n });\n description = this.translate.instant(\"TASKBOARD.PAGE_DESCRIPTION\", {\n projectName: this.scope.project.name,\n sprintName: this.scope.sprint.name,\n startDate: moment(this.scope.sprint.estimated_start).format(prettyDate),\n endDate: moment(this.scope.sprint.estimated_finish).format(prettyDate),\n completedPercentage: this.scope.stats.completedPercentage || \"0\",\n completedPoints: this.scope.stats.completedPointsSum || \"--\",\n totalPoints: this.scope.stats.totalPointsSum || \"--\",\n openTasks: this.scope.stats.openTasks || \"--\",\n totalTasks: this.scope.stats.total_tasks || \"--\"\n });\n return this.appMetaService.setAll(title, description);\n };\n\n TaskboardController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"taskform:bulk:success\", (function(_this) {\n return function(event, tasks) {\n _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.add(tasks);\n });\n return _this.analytics.trackEvent(\"task\", \"create\", \"bulk create task on taskboard\", 1);\n };\n })(this));\n this.scope.$on(\"taskform:new:success\", (function(_this) {\n return function(event, task) {\n _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.add(task);\n });\n return _this.analytics.trackEvent(\"task\", \"create\", \"create task on taskboard\", 1);\n };\n })(this));\n this.scope.$on(\"taskform:edit:success\", (function(_this) {\n return function(event, task) {\n return _this.refreshTagsColors().then(function() {\n return _this.taskboardTasksService.replaceModel(task);\n });\n };\n })(this));\n this.scope.$on(\"taskboard:task:deleted\", (function(_this) {\n return function(event, task) {\n return _this.loadTasks();\n };\n })(this));\n this.scope.$on(\"taskboard:task:move\", this.taskMove);\n return this.scope.$on(\"assigned-to:added\", this.onAssignedToChanged);\n };\n\n TaskboardController.prototype.onAssignedToChanged = function(ctx, userid, taskModel) {\n taskModel.assigned_to = userid;\n this.taskboardTasksService.replaceModel(taskModel);\n return this.repo.save(taskModel).then((function(_this) {\n return function() {\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('assigned_to') || _this.isFilterDataTypeSelected('role')) {\n return _this.loadTasks();\n }\n };\n })(this));\n };\n\n TaskboardController.prototype.initializeSubscription = function() {\n var routingKey, routingKey1;\n routingKey = \"changes.project.\" + this.scope.projectId + \".tasks\";\n this.events.subscribe(this.scope, routingKey, (function(_this) {\n return function(message) {\n return _this.loadTaskboard();\n };\n })(this));\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n return this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n _this.refreshTagsColors();\n _this.loadSprintStats();\n return _this.loadSprint();\n };\n })(this));\n };\n\n TaskboardController.prototype.loadProject = function() {\n return this.rs.projects.get(this.scope.projectId).then((function(_this) {\n return function(project) {\n if (!project.is_backlog_activated) {\n _this.errorHandlingService.permissionDenied();\n }\n _this.scope.project = project;\n _this.scope.pointsList = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(project.points, function(e) {\n return e.id;\n });\n _this.scope.roleById = groupBy(project.roles, function(e) {\n return e.id;\n });\n _this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n _this.scope.usStatusById = groupBy(project.us_statuses, function(e) {\n return e.id;\n });\n _this.scope.$emit('project:loaded', project);\n _this.fillUsersAndRoles(project.members, project.roles);\n return project;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadSprintStats = function() {\n return this.rs.sprints.stats(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(stats) {\n var completedPointsSum, remainingPointsSum, remainingTasks, totalPointsSum;\n totalPointsSum = _.reduce(_.values(stats.total_points), (function(res, n) {\n return res + n;\n }), 0);\n completedPointsSum = _.reduce(_.values(stats.completed_points), (function(res, n) {\n return res + n;\n }), 0);\n remainingPointsSum = totalPointsSum - completedPointsSum;\n remainingTasks = stats.total_tasks - stats.completed_tasks;\n _this.scope.stats = stats;\n _this.scope.stats.totalPointsSum = totalPointsSum;\n _this.scope.stats.completedPointsSum = completedPointsSum;\n _this.scope.stats.remainingPointsSum = remainingPointsSum;\n _this.scope.stats.remainingTasks = remainingTasks;\n if (stats.totalPointsSum) {\n _this.scope.stats.completedPercentage = Math.round(100 * stats.completedPointsSum / stats.totalPointsSum);\n } else {\n _this.scope.stats.completedPercentage = 0;\n }\n _this.scope.stats.openTasks = stats.total_tasks - stats.completed_tasks;\n return stats;\n };\n })(this));\n };\n\n TaskboardController.prototype.refreshTagsColors = function() {\n return this.rs.projects.tagsColors(this.scope.projectId).then((function(_this) {\n return function(tags_colors) {\n return _this.scope.project.tags_colors = tags_colors._attrs;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadSprint = function() {\n return this.rs.sprints.get(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n _this.scope.userstories = _.sortBy(sprint.user_stories, \"sprint_order\");\n _this.taskboardTasksService.setUserstories(_this.scope.userstories);\n return sprint;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTasks = function() {\n var params;\n params = {};\n if (this.zoomLevel > 1) {\n params.include_attachments = 1;\n }\n params = _.merge(params, this.location.search());\n return this.rs.tasks.list(this.scope.projectId, this.scope.sprintId, null, params).then((function(_this) {\n return function(tasks) {\n _this.taskboardTasksService.init(_this.scope.project, _this.scope.usersById);\n return _this.taskboardTasksService.set(tasks);\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTaskboard = function() {\n return this.q.all([\n this.refreshTagsColors(), this.loadSprintStats(), this.loadSprint().then((function(_this) {\n return function() {\n return _this.loadTasks();\n };\n })(this))\n ]);\n };\n\n TaskboardController.prototype.loadInitialData = function() {\n var params, promise;\n params = {\n pslug: this.params.pslug,\n sslug: this.params.sslug\n };\n promise = this.repo.resolve(params).then((function(_this) {\n return function(data) {\n _this.scope.projectId = data.project;\n _this.scope.sprintId = data.milestone;\n _this.initializeSubscription();\n return data;\n };\n })(this));\n return promise.then((function(_this) {\n return function() {\n return _this.loadProject();\n };\n })(this)).then((function(_this) {\n return function() {\n _this.generateFilters();\n return _this.loadTaskboard().then(function() {\n return _this.setRolePoints();\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.showPlaceHolder = function(statusId, usId) {\n if (!this.taskboardTasksService.tasksRaw.length) {\n if (this.scope.taskStatusList[0].id === statusId && (!this.scope.userstories.length || this.scope.userstories[0].id === usId)) {\n return true;\n }\n }\n return false;\n };\n\n TaskboardController.prototype.editTask = function(id) {\n var task;\n task = this.taskboardTasksService.getTask(id);\n task = task.set('loading-edit', true);\n this.taskboardTasksService.replace(task);\n return this.rs.tasks.getByRef(task.getIn(['model', 'project']), task.getIn(['model', 'ref'])).then((function(_this) {\n return function(editingTask) {\n return _this.rs2.attachments.list(\"task\", task.get('id'), task.getIn(['model', 'project'])).then(function(attachments) {\n _this.rootscope.$broadcast(\"taskform:edit\", editingTask, attachments.toJS());\n task = task.set('loading', false);\n return _this.taskboardTasksService.replace(task);\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.deleteTask = function(id) {\n var task;\n task = this.taskboardTasksService.getTask(id);\n task = task.set('loading-delete', true);\n return this.rs.tasks.getByRef(task.getIn(['model', 'project']), task.getIn(['model', 'ref'])).then((function(_this) {\n return function(deletingTask) {\n var message, title;\n task = task.set('loading-delete', false);\n title = _this.translate.instant(\"TASK.TITLE_DELETE_ACTION\");\n message = deletingTask.subject;\n return _this.confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = _this.repo.remove(deletingTask);\n promise.then(function() {\n _this.scope.$broadcast(\"taskboard:task:deleted\");\n return askResponse.finish();\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return this.confirm.notify(\"error\");\n });\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.taskMove = function(ctx, task, oldStatusId, usId, statusId, order) {\n var moveUpdateData, options, params, promise;\n task = this.taskboardTasksService.getTaskModel(task.get('id'));\n moveUpdateData = this.taskboardTasksService.move(task.id, usId, statusId, order);\n params = {\n status__is_archived: false,\n include_attachments: true\n };\n options = {\n headers: {\n \"set-orders\": JSON.stringify(moveUpdateData.set_orders)\n }\n };\n return promise = this.repo.save(task, true, params, options, true).then((function(_this) {\n return function(result) {\n var headers;\n headers = result[1];\n if (headers && headers['taiga-info-order-updated']) {\n order = JSON.parse(headers['taiga-info-order-updated']);\n _this.taskboardTasksService.assignOrders(order);\n }\n _this.loadSprintStats();\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('status')) {\n return _this.loadTasks();\n }\n };\n })(this));\n };\n\n TaskboardController.prototype.addNewTask = function(type, us) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"taskform:new\", this.scope.sprintId, us != null ? us.id : void 0);\n case \"bulk\":\n return this.rootscope.$broadcast(\"taskform:bulk\", this.scope.sprintId, us != null ? us.id : void 0);\n }\n };\n\n TaskboardController.prototype.toggleFold = function(id) {\n return this.taskboardTasksService.toggleFold(id);\n };\n\n TaskboardController.prototype.changeTaskAssignedTo = function(id) {\n var task;\n task = this.taskboardTasksService.getTaskModel(id);\n return this.rootscope.$broadcast(\"assigned-to:add\", task);\n };\n\n TaskboardController.prototype.setRolePoints = function() {\n var computableRoles, getPoint, getRole, pointsByRole;\n computableRoles = _.filter(this.scope.project.roles, \"computable\");\n getRole = (function(_this) {\n return function(roleId) {\n roleId = parseInt(roleId, 10);\n return _.find(computableRoles, function(role) {\n return role.id === roleId;\n });\n };\n })(this);\n getPoint = (function(_this) {\n return function(pointId) {\n var poitnId;\n poitnId = parseInt(pointId, 10);\n return _.find(_this.scope.project.points, function(point) {\n return point.id === pointId;\n });\n };\n })(this);\n pointsByRole = _.reduce(this.scope.userstories, (function(_this) {\n return function(result, us, key) {\n _.forOwn(us.points, function(pointId, roleId) {\n var point, role;\n role = getRole(roleId);\n point = getPoint(pointId);\n if (!result[role.id]) {\n result[role.id] = role;\n result[role.id].points = 0;\n }\n return result[role.id].points += point.value;\n });\n return result;\n };\n })(this), {});\n return this.scope.pointsByRole = Object.keys(pointsByRole).map(function(key) {\n return pointsByRole[key];\n });\n };\n\n return TaskboardController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"TaskboardController\", TaskboardController);\n\n TaskboardDirective = function($rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, tableBodyDom;\n $ctrl = $el.controller();\n $el.on(\"click\", \".toggle-analytics-visibility\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.toggleClass('active');\n return $rootscope.$broadcast(\"taskboard:graph:toggle-visibility\");\n });\n tableBodyDom = $el.find(\".taskboard-table-body\");\n tableBodyDom.on(\"scroll\", function(event) {\n var tableHeaderDom, target;\n target = angular.element(event.currentTarget);\n tableHeaderDom = $el.find(\".taskboard-table-header .taskboard-table-inner\");\n return tableHeaderDom.css(\"left\", -1 * target.scrollLeft());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboard\", [\"$rootScope\", TaskboardDirective]);\n\n TaskboardSquishColumnDirective = function(rs) {\n var avatarWidth, link, maxColumnWidth;\n avatarWidth = 40;\n maxColumnWidth = 300;\n link = function($scope, $el, $attrs) {\n var getCeilWidth, recalculateStatusColumnWidth, recalculateTaskboardWidth, refreshTaskboardTableWidth, setStatusColumnWidth;\n $scope.$on(\"sprint:zoom0\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n $scope.$on(\"sprint:task:moved\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n $scope.$watch(\"usTasks\", function() {\n if ($scope.project) {\n $scope.statusesFolded = rs.tasks.getStatusColumnModes($scope.project.id);\n $scope.usFolded = rs.tasks.getUsRowModes($scope.project.id, $scope.sprintId);\n return recalculateTaskboardWidth();\n }\n });\n $scope.foldStatus = function(status) {\n $scope.statusesFolded[status.id] = !!!$scope.statusesFolded[status.id];\n rs.tasks.storeStatusColumnModes($scope.projectId, $scope.statusesFolded);\n return recalculateTaskboardWidth();\n };\n $scope.foldUs = function(us) {\n if (!us) {\n $scope.usFolded[null] = !!!$scope.usFolded[null];\n } else {\n $scope.usFolded[us.id] = !!!$scope.usFolded[us.id];\n }\n rs.tasks.storeUsRowModes($scope.projectId, $scope.sprintId, $scope.usFolded);\n return recalculateTaskboardWidth();\n };\n getCeilWidth = (function(_this) {\n return function(usId, statusId) {\n var tasks, tasksMatrixSize, width;\n if (usId) {\n tasks = $scope.usTasks.getIn([usId.toString(), statusId.toString()]).size;\n } else {\n tasks = $scope.usTasks.getIn(['null', statusId.toString()]).size;\n }\n if ($scope.statusesFolded[statusId]) {\n if (tasks && $scope.usFolded[usId]) {\n tasksMatrixSize = Math.round(Math.sqrt(tasks));\n width = avatarWidth * tasksMatrixSize;\n } else {\n width = avatarWidth;\n }\n return width;\n }\n return 0;\n };\n })(this);\n setStatusColumnWidth = (function(_this) {\n return function(statusId, width) {\n var column;\n column = $el.find(\".squish-status-\" + statusId);\n if (width) {\n return column.css('max-width', width);\n } else {\n if ($scope.ctrl.zoomLevel === '0') {\n return column.css(\"max-width\", 148);\n } else {\n return column.css(\"max-width\", maxColumnWidth);\n }\n }\n };\n })(this);\n refreshTaskboardTableWidth = (function(_this) {\n return function() {\n var columnWidths, columns, totalWidth;\n columnWidths = [];\n columns = $el.find(\".task-colum-name\");\n columnWidths = _.map(columns, function(column) {\n return $(column).outerWidth(true);\n });\n totalWidth = _.reduce(columnWidths, function(total, width) {\n return total + width;\n });\n return $el.find('.taskboard-table-inner').css(\"width\", totalWidth);\n };\n })(this);\n recalculateStatusColumnWidth = (function(_this) {\n return function(statusId) {\n var statusFoldedWidth;\n statusFoldedWidth = getCeilWidth(null, statusId);\n _.forEach($scope.userstories, function(us) {\n var width;\n width = getCeilWidth(us.id, statusId);\n if (width > statusFoldedWidth) {\n return statusFoldedWidth = width;\n }\n });\n return setStatusColumnWidth(statusId, statusFoldedWidth);\n };\n })(this);\n return recalculateTaskboardWidth = (function(_this) {\n return function() {\n _.forEach($scope.taskStatusList, function(status) {\n return recalculateStatusColumnWidth(status.id);\n });\n refreshTaskboardTableWidth();\n };\n })(this);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSquishColumn\", [\"$tgResources\", TaskboardSquishColumnDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/sortable.coffee\n */\n\n(function() {\n var TaskboardSortableDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaBacklog\");\n\n TaskboardSortableDirective = function($repo, $rs, $rootscope, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch;\n return unwatch = $scope.$watch(\"usTasks\", function(usTasks) {\n var containers, deleteElement, drake, filterError, itemEl, newParentScope, oldParentScope, scroll, tdom;\n if (!usTasks || !usTasks.size) {\n return;\n }\n unwatch();\n if (!($scope.project.my_permissions.indexOf(\"modify_task\") > -1)) {\n return;\n }\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n filterError = function() {\n var text;\n text = $translate.instant(\"BACKLOG.SORTABLE_FILTER_ERROR\");\n return $tgConfirm.notify(\"error\", text);\n };\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n containers = _.map($el.find('.task-column'), function(item) {\n return item;\n });\n drake = dragula(containers, {\n copySortSource: false,\n copy: false,\n accepts: function(el, target) {\n return !$(target).hasClass('taskboard-userstory-box');\n },\n moves: function(item) {\n return $(item).is('tg-card');\n }\n });\n drake.on('drag', function(item) {\n oldParentScope = $(item).parent().scope();\n if ($el.hasClass(\"active-filters\")) {\n filterError();\n setTimeout((function() {\n return drake.cancel(true);\n }), 0);\n return false;\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex, itemTask, newStatusId, newUsId, oldStatusId, oldUsId, parentEl;\n parentEl = $(item).parent();\n itemEl = $(item);\n itemTask = itemEl.scope().task;\n itemIndex = itemEl.index();\n newParentScope = parentEl.scope();\n oldUsId = oldParentScope.us ? oldParentScope.us.id : null;\n oldStatusId = oldParentScope.st.id;\n newUsId = newParentScope.us ? newParentScope.us.id : null;\n newStatusId = newParentScope.st.id;\n if (newStatusId !== oldStatusId || newUsId !== oldUsId) {\n deleteElement(itemEl);\n }\n return $scope.$apply(function() {\n return $rootscope.$broadcast(\"taskboard:task:move\", itemTask, itemTask.getIn(['model', 'status']), newUsId, newStatusId, itemIndex);\n });\n });\n scroll = autoScroll([$('.taskboard-table-body')[0]], {\n margin: 100,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$translate\", TaskboardSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.service.coffee\n */\n\n(function() {\n var TaskboardTasksService, groupBy,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n groupBy = this.taiga.groupBy;\n\n TaskboardTasksService = (function(superClass) {\n extend(TaskboardTasksService, superClass);\n\n TaskboardTasksService.$inject = [];\n\n function TaskboardTasksService() {\n this.reset();\n }\n\n TaskboardTasksService.prototype.reset = function() {\n this.tasksRaw = [];\n this.foldStatusChanged = {};\n return this.usTasks = Immutable.Map();\n };\n\n TaskboardTasksService.prototype.init = function(project, usersById) {\n this.project = project;\n return this.usersById = usersById;\n };\n\n TaskboardTasksService.prototype.resetFolds = function() {\n this.foldStatusChanged = {};\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.toggleFold = function(taskId) {\n this.foldStatusChanged[taskId] = !this.foldStatusChanged[taskId];\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.add = function(task) {\n this.tasksRaw = this.tasksRaw.concat(task);\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.set = function(tasks) {\n this.tasksRaw = tasks;\n this.refreshRawOrder();\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.setUserstories = function(userstories) {\n return this.userstories = userstories;\n };\n\n TaskboardTasksService.prototype.refreshRawOrder = function() {\n var i, len, ref, results, task;\n this.order = {};\n ref = this.tasksRaw;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n task = ref[i];\n results.push(this.order[task.id] = task.taskboard_order);\n }\n return results;\n };\n\n TaskboardTasksService.prototype.assignOrders = function(order) {\n order = _.invert(order);\n this.order = _.assign(this.order, order);\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.getTask = function(id) {\n var findedTask;\n findedTask = null;\n this.usTasks.forEach(function(us) {\n us.forEach(function(status) {\n findedTask = status.find(function(task) {\n return task.get('id') === id;\n });\n if (findedTask) {\n return false;\n }\n });\n if (findedTask) {\n return false;\n }\n });\n return findedTask;\n };\n\n TaskboardTasksService.prototype.replace = function(task) {\n return this.usTasks = this.usTasks.map(function(us) {\n return us.map(function(status) {\n var findedIndex;\n findedIndex = status.findIndex(function(usItem) {\n return usItem.get('id') === us.get('id');\n });\n if (findedIndex !== -1) {\n status = status.set(findedIndex, task);\n }\n return status;\n });\n });\n };\n\n TaskboardTasksService.prototype.getTaskModel = function(id) {\n return _.find(this.tasksRaw, function(task) {\n return task.id === id;\n });\n };\n\n TaskboardTasksService.prototype.replaceModel = function(task) {\n this.tasksRaw = _.map(this.tasksRaw, function(it) {\n if (task.id === it.id) {\n return task;\n } else {\n return it;\n }\n });\n return this.refresh();\n };\n\n TaskboardTasksService.prototype.move = function(id, usId, statusId, index) {\n var afterDestination, beforeDestination, i, it, j, key, len, len1, previous, previousWithTheSameOrder, setOrders, taksWithoutMoved, task, taskByUsStatus;\n task = this.getTaskModel(id);\n taskByUsStatus = _.filter(this.tasksRaw, (function(_this) {\n return function(task) {\n return task.status === statusId && task.user_story === usId;\n };\n })(this));\n taskByUsStatus = _.sortBy(taskByUsStatus, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n taksWithoutMoved = _.filter(taskByUsStatus, (function(_this) {\n return function(it) {\n return it.id !== id;\n };\n })(this));\n beforeDestination = _.slice(taksWithoutMoved, 0, index);\n afterDestination = _.slice(taksWithoutMoved, index);\n setOrders = {};\n previous = beforeDestination[beforeDestination.length - 1];\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return _this.order[it.id] === _this.order[previous.id];\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n for (i = 0, len = previousWithTheSameOrder.length; i < len; i++) {\n it = previousWithTheSameOrder[i];\n setOrders[it.id] = this.order[it.id];\n }\n }\n if (!previous) {\n this.order[task.id] = 0;\n } else if (previous) {\n this.order[task.id] = this.order[previous.id] + 1;\n }\n for (key = j = 0, len1 = afterDestination.length; j < len1; key = ++j) {\n it = afterDestination[key];\n this.order[it.id] = this.order[task.id] + key + 1;\n }\n task.status = statusId;\n task.user_story = usId;\n task.taskboard_order = this.order[task.id];\n this.refresh();\n return {\n \"task_id\": task.id,\n \"order\": this.order[task.id],\n \"set_orders\": setOrders\n };\n };\n\n TaskboardTasksService.prototype.refresh = function() {\n var i, j, k, len, len1, len2, model, ref, status, task, taskModel, taskStatusList, tasks, us, usTasks;\n this.tasksRaw = _.sortBy(this.tasksRaw, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n tasks = this.tasksRaw;\n taskStatusList = _.sortBy(this.project.task_statuses, \"order\");\n usTasks = {};\n ref = _.union(this.userstories, [\n {\n id: null\n }\n ]);\n for (i = 0, len = ref.length; i < len; i++) {\n us = ref[i];\n usTasks[us.id] = {};\n for (j = 0, len1 = taskStatusList.length; j < len1; j++) {\n status = taskStatusList[j];\n usTasks[us.id][status.id] = [];\n }\n }\n for (k = 0, len2 = tasks.length; k < len2; k++) {\n taskModel = tasks[k];\n if ((usTasks[taskModel.user_story] != null) && (usTasks[taskModel.user_story][taskModel.status] != null)) {\n task = {};\n model = taskModel.getAttrs();\n task.foldStatusChanged = this.foldStatusChanged[taskModel.id];\n task.model = model;\n task.images = _.filter(model.attachments, function(it) {\n return !!it.thumbnail_card_url;\n });\n task.id = taskModel.id;\n task.assigned_to = this.usersById[taskModel.assigned_to];\n task.colorized_tags = _.map(task.model.tags, (function(_this) {\n return function(tag) {\n return {\n name: tag[0],\n color: tag[1]\n };\n };\n })(this));\n usTasks[taskModel.user_story][taskModel.status].push(task);\n }\n }\n return this.usTasks = Immutable.fromJS(usTasks);\n };\n\n return TaskboardTasksService;\n\n })(taiga.Service);\n\n angular.module(\"taigaKanban\").service(\"tgTaskboardTasks\", TaskboardTasksService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: kanban-userstories.service.coffee\n */\n\n(function() {\n var KanbanUserstoriesService, groupBy,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n groupBy = this.taiga.groupBy;\n\n KanbanUserstoriesService = (function(superClass) {\n extend(KanbanUserstoriesService, superClass);\n\n KanbanUserstoriesService.$inject = [];\n\n function KanbanUserstoriesService() {\n this.reset();\n }\n\n KanbanUserstoriesService.prototype.reset = function() {\n this.userstoriesRaw = [];\n this.archivedStatus = [];\n this.statusHide = [];\n this.foldStatusChanged = {};\n return this.usByStatus = Immutable.Map();\n };\n\n KanbanUserstoriesService.prototype.init = function(project, usersById) {\n this.project = project;\n return this.usersById = usersById;\n };\n\n KanbanUserstoriesService.prototype.resetFolds = function() {\n this.foldStatusChanged = {};\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.toggleFold = function(usId) {\n this.foldStatusChanged[usId] = !this.foldStatusChanged[usId];\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.set = function(userstories) {\n this.userstoriesRaw = userstories;\n this.refreshRawOrder();\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.add = function(us) {\n this.userstoriesRaw = this.userstoriesRaw.concat(us);\n this.refreshRawOrder();\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.addArchivedStatus = function(statusId) {\n return this.archivedStatus.push(statusId);\n };\n\n KanbanUserstoriesService.prototype.isUsInArchivedHiddenStatus = function(usId) {\n var us;\n us = this.getUsModel(usId);\n return this.archivedStatus.indexOf(us.status) !== -1 && this.statusHide.indexOf(us.status) !== -1;\n };\n\n KanbanUserstoriesService.prototype.hideStatus = function(statusId) {\n this.deleteStatus(statusId);\n return this.statusHide.push(statusId);\n };\n\n KanbanUserstoriesService.prototype.showStatus = function(statusId) {\n return _.remove(this.statusHide, function(it) {\n return it === statusId;\n });\n };\n\n KanbanUserstoriesService.prototype.getStatus = function(statusId) {\n return _.filter(this.userstoriesRaw, function(us) {\n return us.status === statusId;\n });\n };\n\n KanbanUserstoriesService.prototype.deleteStatus = function(statusId) {\n var toDelete;\n toDelete = _.filter(this.userstoriesRaw, function(us) {\n return us.status === statusId;\n });\n toDelete = _.map(function(it) {\n return it.id;\n });\n this.archived = _.difference(this.archived, toDelete);\n this.userstoriesRaw = _.filter(this.userstoriesRaw, function(us) {\n return us.status !== statusId;\n });\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.refreshRawOrder = function() {\n var i, it, len, ref, results;\n this.order = {};\n ref = this.userstoriesRaw;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n it = ref[i];\n results.push(this.order[it.id] = it.kanban_order);\n }\n return results;\n };\n\n KanbanUserstoriesService.prototype.assignOrders = function(order) {\n this.order = _.assign(this.order, order);\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.move = function(usList, statusId, index) {\n var afterDestination, beforeDestination, i, initialLength, it, j, k, key, len, len1, len2, modifiedUs, previous, previousWithTheSameOrder, setNextOrders, setOrders, setPreviousOrders, startIndex, us, usByStatus, usByStatusWithoutMoved;\n initialLength = usList.length;\n usByStatus = _.filter(this.userstoriesRaw, (function(_this) {\n return function(it) {\n return it.status === statusId;\n };\n })(this));\n usByStatus = _.sortBy(usByStatus, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n usByStatusWithoutMoved = _.filter(usByStatus, function(listIt) {\n return !_.find(usList, function(moveIt) {\n return listIt.id === moveIt.id;\n });\n });\n beforeDestination = _.slice(usByStatusWithoutMoved, 0, index);\n afterDestination = _.slice(usByStatusWithoutMoved, index);\n setOrders = {};\n previous = beforeDestination[beforeDestination.length - 1];\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return _this.order[it.id] === _this.order[previous.id];\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n for (i = 0, len = previousWithTheSameOrder.length; i < len; i++) {\n it = previousWithTheSameOrder[i];\n setOrders[it.id] = this.order[it.id];\n }\n }\n modifiedUs = [];\n setPreviousOrders = [];\n setNextOrders = [];\n if (!previous) {\n startIndex = 0;\n } else if (previous) {\n startIndex = this.order[previous.id] + 1;\n previousWithTheSameOrder = _.filter(beforeDestination, (function(_this) {\n return function(it) {\n return it.kanban_order === _this.order[previous.id];\n };\n })(this));\n for (key = j = 0, len1 = afterDestination.length; j < len1; key = ++j) {\n it = afterDestination[key];\n this.order[it.id] = this.order[previous.id] + key + initialLength + 1;\n it.kanban_order = this.order[it.id];\n }\n setNextOrders = _.map(afterDestination, (function(_this) {\n return function(it) {\n return {\n us_id: it.id,\n order: _this.order[it.id]\n };\n };\n })(this));\n if (previousWithTheSameOrder.length > 1) {\n setPreviousOrders = _.map(previousWithTheSameOrder, (function(_this) {\n return function(it) {\n return {\n us_id: it.id,\n order: _this.order[it.id]\n };\n };\n })(this));\n }\n }\n for (key = k = 0, len2 = usList.length; k < len2; key = ++k) {\n us = usList[key];\n us.status = statusId;\n us.kanban_order = startIndex + key;\n this.order[us.id] = us.kanban_order;\n modifiedUs.push({\n us_id: us.id,\n order: us.kanban_order\n });\n }\n this.refresh();\n return {\n bulkOrders: modifiedUs.concat(setPreviousOrders, setNextOrders),\n usList: modifiedUs,\n set_orders: setOrders\n };\n };\n\n KanbanUserstoriesService.prototype.moveToEnd = function(id, statusId) {\n var us;\n us = this.getUsModel(id);\n this.order[us.id] = -1;\n us.status = statusId;\n us.kanban_order = this.order[us.id];\n this.refresh();\n return {\n \"us_id\": us.id,\n \"order\": -1\n };\n };\n\n KanbanUserstoriesService.prototype.replace = function(us) {\n return this.usByStatus = this.usByStatus.map(function(status) {\n var findedIndex;\n findedIndex = status.findIndex(function(usItem) {\n return usItem.get('id') === us.get('id');\n });\n if (findedIndex !== -1) {\n status = status.set(findedIndex, us);\n }\n return status;\n });\n };\n\n KanbanUserstoriesService.prototype.replaceModel = function(us) {\n this.userstoriesRaw = _.map(this.userstoriesRaw, function(usItem) {\n if (us.id === usItem.id) {\n return us;\n } else {\n return usItem;\n }\n });\n return this.refresh();\n };\n\n KanbanUserstoriesService.prototype.getUs = function(id) {\n var findedUs;\n findedUs = null;\n this.usByStatus.forEach(function(status) {\n findedUs = status.find(function(us) {\n return us.get('id') === id;\n });\n if (findedUs) {\n return false;\n }\n });\n return findedUs;\n };\n\n KanbanUserstoriesService.prototype.getUsModel = function(id) {\n return _.find(this.userstoriesRaw, function(us) {\n return us.id === id;\n });\n };\n\n KanbanUserstoriesService.prototype.refresh = function() {\n var usByStatus, userstories;\n this.userstoriesRaw = _.sortBy(this.userstoriesRaw, (function(_this) {\n return function(it) {\n return _this.order[it.id];\n };\n })(this));\n userstories = this.userstoriesRaw;\n userstories = _.map(userstories, (function(_this) {\n return function(usModel) {\n var model, us;\n us = {};\n model = usModel.getAttrs();\n us.foldStatusChanged = _this.foldStatusChanged[usModel.id];\n us.model = model;\n us.images = _.filter(model.attachments, function(it) {\n return !!it.thumbnail_card_url;\n });\n us.id = usModel.id;\n us.assigned_to = _this.usersById[usModel.assigned_to];\n us.assigned_users = [];\n usModel.assigned_users.forEach(function(assignedUserId) {\n var assignedUserData;\n assignedUserData = _this.usersById[assignedUserId];\n return us.assigned_users.push(assignedUserData);\n });\n us.colorized_tags = _.map(us.model.tags, function(tag) {\n return {\n name: tag[0],\n color: tag[1]\n };\n });\n return us;\n };\n })(this));\n usByStatus = _.groupBy(userstories, function(us) {\n return us.model.status;\n });\n return this.usByStatus = Immutable.fromJS(usByStatus);\n };\n\n return KanbanUserstoriesService;\n\n })(taiga.Service);\n\n angular.module(\"taigaKanban\").service(\"tgKanbanUserstories\", KanbanUserstoriesService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban/main.coffee\n */\n\n(function() {\n var KanbanArchivedStatusHeaderDirective, KanbanArchivedStatusIntroDirective, KanbanController, KanbanDirective, KanbanSquishColumnDirective, KanbanWipLimitDirective, bindMethods, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaKanban\");\n\n KanbanController = (function(superClass) {\n extend(KanbanController, superClass);\n\n KanbanController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"$tgModel\", \"tgKanbanUserstories\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\"];\n\n KanbanController.prototype.storeCustomFiltersName = 'kanban-custom-filters';\n\n KanbanController.prototype.storeFiltersName = 'kanban-filters';\n\n function KanbanController(scope, rootscope, repo, confirm, rs1, rs2, params1, q, location, appMetaService, navUrls, events, analytics, translate, errorHandlingService, model, kanbanUserstoriesService1, storage, filterRemoteStorageService, projectService1) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.rs2 = rs2;\n this.params = params1;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.model = model;\n this.kanbanUserstoriesService = kanbanUserstoriesService1;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService1;\n bindMethods(this);\n this.kanbanUserstoriesService.reset();\n this.openFilter = false;\n this.selectedUss = {};\n if (this.applyStoredFilters(this.params.pslug, \"kanban-filters\")) {\n return;\n }\n this.scope.sectionName = this.translate.instant(\"KANBAN.SECTION_NAME\");\n this.initializeEventHandlers();\n taiga.defineImmutableProperty(this.scope, \"usByStatus\", (function(_this) {\n return function() {\n return _this.kanbanUserstoriesService.usByStatus;\n };\n })(this));\n }\n\n KanbanController.prototype.cleanSelectedUss = function() {\n var key, results;\n results = [];\n for (key in this.selectedUss) {\n results.push(this.selectedUss[key] = false);\n }\n return results;\n };\n\n KanbanController.prototype.toggleSelectedUs = function(usId) {\n return this.selectedUss[usId] = !this.selectedUss[usId];\n };\n\n KanbanController.prototype.firstLoad = function() {\n var promise;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"KANBAN.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"KANBAN.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n return promise.then(null, this.onInitialDataError.bind(this));\n };\n\n KanbanController.prototype.setZoom = function(zoomLevel, zoom) {\n var previousZoomLevel;\n if (this.zoomLevel === zoomLevel) {\n return null;\n }\n this.isFirstLoad = !this.zoomLevel;\n previousZoomLevel = this.zoomLevel;\n this.zoomLevel = zoomLevel;\n this.zoom = zoom;\n if (this.isFirstLoad) {\n return this.firstLoad().then((function(_this) {\n return function() {\n _this.isFirstLoad = false;\n return _this.kanbanUserstoriesService.resetFolds();\n };\n })(this));\n } else if (this.zoomLevel > 1 && previousZoomLevel <= 1) {\n this.zoomLoading = true;\n return this.loadUserstories().then((function(_this) {\n return function() {\n _this.zoomLoading = false;\n return _this.kanbanUserstoriesService.resetFolds();\n };\n })(this));\n }\n };\n\n KanbanController.prototype.filtersReloadContent = function() {\n return this.loadUserstories().then((function(_this) {\n return function() {\n var i, len, openArchived, results, statusId;\n openArchived = _.difference(_this.kanbanUserstoriesService.archivedStatus, _this.kanbanUserstoriesService.statusHide);\n if (openArchived.length) {\n results = [];\n for (i = 0, len = openArchived.length; i < len; i++) {\n statusId = openArchived[i];\n results.push(_this.loadUserStoriesForStatus({}, statusId));\n }\n return results;\n }\n };\n })(this));\n };\n\n KanbanController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function(event, us) {\n _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.add(us);\n });\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"create userstory on kanban\", 1);\n };\n })(this));\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function(event, uss) {\n _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.add(uss);\n });\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on kanban\", 1);\n };\n })(this));\n this.scope.$on(\"usform:edit:success\", (function(_this) {\n return function(event, us) {\n return _this.refreshTagsColors().then(function() {\n return _this.kanbanUserstoriesService.replaceModel(us);\n });\n };\n })(this));\n this.scope.$on(\"kanban:us:deleted\", (function(_this) {\n return function(event, us) {\n return _this.filtersReloadContent();\n };\n })(this));\n this.scope.$on(\"assigned-to:added\", this.onAssignedToChanged);\n this.scope.$on(\"assigned-user:added\", this.onAssignedUsersChanged);\n this.scope.$on(\"assigned-user:deleted\", this.onAssignedUsersDeleted);\n this.scope.$on(\"kanban:us:move\", this.moveUs);\n this.scope.$on(\"kanban:show-userstories-for-status\", this.loadUserStoriesForStatus);\n return this.scope.$on(\"kanban:hide-userstories-for-status\", this.hideUserStoriesForStatus);\n };\n\n KanbanController.prototype.addNewUs = function(type, statusId) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"usform:new\", this.scope.projectId, statusId, this.scope.usStatusList);\n case \"bulk\":\n return this.rootscope.$broadcast(\"usform:bulk\", this.scope.projectId, statusId);\n }\n };\n\n KanbanController.prototype.editUs = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUs(id);\n us = us.set('loading-edit', true);\n this.kanbanUserstoriesService.replace(us);\n return this.rs.userstories.getByRef(us.getIn(['model', 'project']), us.getIn(['model', 'ref'])).then((function(_this) {\n return function(editingUserStory) {\n return _this.rs2.attachments.list(\"us\", us.get('id'), us.getIn(['model', 'project'])).then(function(attachments) {\n _this.rootscope.$broadcast(\"usform:edit\", editingUserStory, attachments.toJS());\n us = us.set('loading-edit', false);\n return _this.kanbanUserstoriesService.replace(us);\n });\n };\n })(this));\n };\n\n KanbanController.prototype.deleteUs = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUs(id);\n us = us.set('loading-delete', true);\n return this.rs.userstories.getByRef(us.getIn(['model', 'project']), us.getIn(['model', 'ref'])).then((function(_this) {\n return function(deletingUserStory) {\n var message, title;\n us = us.set('loading-delete', false);\n title = _this.translate.instant(\"US.TITLE_DELETE_ACTION\");\n message = deletingUserStory.subject;\n return _this.confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = _this.repo.remove(deletingUserStory);\n promise.then(function() {\n _this.scope.$broadcast(\"kanban:us:deleted\");\n return askResponse.finish();\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return this.confirm.notify(\"error\");\n });\n });\n };\n })(this));\n };\n\n KanbanController.prototype.showPlaceHolder = function(statusId) {\n if (this.scope.usStatusList[0].id === statusId && !this.kanbanUserstoriesService.userstoriesRaw.length) {\n return true;\n }\n return false;\n };\n\n KanbanController.prototype.toggleFold = function(id) {\n return this.kanbanUserstoriesService.toggleFold(id);\n };\n\n KanbanController.prototype.isUsInArchivedHiddenStatus = function(usId) {\n return this.kanbanUserstoriesService.isUsInArchivedHiddenStatus(usId);\n };\n\n KanbanController.prototype.changeUsAssignedTo = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUsModel(id);\n return this.rootscope.$broadcast(\"assigned-to:add\", us);\n };\n\n KanbanController.prototype.changeUsAssignedUsers = function(id) {\n var us;\n us = this.kanbanUserstoriesService.getUsModel(id);\n return this.rootscope.$broadcast(\"assigned-user:add\", us);\n };\n\n KanbanController.prototype.onAssignedToChanged = function(ctx, userid, usModel) {\n usModel.assigned_to = userid;\n this.kanbanUserstoriesService.replaceModel(usModel);\n return this.repo.save(usModel).then((function(_this) {\n return function() {\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('assigned_to') || _this.isFilterDataTypeSelected('role')) {\n return _this.filtersReloadContent();\n }\n };\n })(this));\n };\n\n KanbanController.prototype.onAssignedUsersChanged = function(ctx, userid, usModel) {\n var assignedUsers, promise;\n assignedUsers = _.clone(usModel.assigned_users, false);\n assignedUsers.push(userid);\n assignedUsers = _.uniq(assignedUsers);\n usModel.assigned_users = assignedUsers;\n if (!usModel.assigned_to) {\n usModel.assigned_to = userid;\n }\n this.kanbanUserstoriesService.replaceModel(usModel);\n promise = this.repo.save(usModel);\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n\n KanbanController.prototype.onAssignedUsersDeleted = function(ctx, userid, usModel) {\n var assignedUsersIds, promise, ref;\n assignedUsersIds = _.clone(usModel.assigned_users, false);\n assignedUsersIds = _.pull(assignedUsersIds, userid);\n assignedUsersIds = _.uniq(assignedUsersIds);\n usModel.assigned_users = assignedUsersIds;\n if ((ref = usModel.assigned_to, indexOf.call(assignedUsersIds, ref) < 0) && assignedUsersIds.length > 0) {\n usModel.assigned_to = assignedUsersIds[0];\n }\n if (assignedUsersIds.length === 0) {\n usModel.assigned_to = null;\n }\n this.kanbanUserstoriesService.replaceModel(usModel);\n promise = this.repo.save(usModel);\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n\n KanbanController.prototype.refreshTagsColors = function() {\n return this.rs.projects.tagsColors(this.scope.projectId).then((function(_this) {\n return function(tags_colors) {\n return _this.scope.project.tags_colors = tags_colors._attrs;\n };\n })(this));\n };\n\n KanbanController.prototype.loadUserstories = function() {\n var params, promise;\n params = {\n status__is_archived: false\n };\n if (this.zoomLevel > 1) {\n params.include_attachments = 1;\n params.include_tasks = 1;\n }\n params = _.merge(params, this.location.search());\n promise = this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n _this.kanbanUserstoriesService.init(_this.scope.project, _this.scope.usersById);\n _this.kanbanUserstoriesService.set(userstories);\n scopeDefer(_this.scope, function() {\n return _this.scope.$broadcast(\"userstories:loaded\", userstories);\n });\n return userstories;\n };\n })(this));\n promise.then((function(_this) {\n return function() {\n return _this.scope.$broadcast(\"redraw:wip\");\n };\n })(this));\n return promise;\n };\n\n KanbanController.prototype.loadUserStoriesForStatus = function(ctx, statusId) {\n var filteredStatus, params;\n filteredStatus = this.location.search().status;\n if (filteredStatus) {\n filteredStatus = filteredStatus.split(\",\").map(function(it) {\n return parseInt(it, 10);\n });\n if (filteredStatus.indexOf(statusId) === -1) {\n return;\n }\n }\n params = {\n status: statusId,\n include_attachments: true,\n include_tasks: true\n };\n params = _.merge(params, this.location.search());\n return this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n _this.scope.$broadcast(\"kanban:shown-userstories-for-status\", statusId, userstories);\n return userstories;\n };\n })(this));\n };\n\n KanbanController.prototype.hideUserStoriesForStatus = function(ctx, statusId) {\n return this.scope.$broadcast(\"kanban:hidden-userstories-for-status\", statusId);\n };\n\n KanbanController.prototype.loadKanban = function() {\n return this.q.all([this.refreshTagsColors(), this.loadUserstories()]);\n };\n\n KanbanController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_kanban_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.projectId = project.id;\n this.scope.points = _.sortBy(project.points, \"order\");\n this.scope.pointsById = groupBy(project.points, function(x) {\n return x.id;\n });\n this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n this.scope.$emit(\"project:loaded\", project);\n return project;\n };\n\n KanbanController.prototype.initializeSubscription = function() {\n var routingKey1;\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n return this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n return _this.loadUserstories();\n };\n })(this));\n };\n\n KanbanController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n this.loadKanban();\n return this.generateFilters();\n };\n\n KanbanController.prototype.prepareBulkUpdateData = function(uses, field) {\n if (field == null) {\n field = \"kanban_order\";\n }\n return _.map(uses, function(x) {\n return {\n \"us_id\": x.id,\n \"order\": x[field]\n };\n });\n };\n\n KanbanController.prototype.moveUs = function(ctx, usList, newStatusId, index) {\n var data, promise;\n this.cleanSelectedUss();\n usList = _.map(usList, (function(_this) {\n return function(us) {\n return _this.kanbanUserstoriesService.getUsModel(us.id);\n };\n })(this));\n data = this.kanbanUserstoriesService.move(usList, newStatusId, index);\n promise = this.rs.userstories.bulkUpdateKanbanOrder(this.scope.projectId, newStatusId, data.bulkOrders);\n return promise.then((function(_this) {\n return function() {\n var options, params, promises;\n options = {\n headers: {\n \"set-orders\": JSON.stringify(data.setOrders)\n }\n };\n params = {\n include_attachments: true,\n include_tasks: true\n };\n promises = _.map(usList, function(us) {\n return _this.repo.save(us, true, params, options, true);\n });\n promise = _this.q.all(promises);\n return promise.then(function(result) {\n var headers, order;\n headers = result[1];\n if (headers && headers['taiga-info-order-updated']) {\n order = JSON.parse(headers['taiga-info-order-updated']);\n _this.kanbanUserstoriesService.assignOrders(order);\n }\n _this.scope.$broadcast(\"redraw:wip\");\n _this.generateFilters();\n if (_this.isFilterDataTypeSelected('status')) {\n _this.filtersReloadContent();\n }\n return promise;\n });\n };\n })(this));\n };\n\n return KanbanController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin, taiga.UsFiltersMixin));\n\n module.controller(\"KanbanController\", KanbanController);\n\n KanbanDirective = function($repo, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var tableBodyDom;\n tableBodyDom = $el.find(\".kanban-table-body\");\n tableBodyDom.on(\"scroll\", function(event) {\n var tableHeaderDom, target;\n target = angular.element(event.currentTarget);\n tableHeaderDom = $el.find(\".kanban-table-header .kanban-table-inner\");\n return tableHeaderDom.css(\"left\", -1 * target.scrollLeft());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanban\", [\"$tgRepo\", \"$rootScope\", KanbanDirective]);\n\n KanbanArchivedStatusHeaderDirective = function($rootscope, $translate, kanbanUserstoriesService) {\n var hideArchivedText, link, showArchivedText;\n showArchivedText = $translate.instant(\"KANBAN.ACTION_SHOW_ARCHIVED\");\n hideArchivedText = $translate.instant(\"KANBAN.ACTION_HIDE_ARCHIVED\");\n link = function($scope, $el, $attrs) {\n var hidden, status;\n status = $scope.$eval($attrs.tgKanbanArchivedStatusHeader);\n hidden = true;\n kanbanUserstoriesService.addArchivedStatus(status.id);\n kanbanUserstoriesService.hideStatus(status.id);\n $scope[\"class\"] = \"icon-watch\";\n $scope.title = showArchivedText;\n $el.on(\"click\", function(event) {\n hidden = !hidden;\n return $scope.$apply(function() {\n if (hidden) {\n $scope[\"class\"] = \"icon-watch\";\n $scope.title = showArchivedText;\n $rootscope.$broadcast(\"kanban:hide-userstories-for-status\", status.id);\n return kanbanUserstoriesService.hideStatus(status.id);\n } else {\n $scope[\"class\"] = \"icon-unwatch\";\n $scope.title = hideArchivedText;\n $rootscope.$broadcast(\"kanban:show-userstories-for-status\", status.id);\n return kanbanUserstoriesService.showStatus(status.id);\n }\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanArchivedStatusHeader\", [\"$rootScope\", \"$translate\", \"tgKanbanUserstories\", KanbanArchivedStatusHeaderDirective]);\n\n KanbanArchivedStatusIntroDirective = function($translate, kanbanUserstoriesService) {\n var link, userStories;\n userStories = [];\n link = function($scope, $el, $attrs) {\n var hiddenUserStoriexText, status, updateIntroText;\n hiddenUserStoriexText = $translate.instant(\"KANBAN.HIDDEN_USER_STORIES\");\n status = $scope.$eval($attrs.tgKanbanArchivedStatusIntro);\n $el.text(hiddenUserStoriexText);\n updateIntroText = function(hasArchived) {\n if (hasArchived) {\n return $el.text(\"\");\n } else {\n return $el.text(hiddenUserStoriexText);\n }\n };\n $scope.$on(\"kanban:us:move\", function(ctx, itemUs, oldStatusId, newStatusId, itemIndex) {\n var hasArchived;\n hasArchived = !!kanbanUserstoriesService.getStatus(newStatusId).length;\n return updateIntroText(hasArchived);\n });\n $scope.$on(\"kanban:shown-userstories-for-status\", function(ctx, statusId, userStoriesLoaded) {\n var hasArchived;\n if (statusId === status.id) {\n kanbanUserstoriesService.deleteStatus(statusId);\n kanbanUserstoriesService.add(userStoriesLoaded);\n hasArchived = !!kanbanUserstoriesService.getStatus(statusId).length;\n return updateIntroText(hasArchived);\n }\n });\n $scope.$on(\"kanban:hidden-userstories-for-status\", function(ctx, statusId) {\n if (statusId === status.id) {\n return updateIntroText(false);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanArchivedStatusIntro\", [\"$translate\", \"tgKanbanUserstories\", KanbanArchivedStatusIntroDirective]);\n\n KanbanSquishColumnDirective = function(rs, projectService) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch, updateTableWidth;\n $scope.foldStatus = function(status) {\n $scope.folds[status.id] = !!!$scope.folds[status.id];\n rs.kanban.storeStatusColumnModes($scope.projectId, $scope.folds);\n updateTableWidth();\n };\n updateTableWidth = function() {\n var columnWidths, totalWidth;\n columnWidths = _.map($scope.usStatusList, function(status) {\n if ($scope.folds[status.id]) {\n return 40;\n } else {\n return 310;\n }\n });\n totalWidth = _.reduce(columnWidths, function(total, width) {\n return total + width;\n });\n return $el.find('.kanban-table-inner').css(\"width\", totalWidth);\n };\n return unwatch = $scope.$watch('usByStatus', function(usByStatus) {\n if (usByStatus.size) {\n $scope.folds = rs.kanban.getStatusColumnModes(projectService.project.get('id'));\n updateTableWidth();\n return unwatch();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSquishColumn\", [\"$tgResources\", \"tgProjectService\", KanbanSquishColumnDirective]);\n\n KanbanWipLimitDirective = function($timeout) {\n var link;\n link = function($scope, $el, $attrs) {\n var redrawWipLimit, status;\n status = $scope.$eval($attrs.tgKanbanWipLimit);\n redrawWipLimit = (function(_this) {\n return function() {\n $el.find(\".kanban-wip-limit\").remove();\n return $timeout(function() {\n var element;\n element = $el.find(\"tg-card\")[status.wip_limit];\n if (element) {\n return angular.element(element).before(\"
    \");\n }\n });\n };\n })(this);\n if (status && !status.is_archived) {\n $scope.$on(\"redraw:wip\", redrawWipLimit);\n $scope.$on(\"kanban:us:move\", redrawWipLimit);\n $scope.$on(\"usform:new:success\", redrawWipLimit);\n $scope.$on(\"usform:bulk:success\", redrawWipLimit);\n }\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanWipLimit\", [\"$timeout\", KanbanWipLimitDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban/sortable.coffee\n */\n\n(function() {\n var KanbanSortableDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaKanban\");\n\n KanbanSortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var unwatch;\n return unwatch = $scope.$watch(\"usByStatus\", function(usByStatus) {\n var containers, deleteElement, drake, itemEl, newParentScope, scroll, tdom;\n if (!usByStatus || !usByStatus.size) {\n return;\n }\n unwatch();\n if (!($scope.project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n containers = _.map($el.find('.task-column'), function(item) {\n return item;\n });\n drake = dragula(containers, {\n copySortSource: false,\n copy: false,\n moves: function(item) {\n return $(item).is('tg-card');\n }\n });\n drake.on('drag', function(item) {\n return window.dragMultiple.start(item, containers);\n });\n drake.on('cloned', function(item, dropTarget) {\n return $(item).addClass('multiple-drag-mirror');\n });\n drake.on('dragend', function(item) {\n var dragMultipleItems, finalUsList, firstElement, index, newStatus, newStatusId, parentEl, usList;\n parentEl = $(item).parent();\n newParentScope = parentEl.scope();\n newStatusId = newParentScope.s.id;\n dragMultipleItems = window.dragMultiple.stop();\n if (!dragMultipleItems.length) {\n dragMultipleItems = [item];\n }\n firstElement = dragMultipleItems[0];\n index = $(firstElement).index();\n newStatus = newParentScope.s.id;\n usList = _.map(dragMultipleItems, function(item) {\n return $(item).scope().us;\n });\n finalUsList = _.map(usList, function(item) {\n return {\n id: item.get('id'),\n oldStatusId: item.getIn(['model', 'status'])\n };\n });\n return $scope.$apply(function() {\n _.each(usList, (function(_this) {\n return function(item, key) {\n var oldStatus, sameContainer;\n oldStatus = item.getIn(['model', 'status']);\n sameContainer = newStatus === oldStatus;\n if (!sameContainer) {\n itemEl = $(dragMultipleItems[key]);\n return deleteElement(itemEl);\n }\n };\n })(this));\n return $rootscope.$broadcast(\"kanban:us:move\", finalUsList, newStatus, index);\n });\n });\n scroll = autoScroll(containers, {\n margin: 100,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", KanbanSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/epics/detail.coffee\n */\n\n(function() {\n var EpicDetailController, EpicStatusButtonDirective, EpicStatusDisplayDirective, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaEpics\");\n\n EpicDetailController = (function(superClass) {\n extend(EpicDetailController, superClass);\n\n EpicDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgAnalytics\", \"$tgNavUrls\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function EpicDetailController(scope, rootscope, repo, confirm, rs, rs2, params, q, location, log, appMetaService, analytics, navUrls, translate, modelTransform, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.rs2 = rs2;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.analytics = analytics;\n this.navUrls = navUrls;\n this.translate = translate;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.epicRef = this.params.epicref;\n this.scope.sectionName = this.translate.instant(\"EPIC.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n EpicDetailController.prototype._setMeta = function() {\n var description, ref, title;\n title = this.translate.instant(\"EPIC.PAGE_TITLE\", {\n epicRef: \"#\" + this.scope.epic.ref,\n epicSubject: this.scope.epic.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"EPIC.PAGE_DESCRIPTION\", {\n epicStatus: ((ref = this.scope.statusById[this.scope.epic.status]) != null ? ref.name : void 0) || \"--\",\n epicDescription: angular.element(this.scope.epic.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n EpicDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on epic\", 1);\n };\n })(this));\n this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadEpic();\n };\n })(this));\n return this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n };\n\n EpicDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-epics\", ctx);\n };\n\n EpicDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.immutableProject = this.projectService.project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.epic_statuses;\n this.scope.statusById = groupBy(project.epic_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n\n EpicDetailController.prototype.loadEpic = function() {\n return this.rs.epics.getByRef(this.scope.projectId, this.params.epicref).then((function(_this) {\n return function(epic) {\n var ctx, ref, ref1;\n _this.scope.epic = epic;\n _this.scope.immutableEpic = Immutable.fromJS(epic._attrs);\n _this.scope.epicId = epic.id;\n _this.scope.commentModel = epic;\n _this.modelTransform.setObject(_this.scope, 'epic');\n if (((ref = _this.scope.epic.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.epic.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-epics-detail\", ctx);\n }\n if (((ref1 = _this.scope.epic.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.epic.neighbors.next.ref\n };\n return _this.scope.nextUrl = _this.navUrls.resolve(\"project-epics-detail\", ctx);\n }\n };\n })(this));\n };\n\n EpicDetailController.prototype.loadUserstories = function() {\n return this.rs2.userstories.listInEpic(this.scope.epicId).then((function(_this) {\n return function(data) {\n return _this.scope.userstories = data;\n };\n })(this));\n };\n\n EpicDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadEpic().then((function(_this) {\n return function() {\n return _this.loadUserstories();\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n EpicDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.epics.upvote(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.epics.downvote(this.scope.epicId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n EpicDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.epics.watch(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadEpic();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.epics.unwatch(this.scope.epicId).then(onSuccess, onError);\n };\n\n EpicDetailController.prototype.onSelectColor = function(color) {\n var onSelectColorError, onSelectColorSuccess, transform;\n onSelectColorSuccess = (function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"object:updated\");\n return _this.confirm.notify('success');\n };\n })(this);\n onSelectColorError = (function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this);\n transform = this.modelTransform.save(function(epic) {\n epic.color = color;\n return epic;\n });\n return transform.then(onSelectColorSuccess, onSelectColorError);\n };\n\n return EpicDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"EpicDetailController\", EpicDetailController);\n\n EpicStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(epic) {\n var html, status;\n status = $scope.statusById[epic.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(epic) {\n if (epic != null) {\n return render(epic);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgEpicStatusDisplay\", [\"$tgTemplate\", \"$compile\", EpicStatusDisplayDirective]);\n\n EpicStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"common/components/status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_epic\") !== -1;\n };\n render = (function(_this) {\n return function(epic) {\n var html, status;\n status = $scope.statusById[epic.status];\n html = $compile(template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n }))($scope);\n return $el.html(html);\n };\n })(this);\n save = function(status) {\n var currentLoading, onError, onSuccess, transform;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(epic) {\n epic.status = status;\n return epic;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n $.fn.popover().closeAll();\n return save(target.data(\"status-id\"));\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var epic;\n epic = $model.$modelValue;\n if (epic) {\n return render(epic);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgEpicStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$compile\", \"$translate\", \"$tgTemplate\", EpicStatusButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/detail.coffee\n */\n\n(function() {\n var IssueDetailController, IssuePriorityButtonDirective, IssueSeverityButtonDirective, IssueStatusButtonDirective, IssueStatusDisplayDirective, IssueTypeButtonDirective, PromoteIssueToUsButtonDirective, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaIssues\");\n\n IssueDetailController = (function(superClass) {\n extend(IssueDetailController, superClass);\n\n IssueDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgAnalytics\", \"$tgNavUrls\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function IssueDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, analytics, navUrls, translate, modelTransform, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.analytics = analytics;\n this.navUrls = navUrls;\n this.translate = translate;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.issueRef = this.params.issueref;\n this.scope.sectionName = this.translate.instant(\"ISSUES.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n IssueDetailController.prototype._setMeta = function() {\n var description, ref, ref1, ref2, ref3, title;\n title = this.translate.instant(\"ISSUE.PAGE_TITLE\", {\n issueRef: \"#\" + this.scope.issue.ref,\n issueSubject: this.scope.issue.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"ISSUE.PAGE_DESCRIPTION\", {\n issueStatus: ((ref = this.scope.statusById[this.scope.issue.status]) != null ? ref.name : void 0) || \"--\",\n issueType: ((ref1 = this.scope.typeById[this.scope.issue.type]) != null ? ref1.name : void 0) || \"--\",\n issueSeverity: ((ref2 = this.scope.severityById[this.scope.issue.severity]) != null ? ref2.name : void 0) || \"--\",\n issuePriority: ((ref3 = this.scope.priorityById[this.scope.issue.priority]) != null ? ref3.name : void 0) || \"--\",\n issueDescription: angular.element(this.scope.issue.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n IssueDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on issue\", 1);\n };\n })(this));\n this.scope.$on(\"promote-issue-to-us:success\", (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"issue\", \"promoteToUserstory\", \"promote issue to userstory\", 1);\n _this.rootscope.$broadcast(\"object:updated\");\n return _this.loadIssue();\n };\n })(this));\n this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadIssue();\n };\n })(this));\n return this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n };\n\n IssueDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n if (this.scope.project.is_issues_activated) {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-issues\", ctx);\n } else {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n }\n };\n\n IssueDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.issue_statuses;\n this.scope.statusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n this.scope.typeById = groupBy(project.issue_types, function(x) {\n return x.id;\n });\n this.scope.typeList = _.sortBy(project.issue_types, \"order\");\n this.scope.severityList = project.severities;\n this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n this.scope.priorityList = project.priorities;\n this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n return project;\n };\n\n IssueDetailController.prototype.loadIssue = function() {\n return this.rs.issues.getByRef(this.scope.projectId, this.params.issueref).then((function(_this) {\n return function(issue) {\n var ctx, ref, ref1;\n _this.scope.issue = issue;\n _this.scope.issueId = issue.id;\n _this.scope.commentModel = issue;\n _this.modelTransform.setObject(_this.scope, 'issue');\n if (((ref = _this.scope.issue.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.issue.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-issues-detail\", ctx);\n }\n if (((ref1 = _this.scope.issue.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.issue.neighbors.next.ref\n };\n return _this.scope.nextUrl = _this.navUrls.resolve(\"project-issues-detail\", ctx);\n }\n };\n })(this));\n };\n\n IssueDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadIssue();\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n IssueDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.upvote(this.scope.issueId).then(onSuccess, onError);\n };\n\n IssueDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.downvote(this.scope.issueId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n IssueDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.watch(this.scope.issueId).then(onSuccess, onError);\n };\n\n IssueDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.unwatch(this.scope.issueId).then(onSuccess, onError);\n };\n\n return IssueDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"IssueDetailController\", IssueDetailController);\n\n IssueStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(issue) {\n var html, status;\n status = $scope.statusById[issue.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue != null) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueStatusDisplay\", [\"$tgTemplate\", \"$compile\", IssueStatusDisplayDirective]);\n\n IssueStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, status;\n status = $scope.statusById[issue.status];\n html = template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = function(statusId) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(issue) {\n issue.status = statusId;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n return save(target.data(\"status-id\"));\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueStatusButtonDirective]);\n\n IssueTypeButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-type-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, type;\n type = $scope.typeById[issue.type];\n html = template({\n type: type,\n typees: $scope.typeList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = function(type) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.type = type;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".type-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-type\").popover().open();\n });\n $el.on(\"click\", \".type\", function(event) {\n var target, type;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n type = target.data(\"type-id\");\n return save(type);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.type : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueTypeButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueTypeButtonDirective]);\n\n IssueSeverityButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-severity-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, severity;\n severity = $scope.severityById[issue.severity];\n html = template({\n severity: severity,\n severityes: $scope.severityList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = function(severity) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.severity = severity;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".severity-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-severity\").popover().open();\n });\n $el.on(\"click\", \".severity\", function(event) {\n var severity, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n severity = target.data(\"severity-id\");\n return save(severity);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.severity : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueSeverityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssueSeverityButtonDirective]);\n\n IssuePriorityButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-priority-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, priority;\n priority = $scope.priorityById[issue.priority];\n html = template({\n priority: priority,\n priorityes: $scope.priorityList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = function(priority) {\n var currentLoading, onError, onSuccess, transform;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n transform = $modelTransform.save(function(issue) {\n issue.priority = priority;\n return issue;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".priority-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-priority\").popover().open();\n });\n $el.on(\"click\", \".priority\", function(event) {\n var priority, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n priority = target.data(\"priority-id\");\n return save(priority);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.priority : void 0;\n }, function() {\n var issue;\n issue = $model.$modelValue;\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssuePriorityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", IssuePriorityButtonDirective]);\n\n PromoteIssueToUsButtonDirective = function($rootScope, $repo, $confirm, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = (function(_this) {\n return function(issue, askResponse) {\n var data, onError, onSuccess;\n data = {\n generated_from_issue: issue.id,\n project: issue.project,\n subject: issue.subject,\n description: issue.description,\n tags: issue.tags,\n is_blocked: issue.is_blocked,\n blocked_note: issue.blocked_note,\n due_date: issue.due_date\n };\n onSuccess = function() {\n askResponse.finish();\n $confirm.notify(\"success\");\n return $rootScope.$broadcast(\"promote-issue-to-us:success\");\n };\n onError = function() {\n askResponse.finish();\n return $confirm.notify(\"error\");\n };\n return $repo.create(\"userstories\", data).then(onSuccess, onError);\n };\n })(this);\n $el.on(\"click\", \"a\", function(event) {\n var issue, message, subtitle, title;\n event.preventDefault();\n issue = $model.$modelValue;\n title = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.TITLE\");\n message = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.MESSAGE\");\n subtitle = issue.subject;\n return $confirm.ask(title, subtitle, message).then((function(_this) {\n return function(response) {\n return save(issue, response);\n };\n })(this));\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n restrict: \"AE\",\n require: \"ngModel\",\n templateUrl: \"issue/promote-issue-to-us-button.html\",\n link: link\n };\n };\n\n module.directive(\"tgPromoteIssueToUsButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$translate\", PromoteIssueToUsButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/lightboxes.coffee\n */\n\n(function() {\n var CreateBulkIssuesDirective, CreateIssueDirective, bindOnce, debounce, module, taiga, trim,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n module = angular.module(\"taigaIssues\");\n\n CreateIssueDirective = function($repo, $confirm, $rootscope, lightboxService, $loading, $q, attachmentsService) {\n var link;\n link = function($scope, $el, $attrs) {\n var attachmentsToAdd, createAttachments, form, resetAttachments, submit, submitButton;\n form = $el.find(\"form\").checksley();\n $scope.issue = {};\n $scope.attachments = Immutable.List();\n $scope.$on(\"issueform:new\", function(ctx, project) {\n form.reset();\n resetAttachments();\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el, function() {\n return $scope.createIssueOpen = false;\n });\n $scope.issue = {\n project: project.id,\n subject: \"\",\n status: project.default_issue_status,\n type: project.default_issue_type,\n priority: project.default_priority,\n severity: project.default_severity,\n tags: []\n };\n return $scope.createIssueOpen = true;\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.issue.project, 'issue');\n });\n return $q.all(promises);\n };\n attachmentsToAdd = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return $scope.attachments = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.filter(function(it) {\n return it.get('name') !== attachment.get('name');\n });\n };\n $scope.addTag = function(tag, color) {\n var inserted, itemtags, projectTags, tags, value;\n value = trim(tag.toLowerCase());\n tags = $scope.project.tags;\n projectTags = $scope.project.tags_colors;\n if (tags == null) {\n tags = [];\n }\n if (projectTags == null) {\n projectTags = {};\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n projectTags[tag] = color || null;\n $scope.project.tags = tags;\n itemtags = _.clone($scope.issue.tags);\n inserted = _.find(itemtags, function(it) {\n return it[0] === value;\n });\n if (!inserted) {\n itemtags.push([tag, color]);\n return $scope.issue.tags = itemtags;\n }\n };\n $scope.deleteTag = function(tag) {\n var itemtags, tags, value;\n value = trim(tag[0].toLowerCase());\n tags = $scope.project.tags;\n itemtags = _.clone($scope.issue.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === value;\n });\n $scope.issue.tags = itemtags;\n return _.pull($scope.issue.tags, value);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"issues\", $scope.issue);\n promise.then(function(data) {\n return createAttachments(data);\n });\n promise.then(function(data) {\n currentLoading.finish();\n $rootscope.$broadcast(\"issueform:new:success\", data);\n lightboxService.close($el);\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateIssue\", [\"$tgRepo\", \"$tgConfirm\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$q\", \"tgAttachmentsService\", CreateIssueDirective]);\n\n CreateBulkIssuesDirective = function($repo, $rs, $confirm, $rootscope, $loading, lightboxService) {\n var link;\n link = function($scope, $el, attrs) {\n var form, submit, submitButton;\n form = null;\n $scope.$on(\"issueform:bulk\", function(ctx, projectId, status) {\n if (form) {\n form.reset();\n }\n lightboxService.open($el);\n return $scope[\"new\"] = {\n projectId: projectId,\n bulk: \"\"\n };\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, data, projectId, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n data = $scope[\"new\"].bulk;\n projectId = $scope[\"new\"].projectId;\n promise = $rs.issues.bulkCreate(projectId, data);\n promise.then(function(result) {\n currentLoading.finish();\n $rootscope.$broadcast(\"issueform:new:success\", result);\n lightboxService.close($el);\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateBulkIssues\", [\"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", CreateBulkIssuesDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/list.coffee\n */\n\n(function() {\n var IssueAssignedToInlineEditionDirective, IssueStatusInlineEditionDirective, IssuesController, IssuesDirective, bindMethods, bindOnce, debounceLeading, groupBy, joinStr, mixOf, module, startswith, taiga, toString, trim,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounceLeading = this.taiga.debounceLeading;\n\n startswith = this.taiga.startswith;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaIssues\");\n\n IssuesController = (function(superClass) {\n extend(IssuesController, superClass);\n\n IssuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$tgUrls\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"$tgStorage\", \"tgFilterRemoteStorageService\", \"tgProjectService\", \"tgUserActivityService\"];\n\n IssuesController.prototype.filtersHashSuffix = \"issues-filters\";\n\n IssuesController.prototype.myFiltersHashSuffix = \"issues-my-filters\";\n\n function IssuesController(scope, rootscope, repo, confirm, rs, urls, params1, q1, location, appMetaService, navUrls, events, analytics, translate, errorHandlingService, storage, filterRemoteStorageService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.urls = urls;\n this.params = params1;\n this.q = q1;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.storage = storage;\n this.filterRemoteStorageService = filterRemoteStorageService;\n this.projectService = projectService;\n this.loadIssues = bind(this.loadIssues, this);\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"PROJECT.SECTION.ISSUES\");\n this.voting = false;\n if (this.applyStoredFilters(this.params.pslug, this.filtersHashSuffix)) {\n return;\n }\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ISSUES.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"ISSUES.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"issueform:new:success\", (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"issue\", \"create\", \"create issue on issues list\", 1);\n return _this.loadIssues();\n };\n })(this));\n }\n\n IssuesController.prototype.changeQ = function(q) {\n this.unselectFilter(\"page\");\n this.replaceFilter(\"q\", q);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.removeFilter = function(filter) {\n this.unselectFilter(\"page\");\n this.unselectFilter(filter.dataType, filter.id);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.addFilter = function(newFilter) {\n this.unselectFilter(\"page\");\n this.selectFilter(newFilter.category.dataType, newFilter.filter.id);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.selectCustomFilter = function(customFilter) {\n var orderBy;\n orderBy = this.location.search().order_by;\n if (orderBy) {\n customFilter.filter.order_by = orderBy;\n }\n this.unselectFilter(\"page\");\n this.replaceAllFilters(customFilter.filter);\n this.loadIssues();\n return this.generateFilters();\n };\n\n IssuesController.prototype.removeCustomFilter = function(customFilter) {\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix).then((function(_this) {\n return function(userFilters) {\n delete userFilters[customFilter.id];\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.myFiltersHashSuffix).then(_this.generateFilters);\n };\n })(this));\n };\n\n IssuesController.prototype.isFilterDataTypeSelected = function(filterDataType) {\n var filter, j, len, ref;\n ref = this.selectedFilters;\n for (j = 0, len = ref.length; j < len; j++) {\n filter = ref[j];\n if (filter['dataType'] === filterDataType) {\n return true;\n }\n }\n return false;\n };\n\n IssuesController.prototype.saveCustomFilter = function(name) {\n var filters, urlfilters;\n filters = {};\n urlfilters = this.location.search();\n filters.tags = urlfilters.tags;\n filters.status = urlfilters.status;\n filters.type = urlfilters.type;\n filters.severity = urlfilters.severity;\n filters.priority = urlfilters.priority;\n filters.assigned_to = urlfilters.assigned_to;\n filters.owner = urlfilters.owner;\n filters.role = urlfilters.role;\n return this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix).then((function(_this) {\n return function(userFilters) {\n userFilters[name] = filters;\n return _this.filterRemoteStorageService.storeFilters(_this.scope.projectId, userFilters, _this.myFiltersHashSuffix).then(_this.generateFilters);\n };\n })(this));\n };\n\n IssuesController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n this.storeFilters(this.params.pslug, this.location.search(), this.filtersHashSuffix);\n urlfilters = this.location.search();\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.type = urlfilters.type;\n loadFilters.severity = urlfilters.severity;\n loadFilters.priority = urlfilters.priority;\n loadFilters.assigned_to = urlfilters.assigned_to;\n loadFilters.owner = urlfilters.owner;\n loadFilters.role = urlfilters.role;\n loadFilters.q = urlfilters.q;\n return this.q.all([this.rs.issues.filtersData(loadFilters), this.filterRemoteStorageService.getFilters(this.scope.projectId, this.myFiltersHashSuffix)]).then((function(_this) {\n return function(result) {\n var assignedTo, customFiltersRaw, data, owner, priority, role, selected, severity, statuses, tags, tagsWithAtLeastOneElement, type;\n data = result[0];\n customFiltersRaw = result[1];\n statuses = _.map(data.statuses, function(it) {\n it.id = it.id.toString();\n return it;\n });\n type = _.map(data.types, function(it) {\n it.id = it.id.toString();\n return it;\n });\n severity = _.map(data.severities, function(it) {\n it.id = it.id.toString();\n return it;\n });\n priority = _.map(data.priorities, function(it) {\n it.id = it.id.toString();\n return it;\n });\n tags = _.map(data.tags, function(it) {\n it.id = it.name;\n return it;\n });\n tagsWithAtLeastOneElement = _.filter(tags, function(tag) {\n return tag.count > 0;\n });\n assignedTo = _.map(data.assigned_to, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.full_name || \"Unassigned\";\n return it;\n });\n owner = _.map(data.owners, function(it) {\n it.id = it.id.toString();\n it.name = it.full_name;\n return it;\n });\n role = _.map(data.roles, function(it) {\n if (it.id) {\n it.id = it.id.toString();\n } else {\n it.id = \"null\";\n }\n it.name = it.name || \"Unassigned\";\n return it;\n });\n _this.selectedFilters = [];\n if (loadFilters.status) {\n selected = _this.formatSelectedFilters(\"status\", statuses, loadFilters.status);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.tags) {\n selected = _this.formatSelectedFilters(\"tags\", tags, loadFilters.tags);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.assigned_to) {\n selected = _this.formatSelectedFilters(\"assigned_to\", assignedTo, loadFilters.assigned_to);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.owner) {\n selected = _this.formatSelectedFilters(\"owner\", owner, loadFilters.owner);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.type) {\n selected = _this.formatSelectedFilters(\"type\", type, loadFilters.type);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.severity) {\n selected = _this.formatSelectedFilters(\"severity\", severity, loadFilters.severity);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.priority) {\n selected = _this.formatSelectedFilters(\"priority\", priority, loadFilters.priority);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n if (loadFilters.role) {\n selected = _this.formatSelectedFilters(\"role\", role, loadFilters.role);\n _this.selectedFilters = _this.selectedFilters.concat(selected);\n }\n _this.filterQ = loadFilters.q;\n _this.filters = [\n {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TYPE\"),\n dataType: \"type\",\n content: type\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.SEVERITY\"),\n dataType: \"severity\",\n content: severity\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.PRIORITIES\"),\n dataType: \"priority\",\n content: priority\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.STATUS\"),\n dataType: \"status\",\n content: statuses\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.TAGS\"),\n dataType: \"tags\",\n content: tags,\n hideEmpty: true,\n totalTaggedElements: tagsWithAtLeastOneElement.length\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ASSIGNED_TO\"),\n dataType: \"assigned_to\",\n content: assignedTo\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.ROLE\"),\n dataType: \"role\",\n content: role\n }, {\n title: _this.translate.instant(\"COMMON.FILTERS.CATEGORIES.CREATED_BY\"),\n dataType: \"owner\",\n content: owner\n }\n ];\n _this.customFilters = [];\n return _.forOwn(customFiltersRaw, function(value, key) {\n return _this.customFilters.push({\n id: key,\n name: key,\n filter: value\n });\n });\n };\n })(this));\n };\n\n IssuesController.prototype.initializeSubscription = function() {\n var routingKey;\n routingKey = \"changes.project.\" + this.scope.projectId + \".issues\";\n return this.events.subscribe(this.scope, routingKey, (function(_this) {\n return function(message) {\n return _this.loadIssues();\n };\n })(this));\n };\n\n IssuesController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_issues_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.issueStatusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n this.scope.severityList = _.sortBy(project.severities, \"order\");\n this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n this.scope.priorityList = _.sortBy(project.priorities, \"order\");\n this.scope.issueTypes = _.sortBy(project.issue_types, \"order\");\n this.scope.issueTypeById = groupBy(project.issue_types, function(x) {\n return x.id;\n });\n return project;\n };\n\n IssuesController.prototype.loadIssuesRequests = 0;\n\n IssuesController.prototype.loadIssues = function() {\n var params, promise;\n params = this.location.search();\n promise = this.rs.issues.list(this.scope.projectId, params);\n this.loadIssuesRequests += 1;\n promise.index = this.loadIssuesRequests;\n promise.then((function(_this) {\n return function(data) {\n if (promise.index === _this.loadIssuesRequests) {\n _this.scope.issues = data.models;\n _this.scope.page = data.current;\n _this.scope.count = data.count;\n _this.scope.paginatedBy = data.paginatedBy;\n }\n return data;\n };\n })(this));\n return promise;\n };\n\n IssuesController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.initializeSubscription();\n this.generateFilters();\n return this.loadIssues();\n };\n\n IssuesController.prototype.addNewIssue = function() {\n return this.rootscope.$broadcast(\"issueform:new\", this.scope.project);\n };\n\n IssuesController.prototype.addIssuesInBulk = function() {\n return this.rootscope.$broadcast(\"issueform:bulk\", this.scope.projectId);\n };\n\n IssuesController.prototype.upVoteIssue = function(issueId) {\n var onError, onSuccess;\n this.voting = issueId;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssues();\n return _this.voting = null;\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.voting = null;\n };\n })(this);\n return this.rs.issues.upvote(issueId).then(onSuccess, onError);\n };\n\n IssuesController.prototype.downVoteIssue = function(issueId) {\n var onError, onSuccess;\n this.voting = issueId;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssues();\n return _this.voting = null;\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.voting = null;\n };\n })(this);\n return this.rs.issues.downvote(issueId).then(onSuccess, onError);\n };\n\n IssuesController.prototype.getOrderBy = function() {\n if (_.isString(this.location.search().order_by)) {\n return this.location.search().order_by;\n } else {\n return \"created_date\";\n }\n };\n\n return IssuesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"IssuesController\", IssuesController);\n\n IssuesDirective = function($log, $location, $template, $compile) {\n var link, linkOrdering, linkPagination, template;\n template = $template.get(\"issue/issue-paginator.html\", true);\n linkPagination = function($scope, $el, $attrs, $ctrl) {\n var $pagEl, afterCurrent, atBegin, atEnd, beforeCurrent, getNumPages, renderPagination;\n afterCurrent = 2;\n beforeCurrent = 4;\n atBegin = 2;\n atEnd = 2;\n $pagEl = $el.find(\".issues-paginator\");\n getNumPages = function() {\n var numPages;\n numPages = $scope.count / $scope.paginatedBy;\n if (parseInt(numPages, 10) < numPages) {\n numPages = parseInt(numPages, 10) + 1;\n } else {\n numPages = parseInt(numPages, 10);\n }\n return numPages;\n };\n renderPagination = function() {\n var cpage, html, i, j, numPages, options, pages, ref;\n numPages = getNumPages();\n if (numPages <= 1) {\n $pagEl.hide();\n return;\n }\n $pagEl.show();\n pages = [];\n options = {};\n options.pages = pages;\n options.showPrevious = $scope.page > 1;\n options.showNext = !($scope.page === numPages);\n cpage = $scope.page;\n for (i = j = 1, ref = numPages; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (i === (cpage + afterCurrent) && numPages > (cpage + afterCurrent + atEnd)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i === (cpage - beforeCurrent) && cpage > (atBegin + beforeCurrent)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i > (cpage + afterCurrent) && i <= (numPages - atEnd)) {\n\n } else if (i < (cpage - beforeCurrent) && i > atBegin) {\n\n } else if (i === cpage) {\n pages.push({\n classes: \"active\",\n num: i,\n type: \"page-active\"\n });\n } else {\n pages.push({\n classes: \"page\",\n num: i,\n type: \"page\"\n });\n }\n }\n html = template(options);\n html = $compile(html)($scope);\n return $pagEl.html(html);\n };\n $scope.$watch(\"issues\", function(value) {\n if (!value) {\n return;\n }\n return renderPagination();\n });\n $el.on(\"click\", \".issues-paginator a.next\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page + 1);\n return $ctrl.loadIssues();\n });\n });\n $el.on(\"click\", \".issues-paginator a.previous\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n return $ctrl.loadIssues();\n });\n });\n return $el.on(\"click\", \".issues-paginator li.page > a\", function(event) {\n var pagenum, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n pagenum = target.data(\"pagenum\");\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", pagenum);\n return $ctrl.loadIssues();\n });\n });\n };\n linkOrdering = function($scope, $el, $attrs, $ctrl) {\n var colHeadElement, currentOrder, icon, svg;\n currentOrder = $ctrl.getOrderBy();\n if (currentOrder) {\n icon = startswith(currentOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-down\";\n colHeadElement = $el.find(\".row.title > div[data-fieldname='\" + (trim(currentOrder, \"-\")) + \"']\");\n svg = $(\"\").attr(\"svg-icon\", icon);\n colHeadElement.append(svg);\n $compile(colHeadElement.contents())($scope);\n }\n return $el.on(\"click\", \".row.title > div\", function(event) {\n var finalOrder, newOrder, target;\n target = angular.element(event.currentTarget);\n currentOrder = $ctrl.getOrderBy();\n newOrder = target.data(\"fieldname\");\n if (newOrder === 'total_voters' && currentOrder !== \"-total_voters\") {\n currentOrder = \"total_voters\";\n }\n finalOrder = currentOrder === newOrder ? \"-\" + newOrder : newOrder;\n return $scope.$apply(function() {\n $ctrl.replaceFilter(\"order_by\", finalOrder);\n $ctrl.storeFilters($ctrl.params.pslug, $location.search(), $ctrl.filtersHashSuffix);\n return $ctrl.loadIssues().then(function() {\n $el.find(\".row.title > div > tg-svg\").remove();\n icon = startswith(finalOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-down\";\n svg = $(\"\").attr(\"svg-icon\", icon);\n target.append(svg);\n return $compile(target.contents())($scope);\n });\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n linkOrdering($scope, $el, $attrs, $ctrl);\n linkPagination($scope, $el, $attrs, $ctrl);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssues\", [\"$log\", \"$tgLocation\", \"$tgTemplate\", \"$compile\", IssuesDirective]);\n\n IssueStatusInlineEditionDirective = function($repo, $template, $rootscope) {\n\n /*\n Print the status of an Issue and a popover to change it.\n - tg-issue-status-inline-edition: The issue\n \n Example:\n \n div.status(tg-issue-status-inline-edition=\"issue\")\n a.issue-status(href=\"\")\n \n NOTE: This directive need 'issueStatusById' and 'project'.\n */\n var link, selectionTemplate, updateIssueStatus;\n selectionTemplate = $template.get(\"issue/issue-status-inline-edition-selection.html\", true);\n updateIssueStatus = function($el, issue, issueStatusById) {\n var issueStatusDom, issueStatusDomParent, status;\n issueStatusDomParent = $el.find(\".issue-status\");\n issueStatusDom = $el.find(\".issue-status .issue-status-bind\");\n status = issueStatusById[issue.status];\n if (status) {\n issueStatusDom.text(status.name);\n issueStatusDom.prop(\"title\", status.name);\n return issueStatusDomParent.css('color', status.color);\n }\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, issue;\n $ctrl = $el.controller();\n issue = $scope.$eval($attrs.tgIssueStatusInlineEdition);\n $el.on(\"click\", \".issue-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n issue.status = target.data(\"status-id\");\n $el.find(\".pop-status\").popover().close();\n updateIssueStatus($el, issue, $scope.issueStatusById);\n return $scope.$apply(function() {\n return $repo.save(issue).then(function() {\n $ctrl.generateFilters();\n if ($ctrl.isFilterDataTypeSelected('status')) {\n return $ctrl.loadIssues();\n }\n });\n });\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n $el.append(selectionTemplate({\n 'statuses': project.issue_statuses\n }));\n updateIssueStatus($el, issue, $scope.issueStatusById);\n if (project.my_permissions.indexOf(\"modify_issue\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$watch($attrs.tgIssueStatusInlineEdition, (function(_this) {\n return function(val) {\n return updateIssueStatus($el, val, $scope.issueStatusById);\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssueStatusInlineEdition\", [\"$tgRepo\", \"$tgTemplate\", \"$rootScope\", IssueStatusInlineEditionDirective]);\n\n IssueAssignedToInlineEditionDirective = function($repo, $rootscope, $translate, avatarService) {\n var link, template;\n template = _.template(\"\\\" src=\\\"<%- imgurl %>\\\" alt=\\\"<%- name %>\\\"/>\\n
    <%- name %>
    \");\n link = function($scope, $el, $attrs) {\n var $ctrl, issue, updateIssue;\n updateIssue = function(issue) {\n var avatar, ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\"\n };\n member = $scope.usersById[issue.assigned_to];\n avatar = avatarService.getAvatar(member);\n ctx.imgurl = avatar.url;\n ctx.bg = null;\n if (member) {\n ctx.name = member.full_name_display;\n ctx.bg = avatar.bg;\n }\n $el.find(\".avatar\").html(template(ctx));\n return $el.find(\".issue-assignedto\").attr('title', ctx.name);\n };\n $ctrl = $el.controller();\n issue = $scope.$eval($attrs.tgIssueAssignedToInlineEdition);\n updateIssue(issue);\n $el.on(\"click\", \".issue-assignedto\", function(event) {\n return $rootscope.$broadcast(\"assigned-to:add\", issue);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_issue\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"assigned-to:added\", function(ctx, userId, updatedIssue) {\n if (updatedIssue.id === issue.id) {\n updatedIssue.assigned_to = userId;\n return $repo.save(issue).then(function() {\n updateIssue(updatedIssue);\n $ctrl.generateFilters();\n if ($ctrl.isFilterDataTypeSelected('assigned_to') || $ctrl.isFilterDataTypeSelected('role')) {\n return $ctrl.loadIssues();\n }\n });\n }\n });\n $scope.$watch($attrs.tgIssueAssignedToInlineEdition, function(val) {\n return updateIssue(val);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssueAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", \"$translate\", \"tgAvatarService\", IssueAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/userstories/detail.coffee\n */\n\n(function() {\n var UsClientRequirementButtonDirective, UsStatusButtonDirective, UsStatusDisplayDirective, UsTeamRequirementButtonDirective, UserStoryDetailController, bindMethods, bindOnce, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaUserStories\");\n\n UserStoryDetailController = (function(superClass) {\n extend(UserStoryDetailController, superClass);\n\n UserStoryDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"$tgConfig\", \"tgProjectService\", \"tgWysiwygService\"];\n\n function UserStoryDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate, modelTransform, errorHandlingService, configService, projectService, wysiwigService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.configService = configService;\n this.projectService = projectService;\n this.wysiwigService = wysiwigService;\n bindMethods(this);\n this.scope.usRef = this.params.usref;\n this.scope.sectionName = this.translate.instant(\"US.SECTION_NAME\");\n this.scope.tribeEnabled = this.configService.config.tribeHost;\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserStoryDetailController.prototype._setMeta = function() {\n var closedTasks, description, progressPercentage, ref, title, totalTasks;\n totalTasks = this.scope.tasks.length;\n closedTasks = _.filter(this.scope.tasks, (function(_this) {\n return function(t) {\n return _this.scope.taskStatusById[t.status].is_closed;\n };\n })(this)).length;\n progressPercentage = totalTasks > 0 ? Math.round(100 * closedTasks / totalTasks) : 0;\n title = this.translate.instant(\"US.PAGE_TITLE\", {\n userStoryRef: \"#\" + this.scope.us.ref,\n userStorySubject: this.scope.us.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"US.PAGE_DESCRIPTION\", {\n userStoryStatus: ((ref = this.scope.statusById[this.scope.us.status]) != null ? ref.name : void 0) || \"--\",\n userStoryPoints: this.scope.us.total_points,\n userStoryDescription: angular.element(this.wysiwigService.getHTML(this.scope.us.description) || \"\").text(),\n userStoryClosedTasks: closedTasks,\n userStoryTotalTasks: totalTasks,\n userStoryProgressPercentage: progressPercentage\n });\n return this.appMetaService.setAll(title, description);\n };\n\n UserStoryDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"related-tasks:update\", (function(_this) {\n return function() {\n var allClosed;\n _this.scope.tasks = _.clone(_this.scope.tasks, false);\n allClosed = _.every(_this.scope.tasks, function(task) {\n return task.is_closed;\n });\n if (_this.scope.us.is_closed !== allClosed) {\n return _this.loadUs();\n }\n };\n })(this));\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on userstory\", 1);\n };\n })(this));\n return this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadUs();\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n if (this.scope.project.is_backlog_activated) {\n if (this.scope.us.milestone) {\n ctx.sprint = this.scope.sprint.slug;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-taskboard\", ctx);\n } else {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-backlog\", ctx);\n }\n } else if (this.scope.project.is_kanban_activated) {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-kanban\", ctx);\n }\n };\n\n UserStoryDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.us_statuses;\n this.scope.statusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n this.scope.taskStatusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n this.scope.pointsList = _.sortBy(project.points, \"order\");\n this.scope.pointsById = groupBy(this.scope.pointsList, function(e) {\n return e.id;\n });\n return project;\n };\n\n UserStoryDetailController.prototype.loadUs = function() {\n var httpParams, kanbanStaus, milestone, noMilestone;\n httpParams = _.pick(this.location.search(), \"milestone\", \"no-milestone\", \"kanban-status\");\n milestone = httpParams.milestone;\n if (milestone) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n milestone: milestone,\n order_by: \"sprint_order\"\n });\n }\n noMilestone = httpParams[\"no-milestone\"];\n if (noMilestone) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n milestone: \"null\",\n order_by: \"backlog_order\"\n });\n }\n kanbanStaus = httpParams[\"kanban-status\"];\n if (kanbanStaus) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n status: kanbanStaus,\n order_by: \"kanban_order\"\n });\n }\n return this.rs.userstories.getByRef(this.scope.projectId, this.params.usref).then((function(_this) {\n return function(us) {\n _this.scope.us = us;\n _this.scope.usId = us.id;\n _this.scope.commentModel = us;\n _this.modelTransform.setObject(_this.scope, 'us');\n return us;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadSprint = function() {\n if (this.scope.us.milestone) {\n return this.rs.sprints.get(this.scope.us.project, this.scope.us.milestone).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n return sprint;\n };\n })(this));\n }\n };\n\n UserStoryDetailController.prototype.loadTasks = function() {\n return this.rs.tasks.list(this.scope.projectId, null, this.scope.usId).then((function(_this) {\n return function(tasks) {\n _this.scope.tasks = tasks;\n return tasks;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadUs().then((function(_this) {\n return function() {\n return _this.q.all([_this.loadSprint(), _this.loadTasks()]);\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n UserStoryDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.upvote(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.downvote(this.scope.usId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n UserStoryDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.watch(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.unwatch(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onTribeInfo = function() {\n var image, publishDesc, publishTitle, text;\n publishTitle = this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TITLE\");\n image = $('').attr({\n 'src': \"/\" + window._version + \"/images/monster-fight.png\",\n 'alt': this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TITLE\")\n });\n text = this.translate.instant(\"US.TRIBE.PUBLISH_MORE_INFO_TEXT\");\n publishDesc = $('
    ').append(image).append(text);\n return this.confirm.success(publishTitle, publishDesc);\n };\n\n return UserStoryDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserStoryDetailController\", UserStoryDetailController);\n\n UsStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(us) {\n var html, status;\n status = $scope.statusById[us.status];\n html = template({\n is_closed: us.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(us) {\n if (us != null) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsStatusDisplay\", [\"$tgTemplate\", \"$compile\", UsStatusDisplayDirective]);\n\n UsStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = (function(_this) {\n return function(us) {\n var html, status;\n status = $scope.statusById[us.status];\n html = template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n });\n $el.html(html);\n return $compile($el.contents())($scope);\n };\n })(this);\n save = (function(_this) {\n return function(status) {\n var currentLoading, onError, onSuccess, transform;\n $el.find(\".pop-status\").popover().close();\n currentLoading = $loading().target($el.find('.js-edit-status')).start();\n transform = $modelTransform.save(function(us) {\n us.status = status;\n return us;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n })(this);\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var status, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n status = target.data(\"status-id\");\n return save(status);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsStatusButtonDirective]);\n\n UsTeamRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"us/us-team-requirement-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var canEdit, render, save;\n canEdit = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = function(us) {\n var ctx, html;\n ctx = {\n canEdit: canEdit(),\n isRequired: us.team_requirement\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n save = function(team_requirement) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\"label\")).start();\n transform = $modelTransform.save(function(us) {\n us.team_requirement = team_requirement;\n return us;\n });\n transform.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return transform.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n $el.on(\"click\", \".team-requirement\", function(event) {\n var team_requirement;\n if (!canEdit()) {\n return;\n }\n team_requirement = !$model.$modelValue.team_requirement;\n return save(team_requirement);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.team_requirement : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsTeamRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsTeamRequirementButtonDirective]);\n\n UsClientRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $template, $compile) {\n var link, template;\n template = $template.get(\"us/us-client-requirement-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var canEdit, render, save;\n canEdit = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = function(us) {\n var ctx, html;\n ctx = {\n canEdit: canEdit(),\n isRequired: us.client_requirement\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n save = function(client_requirement) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find(\"label\")).start();\n transform = $modelTransform.save(function(us) {\n us.client_requirement = client_requirement;\n return us;\n });\n transform.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n $el.on(\"click\", \".client-requirement\", function(event) {\n var client_requirement;\n if (!canEdit()) {\n return;\n }\n client_requirement = !$model.$modelValue.client_requirement;\n return save(client_requirement);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.client_requirement : void 0;\n }, function() {\n var us;\n us = $model.$modelValue;\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsClientRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$tgTemplate\", \"$compile\", UsClientRequirementButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/tasks/detail.coffee\n */\n\n(function() {\n var TaskDetailController, TaskIsIocaineButtonDirective, TaskStatusButtonDirective, TaskStatusDisplayDirective, bindMethods, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaTasks\");\n\n TaskDetailController = (function(superClass) {\n extend(TaskDetailController, superClass);\n\n TaskDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"$tgQueueModelTransformation\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function TaskDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate, modelTransform, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n this.modelTransform = modelTransform;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.taskRef = this.params.taskref;\n this.scope.sectionName = this.translate.instant(\"TASK.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TaskDetailController.prototype._setMeta = function() {\n var description, ref, title;\n title = this.translate.instant(\"TASK.PAGE_TITLE\", {\n taskRef: \"#\" + this.scope.task.ref,\n taskSubject: this.scope.task.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"TASK.PAGE_DESCRIPTION\", {\n taskStatus: ((ref = this.scope.statusById[this.scope.task.status]) != null ? ref.name : void 0) || \"--\",\n taskDescription: angular.element(this.scope.task.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n TaskDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on task\", 1);\n };\n })(this));\n this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadTask();\n };\n })(this));\n };\n\n TaskDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n if (this.scope.project.is_backlog_activated) {\n if (this.scope.task.milestone) {\n ctx.sprint = this.scope.sprint.slug;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-taskboard\", ctx);\n } else if (this.scope.task.us) {\n ctx.ref = this.scope.us.ref;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n } else if (this.scope.project.is_kanban_activated) {\n if (this.scope.us) {\n ctx.ref = this.scope.us.ref;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n }\n };\n\n TaskDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.statusList = project.task_statuses;\n this.scope.statusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n\n TaskDetailController.prototype.loadTask = function() {\n return this.rs.tasks.getByRef(this.scope.projectId, this.params.taskref).then((function(_this) {\n return function(task) {\n var ctx, ref, ref1;\n _this.scope.task = task;\n _this.scope.taskId = task.id;\n _this.scope.commentModel = task;\n _this.modelTransform.setObject(_this.scope, 'task');\n if (((ref = _this.scope.task.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.task.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-tasks-detail\", ctx);\n }\n if (((ref1 = _this.scope.task.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.task.neighbors.next.ref\n };\n _this.scope.nextUrl = _this.navUrls.resolve(\"project-tasks-detail\", ctx);\n }\n return task;\n };\n })(this));\n };\n\n TaskDetailController.prototype.loadSprint = function() {\n if (this.scope.task.milestone) {\n return this.rs.sprints.get(this.scope.task.project, this.scope.task.milestone).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n return sprint;\n };\n })(this));\n }\n };\n\n TaskDetailController.prototype.loadUserStory = function() {\n if (this.scope.task.user_story) {\n return this.rs.userstories.get(this.scope.task.project, this.scope.task.user_story).then((function(_this) {\n return function(us) {\n _this.scope.us = us;\n return us;\n };\n })(this));\n }\n };\n\n TaskDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.loadTask().then((function(_this) {\n return function() {\n return _this.q.all([_this.loadSprint(), _this.loadUserStory()]);\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n TaskDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.upvote(this.scope.taskId).then(onSuccess, onError);\n };\n\n TaskDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.downvote(this.scope.taskId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n TaskDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.watch(this.scope.taskId).then(onSuccess, onError);\n };\n\n TaskDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.unwatch(this.scope.taskId).then(onSuccess, onError);\n };\n\n return TaskDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TaskDetailController\", TaskDetailController);\n\n TaskStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(task) {\n var html, status;\n status = $scope.statusById[task.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(task) {\n if (task != null) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskStatusDisplay\", [\"$tgTemplate\", \"$compile\", TaskStatusDisplayDirective]);\n\n TaskStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $modelTransform, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"common/components/status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n };\n render = (function(_this) {\n return function(task) {\n var html, status;\n status = $scope.statusById[task.status];\n html = $compile(template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n }))($scope);\n return $el.html(html);\n };\n })(this);\n save = function(status) {\n var currentLoading, onError, onSuccess, transform;\n currentLoading = $loading().target($el).start();\n transform = $modelTransform.save(function(task) {\n task.status = status;\n return task;\n });\n onSuccess = function() {\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return transform.then(onSuccess, onError);\n };\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n $.fn.popover().closeAll();\n return save(target.data(\"status-id\"));\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.status : void 0;\n }, function() {\n var task;\n task = $model.$modelValue;\n if (task) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$compile\", \"$translate\", \"$tgTemplate\", TaskStatusButtonDirective]);\n\n TaskIsIocaineButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $modelTransform, $compile, $template) {\n var link, template;\n template = $template.get(\"issue/iocaine-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n };\n render = function(task) {\n var ctx, html;\n if (!isEditable() && !task.is_iocaine) {\n $el.html(\"\");\n return;\n }\n ctx = {\n isIocaine: task.is_iocaine,\n isEditable: isEditable()\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n save = function(is_iocaine) {\n var currentLoading, transform;\n currentLoading = $loading().target($el.find('label')).start();\n transform = $modelTransform.save(function(task) {\n task.is_iocaine = is_iocaine;\n return task;\n });\n transform.then(function() {\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\n $el.on(\"click\", \".is-iocaine\", function(event) {\n var is_iocaine;\n if (!isEditable()) {\n return;\n }\n is_iocaine = !$model.$modelValue.is_iocaine;\n return save(is_iocaine);\n });\n $scope.$watch(function() {\n var ref;\n return (ref = $model.$modelValue) != null ? ref.is_iocaine : void 0;\n }, function() {\n var task;\n task = $model.$modelValue;\n if (task) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskIsIocaineButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQueueModelTransformation\", \"$compile\", \"$tgTemplate\", TaskIsIocaineButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/team/main.coffee\n */\n\n(function() {\n var LeaveProjectDirective, TeamController, TeamFiltersDirective, TeamMemberCurrentUserDirective, TeamMemberStatsDirective, TeamMembersDirective, membersFilter, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n module = angular.module(\"taigaTeam\");\n\n TeamController = (function(superClass) {\n extend(TeamController, superClass);\n\n TeamController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$location\", \"$tgNavUrls\", \"tgAppMetaService\", \"$tgAuth\", \"$translate\", \"tgProjectService\", \"tgErrorHandlingService\"];\n\n function TeamController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, auth, translate, projectService, errorHandlingService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\n this.errorHandlingService = errorHandlingService;\n this.scope.sectionName = \"TEAM.SECTION_NAME\";\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"TEAM.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"TEAM.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TeamController.prototype.setRole = function(role) {\n if (role) {\n return this.scope.filtersRole = role;\n } else {\n return this.scope.filtersRole = null;\n }\n };\n\n TeamController.prototype.loadMembers = function() {\n var i, len, member, ref, user;\n user = this.auth.getUser();\n this.scope.totals = {};\n ref = this.scope.activeUsers;\n for (i = 0, len = ref.length; i < len; i++) {\n member = ref[i];\n this.scope.totals[member.id] = 0;\n }\n this.scope.currentUser = _.find(this.scope.activeUsers, {\n id: user != null ? user.id : void 0\n });\n return this.scope.memberships = _.reject(this.scope.activeUsers, {\n id: user != null ? user.id : void 0\n });\n };\n\n TeamController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.issuesEnabled = project.is_issues_activated;\n this.scope.tasksEnabled = project.is_kanban_activated || project.is_backlog_activated;\n this.scope.wikiEnabled = project.is_wiki_activated;\n this.scope.owner = project.owner.id;\n return project;\n };\n\n TeamController.prototype.loadMemberStats = function() {\n return this.rs.projects.memberStats(this.scope.projectId).then((function(_this) {\n return function(stats) {\n var totals;\n totals = {};\n _.forEach(_this.scope.totals, function(total, userId) {\n var vals;\n vals = _.map(stats, function(memberStats, statsKey) {\n return memberStats[userId];\n });\n total = _.reduce(vals, function(sum, el) {\n return sum + el;\n });\n return _this.scope.totals[userId] = total;\n });\n _this.scope.stats = _this._processStats(stats);\n return _this.scope.stats.totals = _this.scope.totals;\n };\n })(this));\n };\n\n TeamController.prototype._processStat = function(stat) {\n var key, max, min, singleStat, value;\n max = _.max(_.toArray(stat));\n min = _.min(_.toArray(stat));\n singleStat = Object();\n for (key in stat) {\n if (!hasProp.call(stat, key)) continue;\n value = stat[key];\n if (value === min) {\n singleStat[key] = 0.1;\n } else if (value === max) {\n singleStat[key] = 1;\n } else {\n singleStat[key] = (value * 0.5) / max;\n }\n }\n return singleStat;\n };\n\n TeamController.prototype._processStats = function(stats) {\n var key, value;\n for (key in stats) {\n value = stats[key];\n stats[key] = this._processStat(value);\n }\n return stats;\n };\n\n TeamController.prototype.loadInitialData = function() {\n var project, userRoles;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n this.loadMembers();\n userRoles = _.map(this.scope.users, function(user) {\n return user.role;\n });\n this.scope.roles = _.filter(this.scope.roles, function(role) {\n return userRoles.indexOf(role.id) !== -1;\n });\n return this.loadMemberStats();\n };\n\n return TeamController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TeamController\", TeamController);\n\n TeamFiltersDirective = function() {\n return {\n templateUrl: \"team/team-filter.html\"\n };\n };\n\n module.directive(\"tgTeamFilters\", [TeamFiltersDirective]);\n\n TeamMemberStatsDirective = function() {\n return {\n templateUrl: \"team/team-member-stats.html\",\n scope: {\n stats: \"=\",\n userId: \"=user\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\"\n }\n };\n };\n\n module.directive(\"tgTeamMemberStats\", TeamMemberStatsDirective);\n\n TeamMemberCurrentUserDirective = function() {\n return {\n templateUrl: \"team/team-member-current-user.html\",\n scope: {\n project: \"=project\",\n currentUser: \"=currentuser\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\",\n owner: \"=owner\"\n }\n };\n };\n\n module.directive(\"tgTeamCurrentUser\", TeamMemberCurrentUserDirective);\n\n TeamMembersDirective = function() {\n var template;\n template = \"team/team-members.html\";\n return {\n templateUrl: template,\n scope: {\n memberships: \"=\",\n filtersQ: \"=filtersq\",\n filtersRole: \"=filtersrole\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\",\n owner: \"=owner\"\n }\n };\n };\n\n module.directive(\"tgTeamMembers\", TeamMembersDirective);\n\n LeaveProjectDirective = function($repo, $confirm, $location, $rs, $navurls, $translate, lightboxFactory, currentUserService) {\n var link;\n link = function($scope, $el, $attrs) {\n var leaveConfirm;\n leaveConfirm = function() {\n var confirm_leave_project_text, leave_project_text;\n leave_project_text = $translate.instant(\"TEAM.ACTION_LEAVE_PROJECT\");\n confirm_leave_project_text = $translate.instant(\"TEAM.CONFIRM_LEAVE_PROJECT\");\n return $confirm.ask(leave_project_text, confirm_leave_project_text).then((function(_this) {\n return function(response) {\n var promise;\n promise = $rs.projects.leave($scope.project.id);\n promise.then(function() {\n return currentUserService.loadProjects().then(function() {\n response.finish();\n $confirm.notify(\"success\");\n return $location.path($navurls.resolve(\"home\"));\n });\n });\n return promise.then(null, function(response) {\n response.finish();\n return $confirm.notify('error', response.data._error_message);\n });\n };\n })(this));\n };\n return $scope.leave = function() {\n if ($scope.project.owner.id === $scope.user.id) {\n return lightboxFactory.create(\"tg-lightbox-leave-project-warning\", {\n \"class\": \"lightbox lightbox-leave-project-warning\"\n }, {\n isCurrentUser: true,\n project: $scope.project\n });\n } else {\n return leaveConfirm();\n }\n };\n };\n return {\n scope: {\n user: \"=\",\n project: \"=\"\n },\n templateUrl: \"team/leave-project.html\",\n link: link\n };\n };\n\n module.directive(\"tgLeaveProject\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgResources\", \"$tgNavUrls\", \"$translate\", \"tgLightboxFactory\", \"tgCurrentUserService\", LeaveProjectDirective]);\n\n membersFilter = function() {\n return function(members, filtersQ, filtersRole) {\n return _.filter(members, function(m) {\n return (!filtersRole || m.role === filtersRole.id) && (!filtersQ || m.full_name.search(new RegExp(filtersQ, \"i\")) >= 0);\n });\n };\n };\n\n module.filter('membersFilter', membersFilter);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/detail.coffee\n */\n\n(function() {\n var WikiDetailController, WikiSummaryDirective, WikiWysiwyg, bindOnce, debounce, groupBy, mixOf, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaWiki\");\n\n WikiDetailController = (function(superClass) {\n extend(WikiDetailController, superClass);\n\n WikiDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgModel\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$filter\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WikiDetailController(scope, rootscope, repo, model, confirm, rs, params, q, location, filter, log, appMetaService, navUrls, analytics, translate, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.model = model;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.filter = filter;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this.moveLink = bind(this.moveLink, this);\n this.loadWiki = bind(this.loadWiki, this);\n this.scope.$on(\"wiki:links:move\", this.moveLink);\n this.scope.$on(\"wikipage:add\", this.loadWiki);\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\n this.scope.sectionName = \"Wiki\";\n this.scope.linksVisible = false;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n WikiDetailController.prototype._setMeta = function() {\n var description, ref, ref1, ref2, title;\n title = this.translate.instant(\"WIKI.PAGE_TITLE\", {\n wikiPageName: this.scope.wikiSlug,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"WIKI.PAGE_DESCRIPTION\", {\n wikiPageContent: angular.element(((ref = this.scope.wiki) != null ? ref.html : void 0) || \"\").text(),\n totalEditions: ((ref1 = this.scope.wiki) != null ? ref1.editions : void 0) || 0,\n lastModifiedDate: moment((ref2 = this.scope.wiki) != null ? ref2.modified_date : void 0).format(this.translate.instant(\"WIKI.DATETIME\"))\n });\n return this.appMetaService.setAll(title, description);\n };\n\n WikiDetailController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_wiki_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WikiDetailController.prototype.loadWiki = function() {\n var promise;\n promise = this.rs.wiki.getBySlug(this.scope.projectId, this.params.slug);\n promise.then((function(_this) {\n return function(wiki) {\n _this.scope.wiki = wiki;\n _this.scope.wikiId = wiki.id;\n return _this.scope.wiki;\n };\n })(this));\n return promise.then(null, (function(_this) {\n return function(xhr) {\n var data;\n _this.scope.wikiId = null;\n if (_this.scope.project.my_permissions.indexOf(\"add_wiki_page\") === -1) {\n return null;\n }\n data = {\n project: _this.scope.projectId,\n slug: _this.scope.wikiSlug,\n content: \"\"\n };\n _this.scope.wiki = _this.model.make_model(\"wiki\", data);\n return _this.scope.wiki;\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadWikiLinks = function() {\n return this.rs.wiki.listLinks(this.scope.projectId).then((function(_this) {\n return function(wikiLinks) {\n var i, len, link, ref, selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n ref = _this.scope.wikiLinks;\n for (i = 0, len = ref.length; i < len; i++) {\n link = ref[i];\n link.url = _this.navUrls.resolve(\"project-wiki-page\", {\n project: _this.scope.projectSlug,\n slug: link.href\n });\n }\n return selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.q.all([this.loadWikiLinks(), this.loadWiki()]).then(this.checkLinksPerms.bind(this));\n };\n\n WikiDetailController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"add_wiki_link\") !== -1 || (this.scope.project.my_permissions.indexOf(\"view_wiki_links\") !== -1 && this.scope.wikiLinks.length)) {\n return this.scope.linksVisible = true;\n }\n };\n\n WikiDetailController.prototype[\"delete\"] = function() {\n var message, title;\n title = this.translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\");\n message = this.scope.wikiSlug;\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onSuccess = function() {\n var ctx;\n askResponse.finish();\n ctx = {\n project: _this.scope.projectSlug\n };\n _this.location.path(_this.navUrls.resolve(\"project-wiki\", ctx));\n _this.confirm.notify(\"success\");\n return _this.loadWiki();\n };\n onError = function() {\n askResponse.finish(false);\n return _this.confirm.notify(\"error\");\n };\n return _this.repo.remove(_this.scope.wiki).then(onSuccess, onError);\n };\n })(this));\n };\n\n WikiDetailController.prototype.moveLink = function(ctx, item, itemIndex) {\n var r, values;\n values = this.scope.wikiLinks;\n r = values.indexOf(item);\n values.splice(r, 1);\n values.splice(itemIndex, 0, item);\n _.each(values, function(value, index) {\n return value.order = index;\n });\n return this.repo.saveAll(values);\n };\n\n return WikiDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"WikiDetailController\", WikiDetailController);\n\n WikiSummaryDirective = function($log, $template, $compile, $translate, avatarService) {\n var link, template;\n template = $template.get(\"wiki/wiki-summary.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var render;\n render = function(wiki) {\n var avatar, ctx, html, user;\n if ($scope.usersById == null) {\n $log.error(\"WikiSummaryDirective requires userById set in scope.\");\n } else {\n user = $scope.usersById[wiki.last_modifier];\n }\n avatar = avatarService.getAvatar(user);\n if (user === void 0) {\n user = {\n name: \"unknown\",\n avatar: avatar\n };\n } else {\n user = {\n name: user.full_name_display,\n avatar: avatar\n };\n }\n ctx = {\n totalEditions: wiki.editions,\n lastModifiedDate: moment(wiki.modified_date).format($translate.instant(\"WIKI.DATETIME\")),\n user: user\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(wikiPage) {\n if (!wikiPage) {\n return;\n }\n return render(wikiPage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWikiSummary\", [\"$log\", \"$tgTemplate\", \"$compile\", \"$translate\", \"tgAvatarService\", WikiSummaryDirective]);\n\n WikiWysiwyg = function($modelTransform, $rootscope, $confirm, attachmentsFullService, $qqueue, $repo, $analytics, wikiHistoryService) {\n var link;\n link = function($scope, $el, $attrs) {\n var uploadFile;\n $scope.editableDescription = false;\n $scope.saveDescription = $qqueue.bindAdd(function(description, cb) {\n var onError, onSuccess, promise;\n onSuccess = function(wikiPage) {\n if ($scope.item.id == null) {\n $analytics.trackEvent(\"wikipage\", \"create\", \"create wiki page\", 1);\n $scope.$emit(\"wikipage:add\");\n }\n wikiHistoryService.loadHistoryEntries();\n return $confirm.notify(\"success\");\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n $scope.item.content = description;\n if ($scope.item.id != null) {\n promise = $repo.save($scope.item).then(onSuccess, onError);\n } else {\n promise = $repo.create(\"wiki\", $scope.item).then(onSuccess, onError);\n }\n return promise[\"finally\"](cb);\n });\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, 'wiki_page', file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.$watch($attrs.model, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n $scope.version = value.version;\n return $scope.storageKey = $scope.project.id + \"-\" + value.id + \"-wiki\";\n });\n return $scope.$watch('project', function(project) {\n if (!project) {\n return;\n }\n return $scope.editableDescription = project.my_permissions.indexOf(\"modify_wiki_page\") !== -1;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n\\n
    \\n\\n \\n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\\n
    \\n
    \"\n };\n };\n\n module.directive(\"tgWikiWysiwyg\", [\"$tgQueueModelTransformation\", \"$rootScope\", \"$tgConfirm\", \"tgAttachmentsFullService\", \"$tgQqueue\", \"$tgRepo\", \"$tgAnalytics\", \"tgWikiHistoryService\", WikiWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/detail.coffee\n */\n\n(function() {\n var WikiNavDirective, bindOnce, groupBy, mixOf, module, taiga;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaWiki\");\n\n WikiNavDirective = function($tgrepo, $log, $location, $confirm, $analytics, $loading, $template, $compile, $translate) {\n var link, linkWikiLinks, template;\n template = $template.get(\"wiki/wiki-nav.html\", true);\n linkWikiLinks = function($scope, $el, $attrs) {\n var $ctrl, addWikiLinkPermission, drake, render;\n $ctrl = $el.controller();\n if ($attrs.ngModel == null) {\n return $log.error(\"WikiNavDirective: no ng-model attr is defined\");\n }\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1;\n drake = null;\n render = function(wikiLinks) {\n var deleteWikiLinkPermission, html, itemEl, scroll, tdom;\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1;\n deleteWikiLinkPermission = $scope.project.my_permissions.indexOf(\"delete_wiki_link\") > -1;\n html = template({\n wikiLinks: wikiLinks,\n projectSlug: $scope.projectSlug,\n addWikiLinkPermission: addWikiLinkPermission,\n deleteWikiLinkPermission: deleteWikiLinkPermission\n });\n html = $compile(html)($scope);\n $el.off();\n if (addWikiLinkPermission && drake) {\n drake.destroy();\n }\n $el.html(html);\n if (addWikiLinkPermission) {\n itemEl = null;\n tdom = $el.find(\".sortable\");\n drake = dragula([tdom[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: tdom[0],\n moves: function(item) {\n return $(item).is('li');\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex;\n itemEl = $(item);\n item = itemEl.scope().link;\n itemIndex = itemEl.index();\n return $scope.$emit(\"wiki:links:move\", item, itemIndex);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n }\n $el.on(\"click\", \".add-button\", function(event) {\n event.preventDefault();\n $el.find(\".new\").removeClass(\"hidden\");\n $el.find(\".new input\").focus();\n return $el.find(\".add-button\").hide();\n });\n $el.on(\"click\", \".js-delete-link\", function(event) {\n var linkId, message, target, title;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n linkId = target.parents('.wiki-link').data('id');\n title = $translate.instant(\"WIKI.DELETE_LINK_TITLE\");\n message = $scope.wikiLinks[linkId].title;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var promise;\n promise = $tgrepo.remove($scope.wikiLinks[linkId]);\n promise.then(function() {\n promise = $ctrl.loadWikiLinks();\n promise.then(function() {\n askResponse.finish();\n return render($scope.wikiLinks);\n });\n return promise.then(null, function() {\n return askResponse.finish();\n });\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n });\n return $el.on(\"keyup\", \".new input\", function(event) {\n var currentLoading, newLink, promise, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newLink = target.val();\n currentLoading = $loading().target($el.find(\".new\")).start();\n promise = $tgrepo.create(\"wiki-links\", {\n project: $scope.projectId,\n title: newLink\n });\n promise.then(function() {\n var loadPromise;\n $analytics.trackEvent(\"wikilink\", \"create\", \"create wiki link\", 1);\n loadPromise = $ctrl.loadWikiLinks();\n loadPromise.then(function() {\n currentLoading.finish();\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n $el.find(\".add-button\").show();\n return render($scope.wikiLinks);\n });\n return loadPromise.then(null, function() {\n currentLoading.finish();\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n $el.find(\".add-button\").show();\n return $confirm.notify(\"error\", \"Error loading wiki links\");\n });\n });\n return promise.then(null, function(error) {\n var ref;\n currentLoading.finish();\n $el.find(\".new input\").val(newLink);\n $el.find(\".new input\").focus().select();\n if ((error != null ? (ref = error.__all__) != null ? ref[0] : void 0 : void 0) != null) {\n return $confirm.notify(\"error\", \"The link already exists\");\n } else {\n return $confirm.notify(\"error\");\n }\n });\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n return $el.find(\".add-button\").show();\n }\n });\n };\n return bindOnce($scope, $attrs.ngModel, render);\n };\n link = function($scope, $el, $attrs) {\n linkWikiLinks($scope, $el, $attrs);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgWikiNav\", [\"$tgRepo\", \"$log\", \"$tgLocation\", \"$tgConfirm\", \"$tgAnalytics\", \"$tgLoading\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiNavDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/pages-list.coffee\n */\n\n(function() {\n var WikiPagesListController, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n module = angular.module(\"taigaWiki\");\n\n WikiPagesListController = (function(superClass) {\n extend(WikiPagesListController, superClass);\n\n WikiPagesListController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgModel\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgNavUrls\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WikiPagesListController(scope, rootscope, repo, model, confirm, rs, params, q, navUrls, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.model = model;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.navUrls = navUrls;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\n this.scope.sectionName = \"Wiki\";\n this.scope.linksVisible = false;\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n WikiPagesListController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.is_wiki_activated) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WikiPagesListController.prototype.loadWikiPages = function() {\n var promise;\n return promise = this.rs.wiki.list(this.scope.projectId).then((function(_this) {\n return function(wikipages) {\n return _this.scope.wikipages = wikipages;\n };\n })(this));\n };\n\n WikiPagesListController.prototype.loadWikiLinks = function() {\n return this.rs.wiki.listLinks(this.scope.projectId).then((function(_this) {\n return function(wikiLinks) {\n var i, len, link, ref, selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n ref = _this.scope.wikiLinks;\n for (i = 0, len = ref.length; i < len; i++) {\n link = ref[i];\n link.url = _this.navUrls.resolve(\"project-wiki-page\", {\n project: _this.scope.projectSlug,\n slug: link.href\n });\n }\n return selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n };\n })(this));\n };\n\n WikiPagesListController.prototype.loadInitialData = function() {\n var project;\n project = this.loadProject();\n this.fillUsersAndRoles(project.members, project.roles);\n return this.q.all([this.loadWikiLinks(), this.loadWikiPages()]).then(this.checkLinksPerms.bind(this));\n };\n\n WikiPagesListController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"add_wiki_link\") !== -1 || (this.scope.project.my_permissions.indexOf(\"view_wiki_links\") !== -1 && this.scope.wikiLinks.length)) {\n return this.scope.linksVisible = true;\n }\n };\n\n return WikiPagesListController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"WikiPagesListController\", WikiPagesListController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/lightboxes.coffee\n */\n\n(function() {\n var ChangeOwnerLightboxController, ChangeOwnerLightboxDirective, LbRequestOwnershipDirective, LightboxAddMembersWarningMessageDirective, TransferProjectStartSuccessDirective, debounce, module, taiga;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaKanban\");\n\n LightboxAddMembersWarningMessageDirective = function() {\n return {\n templateUrl: \"admin/memberships-warning-message.html\",\n scope: {\n project: \"=\"\n }\n };\n };\n\n module.directive(\"tgLightboxAddMembersWarningMessage\", [LightboxAddMembersWarningMessageDirective]);\n\n LbRequestOwnershipDirective = function(lightboxService, rs, confirmService, $translate) {\n return {\n link: function(scope, el) {\n lightboxService.open(el);\n return scope.request = function() {\n scope.loading = true;\n return rs.projects.transferRequest(scope.projectId).then(function() {\n scope.loading = false;\n lightboxService.close(el);\n return confirmService.notify(\"success\", $translate.instant(\"ADMIN.PROJECT_PROFILE.REQUEST_OWNERSHIP_SUCCESS\"));\n });\n };\n },\n templateUrl: \"common/lightbox/lightbox-request-ownership.html\"\n };\n };\n\n module.directive('tgLbRequestOwnership', [\"lightboxService\", \"tgResources\", \"$tgConfirm\", \"$translate\", LbRequestOwnershipDirective]);\n\n ChangeOwnerLightboxController = (function() {\n function ChangeOwnerLightboxController(rs1, lightboxService1, confirm, translate) {\n this.rs = rs1;\n this.lightboxService = lightboxService1;\n this.confirm = confirm;\n this.translate = translate;\n this.users = [];\n this.q = \"\";\n this.commentOpen = false;\n }\n\n ChangeOwnerLightboxController.prototype.limit = 3;\n\n ChangeOwnerLightboxController.prototype.normalizeString = function(normalizedString) {\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\");\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\");\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\");\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\");\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\");\n return normalizedString;\n };\n\n ChangeOwnerLightboxController.prototype.filterUsers = function(user) {\n var text, username;\n username = user.full_name_display.toUpperCase();\n username = this.normalizeString(username);\n text = this.q.toUpperCase();\n text = this.normalizeString(text);\n return _.includes(username, text);\n };\n\n ChangeOwnerLightboxController.prototype.getUsers = function() {\n var users;\n if (!this.users.length && !this.q.length) {\n users = this.activeUsers;\n } else {\n users = this.users;\n }\n users = users.slice(0, this.limit);\n users = _.reject(users, {\n \"selected\": true\n });\n return _.reject(users, {\n \"id\": this.currentOwnerId\n });\n };\n\n ChangeOwnerLightboxController.prototype.userSearch = function() {\n this.users = this.activeUsers;\n this.selected = _.find(this.users, {\n \"selected\": true\n });\n if (this.q) {\n return this.users = _.filter(this.users, this.filterUsers.bind(this));\n }\n };\n\n ChangeOwnerLightboxController.prototype.selectUser = function(user) {\n this.activeUsers = _.map(this.activeUsers, function(user) {\n user.selected = false;\n return user;\n });\n user.selected = true;\n return this.userSearch();\n };\n\n ChangeOwnerLightboxController.prototype.submit = function() {\n this.loading = true;\n return this.rs.projects.transferStart(this.projectId, this.selected.id, this.comment).then((function(_this) {\n return function() {\n var desc, title;\n _this.loading = false;\n _this.lightboxService.closeAll();\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.CHANGE_OWNER_SUCCESS_TITLE\");\n desc = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.CHANGE_OWNER_SUCCESS_DESC\");\n return _this.confirm.success(title, desc, {\n type: \"svg\",\n name: \"icon-speak-up\"\n });\n };\n })(this));\n };\n\n return ChangeOwnerLightboxController;\n\n })();\n\n ChangeOwnerLightboxController.$inject = [\"tgResources\", \"lightboxService\", \"$tgConfirm\", \"$translate\"];\n\n module.controller('ChangeOwnerLightbox', ChangeOwnerLightboxController);\n\n ChangeOwnerLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile) {\n var link;\n link = function(scope, el) {\n return lightboxService.open(el);\n };\n return {\n scope: true,\n controller: \"ChangeOwnerLightbox\",\n controllerAs: \"vm\",\n bindToController: {\n currentOwnerId: \"=\",\n projectId: \"=\",\n activeUsers: \"=\"\n },\n templateUrl: \"common/lightbox/lightbox-change-owner.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbChangeOwner\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", ChangeOwnerLightboxDirective]);\n\n TransferProjectStartSuccessDirective = function(lightboxService) {\n var link;\n link = function(scope, el) {\n scope.close = function() {\n return lightboxService.close(el);\n };\n return lightboxService.open(el);\n };\n return {\n templateUrl: \"common/lightbox/lightbox-transfer-project-start-success.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbTransferProjectStartSuccess\", [\"lightboxService\", TransferProjectStartSuccessDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/memberships.coffee\n */\n\n(function() {\n var MembershipsController, MembershipsDirective, MembershipsRowActionsDirective, MembershipsRowAdminCheckboxDirective, MembershipsRowAvatarDirective, MembershipsRowRoleSelectorDirective, NoMoreMembershipsExplanationDirective, bindMethods, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaAdmin\");\n\n MembershipsController = (function(superClass) {\n extend(MembershipsController, superClass);\n\n MembershipsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAnalytics\", \"tgAppMetaService\", \"$translate\", \"$tgAuth\", \"tgLightboxFactory\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function MembershipsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, analytics, appMetaService, translate, auth, lightboxFactory1, errorHandlingService, projectService1) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.auth = auth;\n this.lightboxFactory = lightboxFactory1;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n bindMethods(this);\n this.scope.project = {};\n this.scope.filters = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.MEMBERSHIPS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"membersform:new:success\", (function(_this) {\n return function() {\n _this.loadInitialData();\n return _this.analytics.trackEvent(\"membership\", \"create\", \"create memberships on admin\", 1);\n };\n })(this));\n }\n\n MembershipsController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.canAddUsers = project.max_memberships === null || project.max_memberships > project.total_memberships;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n MembershipsController.prototype.loadMembers = function() {\n var httpFilters;\n httpFilters = this.getUrlFilters();\n return this.rs.memberships.list(this.scope.projectId, httpFilters).then((function(_this) {\n return function(data) {\n _this.scope.memberships = _.filter(data.models, function(membership) {\n return membership.user === null || membership.is_user_active;\n });\n _this.scope.page = data.current;\n _this.scope.count = data.count;\n _this.scope.paginatedBy = data.paginatedBy;\n return data;\n };\n })(this));\n };\n\n MembershipsController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.q.all([this.loadMembers(), this.auth.refresh()]);\n };\n\n MembershipsController.prototype.getUrlFilters = function() {\n var filters;\n filters = _.pick(this.location.search(), \"page\");\n if (!filters.page) {\n filters.page = 1;\n }\n return filters;\n };\n\n MembershipsController.prototype.addNewMembers = function() {\n return this.lightboxFactory.create('tg-lb-add-members', {\n \"class\": \"lightbox lightbox-add-member\",\n \"project\": \"project\"\n }, {\n \"project\": this.scope.project\n });\n };\n\n MembershipsController.prototype.showLimitUsersWarningMessage = function() {\n var icon, message, title;\n title = this.translate.instant(\"ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING\");\n message = this.translate.instant(\"ADMIN.MEMBERSHIPS.LIMIT_USERS_WARNING_MESSAGE\", {\n members: this.scope.project.max_memberships\n });\n icon = \"/\" + window._version + \"/svg/icons/team-question.svg\";\n return this.confirm.success(title, message, {\n name: icon,\n type: \"img\"\n });\n };\n\n return MembershipsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"MembershipsController\", MembershipsController);\n\n MembershipsDirective = function($template, $compile) {\n var link, linkPagination, template;\n template = $template.get(\"admin/admin-membership-paginator.html\", true);\n linkPagination = function($scope, $el, $attrs, $ctrl) {\n var $pagEl, afterCurrent, atBegin, atEnd, beforeCurrent, getNumPages, renderPagination;\n afterCurrent = 2;\n beforeCurrent = 4;\n atBegin = 2;\n atEnd = 2;\n $pagEl = $el.find(\".memberships-paginator\");\n getNumPages = function() {\n var numPages;\n numPages = $scope.count / $scope.paginatedBy;\n if (parseInt(numPages, 10) < numPages) {\n numPages = parseInt(numPages, 10) + 1;\n } else {\n numPages = parseInt(numPages, 10);\n }\n return numPages;\n };\n renderPagination = function() {\n var cpage, html, i, j, numPages, options, pages, ref;\n numPages = getNumPages();\n if (numPages <= 1) {\n $pagEl.hide();\n return;\n }\n pages = [];\n options = {};\n options.pages = pages;\n options.showPrevious = $scope.page > 1;\n options.showNext = !($scope.page === numPages);\n cpage = $scope.page;\n for (i = j = 1, ref = numPages; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (i === (cpage + afterCurrent) && numPages > (cpage + afterCurrent + atEnd)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i === (cpage - beforeCurrent) && cpage > (atBegin + beforeCurrent)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i > (cpage + afterCurrent) && i <= (numPages - atEnd)) {\n\n } else if (i < (cpage - beforeCurrent) && i > atBegin) {\n\n } else if (i === cpage) {\n pages.push({\n classes: \"active\",\n num: i,\n type: \"page-active\"\n });\n } else {\n pages.push({\n classes: \"page\",\n num: i,\n type: \"page\"\n });\n }\n }\n html = template(options);\n html = $compile(html)($scope);\n $pagEl.html(html);\n return $pagEl.show();\n };\n $scope.$watch(\"memberships\", function(value) {\n if (!value) {\n return;\n }\n return renderPagination();\n });\n $el.on(\"click\", \".memberships-paginator a.next\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page + 1);\n return $ctrl.loadMembers();\n });\n });\n $el.on(\"click\", \".memberships-paginator a.previous\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n return $ctrl.loadMembers();\n });\n });\n return $el.on(\"click\", \".memberships-paginator li.page > a\", function(event) {\n var pagenum, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n pagenum = target.data(\"pagenum\");\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", pagenum);\n return $ctrl.loadMembers();\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n linkPagination($scope, $el, $attrs, $ctrl);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMemberships\", [\"$tgTemplate\", \"$compile\", MembershipsDirective]);\n\n MembershipsRowAvatarDirective = function($log, $template, $translate, $compile, avatarService) {\n var link, template;\n template = $template.get(\"admin/memberships-row-avatar.html\", true);\n link = function($scope, $el, $attrs) {\n var member, pending, render;\n pending = $translate.instant(\"ADMIN.MEMBERSHIP.STATUS_PENDING\");\n render = function(member) {\n var avatar, ctx, html;\n avatar = avatarService.getAvatar(member);\n ctx = {\n full_name: member.full_name ? member.full_name : \"\",\n email: member.user_email ? member.user_email : member.email,\n imgurl: avatar.url,\n bg: avatar.bg,\n pending: !member.is_user_active ? pending : \"\",\n isOwner: member.is_owner\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowAvatar == null) {\n return $log.error(\"MembershipsRowAvatarDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAvatar);\n render(member);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowAvatar\", [\"$log\", \"$tgTemplate\", '$translate', \"$compile\", \"tgAvatarService\", MembershipsRowAvatarDirective]);\n\n MembershipsRowAdminCheckboxDirective = function($log, $repo, $confirm, $template, $compile) {\n var link, template;\n template = $template.get(\"admin/admin-memberships-row-checkbox.html\", true);\n link = function($scope, $el, $attrs) {\n var html, member, render;\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n if ($attrs.tgMembershipsRowAdminCheckbox == null) {\n return $log.error(\"MembershipsRowAdminCheckboxDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAdminCheckbox);\n if (member.is_owner) {\n $el.find(\".js-check\").remove();\n return;\n }\n render = function(member) {\n var ctx, html;\n ctx = {\n inputId: \"is-admin-\" + member.id\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $el.on(\"click\", \":checkbox\", (function(_this) {\n return function(event) {\n var onError, onSuccess, target;\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function(data) {\n member.revert();\n $el.find(\":checkbox\").prop(\"checked\", member.is_admin);\n return $confirm.notify(\"error\", data.is_admin[0]);\n };\n target = angular.element(event.currentTarget);\n member.is_admin = target.prop(\"checked\");\n return $repo.save(member).then(onSuccess, onError);\n };\n })(this));\n html = render(member);\n if (member.is_admin) {\n return $el.find(\":checkbox\").prop(\"checked\", true);\n }\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowAdminCheckbox\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgTemplate\", \"$compile\", MembershipsRowAdminCheckboxDirective]);\n\n MembershipsRowRoleSelectorDirective = function($log, $repo, $confirm) {\n var link, template;\n template = _.template(\"\");\n link = function($scope, $el, $attrs) {\n var $ctrl, html, member, render;\n render = function(member) {\n var ctx, html;\n ctx = {\n roleList: $scope.project.roles,\n selectedRole: member.role\n };\n html = template(ctx);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowRoleSelector == null) {\n return $log.error(\"MembershipsRowRoleSelectorDirective: the directive need a member\");\n }\n $ctrl = $el.controller();\n member = $scope.$eval($attrs.tgMembershipsRowRoleSelector);\n html = render(member);\n $el.on(\"change\", \"select\", (function(_this) {\n return function(event) {\n var newRole, onError, onSuccess, target;\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n target = angular.element(event.currentTarget);\n newRole = parseInt(target.val(), 10);\n if (member.role !== newRole) {\n member.role = newRole;\n return $repo.save(member).then(onSuccess, onError);\n }\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowRoleSelector\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", MembershipsRowRoleSelectorDirective]);\n\n MembershipsRowActionsDirective = function($log, $repo, $rs, $confirm, $compile, $translate, $location, $navUrls, lightboxFactory, projectService) {\n var activedTemplate, link, pendingTemplate;\n activedTemplate = \"
    \\n
    \\n\\n \\n\";\n pendingTemplate = \"\\n\\n\\n \\n\";\n link = function($scope, $el, $attrs) {\n var $ctrl, leaveConfirm, member, render;\n render = function(member) {\n var html;\n if (member.user) {\n html = $compile(activedTemplate)($scope);\n } else {\n html = $compile(pendingTemplate)($scope);\n }\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowActions == null) {\n return $log.error(\"MembershipsRowActionsDirective: the directive need a member\");\n }\n $ctrl = $el.controller();\n member = $scope.$eval($attrs.tgMembershipsRowActions);\n render(member);\n $el.on(\"click\", \".js-resend\", function(event) {\n var onError, onSuccess;\n event.preventDefault();\n onSuccess = function() {\n var text;\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION\", {\n email: $scope.member.email\n });\n return $confirm.notify(\"success\", text);\n };\n onError = function() {\n var text;\n text = $translate.instant(\"ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION\");\n return $confirm.notify(\"error\", text);\n };\n return $rs.memberships.resendInvitation($scope.member.id).then(onSuccess, onError);\n });\n leaveConfirm = function() {\n var defaultMsg, message, title;\n title = $translate.instant(\"ADMIN.MEMBERSHIP.DELETE_MEMBER\");\n defaultMsg = $translate.instant(\"ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE\", {\n email: member.email\n });\n message = member.user ? member.full_name : defaultMsg;\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n var text;\n askResponse.finish();\n if (member.user !== $scope.user.id) {\n if ($scope.page > 1 && ($scope.count - 1) <= $scope.paginatedBy) {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n }\n projectService.fetchProject().then(function() {\n return $ctrl.loadInitialData();\n });\n } else {\n $location.path($navUrls.resolve(\"home\"));\n }\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_DELETE\", {\n message: message\n });\n return $confirm.notify(\"success\", text, null, 5000);\n };\n })(this);\n onError = (function(_this) {\n return function() {\n var text;\n askResponse.finish(false);\n text = $translate.instant(\"ADMIN.MEMBERSHIP.ERROR_DELETE\", {\n message: message\n });\n return $confirm.notify(\"error\", text);\n };\n })(this);\n return $repo.remove(member).then(onSuccess, onError);\n });\n };\n $el.on(\"click\", \".delete\", function(event) {\n var isCurrentUser;\n event.preventDefault();\n if ($scope.project.owner.id === member.user) {\n isCurrentUser = $scope.user.id === member.user;\n return lightboxFactory.create(\"tg-lightbox-leave-project-warning\", {\n \"class\": \"lightbox lightbox-leave-project-warning\"\n }, {\n isCurrentUser: isCurrentUser,\n project: $scope.project\n });\n } else {\n return leaveConfirm();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowActions\", [\"$log\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$compile\", \"$translate\", \"$tgLocation\", \"$tgNavUrls\", \"tgLightboxFactory\", \"tgProjectService\", MembershipsRowActionsDirective]);\n\n NoMoreMembershipsExplanationDirective = function() {\n return {\n templateUrl: \"admin/no-more-memberships-explanation.html\",\n scope: {\n project: \"=\"\n }\n };\n };\n\n module.directive(\"tgNoMoreMembershipsExplanation\", [NoMoreMembershipsExplanationDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/nav.coffee\n */\n\n(function() {\n var AdminNavigationDirective, module;\n\n AdminNavigationDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var section;\n section = $attrs.tgAdminNavigation;\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\"#adminmenu-\" + section + \" a\").addClass(\"active\");\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaAdmin\");\n\n module.directive(\"tgAdminNavigation\", AdminNavigationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/project-profile.coffee\n */\n\n(function() {\n var AdminProjectChangeOwnerDirective, AdminProjectRequestOwnershipDirective, AdminProjectRestrictionsDirective, CsvEpicDirective, CsvExporterController, CsvExporterEpicsController, CsvExporterIssuesController, CsvExporterTasksController, CsvExporterUserstoriesController, CsvIssueDirective, CsvTaskDirective, CsvUsDirective, ProjectDefaultValuesDirective, ProjectExportDirective, ProjectLogoDirective, ProjectLogoModelDirective, ProjectModulesDirective, ProjectProfileController, ProjectProfileDirective, bindOnce, debounce, groupBy, joinStr, mixOf, module, scopeDefer, taiga, toString, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n scopeDefer = this.taiga.scopeDefer;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAdmin\");\n\n ProjectProfileController = (function(superClass) {\n extend(ProjectProfileController, superClass);\n\n ProjectProfileController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\", \"$tgAuth\", \"tgCurrentUserService\", \"tgErrorHandlingService\", \"tgProjectService\", \"$tgModel\"];\n\n function ProjectProfileController(scope1, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate, tgAuth, currentUserService1, errorHandlingService, projectService1, model1) {\n var promise;\n this.scope = scope1;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.tgAuth = tgAuth;\n this.currentUserService = currentUserService1;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.model = model1;\n this.scope.project = {};\n this.scope.projectTags = [];\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName,\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n _this.appMetaService.setAll(title, description);\n return _this.fillUsersAndRoles(_this.scope.project.members, _this.scope.project.roles);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:loaded\", (function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName,\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n }\n\n ProjectProfileController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n project = this.model.make_model(\"projects\", project);\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.epicStatusList = _.sortBy(project.epic_statuses, \"order\");\n this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n this.scope.pointsList = _.sortBy(project.points, \"order\");\n this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n this.scope.issueTypesList = _.sortBy(project.issue_types, \"order\");\n this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n this.scope.prioritiesList = _.sortBy(project.priorities, \"order\");\n this.scope.severitiesList = _.sortBy(project.severities, \"order\");\n scopeDefer(this.scope, (function(_this) {\n return function() {\n return _this.scope.$emit('project:loaded', project);\n };\n })(this));\n this.scope.projectTags = _.map(this.scope.project.tags, (function(_this) {\n return function(it) {\n return [it, _this.scope.project.tags_colors[it]];\n };\n })(this));\n return project;\n };\n\n ProjectProfileController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.tgAuth.refresh();\n };\n\n ProjectProfileController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.project);\n };\n\n ProjectProfileController.prototype.addTag = function(name, color) {\n var tags;\n tags = _.clone(this.scope.project.tags);\n tags.push(name);\n this.scope.projectTags.push([name, null]);\n return this.scope.project.tags = tags;\n };\n\n ProjectProfileController.prototype.deleteTag = function(tag) {\n var tags;\n tags = _.clone(this.scope.project.tags);\n _.pull(tags, tag[0]);\n _.remove(this.scope.projectTags, (function(_this) {\n return function(it) {\n return it[0] === tag[0];\n };\n })(this));\n return this.scope.project.tags = tags;\n };\n\n return ProjectProfileController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectProfileController\", ProjectProfileController);\n\n ProjectProfileDirective = function($repo, $confirm, $loading, $navurls, $location, projectService, currentUserService, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, form, submit, submitButton;\n $ctrl = $el.controller();\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, privacyChanged, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n privacyChanged = $scope.project.isAttributeModified(\"is_private\");\n promise = $repo.save($scope.project);\n promise.then(function() {\n var newUrl;\n currentLoading.finish();\n if (privacyChanged && $scope.project.is_private) {\n $analytics.trackEvent(\"project-privacy-changed\", \"from-public-to-private\", \"Change project privacy from public to private\", 1);\n } else if (privacyChanged && !$scope.project.is_private) {\n $analytics.trackEvent(\"project-privacy-changed\", \"from-private-to-public\", \"Change project privacy from private to public\", 1);\n }\n $confirm.notify(\"success\");\n newUrl = $navurls.resolve(\"project-admin-project-profile-details\", {\n project: $scope.project.slug\n });\n $location.path(newUrl);\n projectService.fetchProject().then((function(_this) {\n return function() {\n return $ctrl.loadInitialData();\n };\n })(this));\n return currentUserService.loadProjects();\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectProfile\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgNavUrls\", \"$tgLocation\", \"tgProjectService\", \"tgCurrentUserService\", \"$tgAnalytics\", ProjectProfileDirective]);\n\n ProjectDefaultValuesDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.save($scope.project);\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectDefaultValues\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", ProjectDefaultValuesDirective]);\n\n ProjectModulesDirective = function($repo, $confirm, $loading, projectService) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n submit = (function(_this) {\n return function() {\n var form, promise;\n form = $el.find(\"form\").checksley();\n form.initializeFields();\n form.reset();\n if (!form.validate()) {\n return;\n }\n promise = $repo.save($scope.project);\n promise.then(function() {\n $scope.$emit(\"project:loaded\", $scope.project);\n $confirm.notify(\"success\");\n return projectService.fetchProject();\n });\n return promise.then(null, function(data) {\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this);\n $el.on(\"change\", \".module-activation.module-direct-active input\", function(event) {\n event.preventDefault();\n return $scope.$applyAsync(submit);\n });\n $el.on(\"submit\", \"form\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"keydown\", \".videoconference-attributes input\", function(e) {\n return e.which !== 32;\n });\n $scope.$watch(\"project.videoconferences\", function(newVal, oldVal) {\n if ((newVal != null) && (oldVal != null) && newVal !== oldVal) {\n return $scope.project.videoconferences_extra_data = \"\";\n }\n });\n $scope.$watch(\"isVideoconferenceActivated\", function(newValue, oldValue) {\n if (newValue === false) {\n $scope.project.videoconferences = null;\n $scope.project.videoconferences_extra_data = \"\";\n if (oldValue === true) {\n return submit();\n }\n }\n });\n return $scope.$watch(\"project\", function(project) {\n if (project.videoconferences != null) {\n return $scope.isVideoconferenceActivated = true;\n } else {\n return $scope.isVideoconferenceActivated = false;\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectModules\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgProjectService\", ProjectModulesDirective]);\n\n ProjectExportDirective = function($window, $rs, $confirm, $translate, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var asyn_message, buttonsEl, dump_ready_text, hideButtons, hideResult, hideSpinner, loading_msg, loading_title, resultEl, resultMessageEl, resultTitleEl, setAsyncMessage, setAsyncTitle, setLoadingMessage, setLoadingTitle, setSyncMessage, setSyncTitle, showButtons, showErrorMode, showExportResultAsyncMode, showExportResultSyncMode, showLoadingMode, showResult, showSpinner, spinnerEl, syn_message;\n buttonsEl = $el.find(\".admin-project-export-buttons\");\n showButtons = function() {\n return buttonsEl.removeClass(\"hidden\");\n };\n hideButtons = function() {\n return buttonsEl.addClass(\"hidden\");\n };\n resultEl = $el.find(\".admin-project-export-result\");\n showResult = function() {\n return resultEl.removeClass(\"hidden\");\n };\n hideResult = function() {\n return resultEl.addClass(\"hidden\");\n };\n spinnerEl = $el.find(\".spin\");\n showSpinner = function() {\n return spinnerEl.removeClass(\"hidden\");\n };\n hideSpinner = function() {\n return spinnerEl.addClass(\"hidden\");\n };\n resultTitleEl = $el.find(\".result-title\");\n loading_title = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_TITLE\");\n loading_msg = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_MESSAGE\");\n dump_ready_text = function() {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.DUMP_READY\"));\n };\n asyn_message = function() {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE\"));\n };\n syn_message = function(url) {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.SYNC_MESSAGE\", {\n url: url\n }));\n };\n setLoadingTitle = function() {\n return resultTitleEl.html(loading_title);\n };\n setAsyncTitle = function() {\n return resultTitleEl.html(loading_msg);\n };\n setSyncTitle = function() {\n return resultTitleEl.html(dump_ready_text);\n };\n resultMessageEl = $el.find(\".result-message \");\n setLoadingMessage = function() {\n return resultMessageEl.html(loading_msg);\n };\n setAsyncMessage = function() {\n return resultMessageEl.html(asyn_message);\n };\n setSyncMessage = function(url) {\n return resultMessageEl.html(syn_message(url));\n };\n showLoadingMode = function() {\n showSpinner();\n setLoadingTitle();\n setLoadingMessage();\n hideButtons();\n return showResult();\n };\n showExportResultAsyncMode = function() {\n hideSpinner();\n setAsyncTitle();\n return setAsyncMessage();\n };\n showExportResultSyncMode = function(url) {\n hideSpinner();\n setSyncTitle();\n return setSyncMessage(url);\n };\n showErrorMode = function() {\n hideSpinner();\n hideResult();\n return showButtons();\n };\n return $el.on(\"click\", \"a.button-export\", debounce(2000, (function(_this) {\n return function(event) {\n var onError, onSuccess;\n event.preventDefault();\n onSuccess = function(result) {\n var dumpUrl;\n $analytics.trackEvent(\"exporter\", \"export-project\", \"Exported project\", 1);\n if (result.status === 202) {\n return showExportResultAsyncMode();\n } else {\n dumpUrl = result.data.url;\n showExportResultSyncMode(dumpUrl);\n return $window.open(dumpUrl, \"_blank\");\n }\n };\n onError = function(result) {\n var errorMsg, ref;\n showErrorMode();\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\", {\n message: result.data._error_message\n });\n }\n return $confirm.notify(\"error\", errorMsg);\n };\n showLoadingMode();\n return $rs.projects[\"export\"]($scope.projectId).then(onSuccess, onError);\n };\n })(this)));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectExport\", [\"$window\", \"$tgResources\", \"$tgConfirm\", \"$translate\", \"$tgAnalytics\", ProjectExportDirective]);\n\n CsvExporterController = (function(superClass) {\n extend(CsvExporterController, superClass);\n\n CsvExporterController.$inject = [\"$scope\", \"$rootScope\", \"$tgUrls\", \"$tgConfirm\", \"$tgResources\", \"$translate\"];\n\n function CsvExporterController(scope1, rootscope, urls, confirm, rs, translate) {\n this.scope = scope1;\n this.rootscope = rootscope;\n this.urls = urls;\n this.confirm = confirm;\n this.rs = rs;\n this.translate = translate;\n this._generateUuid = bind(this._generateUuid, this);\n this.setCsvUuid = bind(this.setCsvUuid, this);\n this.rootscope.$on(\"project:loaded\", this.setCsvUuid);\n this.scope.$watch(\"csvUuid\", (function(_this) {\n return function(value) {\n if (value) {\n return _this.scope.csvUrl = _this.urls.resolveAbsolute(_this.type + \"-csv\", value);\n } else {\n return _this.scope.csvUrl = \"\";\n }\n };\n })(this));\n }\n\n CsvExporterController.prototype.setCsvUuid = function() {\n return this.scope.csvUuid = this.scope.project[this.type + \"_csv_uuid\"];\n };\n\n CsvExporterController.prototype._generateUuid = function(response) {\n var promise;\n if (response == null) {\n response = null;\n }\n promise = this.rs.projects[\"regenerate_\" + this.type + \"_csv_uuid\"](this.scope.projectId);\n promise.then((function(_this) {\n return function(data) {\n var ref;\n return _this.scope.csvUuid = (ref = data.data) != null ? ref.uuid : void 0;\n };\n })(this));\n promise.then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n promise[\"finally\"](function() {\n if (response) {\n return response.finish();\n }\n });\n return promise;\n };\n\n CsvExporterController.prototype.regenerateUuid = function() {\n var subtitle, title;\n if (this.scope.csvUuid) {\n title = this.translate.instant(\"ADMIN.REPORTS.REGENERATE_TITLE\");\n subtitle = this.translate.instant(\"ADMIN.REPORTS.REGENERATE_SUBTITLE\");\n return this.confirm.ask(title, subtitle).then(this._generateUuid);\n } else {\n return this._generateUuid();\n }\n };\n\n return CsvExporterController;\n\n })(taiga.Controller);\n\n CsvExporterEpicsController = (function(superClass) {\n extend(CsvExporterEpicsController, superClass);\n\n function CsvExporterEpicsController() {\n return CsvExporterEpicsController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterEpicsController.prototype.type = \"epics\";\n\n return CsvExporterEpicsController;\n\n })(CsvExporterController);\n\n CsvExporterUserstoriesController = (function(superClass) {\n extend(CsvExporterUserstoriesController, superClass);\n\n function CsvExporterUserstoriesController() {\n return CsvExporterUserstoriesController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterUserstoriesController.prototype.type = \"userstories\";\n\n return CsvExporterUserstoriesController;\n\n })(CsvExporterController);\n\n CsvExporterTasksController = (function(superClass) {\n extend(CsvExporterTasksController, superClass);\n\n function CsvExporterTasksController() {\n return CsvExporterTasksController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterTasksController.prototype.type = \"tasks\";\n\n return CsvExporterTasksController;\n\n })(CsvExporterController);\n\n CsvExporterIssuesController = (function(superClass) {\n extend(CsvExporterIssuesController, superClass);\n\n function CsvExporterIssuesController() {\n return CsvExporterIssuesController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterIssuesController.prototype.type = \"issues\";\n\n return CsvExporterIssuesController;\n\n })(CsvExporterController);\n\n module.controller(\"CsvExporterEpicsController\", CsvExporterEpicsController);\n\n module.controller(\"CsvExporterUserstoriesController\", CsvExporterUserstoriesController);\n\n module.controller(\"CsvExporterTasksController\", CsvExporterTasksController);\n\n module.controller(\"CsvExporterIssuesController\", CsvExporterIssuesController);\n\n CsvEpicDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_EPIC\";\n };\n return {\n controller: \"CsvExporterEpicsController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvEpic\", [\"$translate\", CsvEpicDirective]);\n\n CsvUsDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_US\";\n };\n return {\n controller: \"CsvExporterUserstoriesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvUs\", [\"$translate\", CsvUsDirective]);\n\n CsvTaskDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_TASK\";\n };\n return {\n controller: \"CsvExporterTasksController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvTask\", [\"$translate\", CsvTaskDirective]);\n\n CsvIssueDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_ISSUE\";\n };\n return {\n controller: \"CsvExporterIssuesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvIssue\", [\"$translate\", CsvIssueDirective]);\n\n ProjectLogoDirective = function($auth, $model, $rs, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var onError, onSuccess, showSizeInfo;\n showSizeInfo = function() {\n return $el.find(\".size-info\").addClass(\"active\");\n };\n onSuccess = function(response) {\n var project;\n project = $model.make_model(\"projects\", response.data);\n $scope.project = project;\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('success');\n };\n onError = function(response) {\n if (response.status === 413) {\n showSizeInfo();\n }\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('error', response.data._error_message);\n };\n $el.on(\"click\", \".js-change-logo\", function() {\n return $el.find(\"#logo-field\").click();\n });\n $el.on(\"change\", \"#logo-field\", function(event) {\n if ($scope.logoAttachment) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.projects.changeLogo($scope.project.id, $scope.logoAttachment).then(onSuccess, onError);\n }\n });\n $el.on(\"click\", \"a.js-use-default-logo\", function(event) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.projects.removeLogo($scope.project.id).then(onSuccess, onError);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectLogo\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", ProjectLogoDirective]);\n\n ProjectLogoModelDirective = function($parse) {\n var link;\n link = function($scope, $el, $attrs) {\n var model, modelSetter;\n model = $parse($attrs.tgProjectLogoModel);\n modelSetter = model.assign;\n return $el.bind('change', function() {\n return $scope.$apply(function() {\n return modelSetter($scope, $el[0].files[0]);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive('tgProjectLogoModel', ['$parse', ProjectLogoModelDirective]);\n\n AdminProjectRestrictionsDirective = function() {\n return {\n scope: {\n \"project\": \"=\"\n },\n templateUrl: \"admin/admin-project-restrictions.html\"\n };\n };\n\n module.directive('tgAdminProjectRestrictions', [AdminProjectRestrictionsDirective]);\n\n AdminProjectRequestOwnershipDirective = function(lightboxFactory) {\n return {\n link: function(scope) {\n return scope.requestOwnership = function() {\n return lightboxFactory.create(\"tg-lb-request-ownership\", {\n \"class\": \"lightbox lightbox-request-ownership\"\n }, {\n projectId: scope.projectId\n });\n };\n },\n scope: {\n \"projectId\": \"=\",\n \"owner\": \"=\"\n },\n templateUrl: \"admin/admin-project-request-ownership.html\"\n };\n };\n\n module.directive('tgAdminProjectRequestOwnership', [\"tgLightboxFactory\", AdminProjectRequestOwnershipDirective]);\n\n AdminProjectChangeOwnerDirective = function(lightboxFactory) {\n return {\n link: function(scope) {\n return scope.changeOwner = function() {\n return lightboxFactory.create(\"tg-lb-change-owner\", {\n \"class\": \"lightbox lightbox-select-user\",\n \"project-id\": \"projectId\",\n \"active-users\": \"activeUsers\",\n \"current-owner-id\": \"currentOwnerId\"\n }, {\n projectId: scope.projectId,\n activeUsers: scope.activeUsers,\n currentOwnerId: scope.owner.id,\n members: scope.members\n });\n };\n },\n scope: {\n \"activeUsers\": \"=\",\n \"projectId\": \"=\",\n \"owner\": \"=\",\n \"members\": \"=\"\n },\n templateUrl: \"admin/admin-project-change-owner.html\"\n };\n };\n\n module.directive('tgAdminProjectChangeOwner', [\"tgLightboxFactory\", AdminProjectChangeOwnerDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/project-profile.coffee\n */\n\n(function() {\n var ColorSelectionDirective, DATE_TYPE, MULTILINE_TYPE, ProjectCustomAttributesController, ProjectCustomAttributesDirective, ProjectTagsController, ProjectTagsDirective, ProjectValuesController, ProjectValuesDirective, ProjectValuesSectionController, RICHTEXT_TYPE, TEXT_TYPE, TYPE_CHOICES, URL_TYPE, bindOnce, debounce, getDefaulColorList, groupBy, joinStr, mixOf, module, taiga, toString, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n getDefaulColorList = this.taiga.getDefaulColorList;\n\n module = angular.module(\"taigaAdmin\");\n\n ProjectValuesSectionController = (function(superClass) {\n extend(ProjectValuesSectionController, superClass);\n\n ProjectValuesSectionController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function ProjectValuesSectionController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate, errorHandlingService, projectService1) {\n var description, sectionName, title;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService1;\n this.scope.project = {};\n this.loadInitialData();\n sectionName = this.translate.instant(this.scope.sectionName);\n title = this.translate.instant(\"ADMIN.PROJECT_VALUES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": this.scope.project.name\n });\n description = this.scope.project.description;\n this.appMetaService.setAll(title, description);\n }\n\n ProjectValuesSectionController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n ProjectValuesSectionController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise;\n };\n\n return ProjectValuesSectionController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectValuesSectionController\", ProjectValuesSectionController);\n\n ProjectValuesController = (function(superClass) {\n extend(ProjectValuesController, superClass);\n\n ProjectValuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\"];\n\n function ProjectValuesController(scope, rootscope, repo, confirm, rs) {\n var unwatch;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.moveValue = bind(this.moveValue, this);\n this.loadValues = bind(this.loadValues, this);\n this.scope.$on(\"admin:project-values:move\", this.moveValue);\n unwatch = this.scope.$watch(\"resource\", (function(_this) {\n return function(resource) {\n if (resource) {\n _this.loadValues();\n return unwatch();\n }\n };\n })(this));\n }\n\n ProjectValuesController.prototype.loadValues = function() {\n return this.rs[this.scope.resource].listValues(this.scope.projectId, this.scope.type).then((function(_this) {\n return function(values) {\n _this.scope.values = values;\n _this.scope.maxValueOrder = _.maxBy(values, \"order\").order;\n return values;\n };\n })(this));\n };\n\n ProjectValuesController.prototype.moveValue = function(ctx, itemValue, itemIndex) {\n var r, values;\n values = this.scope.values;\n r = values.indexOf(itemValue);\n values.splice(r, 1);\n values.splice(itemIndex, 0, itemValue);\n _.each(values, function(value, index) {\n return value.order = index;\n });\n return this.repo.saveAll(values);\n };\n\n return ProjectValuesController;\n\n })(taiga.Controller);\n\n module.controller(\"ProjectValuesController\", ProjectValuesController);\n\n ProjectValuesDirective = function($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope, projectService) {\n var link, linkDragAndDrop, linkValue;\n linkDragAndDrop = function($scope, $el, $attrs) {\n var drake, itemEl, newParentScope, oldParentScope, scroll, tdom;\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el.find(\".sortable\");\n drake = dragula([tdom[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: tdom[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var itemIndex, itemValue;\n itemEl = $(item);\n itemValue = itemEl.scope().value;\n itemIndex = itemEl.index();\n return $scope.$broadcast(\"admin:project-values:move\", itemValue, itemIndex);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return drake.destroy();\n });\n };\n linkValue = function($scope, $el, $attrs) {\n var $ctrl, cancel, goToBottomList, initializeNewValue, initializeTextTranslations, objName, saveNewValue, saveValue, valueType;\n $ctrl = $el.controller();\n valueType = $attrs.type;\n objName = $attrs.objname;\n initializeNewValue = function() {\n return $scope.newValue = {\n \"name\": \"\",\n \"is_closed\": false,\n \"is_archived\": false\n };\n };\n initializeTextTranslations = function() {\n return $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_\" + (objName.toUpperCase()) + \".ACTION_ADD\");\n };\n initializeNewValue();\n initializeTextTranslations();\n $rootscope.$on(\"$translateChangeEnd\", function() {\n return $scope.$evalAsync(initializeTextTranslations);\n });\n goToBottomList = (function(_this) {\n return function(focus) {\n var table;\n if (focus == null) {\n focus = false;\n }\n table = $el.find(\".table-main\");\n $(document.body).scrollTop(table.offset().top + table.height());\n if (focus) {\n return $el.find(\".new-value input:visible\").first().focus();\n }\n };\n })(this);\n saveValue = function(target) {\n var form, formEl, promise, value;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n value = formEl.scope().value;\n promise = $repo.save(value);\n promise.then((function(_this) {\n return function() {\n var row;\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n row.siblings(\".visualization\").removeClass('hidden');\n return projectService.fetchProject();\n };\n })(this));\n return promise.then(null, function(data) {\n return form.setErrors(data);\n });\n };\n saveNewValue = function(target) {\n var form, formEl, promise;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.newValue.project = $scope.project.id;\n $scope.newValue.order = $scope.maxValueOrder ? $scope.maxValueOrder + 1 : 1;\n promise = $repo.create(valueType, $scope.newValue);\n promise.then((function(_this) {\n return function(data) {\n target.addClass(\"hidden\");\n $scope.values.push(data);\n $scope.maxValueOrder = data.order;\n return initializeNewValue();\n };\n })(this));\n return promise.then(null, function(data) {\n return form.setErrors(data);\n });\n };\n cancel = function(target) {\n var formEl, row, value;\n row = target.parents(\".row.table-main\");\n formEl = target.parents(\"form\");\n value = formEl.scope().value;\n return $scope.$apply(function() {\n row.addClass(\"hidden\");\n value.revert();\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n };\n $el.on(\"click\", \".show-add-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").removeClass('hidden');\n return goToBottomList(true);\n });\n $el.on(\"click\", \".add-new\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n }));\n $el.on(\"click\", \".delete-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n });\n $el.on(\"click\", \".edit-value\", function(event) {\n var editionRow, row, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n editionRow = row.siblings(\".edition\");\n editionRow.removeClass('hidden');\n return editionRow.find('input:visible').first().focus().select();\n });\n $el.on(\"keyup\", \".new-value input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n } else if (event.keyCode === 27) {\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return saveValue(target);\n });\n $el.on(\"click\", \".cancel\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return cancel(target);\n });\n return $el.on(\"click\", \".delete-value\", function(event) {\n var choices, formEl, subtitle, target, text, title, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.parents(\"form\");\n value = formEl.scope().value;\n choices = {};\n _.each($scope.values, function(option) {\n if (value.id !== option.id) {\n return choices[option.id] = option.name;\n }\n });\n subtitle = value.name;\n if (_.keys(choices).length === 0) {\n return $confirm.error($translate.instant(\"ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL\"));\n }\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE\");\n text = $translate.instant(\"ADMIN.PROJECT_VALUES.REPLACEMENT\");\n return $confirm.askChoice(title, subtitle, choices, text).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadValues()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $repo.remove(value, {\n \"moveTo\": response.selected\n }).then(onSucces, onError);\n });\n });\n };\n link = function($scope, $el, $attrs) {\n linkDragAndDrop($scope, $el, $attrs);\n linkValue($scope, $el, $attrs);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectValues\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", \"tgProjectService\", ProjectValuesDirective]);\n\n ColorSelectionDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var $ctrl;\n $scope.colorList = getDefaulColorList();\n $scope.allowEmpty = false;\n if ($attrs.tgAllowEmpty) {\n $scope.allowEmpty = true;\n }\n $ctrl = $el.controller();\n $scope.$watch($attrs.ngModel, function(element) {\n return $scope.color = element.color;\n });\n $el.on(\"click\", \".current-color\", function(event) {\n var body, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n $(\".select-color\").hide();\n target.siblings(\".select-color\").show();\n body = angular.element(\"body\");\n return body.on(\"click\", (function(_this) {\n return function(event) {\n if (angular.element(event.target).parent(\".select-color\").length === 0) {\n $el.find(\".select-color\").hide();\n return body.unbind(\"click\");\n }\n };\n })(this));\n });\n $el.on(\"click\", \".select-color .color\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n $scope.$apply(function() {\n return $model.$modelValue.color = target.data(\"color\");\n });\n return $el.find(\".select-color\").hide();\n });\n $el.on(\"click\", \".select-color .selected-color\", function(event) {\n event.preventDefault();\n $scope.$apply(function() {\n return $model.$modelValue.color = $scope.color;\n });\n return $el.find(\".select-color\").hide();\n });\n $el.on(\"keyup\", \"input\", function(event) {\n event.stopPropagation();\n if (event.keyCode === 13) {\n $scope.$apply(function() {\n return $model.$modelValue.color = $scope.color;\n });\n return $el.find(\".select-color\").hide();\n } else if (event.keyCode === 27) {\n return $el.find(\".select-color\").hide();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgColorSelection\", ColorSelectionDirective);\n\n TEXT_TYPE = \"text\";\n\n MULTILINE_TYPE = \"multiline\";\n\n RICHTEXT_TYPE = \"richtext\";\n\n DATE_TYPE = \"date\";\n\n URL_TYPE = \"url\";\n\n TYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n }, {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n }, {\n key: RICHTEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_RICHTEXT\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }, {\n key: URL_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_URL\"\n }\n ];\n\n ProjectCustomAttributesController = (function(superClass) {\n extend(ProjectCustomAttributesController, superClass);\n\n ProjectCustomAttributesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function ProjectCustomAttributesController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, translate, projectService1) {\n var description, sectionName, title;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService1;\n this.moveCustomAttributes = bind(this.moveCustomAttributes, this);\n this.deleteCustomAttribute = bind(this.deleteCustomAttribute, this);\n this.saveCustomAttribute = bind(this.saveCustomAttribute, this);\n this.createCustomAttribute = bind(this.createCustomAttribute, this);\n this.loadCustomAttributes = bind(this.loadCustomAttributes, this);\n this.scope.TYPE_CHOICES = TYPE_CHOICES;\n this.scope.project = this.projectService.project.toJS();\n this.scope.projectId = this.scope.project.id;\n sectionName = this.translate.instant(this.scope.sectionName);\n title = this.translate.instant(\"ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": this.scope.project.name\n });\n description = this.scope.project.description;\n this.appMetaService.setAll(title, description);\n this.scope.init = (function(_this) {\n return function(type) {\n _this.scope.type = type;\n return _this.loadCustomAttributes();\n };\n })(this);\n }\n\n ProjectCustomAttributesController.prototype.loadCustomAttributes = function() {\n return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then((function(_this) {\n return function(customAttributes) {\n var ref;\n _this.scope.customAttributes = customAttributes;\n _this.scope.maxOrder = (ref = _.maxBy(customAttributes, \"order\")) != null ? ref.order : void 0;\n return customAttributes;\n };\n })(this));\n };\n\n ProjectCustomAttributesController.prototype.createCustomAttribute = function(attrValues) {\n return this.repo.create(\"custom-attributes/\" + this.scope.type, attrValues);\n };\n\n ProjectCustomAttributesController.prototype.saveCustomAttribute = function(attrModel) {\n return this.repo.save(attrModel);\n };\n\n ProjectCustomAttributesController.prototype.deleteCustomAttribute = function(attrModel) {\n return this.repo.remove(attrModel);\n };\n\n ProjectCustomAttributesController.prototype.moveCustomAttributes = function(attrModel, newIndex) {\n var customAttributes, r;\n customAttributes = this.scope.customAttributes;\n r = customAttributes.indexOf(attrModel);\n customAttributes.splice(r, 1);\n customAttributes.splice(newIndex, 0, attrModel);\n _.each(customAttributes, function(val, idx) {\n return val.order = idx;\n });\n return this.repo.saveAll(customAttributes);\n };\n\n return ProjectCustomAttributesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectCustomAttributesController\", ProjectCustomAttributesController);\n\n ProjectCustomAttributesDirective = function($log, $confirm, animationFrame, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, cancelCreate, cancelUpdate, create, deleteCustomAttribute, drake, hideAddButton, hideCancelButton, hideCreateForm, hideEditForm, resetNewAttr, revertChangesInCustomAttribute, showAddButton, showCancelButton, showCreateForm, showEditForm, sortableEl, update;\n $ctrl = $el.controller();\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n sortableEl = $el.find(\".js-sortable\");\n drake = dragula([sortableEl[0]], {\n direction: 'vertical',\n copySortSource: false,\n copy: false,\n mirrorContainer: sortableEl[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var itemAttr, itemEl, itemIndex;\n itemEl = $(item);\n itemAttr = itemEl.scope().attr;\n itemIndex = itemEl.index();\n return $ctrl.moveCustomAttributes(itemAttr, itemIndex);\n });\n showCreateForm = function() {\n $el.find(\".js-new-custom-field\").removeClass(\"hidden\");\n return $el.find(\".js-new-custom-field input:visible\").first().focus();\n };\n hideCreateForm = function() {\n return $el.find(\".js-new-custom-field\").addClass(\"hidden\");\n };\n showAddButton = function() {\n return $el.find(\".js-add-custom-field-button\").removeClass(\"hidden\");\n };\n hideAddButton = function() {\n return $el.find(\".js-add-custom-field-button\").addClass(\"hidden\");\n };\n showCancelButton = function() {\n return $el.find(\".js-cancel-new-custom-field-button\").removeClass(\"hidden\");\n };\n hideCancelButton = function() {\n return $el.find(\".js-cancel-new-custom-field-button\").addClass(\"hidden\");\n };\n resetNewAttr = function() {\n return $scope.newAttr = {};\n };\n create = function(formEl) {\n var attr, form, onError, onSucces;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n onSucces = (function(_this) {\n return function() {\n $ctrl.loadCustomAttributes();\n hideCreateForm();\n resetNewAttr();\n return $confirm.notify(\"success\");\n };\n })(this);\n onError = (function(_this) {\n return function(data) {\n return form.setErrors(data);\n };\n })(this);\n attr = $scope.newAttr;\n attr.project = $scope.projectId;\n attr.order = $scope.maxOrder ? $scope.maxOrder + 1 : 1;\n return $ctrl.createCustomAttribute(attr).then(onSucces, onError);\n };\n cancelCreate = function() {\n hideCreateForm();\n return resetNewAttr();\n };\n $scope.$watch(\"customAttributes\", function(customAttributes) {\n if (!customAttributes) {\n return;\n }\n if (customAttributes.length === 0) {\n hideCancelButton();\n hideAddButton();\n return showCreateForm();\n } else {\n hideCreateForm();\n showAddButton();\n return showCancelButton();\n }\n });\n $el.on(\"click\", \".js-add-custom-field-button\", function(event) {\n event.preventDefault();\n return showCreateForm();\n });\n $el.on(\"click\", \".js-create-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return create(formEl);\n }));\n $el.on(\"click\", \".js-cancel-new-custom-field-button\", function(event) {\n event.preventDefault();\n return cancelCreate();\n });\n $el.on(\"keyup\", \".js-new-custom-field input\", function(event) {\n var formEl, target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return create(formEl);\n } else if (event.keyCode === 27) {\n return cancelCreate();\n }\n });\n showEditForm = function(formEl) {\n formEl.find(\".js-view-custom-field\").addClass(\"hidden\");\n formEl.find(\".js-edit-custom-field\").removeClass(\"hidden\");\n return formEl.find(\".js-edit-custom-field input:visible\").first().focus().select();\n };\n hideEditForm = function(formEl) {\n formEl.find(\".js-edit-custom-field\").addClass(\"hidden\");\n return formEl.find(\".js-view-custom-field\").removeClass(\"hidden\");\n };\n revertChangesInCustomAttribute = function(formEl) {\n return $scope.$apply(function() {\n return formEl.scope().attr.revert();\n });\n };\n update = function(formEl) {\n var attr, form, onError, onSucces;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n onSucces = (function(_this) {\n return function() {\n $ctrl.loadCustomAttributes();\n hideEditForm(formEl);\n return $confirm.notify(\"success\");\n };\n })(this);\n onError = (function(_this) {\n return function(data) {\n return form.setErrors(data);\n };\n })(this);\n attr = formEl.scope().attr;\n return $ctrl.saveCustomAttribute(attr).then(onSucces, onError);\n };\n cancelUpdate = function(formEl) {\n hideEditForm(formEl);\n return revertChangesInCustomAttribute(formEl);\n };\n $el.on(\"click\", \".js-edit-custom-field-button\", function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return showEditForm(formEl);\n });\n $el.on(\"click\", \".js-update-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return update(formEl);\n }));\n $el.on(\"click\", \".js-cancel-edit-custom-field-button\", function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return cancelUpdate(formEl);\n });\n $el.on(\"keyup\", \".js-edit-custom-field input\", function(event) {\n var formEl, target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return update(formEl);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return cancelUpdate(formEl);\n }\n });\n deleteCustomAttribute = function(formEl) {\n var attr, message, text, title;\n attr = formEl.scope().attr;\n message = attr.name;\n title = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.DELETE\");\n text = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE\");\n return $confirm.ask(title, text, message).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadCustomAttributes()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\", null, \"We have not been able to delete '\" + message + \"'.\");\n };\n return $ctrl.deleteCustomAttribute(attr).then(onSucces, onError);\n });\n };\n return $el.on(\"click\", \".js-delete-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return deleteCustomAttribute(formEl);\n }));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectCustomAttributes\", [\"$log\", \"$tgConfirm\", \"animationFrame\", \"$translate\", ProjectCustomAttributesDirective]);\n\n ProjectTagsController = (function(superClass) {\n extend(ProjectTagsController, superClass);\n\n ProjectTagsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$tgModel\", \"tgProjectService\"];\n\n function ProjectTagsController(scope, rootscope, repo, confirm, rs, model, projectService1) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.model = model;\n this.projectService = projectService1;\n this.mixingClass = bind(this.mixingClass, this);\n this.cancelMixingTags = bind(this.cancelMixingTags, this);\n this.confirmMixingTags = bind(this.confirmMixingTags, this);\n this.toggleMixingFromTags = bind(this.toggleMixingFromTags, this);\n this.startMixingTags = bind(this.startMixingTags, this);\n this.deleteTag = bind(this.deleteTag, this);\n this.editTag = bind(this.editTag, this);\n this.createTag = bind(this.createTag, this);\n this.filterAndSortTags = bind(this.filterAndSortTags, this);\n this.loadTags = bind(this.loadTags, this);\n this.loading = true;\n this.loadTags();\n }\n\n ProjectTagsController.prototype.loadTags = function() {\n var project;\n project = this.projectService.project.toJS();\n return this.rs.projects.tagsColors(project.id).then((function(_this) {\n return function(tags) {\n _this.scope.projectTagsAll = _.map(tags.getAttrs(), function(color, name) {\n return _this.model.make_model('tag', {\n name: name,\n color: color\n });\n });\n _this.filterAndSortTags();\n return _this.loading = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.filterAndSortTags = function() {\n this.scope.projectTags = _.sortBy(this.scope.projectTagsAll, function(it) {\n return it.name.toLowerCase();\n });\n return this.scope.projectTags = _.filter(this.scope.projectTags, (function(_this) {\n return function(tag) {\n return tag.name.indexOf(_this.scope.tagsFilter.name) !== -1;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.createTag = function(tag, color) {\n return this.rs.projects.createTag(this.scope.projectId, tag, color);\n };\n\n ProjectTagsController.prototype.editTag = function(from_tag, to_tag, color) {\n if (from_tag === to_tag) {\n to_tag = null;\n }\n return this.rs.projects.editTag(this.scope.projectId, from_tag, to_tag, color);\n };\n\n ProjectTagsController.prototype.deleteTag = function(tag) {\n this.scope.loadingDelete = true;\n return this.rs.projects.deleteTag(this.scope.projectId, tag)[\"finally\"]((function(_this) {\n return function() {\n return _this.scope.loadingDelete = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.startMixingTags = function(tag) {\n return this.scope.mixingTags.toTag = tag.name;\n };\n\n ProjectTagsController.prototype.toggleMixingFromTags = function(tag) {\n var index;\n if (tag.name !== this.scope.mixingTags.toTag) {\n index = this.scope.mixingTags.fromTags.indexOf(tag.name);\n if (index === -1) {\n return this.scope.mixingTags.fromTags.push(tag.name);\n } else {\n return this.scope.mixingTags.fromTags.splice(index, 1);\n }\n }\n };\n\n ProjectTagsController.prototype.confirmMixingTags = function() {\n var fromTags, toTag;\n toTag = this.scope.mixingTags.toTag;\n fromTags = this.scope.mixingTags.fromTags;\n this.scope.loadingMixing = true;\n return this.rs.projects.mixTags(this.scope.projectId, toTag, fromTags).then((function(_this) {\n return function() {\n _this.cancelMixingTags();\n return _this.loadTags();\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.scope.loadingMixing = false;\n };\n })(this));\n };\n\n ProjectTagsController.prototype.cancelMixingTags = function() {\n this.scope.mixingTags.toTag = null;\n return this.scope.mixingTags.fromTags = [];\n };\n\n ProjectTagsController.prototype.mixingClass = function(tag) {\n if (this.scope.mixingTags.toTag !== null) {\n if (tag.name === this.scope.mixingTags.toTag) {\n return \"mixing-tags-to\";\n } else if (this.scope.mixingTags.fromTags.indexOf(tag.name) !== -1) {\n return \"mixing-tags-from\";\n }\n }\n };\n\n return ProjectTagsController;\n\n })(taiga.Controller);\n\n module.controller(\"ProjectTagsController\", ProjectTagsController);\n\n ProjectTagsDirective = function($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, $window, cancel, goToBottomList, initializeMixingTags, initializeNewValue, initializeTagsFilter, initializeTextTranslations, objName, saveNewValue, saveValue, valueType;\n $window = $(window);\n $ctrl = $el.controller();\n valueType = $attrs.type;\n objName = $attrs.objname;\n initializeNewValue = function() {\n return $scope.newValue = {\n \"tag\": \"\",\n \"color\": \"\"\n };\n };\n initializeTagsFilter = function() {\n return $scope.tagsFilter = {\n \"name\": \"\"\n };\n };\n initializeMixingTags = function() {\n return $scope.mixingTags = {\n \"toTag\": null,\n \"fromTags\": []\n };\n };\n initializeTextTranslations = function() {\n return $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_TAGS.ACTION_ADD\");\n };\n initializeNewValue();\n initializeTagsFilter();\n initializeMixingTags();\n initializeTextTranslations();\n $rootscope.$on(\"$translateChangeEnd\", function() {\n return $scope.$evalAsync(initializeTextTranslations);\n });\n goToBottomList = (function(_this) {\n return function(focus) {\n var table;\n if (focus == null) {\n focus = false;\n }\n table = $el.find(\".table-main\");\n $(document.body).scrollTop(table.offset().top + table.height());\n if (focus) {\n return $el.find(\".new-value input:visible\").first().focus();\n }\n };\n })(this);\n saveValue = (function(_this) {\n return function(target) {\n var form, formEl, originalTag, promise, tag;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n tag = formEl.scope().tag;\n originalTag = tag.clone();\n originalTag.revert();\n $scope.loadingEdit = true;\n promise = $ctrl.editTag(originalTag.name, tag.name, tag.color);\n promise.then(function() {\n return $ctrl.loadTags().then(function() {\n var row;\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n $scope.loadingEdit = false;\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n });\n return promise.then(null, function(response) {\n $scope.loadingEdit = false;\n return form.setErrors(response.data);\n });\n };\n })(this);\n saveNewValue = (function(_this) {\n return function(target) {\n var form, formEl, promise;\n formEl = target.parents(\"form\");\n formEl = target;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.loadingCreate = true;\n promise = $ctrl.createTag($scope.newValue.tag, $scope.newValue.color);\n promise.then(function(data) {\n return $ctrl.loadTags().then(function() {\n $scope.loadingCreate = false;\n target.addClass(\"hidden\");\n return initializeNewValue();\n });\n });\n return promise.then(null, function(response) {\n $scope.loadingCreate = false;\n return form.setErrors(response.data);\n });\n };\n })(this);\n cancel = function(target) {\n var formEl, row, tag;\n row = target.parents(\".row.table-main\");\n formEl = target.parents(\"form\");\n tag = formEl.scope().tag;\n return $scope.$apply(function() {\n row.addClass(\"hidden\");\n tag.revert();\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n };\n $scope.$watch(\"tagsFilter.name\", function(tagsFilter) {\n return $ctrl.filterAndSortTags();\n });\n $window.on(\"keyup\", function(event) {\n if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return initializeMixingTags();\n });\n }\n });\n $el.on(\"click\", \".show-add-new\", function(event) {\n event.preventDefault();\n return $el.find(\".new-value\").removeClass('hidden');\n });\n $el.on(\"click\", \".add-new\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n }));\n $el.on(\"click\", \".delete-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n });\n $el.on(\"click\", \".mix-tags\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n return $ctrl.startMixingTags(target.parents('form').scope().tag);\n });\n });\n $el.on(\"click\", \".mixing-row\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n return $ctrl.toggleMixingFromTags(target.parents('form').scope().tag);\n });\n });\n $el.on(\"click\", \".mixing-confirm\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $scope.$apply(function() {\n return $ctrl.confirmMixingTags();\n });\n });\n $el.on(\"click\", \".mixing-cancel\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $scope.$apply(function() {\n return $ctrl.cancelMixingTags();\n });\n });\n $el.on(\"click\", \".edit-value\", function(event) {\n var editionRow, row, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n editionRow = row.siblings(\".edition\");\n editionRow.removeClass('hidden');\n return editionRow.find('input:visible').first().focus().select();\n });\n $el.on(\"keyup\", \".new-value input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n } else if (event.keyCode === 27) {\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n }\n });\n $el.on(\"keyup\", \".status-name input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === 13) {\n return saveValue(target);\n } else if (event.keyCode === 27) {\n return cancel(target);\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return saveValue(target);\n });\n $el.on(\"click\", \".cancel\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return cancel(target);\n });\n $el.on(\"click\", \".delete-tag\", function(event) {\n var formEl, tag, target, title;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.parents(\"form\");\n tag = formEl.scope().tag;\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_TAG\");\n return $confirm.askOnDelete(title, tag.name).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadTags()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $ctrl.deleteTag(tag.name).then(onSucces, onError);\n });\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return $window.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectTags\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", ProjectTagsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/memberships.coffee\n */\n\n(function() {\n var EditRoleDirective, NewRoleDirective, RolePermissionsDirective, RolesController, RolesDirective, bindMethods, bindOnce, debounce, mixOf, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaAdmin\");\n\n RolesController = (function(superClass) {\n extend(RolesController, superClass);\n\n RolesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgModel\", \"tgAppMetaService\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function RolesController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, model, appMetaService, translate, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.model = model;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n this._disableComputable = bind(this._disableComputable, this);\n this._enableComputable = bind(this._enableComputable, this);\n bindMethods(this);\n this.scope.sectionName = \"ADMIN.MENU.PERMISSIONS\";\n this.scope.project = {};\n this.scope.anyComputableRole = true;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.ROLES.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n RolesController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n project = this.model.make_model(\"projects\", project);\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.anyComputableRole = _.some(_.map(project.roles, function(point) {\n return point.computable;\n }));\n return project;\n };\n\n RolesController.prototype.loadRoles = function() {\n return this.rs.roles.list(this.scope.projectId).then((function(_this) {\n return function(roles) {\n var public_permission;\n roles = roles.map(function(role) {\n role.external_user = false;\n return role;\n });\n public_permission = {\n \"name\": _this.translate.instant(\"ADMIN.ROLES.EXTERNAL_USER\"),\n \"permissions\": _this.scope.project.public_permissions,\n \"external_user\": true\n };\n roles.push(public_permission);\n _this.scope.roles = roles;\n _this.scope.role = _this.scope.roles[0];\n return roles;\n };\n })(this));\n };\n\n RolesController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadRoles();\n };\n\n RolesController.prototype.forceLoadProject = function() {\n return this.projectService.fetchProject((function(_this) {\n return function() {\n return _this.loadProject();\n };\n })(this));\n };\n\n RolesController.prototype.setRole = function(role) {\n this.scope.role = role;\n return this.scope.$broadcast(\"role:changed\", this.scope.role);\n };\n\n RolesController.prototype[\"delete\"] = function() {\n var choices, i, len, ref, replacement, role, subtitle, title, warning;\n choices = {};\n ref = this.scope.roles;\n for (i = 0, len = ref.length; i < len; i++) {\n role = ref[i];\n if (role.id !== this.scope.role.id) {\n choices[role.id] = role.name;\n }\n }\n if (_.keys(choices).length === 0) {\n return this.confirm.error(this.translate.instant(\"ADMIN.ROLES.ERROR_DELETE_ALL\"));\n }\n title = this.translate.instant(\"ADMIN.ROLES.TITLE_DELETE_ROLE\");\n subtitle = this.scope.role.name;\n replacement = this.translate.instant(\"ADMIN.ROLES.REPLACEMENT_ROLE\");\n warning = this.translate.instant(\"ADMIN.ROLES.WARNING_DELETE_ROLE\");\n return this.confirm.askChoice(title, subtitle, choices, replacement, warning).then((function(_this) {\n return function(response) {\n var onError, onSuccess;\n onSuccess = function() {\n _this.forceLoadProject();\n return _this.loadRoles()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return _this.confirm.notify('error');\n };\n return _this.repo.remove(_this.scope.role, {\n moveTo: response.selected\n }).then(onSuccess, onError);\n };\n })(this));\n };\n\n RolesController.prototype._enableComputable = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.confirm.notify(\"success\");\n return _this.forceLoadProject();\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.scope.role.revert();\n };\n })(this);\n return this.repo.save(this.scope.role).then(onSuccess, onError);\n };\n\n RolesController.prototype._disableComputable = function() {\n var askOnError, askOnSuccess, subtitle, title;\n askOnSuccess = (function(_this) {\n return function(response) {\n var onError, onSuccess;\n onSuccess = function() {\n response.finish();\n _this.confirm.notify(\"success\");\n return _this.forceLoadProject();\n };\n onError = function() {\n response.finish();\n _this.confirm.notify(\"error\");\n return _this.scope.role.revert();\n };\n return _this.repo.save(_this.scope.role).then(onSuccess, onError);\n };\n })(this);\n askOnError = (function(_this) {\n return function(response) {\n return _this.scope.role.revert();\n };\n })(this);\n title = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_TITLE\");\n subtitle = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_SUBTITLE\", {\n roleName: this.scope.role.name\n });\n return this.confirm.ask(title, subtitle, \"\").then(askOnSuccess, askOnError);\n };\n\n RolesController.prototype.toggleComputable = debounce(2000, function() {\n if (!this.scope.role.computable) {\n return this._disableComputable();\n } else {\n return this._enableComputable();\n }\n });\n\n return RolesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"RolesController\", RolesController);\n\n EditRoleDirective = function($repo, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit, toggleView;\n toggleView = function() {\n $el.find('.total').toggle();\n return $el.find('.edit-role').toggle();\n };\n submit = function() {\n var promise;\n $scope.role.name = $el.find(\"input\").val();\n promise = $repo.save($scope.role);\n promise.then(function() {\n return $confirm.notify(\"success\");\n });\n promise.then(null, function(data) {\n return $confirm.notify(\"error\");\n });\n return toggleView();\n };\n $el.on(\"click\", \".edit-value\", function() {\n toggleView();\n $el.find(\"input\").focus();\n return $el.find(\"input\").val($scope.role.name);\n });\n $el.on(\"click\", \"a.save\", submit);\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return submit();\n } else if (event.keyCode === 27) {\n return toggleView();\n }\n });\n $scope.$on(\"role:changed\", function() {\n if ($el.find('.edit-role').is(\":visible\")) {\n return toggleView();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgEditRole\", [\"$tgRepo\", \"$tgConfirm\", EditRoleDirective]);\n\n RolesDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRoles\", RolesDirective);\n\n NewRoleDirective = function($tgrepo, $confirm) {\n var DEFAULT_PERMISSIONS, link;\n DEFAULT_PERMISSIONS = [\"view_project\", \"view_milestones\", \"view_us\", \"view_tasks\", \"view_issues\"];\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $el.on(\"click\", \"a.add-button\", function(event) {\n event.preventDefault();\n $el.find(\".new\").removeClass(\"hidden\");\n $el.find(\".new\").focus();\n return $el.find(\".add-button\").hide();\n });\n return $el.on(\"keyup\", \".new\", function(event) {\n var newRole, onError, onSuccess, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newRole = {\n project: $scope.projectId,\n name: target.val(),\n permissions: DEFAULT_PERMISSIONS,\n order: _.maxBy($scope.roles, function(r) {\n return r.order;\n }).order + 1,\n computable: false\n };\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new\").val('');\n onSuccess = function(role) {\n var insertPosition;\n insertPosition = $scope.roles.length - 1;\n $scope.roles.splice(insertPosition, 0, role);\n $ctrl.setRole(role);\n $el.find(\".add-button\").show();\n return $ctrl.forceLoadProject();\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $tgrepo.create(\"roles\", newRole).then(onSuccess, onError);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new\").val('');\n return $el.find(\".add-button\").show();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNewRole\", [\"$tgRepo\", \"$tgConfirm\", NewRoleDirective]);\n\n RolePermissionsDirective = function($rootscope, $repo, $confirm, $compile) {\n var baseTemplate, categoryTemplate, link, resumeTemplate;\n resumeTemplate = _.template(\"
    \\\">
    \\n
    \\n
    <%- category.activePermissions %>/<%- category.permissions.length %>
    \\n <% _.each(category.permissions, function(permission) { %>\\n
    active<% } %>\\\"\\n title=\\\"{{ '<%- permission.name %>' | translate }}\\\">
    \\n <% }) %>\\n
    \\n\");\n categoryTemplate = _.template(\"
    \\\">\\n
    \\n
    \\n
    \\n
    \\n <% _.each(category.permissions, function(permission) { %>\\n
    \\\">\\n \\\">\\n
    \\n disabled=\\\"disabled\\\" <% } %>\\n <% if(permission.active) { %> checked=\\\"checked\\\" <% } %>/>\\n
    \\n \\n \\n
    \\n
    \\n <% }) %>\\n
    \\n
    \\n
    \");\n baseTemplate = _.template(\"
    \");\n link = function($scope, $el, $attrs) {\n var $ctrl, generateCategoriesFromRole, renderCategory, renderPermissions, renderResume;\n $ctrl = $el.controller();\n generateCategoriesFromRole = function(role) {\n var categories, epicPermissions, isPermissionEditable, issuePermissions, milestonePermissions, setActivePermissions, setActivePermissionsPerCategory, taskPermissions, userStoryPermissions, wikiPermissions;\n setActivePermissions = function(permissions) {\n return _.map(permissions, function(x) {\n var ref;\n return _.extend({}, x, {\n active: (ref = x[\"key\"], indexOf.call(role.permissions, ref) >= 0)\n });\n });\n };\n isPermissionEditable = function(permission, role, project) {\n if (role.external_user && !project.is_private && permission.key.indexOf(\"view_\") === 0) {\n return false;\n } else {\n return true;\n }\n };\n setActivePermissionsPerCategory = function(category) {\n return _.map(category, function(cat) {\n cat.permissions = cat.permissions.map(function(permission) {\n permission.editable = isPermissionEditable(permission, role, $scope.project);\n return permission;\n });\n return _.extend({}, cat, {\n activePermissions: _.filter(cat[\"permissions\"], \"active\").length\n });\n });\n };\n categories = [];\n epicPermissions = [\n {\n key: \"view_epics\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.VIEW_EPICS\"\n }, {\n key: \"add_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.ADD_EPICS\"\n }, {\n key: \"modify_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.MODIFY_EPICS\"\n }, {\n key: \"comment_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.COMMENT_EPICS\"\n }, {\n key: \"delete_epic\",\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.DELETE_EPICS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.EPICS.NAME\",\n permissions: setActivePermissions(epicPermissions)\n });\n milestonePermissions = [\n {\n key: \"view_milestones\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS\"\n }, {\n key: \"add_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS\"\n }, {\n key: \"modify_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS\"\n }, {\n key: \"delete_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME\",\n permissions: setActivePermissions(milestonePermissions)\n });\n userStoryPermissions = [\n {\n key: \"view_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES\"\n }, {\n key: \"add_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES\"\n }, {\n key: \"modify_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES\"\n }, {\n key: \"comment_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.COMMENT_USER_STORIES\"\n }, {\n key: \"delete_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME\",\n permissions: setActivePermissions(userStoryPermissions)\n });\n taskPermissions = [\n {\n key: \"view_tasks\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS\"\n }, {\n key: \"add_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS\"\n }, {\n key: \"modify_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS\"\n }, {\n key: \"comment_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.COMMENT_TASKS\"\n }, {\n key: \"delete_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME\",\n permissions: setActivePermissions(taskPermissions)\n });\n issuePermissions = [\n {\n key: \"view_issues\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES\"\n }, {\n key: \"add_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES\"\n }, {\n key: \"modify_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES\"\n }, {\n key: \"comment_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.COMMENT_ISSUES\"\n }, {\n key: \"delete_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME\",\n permissions: setActivePermissions(issuePermissions)\n });\n wikiPermissions = [\n {\n key: \"view_wiki_pages\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES\"\n }, {\n key: \"add_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES\"\n }, {\n key: \"modify_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES\"\n }, {\n key: \"delete_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES\"\n }, {\n key: \"view_wiki_links\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS\"\n }, {\n key: \"add_wiki_link\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS\"\n }, {\n key: \"delete_wiki_link\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME\",\n permissions: setActivePermissions(wikiPermissions)\n });\n return setActivePermissionsPerCategory(categories);\n };\n renderResume = function(element, category) {\n return element.find(\".resume\").html($compile(resumeTemplate({\n category: category\n }))($scope));\n };\n renderCategory = function(category, index) {\n var html;\n html = categoryTemplate({\n category: category,\n index: index\n });\n html = angular.element(html);\n renderResume(html, category);\n return $compile(html)($scope);\n };\n renderPermissions = function() {\n var html;\n $el.off();\n html = baseTemplate();\n _.each(generateCategoriesFromRole($scope.role), function(category, index) {\n return html = angular.element(html).append(renderCategory(category, index));\n });\n $el.html(html);\n $el.on(\"click\", \".resume\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.toggleClass(\"open-drawer\");\n return target.next().toggleClass(\"open\");\n });\n return $el.on(\"change\", \".category-item input\", function(event) {\n var getActivePermissions, onError, onSuccess, target;\n getActivePermissions = function() {\n var activePermissions;\n activePermissions = _.filter($el.find(\".category-item input\"), function(t) {\n return angular.element(t).is(\":checked\");\n });\n activePermissions = _.sortBy(_.map(activePermissions, function(t) {\n var permission;\n return permission = angular.element(t).parents(\".category-item\").data(\"id\");\n }));\n if (activePermissions.length) {\n activePermissions.push(\"view_project\");\n }\n return activePermissions;\n };\n target = angular.element(event.currentTarget);\n $scope.role.permissions = getActivePermissions();\n onSuccess = function() {\n var categories, categoryId;\n categories = generateCategoriesFromRole($scope.role);\n categoryId = target.parents(\".category-config\").data(\"id\");\n renderResume(target.parents(\".category-config\"), categories[categoryId]);\n $rootscope.$broadcast(\"projects:reload\");\n $confirm.notify(\"success\");\n return $ctrl.forceLoadProject();\n };\n onError = function() {\n $confirm.notify(\"error\");\n target.prop(\"checked\", !target.prop(\"checked\"));\n return $scope.role.permissions = getActivePermissions();\n };\n if ($scope.role.external_user) {\n $scope.project.public_permissions = $scope.role.permissions;\n $scope.project.anon_permissions = $scope.role.permissions.filter(function(permission) {\n return permission.indexOf(\"view_\") === 0;\n });\n return $repo.save($scope.project).then(onSuccess, onError);\n } else {\n return $repo.save($scope.role).then(onSuccess, onError);\n }\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $scope.$on(\"role:changed\", function() {\n return renderPermissions();\n });\n return bindOnce($scope, $attrs.ngModel, renderPermissions);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRolePermissions\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\", RolePermissionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/third-parties.coffee\n */\n\n(function() {\n var BitbucketController, BitbucketWebhooksDirective, GithubController, GithubWebhooksDirective, GitlabController, GitlabWebhooksDirective, GogsController, GogsWebhooksDirective, NewWebhookDirective, SelectInputText, ValidOriginIpsDirective, WebhookDirective, WebhooksController, bindMethods, debounce, mixOf, module, taiga, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindMethods = this.taiga.bindMethods;\n\n debounce = this.taiga.debounce;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaAdmin\");\n\n WebhooksController = (function(superClass) {\n extend(WebhooksController, superClass);\n\n WebhooksController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\", \"tgErrorHandlingService\", \"tgProjectService\"];\n\n function WebhooksController(scope, repo, rs, params, location, navUrls, appMetaService, translate, errorHandlingService, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = \"ADMIN.WEBHOOKS.SECTION_NAME\";\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.WEBHOOKS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"webhooks:reload\", this.loadWebhooks);\n }\n\n WebhooksController.prototype.loadWebhooks = function() {\n return this.rs.webhooks.list(this.scope.projectId).then((function(_this) {\n return function(webhooks) {\n return _this.scope.webhooks = webhooks;\n };\n })(this));\n };\n\n WebhooksController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n if (!project.i_am_admin) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n WebhooksController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadWebhooks();\n };\n\n return WebhooksController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"WebhooksController\", WebhooksController);\n\n WebhookDirective = function($rs, $repo, $confirm, $loading, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var cancel, openHistory, save, showEditMode, showVisualizationMode, updateLogs, updateShowHideHistoryText, webhook;\n webhook = $scope.$eval($attrs.tgWebhook);\n updateLogs = function() {\n var prettyDate;\n prettyDate = $translate.instant(\"ADMIN.WEBHOOKS.DATE\");\n return $rs.webhooklogs.list(webhook.id).then((function(_this) {\n return function(webhooklogs) {\n var i, len, log, ref;\n for (i = 0, len = webhooklogs.length; i < len; i++) {\n log = webhooklogs[i];\n log.validStatus = (200 <= (ref = log.status) && ref < 300);\n log.prettySentHeaders = _.map(_.toPairs(log.request_headers), function(arg) {\n var header, value;\n header = arg[0], value = arg[1];\n return header + \": \" + value;\n }).join(\"\\n\");\n log.prettySentData = JSON.stringify(log.request_data);\n log.prettyDate = moment(log.created).format(prettyDate);\n }\n webhook.logs_counter = webhooklogs.length;\n webhook.logs = webhooklogs;\n return updateShowHideHistoryText();\n };\n })(this));\n };\n updateShowHideHistoryText = function() {\n var historyElement, text, textElement, title;\n textElement = $el.find(\".toggle-history\");\n historyElement = textElement.parents(\".single-webhook-wrapper\").find(\".webhooks-history\");\n if (historyElement.hasClass(\"open\")) {\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY\");\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY_TITLE\");\n } else {\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY\");\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY_TITLE\");\n }\n textElement.text(text);\n return textElement.prop(\"title\", title);\n };\n showVisualizationMode = function() {\n $el.find(\".edition-mode\").addClass(\"hidden\");\n return $el.find(\".visualization-mode\").removeClass(\"hidden\");\n };\n showEditMode = function() {\n $el.find(\".visualization-mode\").addClass(\"hidden\");\n return $el.find(\".edition-mode\").removeClass(\"hidden\");\n };\n openHistory = function() {\n return $el.find(\".webhooks-history\").addClass(\"open\");\n };\n cancel = function() {\n showVisualizationMode();\n return $scope.$apply(function() {\n return webhook.revert();\n });\n };\n save = debounce(2000, function(target) {\n var form, promise;\n form = target.parents(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n promise = $repo.save(webhook);\n promise.then((function(_this) {\n return function() {\n return showVisualizationMode();\n };\n })(this));\n return promise.then(null, function(data) {\n $confirm.notify(\"error\");\n return form.setErrors(data);\n });\n });\n $el.on(\"click\", \".test-webhook\", function() {\n openHistory();\n return $rs.webhooks.test(webhook.id).then((function(_this) {\n return function() {\n return updateLogs();\n };\n })(this));\n });\n $el.on(\"click\", \".edit-webhook\", function() {\n return showEditMode();\n });\n $el.on(\"click\", \".cancel-existing\", function() {\n return cancel();\n });\n $el.on(\"click\", \".edit-existing\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return save(target);\n });\n $el.on(\"keyup\", \".edition-mode input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n return save(target);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n return cancel(target);\n }\n });\n $el.on(\"click\", \".delete-webhook\", function() {\n var message, title;\n title = $translate.instant(\"ADMIN.WEBHOOKS.DELETE\");\n message = $translate.instant(\"ADMIN.WEBHOOKS.WEBHOOK_NAME\", {\n name: webhook.name\n });\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSucces;\n onSucces = function() {\n askResponse.finish();\n return $scope.$emit(\"webhooks:reload\");\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove(webhook).then(onSucces, onError);\n };\n })(this));\n });\n $el.on(\"click\", \".toggle-history\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if ((webhook.logs == null) || webhook.logs.length === 0) {\n return updateLogs().then(function() {\n return timeout(0, function() {\n $el.find(\".webhooks-history\").toggleClass(\"open\").slideToggle();\n return updateShowHideHistoryText();\n });\n });\n } else {\n $el.find(\".webhooks-history\").toggleClass(\"open\").slideToggle();\n return $scope.$apply(function() {\n return updateShowHideHistoryText();\n });\n }\n });\n $el.on(\"click\", \".history-single\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n target.toggleClass(\"history-single-open\");\n return target.siblings(\".history-single-response\").toggleClass(\"open\");\n });\n return $el.on(\"click\", \".resend-request\", function(event) {\n var log, target;\n target = angular.element(event.currentTarget);\n log = target.data(\"log\");\n return $rs.webhooklogs.resend(log).then((function(_this) {\n return function() {\n return updateLogs();\n };\n })(this));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", WebhookDirective]);\n\n NewWebhookDirective = function($rs, $repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var addWebhookDOMNode, formDOMNode, initializeNewValue, save, webhook;\n webhook = $scope.$eval($attrs.tgWebhook);\n formDOMNode = $el.find(\".new-webhook-form\");\n addWebhookDOMNode = $el.find(\".add-webhook\");\n initializeNewValue = function() {\n return $scope.newValue = {\n \"name\": \"\",\n \"url\": \"\",\n \"key\": \"\"\n };\n };\n initializeNewValue();\n $scope.$watch(\"webhooks\", function(webhooks) {\n if (webhooks != null) {\n if (webhooks.length === 0) {\n formDOMNode.removeClass(\"hidden\");\n addWebhookDOMNode.addClass(\"hidden\");\n return formDOMNode.find(\"input\")[0].focus();\n } else {\n formDOMNode.addClass(\"hidden\");\n return addWebhookDOMNode.removeClass(\"hidden\");\n }\n }\n });\n save = debounce(2000, function() {\n var form, promise;\n form = formDOMNode.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.newValue.project = $scope.project.id;\n promise = $repo.create(\"webhooks\", $scope.newValue);\n promise.then((function(_this) {\n return function() {\n $analytics.trackEvent(\"webhooks\", \"create\", \"Create new webhook\", 1);\n $scope.$emit(\"webhooks:reload\");\n return initializeNewValue();\n };\n })(this));\n return promise.then(null, function(data) {\n $confirm.notify(\"error\");\n return form.setErrors(data);\n });\n });\n formDOMNode.on(\"click\", \".add-new\", function(event) {\n event.preventDefault();\n return save();\n });\n formDOMNode.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return save();\n }\n });\n formDOMNode.on(\"click\", \".cancel-new\", function(event) {\n return $scope.$apply(function() {\n initializeNewValue();\n if ($scope.webhooks.length >= 1) {\n return formDOMNode.addClass(\"hidden\");\n }\n });\n });\n return addWebhookDOMNode.on(\"click\", function(event) {\n formDOMNode.removeClass(\"hidden\");\n return formDOMNode.find(\"input\")[0].focus();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNewWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", NewWebhookDirective]);\n\n GithubController = (function(superClass) {\n extend(GithubController, superClass);\n\n GithubController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GithubController(scope, repo, rs, params, appMetaService, translate, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GITHUB.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GITHUB.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n GithubController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"github\").then((function(_this) {\n return function(github) {\n return _this.scope.github = github;\n };\n })(this));\n };\n\n GithubController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GithubController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return this.loadModules();\n };\n\n return GithubController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"GithubController\", GithubController);\n\n GitlabController = (function(superClass) {\n extend(GitlabController, superClass);\n\n GitlabController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GitlabController(scope, repo, rs, params, appMetaService, translate, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GITLAB.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GITLAB.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:modules:reload\", (function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n }\n\n GitlabController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"gitlab\").then((function(_this) {\n return function(gitlab) {\n return _this.scope.gitlab = gitlab;\n };\n })(this));\n };\n\n GitlabController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GitlabController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\n };\n\n return GitlabController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"GitlabController\", GitlabController);\n\n BitbucketController = (function(superClass) {\n extend(BitbucketController, superClass);\n\n BitbucketController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function BitbucketController(scope, repo, rs, params, appMetaService, translate, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.BITBUCKET.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.BITBUCKET.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:modules:reload\", (function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n }\n\n BitbucketController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"bitbucket\").then((function(_this) {\n return function(bitbucket) {\n return _this.scope.bitbucket = bitbucket;\n };\n })(this));\n };\n\n BitbucketController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n BitbucketController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\n };\n\n return BitbucketController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"BitbucketController\", BitbucketController);\n\n SelectInputText = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", \".select-input-content\", function() {\n $el.find(\"input\").select();\n return $el.find(\".help-copy\").addClass(\"visible\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSelectInputText\", SelectInputText);\n\n GithubWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.github, \"github\");\n promise.then(function() {\n $analytics.trackEvent(\"github-webhook\", \"created-or-changed\", \"Create or changed github webhook\", 1);\n currentLoading.finish();\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgGithubWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", GithubWebhooksDirective]);\n\n GitlabWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.gitlab, \"gitlab\");\n promise.then(function() {\n $analytics.trackEvent(\"gitlab-webhook\", \"created-or-changed\", \"Create or changed gitlab webhook\", 1);\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgGitlabWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", GitlabWebhooksDirective]);\n\n BitbucketWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.bitbucket, \"bitbucket\");\n promise.then(function() {\n $analytics.trackEvent(\"bitbucket-webhook\", \"created-or-changed\", \"Create or changed bitbucket webhook\", 1);\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBitbucketWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", BitbucketWebhooksDirective]);\n\n ValidOriginIpsDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $ngModel) {\n return $ngModel.$parsers.push(function(value) {\n value = $.trim(value);\n if (value === \"\") {\n return [];\n }\n return value.split(\",\");\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgValidOriginIps\", ValidOriginIpsDirective);\n\n GogsController = (function(superClass) {\n extend(GogsController, superClass);\n\n GogsController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\", \"tgProjectService\"];\n\n function GogsController(scope, repo, rs, params, appMetaService, translate, projectService) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GOGS.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GOGS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n GogsController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"gogs\").then((function(_this) {\n return function(gogs) {\n return _this.scope.gogs = gogs;\n };\n })(this));\n };\n\n GogsController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n return project;\n };\n\n GogsController.prototype.loadInitialData = function() {\n this.loadProject();\n return this.loadModules();\n };\n\n return GogsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n GogsWebhooksDirective = function($repo, $confirm, $loading, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.gogs, \"gogs\");\n promise.then(function() {\n $analytics.trackEvent(\"gogs-webhook\", \"create-or-change\", \"Create or change gogs webhook\", 1);\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $el.on(\"click\", \".submit-button\", submit);\n };\n return {\n link: link\n };\n };\n\n module.controller(\"GogsController\", GogsController);\n\n module.directive(\"tgGogsWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", GogsWebhooksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/attachments.coffee\n */\n\n(function() {\n var DeleteProjectDirective, bindOnce, debounce, module, taiga, timeout;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n timeout = this.taiga.timeout;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaProject\");\n\n DeleteProjectDirective = function($repo, $rootscope, $auth, $location, $navUrls, $confirm, lightboxService, tgLoader, currentUserService, $analytics) {\n var link;\n link = function($scope, $el, $attrs) {\n var projectToDelete, submit;\n projectToDelete = null;\n $scope.$on(\"deletelightbox:new\", function(ctx, project) {\n lightboxService.open($el);\n return projectToDelete = project;\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n submit = function() {\n var promise;\n tgLoader.start();\n lightboxService.close($el);\n promise = $repo.remove(projectToDelete);\n promise.then(function(data) {\n $analytics.trackEvent(\"projects\", \"delete\", \"Delete project\", 1);\n tgLoader.pageLoaded();\n $rootscope.$broadcast(\"projects:reload\");\n $location.path($navUrls.resolve(\"home\"));\n $confirm.notify(\"success\");\n return currentUserService.loadProjects();\n });\n return promise.then(null, function() {\n $confirm.notify(\"error\");\n return lightboxService.close($el);\n });\n };\n $el.on(\"click\", \".button-red\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return submit();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbDeleteProject\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfirm\", \"lightboxService\", \"tgLoader\", \"tgCurrentUserService\", \"$tgAnalytics\", DeleteProjectDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/bind.coffee\n */\n\n(function() {\n var BindHtmlDirective, BindOnceAltDirective, BindOnceBindDirective, BindOnceHrefDirective, BindOnceHtmlDirective, BindOnceRefDirective, BindOnceSrcDirective, BindOnceTitleDirective, BindTitleDirective, bindOnce, module;\n\n bindOnce = this.taiga.bindOnce;\n\n BindOnceBindDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoBind, function(val) {\n return $el.text(val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceHtmlDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoHtml, function(val) {\n return $el.html(val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceRefDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoRef, function(val) {\n return $el.html(\"#\" + val + \" \");\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceSrcDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoSrc, function(val) {\n return $el.attr(\"src\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceHrefDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoHref, function(val) {\n return $el.attr(\"href\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceAltDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoAlt, function(val) {\n return $el.attr(\"alt\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceTitleDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoTitle, function(val) {\n return $el.attr(\"title\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindTitleDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$watch($attrs.tgTitleHtml, function(val) {\n if (val != null) {\n return $el.attr(\"title\", val);\n }\n });\n };\n return {\n link: link\n };\n };\n\n BindHtmlDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$watch($attrs.tgBindHtml, function(val) {\n if (val != null) {\n return $el.html(val);\n }\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaBase\");\n\n module.directive(\"tgBoBind\", BindOnceBindDirective);\n\n module.directive(\"tgBoHtml\", BindOnceHtmlDirective);\n\n module.directive(\"tgBoRef\", BindOnceRefDirective);\n\n module.directive(\"tgBoSrc\", BindOnceSrcDirective);\n\n module.directive(\"tgBoHref\", BindOnceHrefDirective);\n\n module.directive(\"tgBoAlt\", BindOnceAltDirective);\n\n module.directive(\"tgBoTitle\", BindOnceTitleDirective);\n\n module.directive(\"tgBindTitle\", BindTitleDirective);\n\n module.directive(\"tgBindHtml\", BindHtmlDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/conf.coffee\n */\n\n(function() {\n var ConfigurationService, module;\n\n ConfigurationService = (function() {\n function ConfigurationService() {\n this.config = window.taigaConfig;\n }\n\n ConfigurationService.prototype.get = function(key, defaultValue) {\n if (defaultValue == null) {\n defaultValue = null;\n }\n if (_.has(this.config, key)) {\n return this.config[key];\n }\n return defaultValue;\n };\n\n return ConfigurationService;\n\n })();\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgConfig\", ConfigurationService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/contrib.coffee\n */\n\n(function() {\n var ContribController, ContribUserSettingsController, module,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n module = angular.module(\"taigaBase\");\n\n ContribController = (function(superClass) {\n extend(ContribController, superClass);\n\n ContribController.$inject = [\"$rootScope\", \"$scope\", \"$routeParams\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"tgProjectService\"];\n\n function ContribController(rootScope, scope, params, repo, rs, confirm, projectService) {\n this.rootScope = rootScope;\n this.scope = scope;\n this.params = params;\n this.repo = repo;\n this.rs = rs;\n this.confirm = confirm;\n this.projectService = projectService;\n this.scope.currentPlugin = _.head(_.filter(this.rootScope.adminPlugins, {\n \"slug\": this.params.plugin\n }));\n this.scope.projectSlug = this.params.pslug;\n this.loadInitialData();\n }\n\n ContribController.prototype.loadProject = function() {\n var project;\n project = this.projectService.project.toJS();\n this.scope.projectId = project.id;\n this.scope.project = project;\n this.scope.$emit('project:loaded', project);\n this.scope.$broadcast('project:loaded', project);\n return project;\n };\n\n ContribController.prototype.loadInitialData = function() {\n return this.loadProject();\n };\n\n return ContribController;\n\n })(taiga.Controller);\n\n module.controller(\"ContribController\", ContribController);\n\n ContribUserSettingsController = (function(superClass) {\n extend(ContribUserSettingsController, superClass);\n\n ContribUserSettingsController.$inject = [\"$rootScope\", \"$scope\", \"$routeParams\"];\n\n function ContribUserSettingsController(rootScope, scope, params) {\n this.rootScope = rootScope;\n this.scope = scope;\n this.params = params;\n this.scope.currentPlugin = _.head(_.filter(this.rootScope.userSettingsPlugins, {\n \"slug\": this.params.plugin\n }));\n }\n\n return ContribUserSettingsController;\n\n })(taiga.Controller);\n\n module.controller(\"ContribUserSettingsController\", ContribUserSettingsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/filters.coffee\n */\n\n(function() {\n var FiltersStorageService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n FiltersStorageService = (function(superClass) {\n extend(FiltersStorageService, superClass);\n\n FiltersStorageService.$inject = [\"$tgStorage\", \"$routeParams\"];\n\n function FiltersStorageService(storage, params) {\n this.storage = storage;\n this.params = params;\n }\n\n FiltersStorageService.prototype.generateHash = function(components) {\n if (components == null) {\n components = [];\n }\n components = _.map(components, function(x) {\n return JSON.stringify(x);\n });\n return hex_sha1(components.join(\":\"));\n };\n\n return FiltersStorageService;\n\n })(taiga.Service);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/http.coffee\n */\n\n(function() {\n var HttpService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n HttpService = (function(superClass) {\n extend(HttpService, superClass);\n\n HttpService.$inject = [\"$http\", \"$q\", \"$tgStorage\", \"$rootScope\", \"$cacheFactory\", \"$translate\"];\n\n function HttpService(http, q, storage, rootScope, cacheFactory, translate) {\n this.http = http;\n this.q = q;\n this.storage = storage;\n this.rootScope = rootScope;\n this.cacheFactory = cacheFactory;\n this.translate = translate;\n HttpService.__super__.constructor.call(this);\n this.cache = this.cacheFactory(\"httpget\");\n }\n\n HttpService.prototype.headers = function() {\n var headers, lang, token;\n headers = {};\n token = this.storage.get('token');\n if (token) {\n headers[\"Authorization\"] = \"Bearer \" + token;\n }\n lang = this.translate.preferredLanguage();\n if (lang) {\n headers[\"Accept-Language\"] = lang;\n }\n return headers;\n };\n\n HttpService.prototype.request = function(options) {\n options.headers = _.assign({}, options.headers || {}, this.headers());\n return this.http(options);\n };\n\n HttpService.prototype.get = function(url, params, options) {\n options = _.assign({\n method: \"GET\",\n url: url\n }, options);\n if (params) {\n options.params = params;\n }\n options.cache = this.cache;\n return this.request(options)[\"finally\"]((function(_this) {\n return function(data) {\n return _this.cache.removeAll();\n };\n })(this));\n };\n\n HttpService.prototype.post = function(url, data, params, options) {\n options = _.assign({\n method: \"POST\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype.put = function(url, data, params, options) {\n options = _.assign({\n method: \"PUT\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype.patch = function(url, data, params, options) {\n options = _.assign({\n method: \"PATCH\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype[\"delete\"] = function(url, data, params, options) {\n options = _.assign({\n method: \"DELETE\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n return HttpService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgHttp\", HttpService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/location.coffee\n */\n\n(function() {\n var locationFactory, module;\n\n locationFactory = function($location, $route, $rootscope) {\n $location.noreload = function(scope) {\n var lastRoute, un;\n lastRoute = $route.current;\n un = scope.$on(\"$locationChangeSuccess\", function() {\n $route.current = lastRoute;\n return un();\n });\n return $location;\n };\n $location.isInCurrentRouteParams = function(name, value) {\n var params;\n params = $location.search() || {};\n return params[name] === value;\n };\n return $location;\n };\n\n module = angular.module(\"taigaBase\");\n\n module.factory(\"$tgLocation\", [\"$location\", \"$route\", \"$rootScope\", locationFactory]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/model.coffee\n */\n\n(function() {\n var Model, ModelService, module, provider, taiga,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n Model = (function() {\n function Model(name, data, dataTypes) {\n this._attrs = data;\n this._name = name;\n this._dataTypes = dataTypes;\n this.setAttrs(data);\n this.initialize();\n }\n\n Model.prototype.realClone = function() {\n var attrs, instance;\n attrs = _.cloneDeep(this._attrs);\n instance = new Model(this._name, attrs, this._dataTypes);\n instance._modifiedAttrs = _.cloneDeep(this._modifiedAttrs);\n instance._isModified = _.cloneDeep(this._isModified);\n return instance;\n };\n\n Model.prototype.clone = function() {\n var instance;\n instance = new Model(this._name, this._attrs, this._dataTypes);\n instance._modifiedAttrs = this._modifiedAttrs;\n instance._isModified = this._isModified;\n return instance;\n };\n\n Model.prototype.applyCasts = function() {\n var attrName, castMethod, castName, ref, results;\n ref = this._dataTypes;\n results = [];\n for (attrName in ref) {\n castName = ref[attrName];\n castMethod = service.casts[castName];\n if (!castMethod) {\n continue;\n }\n results.push(this._attrs[attrName] = castMethod(this._attrs[attrName]));\n }\n return results;\n };\n\n Model.prototype.getIdAttrName = function() {\n return \"id\";\n };\n\n Model.prototype.getName = function() {\n return this._name;\n };\n\n Model.prototype.getAttrs = function(patch) {\n if (patch == null) {\n patch = false;\n }\n if (this._attrs.version != null) {\n this._modifiedAttrs.version = this._attrs.version;\n }\n if (patch) {\n return _.extend({}, this._modifiedAttrs);\n }\n return _.extend({}, this._attrs, this._modifiedAttrs);\n };\n\n Model.prototype.setAttrs = function(attrs) {\n this._attrs = attrs;\n this._modifiedAttrs = {};\n this.applyCasts();\n return this._isModified = false;\n };\n\n Model.prototype.setAttr = function(name, value) {\n this._modifiedAttrs[name] = value;\n return this._isModified = true;\n };\n\n Model.prototype.initialize = function() {\n var getter, self, setter;\n self = this;\n getter = function(name) {\n return function() {\n if (typeof name === 'string' && name.substr(0, 2) === \"__\") {\n return self[name];\n }\n if (indexOf.call(_.keys(self._modifiedAttrs), name) < 0) {\n return self._attrs[name];\n }\n return self._modifiedAttrs[name];\n };\n };\n setter = function(name) {\n return function(value) {\n if (typeof name === 'string' && name.substr(0, 2) === \"__\") {\n self[name] = value;\n return;\n }\n if (self._attrs[name] !== value) {\n self._modifiedAttrs[name] = value;\n self._isModified = true;\n } else {\n delete self._modifiedAttrs[name];\n }\n };\n };\n return _.each(this._attrs, function(value, name) {\n var options;\n options = {\n get: getter(name),\n set: setter(name),\n enumerable: true,\n configurable: true\n };\n return Object.defineProperty(self, name, options);\n });\n };\n\n Model.prototype.serialize = function() {\n var data;\n data = {\n \"data\": _.clone(this._attrs),\n \"name\": this._name\n };\n return JSON.stringify(data);\n };\n\n Model.prototype.isModified = function() {\n return this._isModified;\n };\n\n Model.prototype.isAttributeModified = function(attribute) {\n return this._modifiedAttrs[attribute] != null;\n };\n\n Model.prototype.markSaved = function() {\n this._isModified = false;\n this._attrs = this.getAttrs();\n return this._modifiedAttrs = {};\n };\n\n Model.prototype.revert = function() {\n this._modifiedAttrs = {};\n return this._isModified = false;\n };\n\n Model.desSerialize = function(sdata) {\n var ddata, model;\n ddata = JSON.parse(sdata);\n model = new Model(ddata.url, ddata.data);\n return model;\n };\n\n return Model;\n\n })();\n\n taiga = this.taiga;\n\n ModelService = (function(superClass) {\n extend(ModelService, superClass);\n\n ModelService.$inject = [\"$q\", \"$tgUrls\", \"$tgStorage\", \"$tgHttp\"];\n\n function ModelService(q, urls, storage, http) {\n this.q = q;\n this.urls = urls;\n this.storage = storage;\n this.http = http;\n ModelService.__super__.constructor.call(this);\n }\n\n return ModelService;\n\n })(taiga.Service);\n\n provider = function($q, $http, $gmUrls, $gmStorage) {\n var service;\n service = {};\n service.make_model = function(name, data, cls, dataTypes) {\n if (cls == null) {\n cls = Model;\n }\n if (dataTypes == null) {\n dataTypes = {};\n }\n return new cls(name, data, dataTypes);\n };\n service.cls = Model;\n service.casts = {\n int: function(value) {\n return parseInt(value, 10);\n },\n float: function(value) {\n return parseFloat(value, 10);\n }\n };\n return service;\n };\n\n module = angular.module(\"taigaBase\");\n\n module.factory(\"$tgModel\", [\"$q\", \"$http\", \"$tgUrls\", \"$tgStorage\", provider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/navurl.coffee\n */\n\n(function() {\n var NavigationUrlsDirective, NavigationUrlsService, bindOnce, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBase\");\n\n NavigationUrlsService = (function(superClass) {\n extend(NavigationUrlsService, superClass);\n\n function NavigationUrlsService() {\n this.urls = {};\n }\n\n NavigationUrlsService.prototype.update = function(urls) {\n return this.urls = _.merge({}, this.urls, urls || {});\n };\n\n NavigationUrlsService.prototype.formatUrl = function(url, ctx) {\n var replacer;\n if (ctx == null) {\n ctx = {};\n }\n replacer = function(match) {\n match = trim(match, \":\");\n return ctx[match] || \"undefined\";\n };\n return url.replace(/(:\\w+)/g, replacer);\n };\n\n NavigationUrlsService.prototype.resolve = function(name, ctx) {\n var url;\n url = this.urls[name];\n if (!url) {\n return \"\";\n }\n if (ctx) {\n return this.formatUrl(url, ctx);\n }\n return url;\n };\n\n return NavigationUrlsService;\n\n })(taiga.Service);\n\n module.service(\"$tgNavUrls\", NavigationUrlsService);\n\n NavigationUrlsDirective = function($navurls, $auth, $q, $location, lightboxService) {\n var bindOnceP, link, parseNav;\n bindOnceP = function($scope, attr) {\n var defered;\n defered = $q.defer();\n bindOnce($scope, attr, function(v) {\n return defered.resolve(v);\n });\n return defered.promise;\n };\n parseNav = function(data, $scope) {\n var index, name, obj, params, promises, ref, result, values;\n ref = _.map(data.split(\":\"), trim), name = ref[0], params = ref[1];\n if (params) {\n result = params.split(/(\\w+)=/);\n result = _.filter(result, function(str) {\n return str.length;\n });\n result = _.map(result, function(str) {\n return trim(str.replace(/,$/g, ''));\n });\n params = [];\n index = 0;\n while (index < result.length) {\n obj = {};\n obj[result[index]] = result[index + 1];\n params.push(obj);\n index = index + 2;\n }\n } else {\n params = [];\n }\n values = _.map(params, function(param) {\n return _.values(param)[0];\n });\n promises = _.map(values, function(x) {\n return bindOnceP($scope, x);\n });\n return $q.all(promises).then(function() {\n var i, key, len, options, param, value;\n options = {};\n for (i = 0, len = params.length; i < len; i++) {\n param = params[i];\n key = Object.keys(param)[0];\n value = param[key];\n options[key] = $scope.$eval(value);\n }\n return [name, options];\n });\n };\n link = function($scope, $el, $attrs) {\n if ($el.is(\"a\")) {\n $el.attr(\"href\", \"#\");\n }\n $el.on(\"mouseenter\", function(event) {\n var target;\n target = $(event.currentTarget);\n if (!target.data(\"fullUrl\") || $attrs.tgNavGetParams !== target.data(\"params\")) {\n return parseNav($attrs.tgNav, $scope).then(function(result) {\n var fullUrl, getURLParams, getURLParamsStr, name, options, url, user;\n name = result[0], options = result[1];\n user = $auth.getUser();\n if (user) {\n options.user = user.username;\n }\n url = $navurls.resolve(name);\n fullUrl = $navurls.formatUrl(url, options);\n if ($attrs.tgNavGetParams) {\n getURLParams = JSON.parse($attrs.tgNavGetParams);\n getURLParamsStr = $.param(getURLParams);\n fullUrl = fullUrl + \"?\" + getURLParamsStr;\n target.data(\"params\", $attrs.tgNavGetParams);\n }\n target.data(\"fullUrl\", fullUrl);\n if (target.is(\"a\")) {\n target.attr(\"href\", fullUrl);\n }\n return $el.on(\"click\", function(event) {\n if (event.metaKey || event.ctrlKey) {\n return;\n }\n event.preventDefault();\n target = $(event.currentTarget);\n if (target.hasClass('noclick')) {\n return;\n }\n fullUrl = target.data(\"fullUrl\");\n switch (event.which) {\n case 1:\n $location.url(fullUrl);\n $scope.$apply();\n break;\n case 2:\n window.open(fullUrl);\n }\n return lightboxService.closeAll();\n });\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNav\", [\"$tgNavUrls\", \"$tgAuth\", \"$q\", \"$tgLocation\", \"lightboxService\", NavigationUrlsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/repository.coffee\n */\n\n(function() {\n var RepositoryService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n RepositoryService = (function(superClass) {\n extend(RepositoryService, superClass);\n\n RepositoryService.$inject = [\"$q\", \"$tgModel\", \"$tgStorage\", \"$tgHttp\", \"$tgUrls\"];\n\n function RepositoryService(q, model1, storage, http, urls) {\n this.q = q;\n this.model = model1;\n this.storage = storage;\n this.http = http;\n this.urls = urls;\n RepositoryService.__super__.constructor.call(this);\n }\n\n RepositoryService.prototype.resolveUrlForModel = function(model) {\n var idAttrName;\n idAttrName = model.getIdAttrName();\n return (this.urls.resolve(model.getName())) + \"/\" + model[idAttrName];\n };\n\n RepositoryService.prototype.resolveUrlForAttributeModel = function(model) {\n return this.urls.resolve(model.getName(), model.parent);\n };\n\n RepositoryService.prototype.create = function(name, data, dataTypes, extraParams) {\n var defered, promise, url;\n if (dataTypes == null) {\n dataTypes = {};\n }\n if (extraParams == null) {\n extraParams = {};\n }\n defered = this.q.defer();\n url = this.urls.resolve(name);\n promise = this.http.post(url, JSON.stringify(data), extraParams);\n promise.success((function(_this) {\n return function(_data, _status) {\n return defered.resolve(_this.model.make_model(name, _data, null, dataTypes));\n };\n })(this));\n promise.error((function(_this) {\n return function(data, status) {\n return defered.reject(data);\n };\n })(this));\n return defered.promise;\n };\n\n RepositoryService.prototype.remove = function(model, params) {\n var defered, promise, url;\n if (params == null) {\n params = {};\n }\n defered = this.q.defer();\n url = this.resolveUrlForModel(model);\n promise = this.http[\"delete\"](url, {}, params);\n promise.success(function(data, status) {\n return defered.resolve(model);\n });\n promise.error(function(data, status) {\n return defered.reject(model);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.saveAll = function(models, patch) {\n var promises;\n if (patch == null) {\n patch = true;\n }\n promises = _.map(models, (function(_this) {\n return function(x) {\n return _this.save(x, true);\n };\n })(this));\n return this.q.all(promises);\n };\n\n RepositoryService.prototype.save = function(model, patch, params, options, returnHeaders) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n if (params == null) {\n params = {};\n }\n if (returnHeaders == null) {\n returnHeaders = false;\n }\n defered = this.q.defer();\n if (!model.isModified() && patch) {\n defered.resolve(model);\n return defered.promise;\n }\n url = this.resolveUrlForModel(model);\n data = JSON.stringify(model.getAttrs(patch));\n if (patch) {\n promise = this.http.patch(url, data, params, options);\n } else {\n promise = this.http.put(url, data, params, options);\n }\n promise.success((function(_this) {\n return function(data, status, headers, response) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n if (returnHeaders) {\n return defered.resolve([model, headers()]);\n } else {\n return defered.resolve(model);\n }\n };\n })(this));\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.saveAttribute = function(model, attribute, patch) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n defered = this.q.defer();\n if (!model.isModified() && patch) {\n defered.resolve(model);\n return defered.promise;\n }\n url = this.resolveUrlForAttributeModel(model);\n data = {};\n data[attribute] = model.getAttrs();\n if (patch) {\n promise = this.http.patch(url, data);\n } else {\n promise = this.http.put(url, data);\n }\n promise.success((function(_this) {\n return function(data, status) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n return defered.resolve(model);\n };\n })(this));\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.refresh = function(model) {\n var defered, promise, url;\n defered = this.q.defer();\n url = this.resolveUrlForModel(model);\n promise = this.http.get(url);\n promise.success(function(data, status) {\n model._modifiedAttrs = {};\n model._attrs = data;\n model._isModified = false;\n model.applyCasts();\n return defered.resolve(model);\n });\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.queryMany = function(name, params, options, headers) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n if (headers == null) {\n headers = false;\n }\n url = this.urls.resolve(name);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var result;\n result = _.map(data.data, function(x) {\n return _this.model.make_model(name, x);\n });\n if (headers) {\n return [result, data.headers];\n }\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOneAttribute = function(name, id, attribute, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name, id);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var model;\n model = _this.model.make_model(name, data.data[attribute]);\n model.parent = id;\n return model;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOne = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n return _this.model.make_model(name, data.data);\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOneRaw = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = _.merge({\n headers: {}\n }, options);\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryPaginated = function(name, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n httpOptions = _.merge({\n headers: {}\n }, options);\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var headers, result;\n headers = data.headers();\n result = {};\n result.models = _.map(data.data, function(x) {\n return _this.model.make_model(name, x);\n });\n result.count = parseInt(headers[\"x-pagination-count\"], 10);\n result.current = parseInt(headers[\"x-pagination-current\"] || 1, 10);\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10);\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOnePaginatedRaw = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = _.merge({\n headers: {}\n }, options);\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var headers, result;\n headers = data.headers();\n result = {};\n result.data = data.data;\n result.count = parseInt(headers[\"x-pagination-count\"], 10);\n result.current = parseInt(headers[\"x-pagination-current\"] || 1, 10);\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10);\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.resolve = function(options) {\n var cache, params;\n params = {};\n if (options.pslug != null) {\n params.project = options.pslug;\n }\n if (options.usref != null) {\n params.us = options.usref;\n }\n if (options.taskref != null) {\n params.task = options.taskref;\n }\n if (options.issueref != null) {\n params.issue = options.issueref;\n }\n if (options.sslug != null) {\n params.milestone = options.sslug;\n }\n if (options.wikipage != null) {\n params.wikipage = options.wikipage;\n }\n if (options.ref != null) {\n params.ref = options.ref;\n }\n cache = !(options.wikipage || options.sslug);\n return this.queryOneRaw(\"resolver\", null, params, {\n cache: cache\n });\n };\n\n return RepositoryService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgRepo\", RepositoryService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/storage.coffee\n */\n\n(function() {\n var StorageService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n StorageService = (function(superClass) {\n extend(StorageService, superClass);\n\n StorageService.$inject = [\"$rootScope\"];\n\n function StorageService($rootScope) {\n StorageService.__super__.constructor.call(this);\n }\n\n StorageService.prototype.get = function(key, _default) {\n var serializedValue;\n serializedValue = localStorage.getItem(key);\n if (serializedValue === null) {\n return _default || null;\n }\n return JSON.parse(serializedValue);\n };\n\n StorageService.prototype.set = function(key, val) {\n if (_.isObject(key)) {\n return _.each(key, (function(_this) {\n return function(val, key) {\n return _this.set(key, val);\n };\n })(this));\n } else {\n return localStorage.setItem(key, JSON.stringify(val));\n }\n };\n\n StorageService.prototype.contains = function(key) {\n var value;\n value = this.get(key);\n return value !== null;\n };\n\n StorageService.prototype.remove = function(key) {\n return localStorage.removeItem(key);\n };\n\n StorageService.prototype.clear = function() {\n return localStorage.clear();\n };\n\n return StorageService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgStorage\", StorageService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/http.coffee\n */\n\n(function() {\n var UrlsService, format, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n format = function(fmt, obj) {\n obj = _.clone(obj);\n return fmt.replace(/%s/g, function(match) {\n return String(obj.shift());\n });\n };\n\n taiga = this.taiga;\n\n UrlsService = (function(superClass) {\n extend(UrlsService, superClass);\n\n UrlsService.$inject = [\"$tgConfig\"];\n\n function UrlsService(config) {\n this.config = config;\n this.urls = {};\n this.mainUrl = this.config.get(\"api\");\n }\n\n UrlsService.prototype.update = function(urls) {\n return this.urls = _.merge(this.urls, urls);\n };\n\n UrlsService.prototype.resolve = function() {\n var args, name, url;\n args = _.toArray(arguments);\n if (args.length === 0) {\n throw Error(\"wrong arguments to setUrls\");\n }\n name = args.slice(0, 1)[0];\n url = format(this.urls[name], args.slice(1));\n return format(\"%s/%s\", [_.trimEnd(this.mainUrl, \"/\"), _.trimStart(url, \"/\")]);\n };\n\n UrlsService.prototype.resolveAbsolute = function() {\n var url;\n url = this.resolve.apply(this, arguments);\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n if (/^\\//.test(url)) {\n return window.location.protocol + \"//\" + window.location.host + url;\n }\n return window.location.protocol + \"//\" + window.location.host + \"/\" + url;\n };\n\n return UrlsService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service('$tgUrls', UrlsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/custom-field-values.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo) {\n var _get, service;\n _get = function(objectId, resource) {\n return $repo.queryOne(resource, objectId);\n };\n service = {\n epic: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/epic\");\n }\n },\n userstory: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/userstory\");\n }\n },\n task: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/task\");\n }\n },\n issue: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/issue\");\n }\n }\n };\n return function(instance) {\n return instance.customAttributesValues = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgCustomAttributesValuesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($repo) {\n var _list, service;\n _list = function(projectId, resource) {\n return $repo.queryMany(resource, {\n project: projectId\n });\n };\n service = {\n epic: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/epic\");\n }\n },\n userstory: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/userstory\");\n }\n },\n task: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/task\");\n }\n },\n issue: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/issue\");\n }\n }\n };\n return function(instance) {\n return instance.customAttributes = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgCustomAttributesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/epics.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"epics-queryparams\";\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"epics\", \"by_ref\", params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.upvote = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-upvote\", epicId);\n return $http.post(url);\n };\n service.downvote = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-downvote\", epicId);\n return $http.post(url);\n };\n service.watch = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-watch\", epicId);\n return $http.post(url);\n };\n service.unwatch = function(epicId) {\n var url;\n url = $urls.resolve(\"epic-unwatch\", epicId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.epics = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgEpicsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/history.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(type, objectId) {\n return $repo.queryOneRaw(\"history/\" + type, objectId);\n };\n service.editComment = function(type, objectId, activityId, comment) {\n var commentData, params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/edit_comment\";\n params = {\n id: activityId\n };\n commentData = {\n comment: comment\n };\n return $http.post(url, commentData, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.getCommentHistory = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/comment_versions\";\n params = {\n id: activityId\n };\n return $http.get(url, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.deleteComment = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/delete_comment\";\n params = {\n id: activityId\n };\n return $http.post(url, null, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.undeleteComment = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/undelete_comment\";\n params = {\n id: activityId\n };\n return $http.post(url, null, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n return function(instance) {\n return instance.history = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgHistoryResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo) {\n var service;\n service = {};\n service.get = function(token) {\n return $repo.queryOne(\"invitations\", token);\n };\n return function(instance) {\n return instance.invitations = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgInvitationsResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/issues.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage, $q) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"issues-queryparams\";\n service.get = function(projectId, issueId) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n return $repo.queryOne(\"issues\", issueId, params);\n };\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"issues\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"issues\", filters);\n };\n service.list = function(projectId, filters, options) {\n var params;\n params = {\n project: projectId\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryPaginated(\"issues\", params, options);\n };\n service.bulkCreate = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-create-issues\");\n params = {\n project_id: projectId,\n bulk_issues: data\n };\n return $http.post(url, params);\n };\n service.upvote = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-upvote\", issueId);\n return $http.post(url);\n };\n service.downvote = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-downvote\", issueId);\n return $http.post(url);\n };\n service.watch = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-watch\", issueId);\n return $http.post(url);\n };\n service.unwatch = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-unwatch\", issueId);\n return $http.post(url);\n };\n service.stats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/issues_stats\");\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"issues-filters\", null, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.issues = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgIssuesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/kanban.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($storage) {\n var hashSuffixStatusColumnModes, hashSuffixStatusViewModes, service;\n service = {};\n hashSuffixStatusViewModes = \"kanban-statusviewmodels\";\n hashSuffixStatusColumnModes = \"kanban-statuscolumnmodels\";\n service.storeStatusColumnModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusColumnModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.kanban = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgKanbanResourcesProvider\", [\"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/locales.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($repo) {\n var service;\n service = {\n list: function() {\n return $repo.queryMany(\"locales\");\n }\n };\n return function(instance) {\n return instance.locales = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgLocalesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/mdrender.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.render = function(projectId, content) {\n var params, url;\n if ((content == null) || content === \"\") {\n content = ' ';\n }\n params = {\n project_id: projectId,\n content: content\n };\n url = $urls.resolve(\"wiki\");\n return $http.post(url + \"/render\", params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n return function(instance) {\n return instance.mdrender = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgMdRenderResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"memberships\", id);\n };\n service.list = function(projectId, filters, enablePagination) {\n var options, params;\n if (enablePagination == null) {\n enablePagination = true;\n }\n params = {\n project: projectId\n };\n params = _.extend({}, params, filters || {});\n if (enablePagination) {\n return $repo.queryPaginated(\"memberships\", params);\n }\n return $repo.queryMany(\"memberships\", params, options = {\n enablePagination: enablePagination\n });\n };\n service.listByUser = function(userId, filters) {\n var params;\n params = {\n user: userId\n };\n params = _.extend({}, params, filters || {});\n return $repo.queryPaginated(\"memberships\", params);\n };\n service.resendInvitation = function(id) {\n var url;\n url = $urls.resolve(\"memberships\");\n return $http.post(url + \"/\" + id + \"/resend_invitation\", {});\n };\n service.bulkCreateMemberships = function(projectId, data, invitation_extra_text) {\n var params, url;\n url = $urls.resolve(\"bulk-create-memberships\");\n params = {\n project_id: projectId,\n bulk_memberships: data,\n invitation_extra_text: invitation_extra_text\n };\n return $http.post(url, params);\n };\n return function(instance) {\n return instance.memberships = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgMembershipsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo) {\n var service;\n service = {};\n service.list = function(projectId, module) {\n return $repo.queryOneAttribute(\"project-modules\", projectId, module);\n };\n return function(instance) {\n return instance.modules = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgModulesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"notify-policies\", id);\n };\n service.list = function(filters) {\n var params;\n params = _.extend({}, params, filters || {});\n return $repo.queryMany(\"notify-policies\", params);\n };\n return function(instance) {\n return instance.notifyPolicies = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgNotifyPoliciesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($config, $repo, $http, $urls, $auth, $q, $translate) {\n var service;\n service = {};\n service.get = function(projectId) {\n return $repo.queryOne(\"projects\", projectId);\n };\n service.getBySlug = function(projectSlug) {\n return $repo.queryOne(\"projects\", \"by_slug?slug=\" + projectSlug);\n };\n service.list = function() {\n return $repo.queryMany(\"projects\");\n };\n service.listByMember = function(memberId) {\n var params;\n params = {\n \"member\": memberId,\n \"order_by\": \"user_order\"\n };\n return $repo.queryMany(\"projects\", params);\n };\n service.templates = function() {\n return $repo.queryMany(\"project-templates\");\n };\n service.usersList = function(projectId) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(\"users\", params);\n };\n service.rolesList = function(projectId) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(\"roles\", params);\n };\n service.stats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/stats\");\n };\n service.bulkUpdateOrder = function(bulkData) {\n var url;\n url = $urls.resolve(\"bulk-update-projects-order\");\n return $http.post(url, bulkData);\n };\n service.regenerate_epics_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_epics_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_userstories_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_userstories_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_tasks_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_tasks_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_issues_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_issues_csv_uuid\";\n return $http.post(url);\n };\n service.leave = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/leave\";\n return $http.post(url);\n };\n service.memberStats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/member_stats\");\n };\n service.tagsColors = function(projectId) {\n return $repo.queryOne(\"projects\", projectId + \"/tags_colors\");\n };\n service.deleteTag = function(projectId, tag) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/delete_tag\";\n return $http.post(url, {\n tag: tag\n });\n };\n service.createTag = function(projectId, tag, color) {\n var data, url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/create_tag\";\n data = {};\n data.tag = tag;\n data.color = null;\n if (color) {\n data.color = color;\n }\n return $http.post(url, data);\n };\n service.editTag = function(projectId, from_tag, to_tag, color) {\n var data, url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/edit_tag\";\n data = {};\n data.from_tag = from_tag;\n if (to_tag) {\n data.to_tag = to_tag;\n }\n data.color = null;\n if (color) {\n data.color = color;\n }\n return $http.post(url, data);\n };\n service.mixTags = function(projectId, to_tag, from_tags) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/mix_tags\";\n return $http.post(url, {\n to_tag: to_tag,\n from_tags: from_tags\n });\n };\n service[\"export\"] = function(projectId) {\n var url;\n url = ($urls.resolve(\"exporter\")) + \"/\" + projectId;\n return $http.get(url);\n };\n service[\"import\"] = function(file, statusUpdater) {\n var complete, data, defered, errorMsg, failed, maxFileSize, response, uploadComplete, uploadFailed, uploadProgress, xhr;\n defered = $q.defer();\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name,\n fileSize: sizeFormat(file.size),\n maxFileSize: sizeFormat(maxFileSize)\n });\n response = {\n status: 413,\n data: {\n _error_message: errorMsg\n }\n };\n defered.reject(response);\n return defered.promise;\n }\n uploadProgress = (function(_this) {\n return function(evt) {\n var message, percent;\n percent = Math.round((evt.loaded / evt.total) * 100);\n message = $translate.instant(\"PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE\", {\n uploadedSize: sizeFormat(evt.loaded),\n totalSize: sizeFormat(evt.total)\n });\n return statusUpdater(\"in-progress\", null, message, percent);\n };\n })(this);\n uploadComplete = (function(_this) {\n return function(evt) {\n return statusUpdater(\"done\", $translate.instant(\"PROJECT.IMPORT.TITLE\"), $translate.instant(\"PROJECT.IMPORT.DESCRIPTION\"));\n };\n })(this);\n uploadFailed = (function(_this) {\n return function(evt) {\n return statusUpdater(\"error\");\n };\n })(this);\n complete = (function(_this) {\n return function(evt) {\n var ref;\n response = {};\n try {\n response.data = JSON.parse(evt.target.responseText);\n } catch (error) {\n response.data = {};\n }\n response.status = evt.target.status;\n if (evt.target.getResponseHeader('Taiga-Info-Project-Is-Private')) {\n response.headers = {\n isPrivate: evt.target.getResponseHeader('Taiga-Info-Project-Is-Private') === 'True',\n memberships: parseInt(evt.target.getResponseHeader('Taiga-Info-Project-Memberships'))\n };\n }\n if ((ref = response.status) === 201 || ref === 202) {\n defered.resolve(response);\n }\n return defered.reject(response);\n };\n })(this);\n failed = (function(_this) {\n return function(evt) {\n return defered.reject(\"fail\");\n };\n })(this);\n data = new FormData();\n data.append('dump', file);\n xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.upload.addEventListener(\"load\", uploadComplete, false);\n xhr.upload.addEventListener(\"error\", uploadFailed, false);\n xhr.upload.addEventListener(\"abort\", uploadFailed, false);\n xhr.addEventListener(\"load\", complete, false);\n xhr.addEventListener(\"error\", failed, false);\n xhr.open(\"POST\", $urls.resolve(\"importer\"));\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + ($auth.getToken()));\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send(data);\n return defered.promise;\n };\n service.changeLogo = function(projectId, file) {\n var data, defered, maxFileSize, options, response, url;\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered = $q.defer();\n defered.reject(response);\n return defered.promise;\n }\n data = new FormData();\n data.append('logo', file);\n options = {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': void 0\n }\n };\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/change_logo\";\n return $http.post(url, data, {}, options);\n };\n service.removeLogo = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/remove_logo\";\n return $http.post(url);\n };\n return function(instance) {\n return instance.projects = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgProjectsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgAuth\", \"$q\", \"$translate\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"roles\", id);\n };\n service.list = function(projectId) {\n return $repo.queryMany(\"roles\", {\n project: projectId\n });\n };\n return function(instance) {\n return instance.roles = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgRolesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/search.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $urls, $http, $q) {\n var service;\n service = {};\n service[\"do\"] = function(projectId, term) {\n var deferredAbort, params, request, url;\n deferredAbort = $q.defer();\n url = $urls.resolve(\"search\");\n params = {\n url: url,\n method: \"GET\",\n timeout: deferredAbort.promise,\n cancelable: true,\n params: {\n project: projectId,\n text: term,\n get_all: false\n }\n };\n request = $http.request(params).then(function(data) {\n return data.data;\n });\n request.abort = function() {\n return deferredAbort.resolve();\n };\n request[\"finally\"] = function() {\n request.abort = angular.noop;\n return deferredAbort = request = null;\n };\n return request;\n };\n return function(instance) {\n return instance.search = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgSearchResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/sprints.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $model, $storage) {\n var service;\n service = {};\n service.get = function(projectId, sprintId) {\n return $repo.queryOne(\"milestones\", sprintId).then(function(sprint) {\n var uses;\n uses = sprint.user_stories;\n uses = _.map(uses, function(u) {\n return $model.make_model(\"userstories\", u);\n });\n sprint._attrs.user_stories = uses;\n return sprint;\n });\n };\n service.stats = function(projectId, sprintId) {\n return $repo.queryOneRaw(\"milestones\", sprintId + \"/stats\");\n };\n service.list = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId\n };\n params = _.extend({}, params, filters || {});\n return $repo.queryMany(\"milestones\", params, {}, true).then((function(_this) {\n return function(result) {\n var headers, i, len, m, milestones, uses;\n milestones = result[0];\n headers = result[1];\n for (i = 0, len = milestones.length; i < len; i++) {\n m = milestones[i];\n uses = m.user_stories;\n uses = _.map(uses, function(u) {\n return $model.make_model(\"userstories\", u);\n });\n m._attrs.user_stories = uses;\n }\n return {\n milestones: milestones,\n closed: parseInt(headers(\"Taiga-Info-Total-Closed-Milestones\"), 10),\n open: parseInt(headers(\"Taiga-Info-Total-Opened-Milestones\"), 10)\n };\n };\n })(this));\n };\n return function(instance) {\n return instance.sprints = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgSprintsResourcesProvider\", [\"$tgRepo\", \"$tgModel\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/tasks.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage) {\n var hashSuffix, hashSuffixStatusColumnModes, hashSuffixUsRowModes, service;\n service = {};\n hashSuffix = \"tasks-queryparams\";\n hashSuffixStatusColumnModes = \"tasks-statuscolumnmodels\";\n hashSuffixUsRowModes = \"tasks-usrowmodels\";\n service.get = function(projectId, taskId, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"tasks\", taskId, params);\n };\n service.getByRef = function(projectId, ref, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"tasks\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"tasks\", filters);\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"task-filters\", null, params);\n };\n service.list = function(projectId, sprintId, userStoryId, params) {\n if (sprintId == null) {\n sprintId = null;\n }\n if (userStoryId == null) {\n userStoryId = null;\n }\n params = _.merge(params, {\n project: projectId\n });\n if (sprintId) {\n params.milestone = sprintId;\n }\n if (userStoryId) {\n params.user_story = userStoryId;\n }\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"tasks\", params);\n };\n service.bulkCreate = function(projectId, sprintId, usId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-create-tasks\");\n params = {\n project_id: projectId,\n milestone_id: sprintId,\n us_id: usId,\n bulk_tasks: data\n };\n return $http.post(url, params).then(function(result) {\n return result.data;\n });\n };\n service.upvote = function(taskId) {\n var url;\n url = $urls.resolve(\"task-upvote\", taskId);\n return $http.post(url);\n };\n service.downvote = function(taskId) {\n var url;\n url = $urls.resolve(\"task-downvote\", taskId);\n return $http.post(url);\n };\n service.watch = function(taskId) {\n var url;\n url = $urls.resolve(\"task-watch\", taskId);\n return $http.post(url);\n };\n service.unwatch = function(taskId) {\n var url;\n url = $urls.resolve(\"task-unwatch\", taskId);\n return $http.post(url);\n };\n service.bulkUpdateTaskTaskboardOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-task-taskboard-order\");\n params = {\n project_id: projectId,\n bulk_tasks: data\n };\n return $http.post(url, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeStatusColumnModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusColumnModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeUsRowModes = function(projectId, sprintId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixUsRowModes;\n hash = generateHash([projectId, sprintId, ns]);\n return $storage.set(hash, params);\n };\n service.getUsRowModes = function(projectId, sprintId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixUsRowModes;\n hash = generateHash([projectId, sprintId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.tasks = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgTasksResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($config, $repo, $http, $urls, $q) {\n var service;\n service = {};\n service.changeAvatar = function(file) {\n var data, defered, maxFileSize, options, response, url;\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered = $q.defer();\n defered.reject(response);\n return defered.promise;\n }\n data = new FormData();\n data.append('avatar', file);\n options = {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': void 0\n }\n };\n url = ($urls.resolve(\"users\")) + \"/change_avatar\";\n return $http.post(url, data, {}, options);\n };\n service.removeAvatar = function() {\n var url;\n url = ($urls.resolve(\"users\")) + \"/remove_avatar\";\n return $http.post(url);\n };\n service.changePassword = function(currentPassword, newPassword) {\n var data, url;\n url = ($urls.resolve(\"users\")) + \"/change_password\";\n data = {\n current_password: currentPassword,\n password: newPassword\n };\n return $http.post(url, data);\n };\n return function(instance) {\n return instance.userSettings = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUserSettingsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/user.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($http, $urls) {\n var service;\n service = {};\n service.contacts = function(userId, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = $urls.resolve(\"user-contacts\", userId);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return $http.get(url, {}, httpOptions).then(function(result) {\n return result.data;\n });\n };\n return function(instance) {\n return instance.users = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUsersResourcesProvider\", [\"$tgHttp\", \"$tgUrls\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/userstories.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage, $q) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"userstories-queryparams\";\n service.get = function(projectId, usId, extraParams) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"userstories\", usId, params);\n };\n service.getByRef = function(projectId, ref, extraParams) {\n var params;\n if (extraParams == null) {\n extraParams = {};\n }\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n params = _.extend({}, params, extraParams);\n return $repo.queryOne(\"userstories\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"userstories\", filters);\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"userstories-filters\", null, params);\n };\n service.listUnassigned = function(projectId, filters, pageSize) {\n var params;\n params = {\n \"project\": projectId,\n \"milestone\": \"null\"\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"userstories\", _.extend(params, {\n page_size: pageSize\n }), {\n enablePagination: true\n }, true);\n };\n service.listAll = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"userstories\", params);\n };\n service.bulkCreate = function(projectId, status, bulk) {\n var data, url;\n data = {\n project_id: projectId,\n status_id: status,\n bulk_stories: bulk\n };\n url = $urls.resolve(\"bulk-create-us\");\n return $http.post(url, data);\n };\n service.upvote = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-upvote\", userStoryId);\n return $http.post(url);\n };\n service.downvote = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-downvote\", userStoryId);\n return $http.post(url);\n };\n service.watch = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-watch\", userStoryId);\n return $http.post(url);\n };\n service.unwatch = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-unwatch\", userStoryId);\n return $http.post(url);\n };\n service.bulkUpdateBacklogOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-backlog-order\");\n params = {\n project_id: projectId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateMilestone = function(projectId, milestoneId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-milestone\");\n params = {\n project_id: projectId,\n milestone_id: milestoneId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateKanbanOrder = function(projectId, statusId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-kanban-order\");\n params = {\n project_id: projectId,\n status_id: statusId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeShowTags = function(projectId, showTags) {\n var hash;\n hash = generateHash([projectId, 'showTags']);\n return $storage.set(hash, showTags);\n };\n service.getShowTags = function(projectId) {\n var hash;\n hash = generateHash([projectId, 'showTags']);\n return $storage.get(hash) || null;\n };\n return function(instance) {\n return instance.userstories = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUserstoriesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: webhooklogs.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.list = function(webhookId) {\n var params;\n params = {\n webhook: webhookId\n };\n return $repo.queryMany(\"webhooklogs\", params);\n };\n service.resend = function(webhooklogId) {\n var url;\n url = $urls.resolve(\"webhooklogs-resend\", webhooklogId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.webhooklogs = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWebhookLogsResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: webhooks.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.list = function(projectId) {\n var params;\n params = {\n project: projectId\n };\n return $repo.queryMany(\"webhooks\", params);\n };\n service.test = function(webhookId) {\n var url;\n url = $urls.resolve(\"webhooks-test\", webhookId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.webhooks = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWebhooksResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/wikis.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(wikiId) {\n return $repo.queryOne(\"wiki\", wikiId);\n };\n service.getBySlug = function(projectId, slug) {\n return $repo.queryOne(\"wiki\", \"by_slug?project=\" + projectId + \"&slug=\" + slug);\n };\n service.list = function(projectId) {\n return $repo.queryMany(\"wiki\", {\n project: projectId\n });\n };\n service.listLinks = function(projectId) {\n return $repo.queryMany(\"wiki-links\", {\n project: projectId\n });\n };\n return function(instance) {\n return instance.wiki = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWikiResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/main.coffee\n */\n\n(function() {\n var UserChangePasswordController, UserChangePasswordDirective, debounce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserChangePasswordController = (function(superClass) {\n extend(UserChangePasswordController, superClass);\n\n UserChangePasswordController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"$translate\"];\n\n function UserChangePasswordController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, translate) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.translate = translate;\n this.scope.sectionName = this.translate.instant(\"CHANGE_PASSWORD.SECTION_NAME\");\n this.scope.user = this.auth.getUser();\n }\n\n return UserChangePasswordController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserChangePasswordController\", UserChangePasswordController);\n\n UserChangePasswordDirective = function($rs, $confirm, $loading, $translate) {\n var link;\n link = function($scope, $el, $attrs, ctrl) {\n var form, submit, submitButton;\n form = new checksley.Form($el.find(\"form\"));\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n if ($scope.newPassword1 !== $scope.newPassword2) {\n $confirm.notify('error', $translate.instant(\"CHANGE_PASSWORD.ERROR_PASSWORD_MATCH\"));\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $rs.userSettings.changePassword($scope.currentPassword, $scope.newPassword1);\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify('success');\n });\n return promise.then(null, function(response) {\n currentLoading.finish();\n return $confirm.notify('error', response.data._error_message);\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserChangePassword\", [\"$tgResources\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", UserChangePasswordDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/lightboxes.coffee\n */\n\n(function() {\n var DeleteUserDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaUserSettings\");\n\n DeleteUserDirective = function($repo, $rootscope, $auth, $location, $navUrls, lightboxService, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit, submitButton;\n $scope.$on(\"deletelightbox:new\", function(ctx, user) {\n return lightboxService.open($el);\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n submit = function() {\n var currentLoading, promise;\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.remove($scope.user);\n promise.then(function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n $auth.logout();\n return $location.path($navUrls.resolve(\"login\"));\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return console.log(\"FAIL\");\n });\n };\n $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n $el.on(\"click\", \".button-red\", debounce(2000, function(event) {\n event.preventDefault();\n return submit();\n }));\n return submitButton = $el.find(\".button-red\");\n };\n return {\n link: link,\n templateUrl: \"user/lightbox/lightbox-delete-account.html\"\n };\n };\n\n module.directive(\"tgLbDeleteUser\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\", \"lightboxService\", \"$tgLoading\", DeleteUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/live-notifications.coffee\n */\n\n(function() {\n var UserLiveNotificationsController, UserLiveNotificationsDirective, UserLiveNotificationsListDirective, bindOnce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserLiveNotificationsController = (function(superClass) {\n extend(UserLiveNotificationsController, superClass);\n\n UserLiveNotificationsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"tgErrorHandlingService\"];\n\n function UserLiveNotificationsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, errorHandlingService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.errorHandlingService = errorHandlingService;\n this.scope.sectionName = \"USER_SETTINGS.NOTIFICATIONS.LIVE_SECTION_NAME\";\n this.scope.user = this.auth.getUser();\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserLiveNotificationsController.prototype.loadInitialData = function() {\n return this.rs.notifyPolicies.list().then((function(_this) {\n return function(notifyPolicies) {\n _this.scope.notifyPolicies = notifyPolicies;\n return notifyPolicies;\n };\n })(this));\n };\n\n return UserLiveNotificationsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserLiveNotificationsController\", UserLiveNotificationsController);\n\n UserLiveNotificationsDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserLiveNotifications\", UserLiveNotificationsDirective);\n\n UserLiveNotificationsListDirective = function($repo, $confirm, $compile) {\n var link, template;\n template = _.template(\"<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\\n
    \\\">\\n
    <%- notifyPolicy.project_name %>
    \\n
    \\n
    \\n \\\" id=\\\"policy-all-<%- notifyPolicy.id %>\\\"\\n value=\\\"2\\\" <% if (notifyPolicy.live_notify_level == 2) { %>checked=\\\"checked\\\"<% } %>/>\\n \\n
    \\n
    \\n
    \\n
    \\n \\\" id=\\\"policy-involved-<%- notifyPolicy.id %>\\\"\\n value=\\\"1\\\" <% if (notifyPolicy.live_notify_level == 1) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
    \\n
    \\n
    \\n
    \\n \\\" id=\\\"policy-none-<%- notifyPolicy.id %>\\\"\\n value=\\\"3\\\" <% if (notifyPolicy.live_notify_level == 3) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
    \\n
    \\n
    \\n<% }) %>\");\n link = function($scope, $el, $attrs) {\n var render;\n render = function() {\n var ctx, html;\n $el.off();\n ctx = {\n notifyPolicies: $scope.notifyPolicies\n };\n html = template(ctx);\n $el.html($compile(html)($scope));\n return $el.on(\"change\", \"input[type=radio]\", function(event) {\n var onError, onSuccess, policy, policyIndex, prev_level, target;\n target = angular.element(event.currentTarget);\n policyIndex = target.parents(\".policy-table-row\").data('index');\n policy = $scope.notifyPolicies[policyIndex];\n prev_level = policy.live_notify_level;\n policy.live_notify_level = parseInt(target.val(), 10);\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n return target.parents(\".policy-table-row\").find(\"input[value=\" + prev_level + \"]\").prop(\"checked\", true);\n };\n return $repo.save(policy).then(onSuccess, onError);\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return bindOnce($scope, $attrs.ngModel, render);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserLiveNotificationsList\", [\"$tgRepo\", \"$tgConfirm\", \"$compile\", UserLiveNotificationsListDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/main.coffee\n */\n\n(function() {\n var TaigaAvatarModelDirective, UserAvatarDirective, UserProfileDirective, UserSettingsController, debounce, mixOf, module, sizeFormat, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n sizeFormat = this.taiga.sizeFormat;\n\n module = angular.module(\"taigaUserSettings\");\n\n debounce = this.taiga.debounce;\n\n UserSettingsController = (function(superClass) {\n extend(UserSettingsController, superClass);\n\n UserSettingsController.$inject = [\"$scope\", \"$rootScope\", \"$tgConfig\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"$translate\", \"tgErrorHandlingService\", \"$window\"];\n\n function UserSettingsController(scope, rootscope, config, repo, confirm, rs, params, q, location, navUrls, auth, translate, errorHandlingService, window) {\n var maxFileSize, promise, text;\n this.scope = scope;\n this.rootscope = rootscope;\n this.config = config;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.translate = translate;\n this.errorHandlingService = errorHandlingService;\n this.window = window;\n this.scope.sectionName = \"USER_SETTINGS.MENU.SECTION_TITLE\";\n this.scope.project = {};\n this.scope.user = this.auth.getUser();\n if (!this.scope.user) {\n this.errorHandlingService.permissionDenied();\n }\n this.scope.lang = this.getLan();\n this.scope.theme = this.getTheme();\n maxFileSize = this.config.get(\"maxUploadFileSize\", null);\n if (maxFileSize) {\n text = this.translate.instant(\"USER_SETTINGS.AVATAR_MAX_SIZE\", {\n \"maxFileSize\": sizeFormat(maxFileSize)\n });\n this.scope.maxFileSizeMsg = text;\n }\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserSettingsController.prototype.loadInitialData = function() {\n this.scope.availableThemes = this.config.get(\"themes\", []);\n return this.rs.locales.list().then((function(_this) {\n return function(locales) {\n _this.scope.locales = locales;\n return locales;\n };\n })(this));\n };\n\n UserSettingsController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.user);\n };\n\n UserSettingsController.prototype.getLan = function() {\n return this.scope.user.lang || this.translate.preferredLanguage();\n };\n\n UserSettingsController.prototype.getTheme = function() {\n return this.scope.user.theme || this.config.get(\"defaultTheme\") || \"taiga\";\n };\n\n UserSettingsController.prototype.exportProfile = function() {\n var onError, onSuccess;\n onSuccess = function(result) {\n var dumpUrl;\n dumpUrl = result.data.url;\n return this.window.open(dumpUrl, \"_blank\");\n };\n onError = (function(_this) {\n return function(response) {\n var ref;\n if ((ref = response.data) != null ? ref._error_message : void 0) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this);\n return this.auth.exportProfile().then(onSuccess, onError);\n };\n\n return UserSettingsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserSettingsController\", UserSettingsController);\n\n UserProfileDirective = function($confirm, $auth, $repo, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var changeEmail, form, onError, onSuccess;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n changeEmail = $scope.user.isAttributeModified(\"email\");\n $scope.user.lang = $scope.lang;\n $scope.user.theme = $scope.theme;\n onSuccess = function(data) {\n var text;\n $auth.setUser(data);\n if (changeEmail) {\n text = $translate.instant(\"USER_PROFILE.CHANGE_EMAIL_SUCCESS\");\n return $confirm.success(text);\n } else {\n return $confirm.notify('success');\n }\n };\n onError = function(data) {\n form.setErrors(data);\n return $confirm.notify('error', data._error_message);\n };\n return $repo.save($scope.user).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserProfile\", [\"$tgConfirm\", \"$tgAuth\", \"$tgRepo\", \"$translate\", UserProfileDirective]);\n\n UserAvatarDirective = function($auth, $model, $rs, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var onError, onSuccess, showSizeInfo;\n showSizeInfo = function() {\n return $el.find(\".size-info\").removeClass(\"hidden\");\n };\n onSuccess = function(response) {\n var user;\n user = $model.make_model(\"users\", response.data);\n $auth.setUser(user);\n $scope.user = user;\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('success');\n };\n onError = function(response) {\n if (response.status === 413) {\n showSizeInfo();\n }\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('error', response.data._error_message);\n };\n $el.on(\"click\", \".js-change-avatar\", function() {\n return $el.find(\"#avatar-field\").click();\n });\n $el.on(\"change\", \"#avatar-field\", function(event) {\n if ($scope.avatarAttachment) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.userSettings.changeAvatar($scope.avatarAttachment).then(onSuccess, onError);\n }\n });\n $el.on(\"click\", \"a.js-use-gravatar\", function(event) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.userSettings.removeAvatar().then(onSuccess, onError);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserAvatar\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", UserAvatarDirective]);\n\n TaigaAvatarModelDirective = function($parse) {\n var link;\n link = function($scope, $el, $attrs) {\n var model, modelSetter;\n model = $parse($attrs.tgAvatarModel);\n modelSetter = model.assign;\n return $el.bind('change', function() {\n return $scope.$apply(function() {\n return modelSetter($scope, $el[0].files[0]);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive('tgAvatarModel', ['$parse', TaigaAvatarModelDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/nav.coffee\n */\n\n(function() {\n var UserSettingsNavigationDirective, module;\n\n UserSettingsNavigationDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var section;\n section = $attrs.tgUserSettingsNavigation;\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\"#usersettingsmenu-\" + section + \" a\").addClass(\"active\");\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaUserSettings\");\n\n module.directive(\"tgUserSettingsNavigation\", UserSettingsNavigationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/notifications.coffee\n */\n\n(function() {\n var UserNotificationsController, UserNotificationsDirective, UserNotificationsListDirective, bindOnce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserNotificationsController = (function(superClass) {\n extend(UserNotificationsController, superClass);\n\n UserNotificationsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"tgErrorHandlingService\"];\n\n function UserNotificationsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, errorHandlingService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.errorHandlingService = errorHandlingService;\n this.scope.sectionName = \"USER_SETTINGS.NOTIFICATIONS.SECTION_NAME\";\n this.scope.user = this.auth.getUser();\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserNotificationsController.prototype.loadInitialData = function() {\n return this.rs.notifyPolicies.list().then((function(_this) {\n return function(notifyPolicies) {\n _this.scope.notifyPolicies = notifyPolicies;\n return notifyPolicies;\n };\n })(this));\n };\n\n return UserNotificationsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserNotificationsController\", UserNotificationsController);\n\n UserNotificationsDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserNotifications\", UserNotificationsDirective);\n\n UserNotificationsListDirective = function($repo, $confirm, $compile) {\n var link, template;\n template = _.template(\"<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\\n
    \\\">\\n
    <%- notifyPolicy.project_name %>
    \\n
    \\n
    \\n \\\" id=\\\"policy-all-<%- notifyPolicy.id %>\\\"\\n value=\\\"2\\\" <% if (notifyPolicy.notify_level == 2) { %>checked=\\\"checked\\\"<% } %>/>\\n \\n
    \\n
    \\n
    \\n
    \\n \\\" id=\\\"policy-involved-<%- notifyPolicy.id %>\\\"\\n value=\\\"1\\\" <% if (notifyPolicy.notify_level == 1) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
    \\n
    \\n
    \\n
    \\n \\\" id=\\\"policy-none-<%- notifyPolicy.id %>\\\"\\n value=\\\"3\\\" <% if (notifyPolicy.notify_level == 3) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
    \\n
    \\n
    \\n<% }) %>\");\n link = function($scope, $el, $attrs) {\n var render;\n render = function() {\n var ctx, html;\n $el.off();\n ctx = {\n notifyPolicies: $scope.notifyPolicies\n };\n html = template(ctx);\n $el.html($compile(html)($scope));\n return $el.on(\"change\", \"input[type=radio]\", function(event) {\n var onError, onSuccess, policy, policyIndex, prev_level, target;\n target = angular.element(event.currentTarget);\n policyIndex = target.parents(\".policy-table-row\").data('index');\n policy = $scope.notifyPolicies[policyIndex];\n prev_level = policy.notify_level;\n policy.notify_level = parseInt(target.val(), 10);\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n return target.parents(\".policy-table-row\").find(\"input[value=\" + prev_level + \"]\").prop(\"checked\", true);\n };\n return $repo.save(policy).then(onSuccess, onError);\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return bindOnce($scope, $attrs.ngModel, render);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserNotificationsList\", [\"$tgRepo\", \"$tgConfirm\", \"$compile\", UserNotificationsListDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: components.module.coffee\n */\n\n(function() {\n angular.module(\"taigaComponents\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaDiscover\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-apps.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaExternalApps\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.module.coffee\n */\n\n(function() {\n angular.module(\"taigaHistory\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaHome\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.module.coffee\n */\n\n(function() {\n angular.module(\"taigaNavigationBar\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaProfile\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects.module.coffee\n */\n\n(function() {\n angular.module(\"taigaProjects\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: resources.module.coffee\n */\n\n(function() {\n angular.module(\"taigaResources2\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.module.coffee\n */\n\n(function() {\n angular.module(\"taigaUserTimeline\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: utils.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUtils\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.module.coffee\n */\n\n(function() {\n angular.module(\"taigaWikiHistory\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to-selector.directive.coffee\n */\n\n(function() {\n var AssignedItemDirective;\n\n AssignedItemDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n templateUrl: \"components/assigned-to/assigned-item/assigned-item.html\",\n scope: {\n member: \"=\"\n },\n link: link\n };\n };\n\n AssignedItemDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedItem\", AssignedItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to-selector.controller.coffee\n */\n\n(function() {\n var AssignedToSelectorController;\n\n AssignedToSelectorController = (function() {\n AssignedToSelectorController.$inject = [];\n\n function AssignedToSelectorController() {\n if (this.assigned) {\n this._getAssignedMember();\n }\n this._filterAssignedMember();\n }\n\n AssignedToSelectorController.prototype._getAssignedMember = function() {\n return this.assignedMember = _.filter(this.project.members, (function(_this) {\n return function(member) {\n return member.id === _this.assigned.get('id');\n };\n })(this));\n };\n\n AssignedToSelectorController.prototype._filterAssignedMember = function() {\n if (this.assigned) {\n return this.nonAssignedMembers = _.filter(this.project.members, (function(_this) {\n return function(member) {\n return member.id !== _this.assigned.get('id');\n };\n })(this));\n } else {\n return this.nonAssignedMembers = this.project.members;\n }\n };\n\n return AssignedToSelectorController;\n\n })();\n\n angular.module('taigaComponents').controller('AssignedToSelectorCtrl', AssignedToSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to-selector.directive.coffee\n */\n\n(function() {\n var AssignedToSelectorDirective;\n\n AssignedToSelectorDirective = function() {\n return {\n controller: \"AssignedToSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/assigned-to/assigned-to-selector/assigned-to-selector.html\",\n scope: {\n assigned: \"=\",\n project: \"=\",\n onRemoveAssigned: \"&\",\n onAssignTo: \"&\"\n }\n };\n };\n\n AssignedToSelectorDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedToSelector\", AssignedToSelectorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to.controller.coffee\n */\n\n(function() {\n var AssignedToController;\n\n AssignedToController = (function() {\n AssignedToController.$inject = [\"tgLightboxFactory\", \"lightboxService\"];\n\n function AssignedToController(lightboxFactory, lightboxService) {\n this.lightboxFactory = lightboxFactory;\n this.lightboxService = lightboxService;\n this.has_permissions = _.includes(this.project.my_permissions, 'modify_epic');\n }\n\n AssignedToController.prototype._closeAndRemoveAssigned = function() {\n this.lightboxService.closeAll();\n return this.onRemoveAssigned();\n };\n\n AssignedToController.prototype._closeAndAssign = function(member) {\n this.lightboxService.closeAll();\n return this.onAssignTo({\n 'member': member\n });\n };\n\n AssignedToController.prototype.onSelectAssignedTo = function(assigned, project) {\n return this.lightboxFactory.create('tg-assigned-to-selector', {\n \"class\": \"lightbox lightbox-assigned-to-selector open\",\n \"assigned\": \"assigned\",\n \"project\": \"project\",\n \"on-remove-assigned\": \"onRemoveAssigned()\",\n \"on-assign-to\": \"assignTo(member)\"\n }, {\n \"assigned\": this.assignedTo,\n \"project\": this.project,\n \"onRemoveAssigned\": this._closeAndRemoveAssigned.bind(this),\n \"assignTo\": this._closeAndAssign.bind(this)\n });\n };\n\n return AssignedToController;\n\n })();\n\n angular.module('taigaComponents').controller('AssignedToCtrl', AssignedToController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: assigned-to.directive.coffee\n */\n\n(function() {\n var AssignedToDirective;\n\n AssignedToDirective = function() {\n return {\n controller: \"AssignedToCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/assigned-to/assigned-to.html\",\n scope: {\n assignedTo: \"=\",\n project: \"=\",\n onRemoveAssigned: \"&\",\n onAssignTo: \"&\"\n }\n };\n };\n\n AssignedToDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAssignedToComponent\", AssignedToDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment-link.directive.coffee\n */\n\n(function() {\n var AttachmentLinkDirective;\n\n AttachmentLinkDirective = function($parse, attachmentsPreviewService, lightboxService) {\n var link;\n link = function(scope, el, attrs) {\n var attachment;\n attachment = $parse(attrs.tgAttachmentLink)(scope);\n el.on(\"click\", function(event) {\n if (taiga.isImage(attachment.getIn(['file', 'name']))) {\n event.preventDefault();\n return scope.$apply(function() {\n lightboxService.open($('tg-attachments-preview'));\n return attachmentsPreviewService.fileId = attachment.getIn(['file', 'id']);\n });\n } else if (taiga.isPdf(attachment.getIn(['file', 'name']))) {\n event.preventDefault();\n return window.open(attachment.getIn(['file', 'url']));\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentLinkDirective.$inject = [\"$parse\", \"tgAttachmentsPreviewService\", \"lightboxService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentLink\", AttachmentLinkDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment-gallery.directive.coffee\n */\n\n(function() {\n var AttachmentGalleryDirective;\n\n AttachmentGalleryDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachment: \"=\",\n onDelete: \"&\",\n onUpdate: \"&\",\n type: \"=\"\n },\n controller: \"Attachment\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachment/attachment-gallery.html\",\n link: link\n };\n };\n\n AttachmentGalleryDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentGallery\", AttachmentGalleryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchment.controller.coffee\n */\n\n(function() {\n var AttachmentController;\n\n AttachmentController = (function() {\n AttachmentController.$inject = ['tgAttachmentsService', '$translate'];\n\n function AttachmentController(attachmentsService, translate) {\n this.attachmentsService = attachmentsService;\n this.translate = translate;\n this.form = {};\n this.form.description = this.attachment.getIn(['file', 'description']);\n this.form.is_deprecated = this.attachment.get(['file', 'is_deprecated']);\n this.title = this.translate.instant(\"ATTACHMENT.TITLE\", {\n fileName: this.attachment.get('name'),\n date: moment(this.attachment.get('created_date')).format(this.translate.instant(\"ATTACHMENT.DATE\"))\n });\n }\n\n AttachmentController.prototype.editMode = function(mode) {\n var attachment;\n attachment = this.attachment.set('editable', mode);\n return this.onUpdate({\n attachment: attachment\n });\n };\n\n AttachmentController.prototype[\"delete\"] = function() {\n return this.onDelete({\n attachment: this.attachment\n });\n };\n\n AttachmentController.prototype.save = function() {\n var attachment;\n attachment = this.attachment.set('loading', true);\n this.onUpdate({\n attachment: attachment\n });\n attachment = this.attachment.merge({\n editable: false,\n loading: false\n });\n attachment = attachment.mergeIn(['file'], {\n description: this.form.description,\n is_deprecated: !!this.form.is_deprecated\n });\n return this.onUpdate({\n attachment: attachment\n });\n };\n\n return AttachmentController;\n\n })();\n\n angular.module('taigaComponents').controller('Attachment', AttachmentController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment.directive.coffee\n */\n\n(function() {\n var AttachmentDirective;\n\n AttachmentDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachment: \"=\",\n onDelete: \"&\",\n onUpdate: \"&\",\n type: \"=\"\n },\n controller: \"Attachment\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachment/attachment.html\",\n link: link\n };\n };\n\n AttachmentDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachment\", AttachmentDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-drop.directive.coffee\n */\n\n(function() {\n var AttachmentsDropDirective;\n\n AttachmentsDropDirective = function($parse) {\n var link;\n link = function(scope, el, attrs) {\n var eventAttr;\n eventAttr = $parse(attrs.tgAttachmentsDrop);\n el.on('dragover', function(e) {\n e.preventDefault();\n return false;\n });\n el.on('drop', function(e) {\n var dataTransfer;\n e.stopPropagation();\n e.preventDefault();\n dataTransfer = e.dataTransfer || (e.originalEvent && e.originalEvent.dataTransfer);\n return scope.$apply(function() {\n return eventAttr(scope, {\n files: dataTransfer.files\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentsDropDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsDrop\", AttachmentsDropDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-full.controller.coffee\n */\n\n(function() {\n var AttachmentsFullController, sizeFormat;\n\n sizeFormat = this.taiga.sizeFormat;\n\n AttachmentsFullController = (function() {\n AttachmentsFullController.$inject = [\"$translate\", \"$tgConfirm\", \"$tgConfig\", \"$tgStorage\", \"tgAttachmentsFullService\", \"tgProjectService\", \"tgAttachmentsPreviewService\"];\n\n function AttachmentsFullController(translate, confirm, config, storage, attachmentsFullService, projectService, attachmentsPreviewService) {\n this.translate = translate;\n this.confirm = confirm;\n this.config = config;\n this.storage = storage;\n this.attachmentsFullService = attachmentsFullService;\n this.projectService = projectService;\n this.attachmentsPreviewService = attachmentsPreviewService;\n this.mode = this.storage.get('attachment-mode', 'list');\n this.maxFileSize = this.config.get(\"maxUploadFileSize\", null);\n if (this.maxFileSize) {\n this.maxFileSize = sizeFormat(this.maxFileSize);\n }\n this.maxFileSizeMsg = this.maxFileSize ? this.translate.instant(\"ATTACHMENT.MAX_UPLOAD_SIZE\", {\n maxFileSize: this.maxFileSize\n }) : \"\";\n taiga.defineImmutableProperty(this, 'attachments', (function(_this) {\n return function() {\n return _this.attachmentsFullService.attachments;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsCount', (function(_this) {\n return function() {\n return _this.attachmentsFullService.deprecatedsCount;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'attachmentsVisible', (function(_this) {\n return function() {\n return _this.attachmentsFullService.attachmentsVisible;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsVisible', (function(_this) {\n return function() {\n return _this.attachmentsFullService.deprecatedsVisible;\n };\n })(this));\n }\n\n AttachmentsFullController.prototype.uploadingAttachments = function() {\n return this.attachmentsFullService.uploadingAttachments;\n };\n\n AttachmentsFullController.prototype.addAttachment = function(file) {\n var editable;\n editable = this.mode === 'list';\n return this.attachmentsFullService.addAttachment(this.projectId, this.objId, this.type, file, editable);\n };\n\n AttachmentsFullController.prototype.setMode = function(mode) {\n this.mode = mode;\n return this.storage.set('attachment-mode', mode);\n };\n\n AttachmentsFullController.prototype.toggleDeprecatedsVisible = function() {\n return this.attachmentsFullService.toggleDeprecatedsVisible();\n };\n\n AttachmentsFullController.prototype.addAttachments = function(files) {\n return _.forEach(files, (function(_this) {\n return function(file) {\n return _this.addAttachment(file);\n };\n })(this));\n };\n\n AttachmentsFullController.prototype.loadAttachments = function() {\n return this.attachmentsFullService.loadAttachments(this.type, this.objId, this.projectId);\n };\n\n AttachmentsFullController.prototype.deleteAttachment = function(toDeleteAttachment) {\n var message, title;\n this.attachmentsPreviewService.fileId = null;\n title = this.translate.instant(\"ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT\");\n message = this.translate.instant(\"ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT\", {\n fileName: toDeleteAttachment.getIn(['file', 'name'])\n });\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onError = function() {\n message = _this.translate.instant(\"ATTACHMENT.ERROR_DELETE_ATTACHMENT\", {\n errorMessage: message\n });\n _this.confirm.notify(\"error\", null, message);\n return askResponse.finish(false);\n };\n onSuccess = function() {\n return askResponse.finish();\n };\n return _this.attachmentsFullService.deleteAttachment(toDeleteAttachment, _this.type).then(onSuccess, onError);\n };\n })(this));\n };\n\n AttachmentsFullController.prototype.reorderAttachment = function(attachment, newIndex) {\n return this.attachmentsFullService.reorderAttachment(this.type, attachment, newIndex);\n };\n\n AttachmentsFullController.prototype.updateAttachment = function(toUpdateAttachment) {\n return this.attachmentsFullService.updateAttachment(toUpdateAttachment, this.type);\n };\n\n AttachmentsFullController.prototype._isEditable = function() {\n if (this.projectService.project) {\n return this.projectService.hasPermission(this.editPermission);\n }\n return false;\n };\n\n AttachmentsFullController.prototype.showAttachments = function() {\n return this._isEditable() || this.attachmentsFullService.attachments.size;\n };\n\n return AttachmentsFullController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"AttachmentsFull\", AttachmentsFullController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-full.directive.coffee\n */\n\n(function() {\n var AttachmentsFullDirective, bindOnce;\n\n bindOnce = this.taiga.bindOnce;\n\n AttachmentsFullDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return bindOnce(scope, 'vm.objId', function(value) {\n return ctrl.loadAttachments();\n });\n };\n return {\n scope: {},\n bindToController: {\n type: \"@\",\n objId: \"=\",\n projectId: \"=\",\n editPermission: \"@\"\n },\n controller: \"AttachmentsFull\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachments-full/attachments-full.html\",\n link: link\n };\n };\n\n AttachmentsFullDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsFull\", AttachmentsFullDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-full.service.coffee\n */\n\n(function() {\n var AttachmentsFullService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n AttachmentsFullService = (function(superClass) {\n extend(AttachmentsFullService, superClass);\n\n AttachmentsFullService.$inject = [\"tgAttachmentsService\", \"$rootScope\"];\n\n function AttachmentsFullService(attachmentsService, rootScope) {\n this.attachmentsService = attachmentsService;\n this.rootScope = rootScope;\n this._attachments = Immutable.List();\n this._deprecatedsCount = 0;\n this._attachmentsVisible = Immutable.List();\n this._deprecatedsVisible = false;\n this.uploadingAttachments = [];\n taiga.defineImmutableProperty(this, 'attachments', (function(_this) {\n return function() {\n return _this._attachments;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsCount', (function(_this) {\n return function() {\n return _this._deprecatedsCount;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'attachmentsVisible', (function(_this) {\n return function() {\n return _this._attachmentsVisible;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsVisible', (function(_this) {\n return function() {\n return _this._deprecatedsVisible;\n };\n })(this));\n }\n\n AttachmentsFullService.prototype.toggleDeprecatedsVisible = function() {\n this._deprecatedsVisible = !this._deprecatedsVisible;\n return this.regenerate();\n };\n\n AttachmentsFullService.prototype.regenerate = function() {\n this._deprecatedsCount = this._attachments.count(function(it) {\n return it.getIn(['file', 'is_deprecated']);\n });\n if (this._deprecatedsVisible) {\n return this._attachmentsVisible = this._attachments;\n } else {\n return this._attachmentsVisible = this._attachments.filter(function(it) {\n return !it.getIn(['file', 'is_deprecated']);\n });\n }\n };\n\n AttachmentsFullService.prototype.addAttachment = function(projectId, objId, type, file, editable, comment) {\n if (editable == null) {\n editable = true;\n }\n if (comment == null) {\n comment = false;\n }\n return new Promise((function(_this) {\n return function(resolve, reject) {\n var promise;\n if (_this.attachmentsService.validate(file)) {\n _this.uploadingAttachments.push(file);\n promise = _this.attachmentsService.upload(file, objId, projectId, type, comment);\n return promise.then(function(file) {\n var attachment;\n _this.uploadingAttachments = _this.uploadingAttachments.filter(function(uploading) {\n return uploading.name !== file.get('name');\n });\n attachment = Immutable.Map();\n attachment = attachment.merge({\n file: file,\n editable: editable,\n loading: false,\n from_comment: comment\n });\n _this._attachments = _this._attachments.push(attachment);\n _this.regenerate();\n _this.rootScope.$broadcast(\"attachment:create\");\n return resolve(attachment);\n });\n } else {\n return reject(new Error(file));\n }\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.loadAttachments = function(type, objId, projectId) {\n return this.attachmentsService.list(type, objId, projectId).then((function(_this) {\n return function(files) {\n _this._attachments = files.map(function(file) {\n var attachment;\n attachment = Immutable.Map();\n return attachment.merge({\n loading: false,\n editable: false,\n file: file\n });\n });\n return _this.regenerate();\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.deleteAttachment = function(toDeleteAttachment, type) {\n var onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this._attachments = _this._attachments.filter(function(attachment) {\n return attachment !== toDeleteAttachment;\n });\n return _this.regenerate();\n };\n })(this);\n return this.attachmentsService[\"delete\"](type, toDeleteAttachment.getIn(['file', 'id'])).then(onSuccess);\n };\n\n AttachmentsFullService.prototype.reorderAttachment = function(type, attachment, newIndex) {\n var attachments, oldIndex, promises;\n oldIndex = this.attachments.findIndex(function(it) {\n return it === attachment;\n });\n if (oldIndex === newIndex) {\n return;\n }\n attachments = this.attachments.remove(oldIndex);\n attachments = attachments.splice(newIndex, 0, attachment);\n attachments = attachments.map(function(x, i) {\n return x.setIn(['file', 'order'], i + 1);\n });\n promises = [];\n attachments.forEach((function(_this) {\n return function(attachment) {\n var patch;\n patch = {\n order: attachment.getIn(['file', 'order'])\n };\n return promises.push(_this.attachmentsService.patch(attachment.getIn(['file', 'id']), type, patch));\n };\n })(this));\n return Promise.all(promises).then((function(_this) {\n return function() {\n _this._attachments = attachments;\n return _this.regenerate();\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.updateAttachment = function(toUpdateAttachment, type) {\n var index, oldAttachment, patch;\n index = this._attachments.findIndex(function(attachment) {\n return attachment.getIn(['file', 'id']) === toUpdateAttachment.getIn(['file', 'id']);\n });\n oldAttachment = this._attachments.get(index);\n patch = taiga.patch(oldAttachment.get('file'), toUpdateAttachment.get('file'));\n if (toUpdateAttachment.get('loading')) {\n this._attachments = this._attachments.set(index, toUpdateAttachment);\n return this.regenerate();\n } else {\n return this.attachmentsService.patch(toUpdateAttachment.getIn(['file', 'id']), type, patch).then((function(_this) {\n return function() {\n _this._attachments = _this._attachments.set(index, toUpdateAttachment);\n return _this.regenerate();\n };\n })(this));\n }\n };\n\n return AttachmentsFullService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgAttachmentsFullService\", AttachmentsFullService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-preview.controller.coffee\n */\n\n(function() {\n var AttachmentsPreviewController;\n\n AttachmentsPreviewController = (function() {\n AttachmentsPreviewController.$inject = [\"tgAttachmentsPreviewService\"];\n\n function AttachmentsPreviewController(attachmentsPreviewService) {\n this.attachmentsPreviewService = attachmentsPreviewService;\n taiga.defineImmutableProperty(this, \"current\", (function(_this) {\n return function() {\n if (!_this.attachmentsPreviewService.fileId) {\n return null;\n }\n return _this.getCurrent();\n };\n })(this));\n }\n\n AttachmentsPreviewController.prototype.hasPagination = function() {\n var images;\n images = this.attachments.filter((function(_this) {\n return function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n };\n })(this));\n return images.size > 1;\n };\n\n AttachmentsPreviewController.prototype.getCurrent = function() {\n var attachment, file;\n attachment = this.attachments.find((function(_this) {\n return function(attachment) {\n return _this.attachmentsPreviewService.fileId === attachment.getIn(['file', 'id']);\n };\n })(this));\n file = attachment.get('file');\n return file;\n };\n\n AttachmentsPreviewController.prototype.getIndex = function() {\n return this.attachments.findIndex((function(_this) {\n return function(attachment) {\n return _this.attachmentsPreviewService.fileId === attachment.getIn(['file', 'id']);\n };\n })(this));\n };\n\n AttachmentsPreviewController.prototype.next = function() {\n var attachmentIndex, image;\n attachmentIndex = this.getIndex();\n image = this.attachments.slice(attachmentIndex + 1).find(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n if (!image) {\n image = this.attachments.find(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n }\n return this.attachmentsPreviewService.fileId = image.getIn(['file', 'id']);\n };\n\n AttachmentsPreviewController.prototype.previous = function() {\n var attachmentIndex, image;\n attachmentIndex = this.getIndex();\n image = this.attachments.slice(0, attachmentIndex).findLast(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n if (!image) {\n image = this.attachments.findLast(function(attachment) {\n return taiga.isImage(attachment.getIn(['file', 'name']));\n });\n }\n return this.attachmentsPreviewService.fileId = image.getIn(['file', 'id']);\n };\n\n return AttachmentsPreviewController;\n\n })();\n\n angular.module('taigaComponents').controller('AttachmentsPreview', AttachmentsPreviewController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-preview.directive.coffee\n */\n\n(function() {\n var AttachmentPreviewLightboxDirective;\n\n AttachmentPreviewLightboxDirective = function(lightboxService, attachmentsPreviewService) {\n var link;\n link = function($scope, el, attrs, ctrl) {\n $(document.body).on(\"keydown.image-preview\", function(e) {\n if (attachmentsPreviewService.fileId) {\n if (e.keyCode === 39) {\n ctrl.next();\n } else if (e.keyCode === 37) {\n ctrl.previous();\n }\n }\n return $scope.$digest();\n });\n return $scope.$on('$destroy', function() {\n return $(document.body).off('.image-preview');\n });\n };\n return {\n scope: {},\n controller: 'AttachmentsPreview',\n templateUrl: 'components/attachments-preview/attachments-preview.html',\n link: link,\n controllerAs: \"vm\",\n bindToController: {\n attachments: \"=\"\n }\n };\n };\n\n angular.module('taigaComponents').directive(\"tgAttachmentsPreview\", [\"lightboxService\", \"tgAttachmentsPreviewService\", AttachmentPreviewLightboxDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-preview.service.coffee\n */\n\n(function() {\n var AttachmentsPreviewService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n AttachmentsPreviewService = (function(superClass) {\n extend(AttachmentsPreviewService, superClass);\n\n AttachmentsPreviewService.$inject = [];\n\n function AttachmentsPreviewService() {}\n\n return AttachmentsPreviewService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgAttachmentsPreviewService\", AttachmentsPreviewService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-simple.controller.coffee\n */\n\n(function() {\n var AttachmentsSimpleController;\n\n AttachmentsSimpleController = (function() {\n AttachmentsSimpleController.$inject = [\"tgAttachmentsService\"];\n\n function AttachmentsSimpleController(attachmentsService) {\n this.attachmentsService = attachmentsService;\n }\n\n AttachmentsSimpleController.prototype.addAttachment = function(file) {\n var attachment;\n attachment = Immutable.fromJS({\n file: file,\n name: file.name,\n size: file.size\n });\n if (this.attachmentsService.validate(file)) {\n this.attachments = this.attachments.push(attachment);\n if (this.onAdd) {\n return this.onAdd({\n attachment: attachment\n });\n }\n }\n };\n\n AttachmentsSimpleController.prototype.addAttachments = function(files) {\n return _.forEach(files, this.addAttachment.bind(this));\n };\n\n AttachmentsSimpleController.prototype.deleteAttachment = function(toDeleteAttachment) {\n this.attachments = this.attachments.filter(function(attachment) {\n return attachment !== toDeleteAttachment;\n });\n if (this.onDelete) {\n return this.onDelete({\n attachment: toDeleteAttachment\n });\n }\n };\n\n return AttachmentsSimpleController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"AttachmentsSimple\", AttachmentsSimpleController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-simple.directive.coffee\n */\n\n(function() {\n var AttachmentsSimpleDirective;\n\n AttachmentsSimpleDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachments: \"=\",\n onAdd: \"&\",\n onDelete: \"&\"\n },\n controller: \"AttachmentsSimple\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachments-simple/attachments-simple.html\",\n link: link\n };\n };\n\n AttachmentsSimpleDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsSimple\", AttachmentsSimpleDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-sortable.directive.coffee\n */\n\n(function() {\n var AttachmentSortableDirective;\n\n AttachmentSortableDirective = function($parse) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n callback = $parse(attrs.tgAttachmentsSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('div[tg-bind-scope]');\n }\n });\n drake.on('dragend', function(item) {\n var attachment, newIndex;\n item = $(item);\n attachment = item.scope().attachment;\n newIndex = item.index();\n return scope.$apply(function() {\n return callback(scope, {\n attachment: attachment,\n index: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentSortableDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsSortable\", AttachmentSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: auto-select.directive.coffee\n */\n\n(function() {\n var AutoSelectDirective;\n\n AutoSelectDirective = function($timeout) {\n return {\n link: function(scope, elm) {\n return $timeout(function() {\n return elm[0].select();\n });\n }\n };\n };\n\n AutoSelectDirective.$inject = ['$timeout'];\n\n angular.module(\"taigaComponents\").directive(\"tgAutoSelect\", AutoSelectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: avatar.directive.coffee\n */\n\n(function() {\n var AvatarDirective;\n\n AvatarDirective = function(avatarService) {\n var link;\n link = function(scope, el, attrs) {\n var attributeName;\n if (attrs.tgAvatarBig) {\n attributeName = 'avatarBig';\n } else {\n attributeName = 'avatar';\n }\n return scope.$watch(attributeName, function(user) {\n var avatar;\n avatar = avatarService.getAvatar(user, attributeName);\n el.attr('src', avatar.url);\n return el.css('background', avatar.bg || \"\");\n });\n };\n return {\n link: link,\n scope: {\n avatar: \"=tgAvatar\",\n avatarBig: \"=tgAvatarBig\"\n }\n };\n };\n\n AvatarDirective.$inject = ['tgAvatarService'];\n\n angular.module(\"taigaComponents\").directive(\"tgAvatar\", AvatarDirective);\n\n angular.module(\"taigaComponents\").directive(\"tgAvatarBig\", AvatarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: belong-to-epics.directive.coffee\n */\n\n(function() {\n var BelongToEpicsDirective, module;\n\n module = angular.module('taigaEpics');\n\n BelongToEpicsDirective = function() {\n var link, templateUrl;\n link = function(scope, el, attrs) {\n return scope.$watch('epics', function(epics) {\n if (epics && !epics.isIterable) {\n return scope.immutable_epics = Immutable.fromJS(epics);\n }\n });\n };\n templateUrl = function(el, attrs) {\n if (attrs.format) {\n return \"components/belong-to-epics/belong-to-epics-\" + attrs.format + \".html\";\n }\n return \"components/belong-to-epics/belong-to-epics-pill.html\";\n };\n return {\n link: link,\n scope: {\n epics: '='\n },\n templateUrl: templateUrl\n };\n };\n\n module.directive(\"tgBelongToEpics\", BelongToEpicsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/bind-code.directive.coffee\n */\n\n(function() {\n var BindCode;\n\n BindCode = function($sce, $parse, $compile, wysiwygService, wysiwygCodeHightlighterService) {\n return {\n restrict: 'A',\n compile: function(tElement, tAttrs) {\n var tgBindCodeGetter, tgBindCodeWatch;\n tgBindCodeGetter = $parse(tAttrs.tgBindCode);\n tgBindCodeWatch = $parse(tAttrs.tgBindCode, function(value) {\n return (value || '').toString();\n });\n $compile.$$addBindingClass(tElement);\n return function(scope, element, attr) {\n $compile.$$addBindingInfo(element, attr.tgBindCode);\n return scope.$watch(tgBindCodeWatch, function() {\n var html;\n html = wysiwygService.getHTML(tgBindCodeGetter(scope));\n element.html($sce.getTrustedHtml(html) || '');\n return wysiwygCodeHightlighterService.addHightlighter(element);\n });\n };\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgBindCode\", [\"$sce\", \"$parse\", \"$compile\", \"tgWysiwygService\", \"tgWysiwygCodeHightlighterService\", BindCode]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: board-zoom.directive.coffee\n */\n\n(function() {\n var BoardZoomDirective;\n\n BoardZoomDirective = function() {\n return {\n scope: {\n levels: \"=\",\n value: \"=\"\n },\n templateUrl: 'components/board-zoom/board-zoom.html'\n };\n };\n\n angular.module('taigaComponents').directive(\"tgBoardZoom\", [BoardZoomDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: card-slideshow.controller.coffee\n */\n\n(function() {\n var CardSlideshowController;\n\n CardSlideshowController = (function() {\n CardSlideshowController.$inject = [];\n\n function CardSlideshowController() {\n this.index = 0;\n }\n\n CardSlideshowController.prototype.next = function() {\n this.index++;\n if (this.index >= this.images.size) {\n return this.index = 0;\n }\n };\n\n CardSlideshowController.prototype.previous = function() {\n this.index--;\n if (this.index < 0) {\n return this.index = this.images.size - 1;\n }\n };\n\n return CardSlideshowController;\n\n })();\n\n angular.module('taigaComponents').controller('CardSlideshow', CardSlideshowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: card.directive.coffee\n */\n\n(function() {\n var cardSlideshowDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n cardSlideshowDirective = function() {\n return {\n controller: \"CardSlideshow\",\n templateUrl: \"components/card-slideshow/card-slideshow.html\",\n bindToController: true,\n controllerAs: \"vm\",\n scope: {\n images: \"=\"\n }\n };\n };\n\n module.directive('tgCardSlideshow', cardSlideshowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: card.controller.coffee\n */\n\n(function() {\n var CardController;\n\n CardController = (function() {\n function CardController() {}\n\n CardController.$inject = [];\n\n CardController.prototype.visible = function(name) {\n return this.zoom.indexOf(name) !== -1;\n };\n\n CardController.prototype.hasTasks = function() {\n var tasks;\n tasks = this.item.getIn(['model', 'tasks']);\n return tasks && tasks.size > 0;\n };\n\n CardController.prototype.hasMultipleAssignedUsers = function() {\n var assignedUsers;\n assignedUsers = this.item.getIn(['model', 'assigned_users']);\n return assignedUsers && assignedUsers.size > 1;\n };\n\n CardController.prototype.hasVisibleAttachments = function() {\n return this.item.get('images').size > 0;\n };\n\n CardController.prototype.toggleFold = function() {\n return this.onToggleFold({\n id: this.item.get('id')\n });\n };\n\n CardController.prototype.getClosedTasks = function() {\n return this.item.getIn(['model', 'tasks']).filter(function(task) {\n return task.get('is_closed');\n });\n };\n\n CardController.prototype.closedTasksPercent = function() {\n return this.getClosedTasks().size * 100 / this.item.getIn(['model', 'tasks']).size;\n };\n\n CardController.prototype.getModifyPermisionKey = function() {\n if (this.type === 'task') {\n return 'modify_task';\n } else {\n return 'modify_us';\n }\n };\n\n CardController.prototype.getDeletePermisionKey = function() {\n if (this.type === 'task') {\n return 'delete_task';\n } else {\n return 'delete_us';\n }\n };\n\n CardController.prototype._setVisibility = function() {\n var visibility;\n visibility = {\n related: this.visible('related_tasks'),\n slides: this.visible('attachments')\n };\n if (!_.isUndefined(this.item.get('foldStatusChanged'))) {\n if (this.visible('related_tasks') && this.visible('attachments')) {\n visibility.related = !this.item.get('foldStatusChanged');\n visibility.slides = !this.item.get('foldStatusChanged');\n } else if (this.visible('attachments')) {\n visibility.related = this.item.get('foldStatusChanged');\n visibility.slides = this.item.get('foldStatusChanged');\n } else if (!this.visible('related_tasks') && !this.visible('attachments')) {\n visibility.related = this.item.get('foldStatusChanged');\n visibility.slides = this.item.get('foldStatusChanged');\n }\n }\n if (!this.item.getIn(['model', 'tasks']) || !this.item.getIn(['model', 'tasks']).size) {\n visibility.related = false;\n }\n if (!this.item.get('images') || !this.item.get('images').size) {\n visibility.slides = false;\n }\n return visibility;\n };\n\n CardController.prototype.isRelatedTasksVisible = function() {\n var visibility;\n visibility = this._setVisibility();\n return visibility.related;\n };\n\n CardController.prototype.isSlideshowVisible = function() {\n var visibility;\n visibility = this._setVisibility();\n return visibility.slides;\n };\n\n CardController.prototype.getNavKey = function() {\n if (this.type === 'task') {\n return 'project-tasks-detail';\n } else {\n return 'project-userstories-detail';\n }\n };\n\n return CardController;\n\n })();\n\n angular.module('taigaComponents').controller('Card', CardController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: card.directive.coffee\n */\n\n(function() {\n var cardDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n cardDirective = function() {\n return {\n link: function(scope) {},\n controller: \"Card\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"components/card/card.html\",\n scope: {\n onToggleFold: \"&\",\n onClickAssignedTo: \"&\",\n onClickEdit: \"&\",\n onClickDelete: \"&\",\n project: \"=\",\n item: \"=\",\n zoom: \"=\",\n zoomLevel: \"=\",\n archived: \"=\",\n type: \"@\"\n }\n };\n };\n\n module.directive('tgCard', cardDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/click-input-file.directive.coffee\n */\n\n(function() {\n var ClickInputFile;\n\n ClickInputFile = function() {\n return {\n link: function(scope, el) {\n el.on('click', function(e) {\n var inputFile;\n if (!$(e.target).is('input')) {\n e.preventDefault();\n inputFile = el.find('input[type=\"file\"]');\n inputFile.val('');\n return inputFile.trigger('click');\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgClickInputFile\", [ClickInputFile]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: color-selector.controller.coffee\n */\n\n(function() {\n var ColorSelectorController, getDefaulColorList, taiga;\n\n taiga = this.taiga;\n\n getDefaulColorList = taiga.getDefaulColorList;\n\n ColorSelectorController = (function() {\n ColorSelectorController.$inject = [\"tgProjectService\"];\n\n function ColorSelectorController(projectService) {\n this.projectService = projectService;\n this.colorList = getDefaulColorList();\n this.checkIsColorRequired();\n this.displayColorList = false;\n }\n\n ColorSelectorController.prototype.userCanChangeColor = function() {\n if (!this.requiredPerm) {\n return true;\n }\n return this.projectService.hasPermission(this.requiredPerm);\n };\n\n ColorSelectorController.prototype.checkIsColorRequired = function() {\n if (!this.isColorRequired) {\n return this.colorList = _.dropRight(this.colorList);\n }\n };\n\n ColorSelectorController.prototype.setColor = function(color) {\n this.color = color;\n return this.customColor = color;\n };\n\n ColorSelectorController.prototype.resetColor = function() {\n if (this.isColorRequired && !this.color) {\n return this.color = this.initColor;\n }\n };\n\n ColorSelectorController.prototype.toggleColorList = function() {\n this.displayColorList = !this.displayColorList;\n this.customColor = this.color;\n return this.resetColor();\n };\n\n ColorSelectorController.prototype.onSelectDropdownColor = function(color) {\n this.color = color;\n this.onSelectColor({\n color: color\n });\n return this.toggleColorList();\n };\n\n ColorSelectorController.prototype.onKeyDown = function(event) {\n if (event.which === 13) {\n if (this.customColor || !this.isColorRequired) {\n this.onSelectDropdownColor(this.customColor);\n }\n return event.preventDefault();\n }\n };\n\n return ColorSelectorController;\n\n })();\n\n angular.module('taigaComponents').controller(\"ColorSelectorCtrl\", ColorSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: color-selector.directive.coffee\n */\n\n(function() {\n var ColorSelectorDirective, bindOnce;\n\n bindOnce = this.taiga.bindOnce;\n\n ColorSelectorDirective = function($timeout) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var _timeout, cancel, close;\n _timeout = null;\n cancel = function() {\n $timeout.cancel(_timeout);\n return _timeout = null;\n };\n close = function() {\n if (_timeout) {\n return;\n }\n return _timeout = $timeout((function() {\n ctrl.displayColorList = false;\n return ctrl.resetColor();\n }), 400);\n };\n el.find('.color-selector').mouseenter(cancel).mouseleave(close);\n el.find('.color-selector-dropdown').mouseenter(cancel).mouseleave(close);\n return scope.$watch('vm.initColor', function(color) {\n return ctrl.setColor(color);\n });\n };\n return {\n link: link,\n templateUrl: \"components/color-selector/color-selector.html\",\n controller: \"ColorSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n isColorRequired: \"=\",\n onSelectColor: \"&\",\n initColor: \"=\",\n requiredPerm: \"@\"\n },\n scope: {}\n };\n };\n\n ColorSelectorDirective.$inject = [\"$timeout\"];\n\n angular.module('taigaComponents').directive(\"tgColorSelector\", ColorSelectorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: story-header.controller.coffee\n */\n\n(function() {\n var StoryHeaderController, module;\n\n module = angular.module(\"taigaUserStories\");\n\n StoryHeaderController = (function() {\n StoryHeaderController.$inject = [\"$rootScope\", \"$tgConfirm\", \"$tgQueueModelTransformation\", \"$tgNavUrls\", \"$window\"];\n\n function StoryHeaderController(rootScope, confirm, modelTransform, navUrls, window) {\n this.rootScope = rootScope;\n this.confirm = confirm;\n this.modelTransform = modelTransform;\n this.navUrls = navUrls;\n this.window = window;\n this.editMode = false;\n this.loadingSubject = false;\n this.originalSubject = this.item.subject;\n }\n\n StoryHeaderController.prototype._checkNav = function() {\n var ctx, ref, ref1;\n if (((ref = this.item.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: this.project.slug,\n ref: this.item.neighbors.previous.ref\n };\n this.previousUrl = this.navUrls.resolve(\"project-\" + this.item._name + \"-detail\", ctx);\n }\n if (((ref1 = this.item.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: this.project.slug,\n ref: this.item.neighbors.next.ref\n };\n return this.nextUrl = this.navUrls.resolve(\"project-\" + this.item._name + \"-detail\", ctx);\n }\n };\n\n StoryHeaderController.prototype._checkPermissions = function() {\n return this.permissions = {\n canEdit: _.includes(this.project.my_permissions, this.requiredPerm)\n };\n };\n\n StoryHeaderController.prototype.editSubject = function(value) {\n var selection;\n selection = this.window.getSelection();\n if (selection.type !== \"Range\") {\n if (value) {\n this.editMode = true;\n }\n if (!value) {\n return this.editMode = false;\n }\n }\n };\n\n StoryHeaderController.prototype.onKeyDown = function(event) {\n if (event.which === 13) {\n this.saveSubject();\n }\n if (event.which === 27) {\n this.item.subject = this.originalSubject;\n return this.editSubject(false);\n }\n };\n\n StoryHeaderController.prototype.saveSubject = function() {\n var item, onEditSubjectError, onEditSubjectSuccess, transform;\n onEditSubjectSuccess = (function(_this) {\n return function() {\n _this.loadingSubject = false;\n _this.rootScope.$broadcast(\"object:updated\");\n _this.confirm.notify('success');\n return _this.originalSubject = _this.item.subject;\n };\n })(this);\n onEditSubjectError = (function(_this) {\n return function() {\n _this.loadingSubject = false;\n return _this.confirm.notify('error');\n };\n })(this);\n this.editMode = false;\n this.loadingSubject = true;\n item = this.item;\n transform = this.modelTransform.save(function(item) {\n return item;\n });\n return transform.then(onEditSubjectSuccess, onEditSubjectError);\n };\n\n return StoryHeaderController;\n\n })();\n\n module.controller(\"StoryHeaderCtrl\", StoryHeaderController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: story-header.directive.coffee\n */\n\n(function() {\n var DetailHeaderDirective, module;\n\n module = angular.module('taigaUserStories');\n\n DetailHeaderDirective = function() {\n var link;\n this.$inject = [];\n link = function(scope, el, attrs, ctrl) {\n ctrl._checkPermissions();\n return ctrl._checkNav();\n };\n return {\n link: link,\n controller: \"StoryHeaderCtrl\",\n bindToController: true,\n scope: {\n item: \"=\",\n project: \"=\",\n requiredPerm: \"@\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/detail/header/detail-header.html\"\n };\n };\n\n module.directive(\"tgDetailHeader\", DetailHeaderDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2018 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: due-date-controller.coffee\n */\n\n(function() {\n var DueDateController;\n\n DueDateController = (function() {\n DueDateController.$inject = [\"$translate\", \"tgLightboxFactory\"];\n\n function DueDateController(translate, tgLightboxFactory) {\n this.translate = translate;\n this.tgLightboxFactory = tgLightboxFactory;\n }\n\n DueDateController.prototype.visible = function() {\n return this.format === 'button' || (this.dueDate != null);\n };\n\n DueDateController.prototype.disabled = function() {\n return this.isClosed;\n };\n\n DueDateController.prototype.color = function() {\n var colors;\n colors = {\n 'no_longer_applicable': 'closed',\n 'due_soon': 'due-soon',\n 'past_due': 'past-due',\n 'set': 'due-set'\n };\n return colors[this.dueDateStatus] || '';\n };\n\n DueDateController.prototype.title = function() {\n if (this.format === 'button') {\n if (this.dueDate) {\n return this._formatTitle();\n } else {\n return 'Edit due date';\n }\n }\n return this._formatTitle();\n };\n\n DueDateController.prototype._formatTitle = function() {\n var dueDateStatus, formatedDate, prettyDate, titles;\n dueDateStatus = 'closed';\n titles = {\n 'no_longer_applicable': 'COMMON.DUE_DATE.NO_LONGER_APPLICABLE',\n 'due_soon': 'COMMON.DUE_DATE.DUE_SOON',\n 'past_due': 'COMMON.DUE_DATE.PAST_DUE'\n };\n prettyDate = this.translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n formatedDate = moment(this.dueDate).format(prettyDate);\n if (!titles[this.dueDateStatus]) {\n return formatedDate;\n }\n return formatedDate + \" (\" + (this.translate.instant(titles[this.dueDateStatus])) + \")\";\n };\n\n DueDateController.prototype.setDueDate = function() {\n if (this.disabled()) {\n return;\n }\n return this.tgLightboxFactory.create(\"tg-lb-set-due-date\", {\n \"class\": \"lightbox lightbox-set-due-date\"\n }, {\n \"object\": this.item\n });\n };\n\n return DueDateController;\n\n })();\n\n angular.module('taigaComponents').controller('DueDate', DueDateController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2018 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: due-date.directive.coffee\n */\n\n(function() {\n var dueDateDirective, module;\n\n module = angular.module(\"taigaComponents\");\n\n dueDateDirective = function() {\n var templateUrl;\n templateUrl = function(el, attrs) {\n if (attrs.format) {\n return \"components/due-date/due-date-\" + attrs.format + \".html\";\n }\n return \"components/due-date/due-date-icon.html\";\n };\n return {\n link: function(scope) {},\n controller: \"DueDate\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: templateUrl,\n scope: {\n dueDate: '=',\n dueDateStatus: '=',\n isClosed: '=',\n item: '=',\n format: '@'\n }\n };\n };\n\n module.directive('tgDueDate', dueDateDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: file-change.directive.coffee\n */\n\n(function() {\n var FileChangeDirective;\n\n FileChangeDirective = function($parse) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var eventAttr;\n eventAttr = $parse(attrs.tgFileChange);\n el.on('change', function(event) {\n return scope.$apply(function() {\n return eventAttr(scope, {\n files: event.currentTarget.files\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n restrict: \"A\",\n link: link\n };\n };\n\n FileChangeDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgFileChange\", FileChangeDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: filter-utils.service.coffee\n */\n\n(function() {\n var FilterRemoteStorageService, generateHash,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n generateHash = taiga.generateHash;\n\n FilterRemoteStorageService = (function(superClass) {\n extend(FilterRemoteStorageService, superClass);\n\n FilterRemoteStorageService.$inject = [\"$q\", \"$tgUrls\", \"$tgHttp\"];\n\n function FilterRemoteStorageService(q, urls, http) {\n this.q = q;\n this.urls = urls;\n this.http = http;\n }\n\n FilterRemoteStorageService.prototype.storeFilters = function(projectId, myFilters, filtersHashSuffix) {\n var deferred, hash, ns, promise, url;\n deferred = this.q.defer();\n url = this.urls.resolve(\"user-storage\");\n ns = projectId + \":\" + filtersHashSuffix;\n hash = generateHash([projectId, ns]);\n if (_.isEmpty(myFilters)) {\n promise = this.http[\"delete\"](url + \"/\" + hash, {\n key: hash,\n value: myFilters\n });\n promise.then(function() {\n return deferred.resolve();\n });\n promise.then(null, function() {\n return deferred.reject();\n });\n } else {\n promise = this.http.put(url + \"/\" + hash, {\n key: hash,\n value: myFilters\n });\n promise.then(function(data) {\n return deferred.resolve();\n });\n promise.then(null, (function(_this) {\n return function(data) {\n var innerPromise;\n innerPromise = _this.http.post(\"\" + url, {\n key: hash,\n value: myFilters\n });\n innerPromise.then(function() {\n return deferred.resolve();\n });\n return innerPromise.then(null, function() {\n return deferred.reject();\n });\n };\n })(this));\n }\n return deferred.promise;\n };\n\n FilterRemoteStorageService.prototype.getFilters = function(projectId, filtersHashSuffix) {\n var deferred, hash, ns, promise, url;\n deferred = this.q.defer();\n url = this.urls.resolve(\"user-storage\");\n ns = projectId + \":\" + filtersHashSuffix;\n hash = generateHash([projectId, ns]);\n promise = this.http.get(url + \"/\" + hash);\n promise.then(function(data) {\n return deferred.resolve(data.data.value);\n });\n promise.then(null, function(data) {\n return deferred.resolve({});\n });\n return deferred.promise;\n };\n\n return FilterRemoteStorageService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgFilterRemoteStorageService\", FilterRemoteStorageService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: filter.-slide-down.controller.coffee\n */\n\n(function() {\n var FilterSlideDownDirective;\n\n FilterSlideDownDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var filter;\n filter = $('tg-filter');\n return scope.$watch(attrs.ngIf, function(value) {\n var contentHeight, wrapperHeight;\n if (value) {\n filter.find('.filter-list').hide();\n wrapperHeight = filter.height();\n contentHeight = 0;\n filter.children().each(function() {\n return contentHeight += $(this).outerHeight(true);\n });\n return $(el.context.nextSibling).css({\n \"max-height\": wrapperHeight - contentHeight,\n \"display\": \"block\"\n });\n }\n });\n };\n return {\n priority: 900,\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgFilterSlideDown\", [FilterSlideDownDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: filter.controller.coffee\n */\n\n(function() {\n var FilterController;\n\n FilterController = (function() {\n FilterController.$inject = [];\n\n function FilterController() {\n this.opened = null;\n this.customFilterForm = false;\n this.customFilterName = '';\n }\n\n FilterController.prototype.toggleFilterCategory = function(filterName) {\n if (this.opened === filterName) {\n return this.opened = null;\n } else {\n return this.opened = filterName;\n }\n };\n\n FilterController.prototype.isOpen = function(filterName) {\n return this.opened === filterName;\n };\n\n FilterController.prototype.saveCustomFilter = function() {\n this.onSaveCustomFilter({\n name: this.customFilterName\n });\n this.customFilterForm = false;\n this.opened = 'custom-filter';\n return this.customFilterName = '';\n };\n\n FilterController.prototype.changeQ = function() {\n return this.onChangeQ({\n q: this.q\n });\n };\n\n FilterController.prototype.unselectFilter = function(filter) {\n return this.onRemoveFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.unselectFilter = function(filter) {\n return this.onRemoveFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.selectFilter = function(filterCategory, filter) {\n filter = {\n category: filterCategory,\n filter: filter\n };\n return this.onAddFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.removeCustomFilter = function(filter) {\n return this.onRemoveCustomFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.selectCustomFilter = function(filter) {\n return this.onSelectCustomFilter({\n filter: filter\n });\n };\n\n FilterController.prototype.isFilterSelected = function(filterCategory, filter) {\n return !!_.find(this.selectedFilters, function(it) {\n return filter.id === it.id && filterCategory.dataType === it.dataType;\n });\n };\n\n return FilterController;\n\n })();\n\n angular.module('taigaComponents').controller('Filter', FilterController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: filter.directive.coffee\n */\n\n(function() {\n var FilterDirective;\n\n FilterDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var unwatch;\n unwatch = scope.$watch(\"vm.defaultQ\", function(q) {\n if (q && !scope.vm.filtersForm.$dirty) {\n scope.vm.q = q;\n return unwatch();\n } else if (scope.vm.filtersForm.$dirty) {\n return unwatch();\n }\n });\n return attrs.$observe(\"open\", function(open) {\n open = scope.$eval(open);\n if (open) {\n return el.addClass('open');\n } else {\n return el.removeClass('open');\n }\n });\n };\n return {\n scope: {\n onChangeQ: \"&\",\n onAddFilter: \"&\",\n onSelectCustomFilter: \"&\",\n onRemoveFilter: \"&\",\n onRemoveCustomFilter: \"&\",\n onSaveCustomFilter: \"&\",\n customFilters: \"<\",\n defaultQ: \"=q\",\n filters: \"<\",\n customFilters: \"<\",\n selectedFilters: \"<\"\n },\n bindToController: true,\n controller: \"Filter\",\n controllerAs: \"vm\",\n templateUrl: 'components/filter/filter.html',\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgFilter\", [FilterDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: joy-ride.directive.coffee\n */\n\n(function() {\n var JoyRideDirective, taiga;\n\n taiga = this.taiga;\n\n JoyRideDirective = function($rootScope, currentUserService, joyRideService, $location, $translate) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var initJoyrRide, intro, unsuscribe;\n unsuscribe = null;\n intro = introJs();\n intro.oncomplete(function() {\n return $('html,body').scrollTop(0);\n });\n intro.onexit(function() {\n return currentUserService.disableJoyRide();\n });\n initJoyrRide = function(next, config) {\n if (!config[next.joyride]) {\n return;\n }\n intro.setOptions({\n exitOnEsc: false,\n exitOnOverlayClick: false,\n showStepNumbers: false,\n nextLabel: $translate.instant('JOYRIDE.NAV.NEXT') + ' →',\n prevLabel: '← ' + $translate.instant('JOYRIDE.NAV.BACK'),\n skipLabel: $translate.instant('JOYRIDE.NAV.SKIP'),\n doneLabel: $translate.instant('JOYRIDE.NAV.DONE'),\n disableInteraction: true\n });\n intro.setOption('steps', joyRideService.get(next.joyride));\n return intro.start();\n };\n return $rootScope.$on('$routeChangeSuccess', function(event, next) {\n if (!next.joyride || !currentUserService.isAuthenticated()) {\n intro.exit();\n if (unsuscribe) {\n unsuscribe();\n }\n return;\n }\n intro.oncomplete(function() {\n return currentUserService.disableJoyRide(next.joyride);\n });\n if (next.loader) {\n return unsuscribe = $rootScope.$on('loader:end', function() {\n currentUserService.loadJoyRideConfig().then(function(config) {\n return initJoyrRide(next, config);\n });\n return unsuscribe();\n });\n } else {\n return currentUserService.loadJoyRideConfig().then(function(config) {\n return initJoyrRide(next, config);\n });\n }\n });\n };\n return {\n scope: {},\n link: link\n };\n };\n\n JoyRideDirective.$inject = [\"$rootScope\", \"tgCurrentUserService\", \"tgJoyRideService\", \"$location\", \"$translate\"];\n\n angular.module(\"taigaComponents\").directive(\"tgJoyRide\", JoyRideDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: joy-ride.service.coffee\n */\n\n(function() {\n var JoyRideService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n JoyRideService = (function(superClass) {\n extend(JoyRideService, superClass);\n\n JoyRideService.$inject = ['$translate', 'tgCheckPermissionsService'];\n\n function JoyRideService(translate, checkPermissionsService) {\n this.translate = translate;\n this.checkPermissionsService = checkPermissionsService;\n }\n\n JoyRideService.prototype.getConfig = function() {\n return {\n dashboard: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.project-list > section:not(.ng-hide)',\n position: 'left',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP1.TITLE'),\n text: _this.translate.instant('JOYRIDE.DASHBOARD.STEP1.TEXT')\n }\n }, {\n element: '.working-on-container',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.DASHBOARD.STEP2.TEXT')\n }\n }, {\n element: '.watching-container',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TITLE'),\n text: [_this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT1'), _this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT2')]\n }\n }\n ];\n if (!$('.project-list .create-project-button').is(':hidden')) {\n steps.push({\n element: '.project-list .create-project-button',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TITLE'),\n text: [_this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT1'), _this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT2')]\n }\n });\n }\n return steps;\n };\n })(this),\n backlog: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.summary',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP1.TITLE'),\n text: [_this.translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT1'), _this.translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT2')]\n }\n }, {\n element: '.backlog-table-empty',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP2.TEXT')\n }\n }, {\n element: '.sprints',\n position: 'left',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP3.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP3.TEXT')\n }\n }\n ];\n if (_this.checkPermissionsService.check('add_us')) {\n steps.push({\n element: '.new-us',\n position: 'rigth',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP4.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP4.TEXT')\n }\n });\n }\n return steps;\n };\n })(this),\n kanban: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.kanban-table-inner',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP1.TITLE'),\n text: _this.translate.instant('JOYRIDE.KANBAN.STEP1.TEXT')\n }\n }, {\n element: '.card-placeholder',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.KANBAN.STEP2.TEXT')\n }\n }\n ];\n if (_this.checkPermissionsService.check('add_us')) {\n steps.push({\n element: '.add-action',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP3.TITLE'),\n text: [_this.translate.instant('JOYRIDE.KANBAN.STEP3.TEXT1'), _this.translate.instant('JOYRIDE.KANBAN.STEP3.TEXT2')]\n }\n });\n }\n return steps;\n };\n })(this)\n };\n };\n\n JoyRideService.prototype.get = function(name) {\n var joyRide, joyRides;\n joyRides = this.getConfig();\n joyRide = joyRides[name].call(this);\n return _.map(joyRide, function(item) {\n var html;\n html = \"\";\n if (item.joyride.title) {\n html += \"

    \" + item.joyride.title + \"

    \";\n }\n if (_.isArray(item.joyride.text)) {\n _.forEach(item.joyride.text, function(text) {\n return html += \"

    \" + text + \"

    \";\n });\n } else {\n html += \"

    \" + item.joyride.text + \"

    \";\n }\n item.intro = html;\n return item;\n });\n };\n\n return JoyRideService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgJoyRideService\", JoyRideService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: kanban-board-zoom.directive.coffee\n */\n\n(function() {\n var KanbanBoardZoomDirective;\n\n KanbanBoardZoomDirective = function(storage, projectService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var getZoomView, unwatch, zooms;\n scope.zoomIndex = storage.get(\"kanban_zoom\") || 2;\n scope.levels = 5;\n zooms = [[\"ref\"], [\"subject\"], [\"owner\", \"tags\", \"extra_info\", \"unfold\"], [\"attachments\"], [\"related_tasks\", \"empty_extra_info\"]];\n getZoomView = function(zoomIndex) {\n if (zoomIndex == null) {\n zoomIndex = 0;\n }\n if (storage.get(\"kanban_zoom\") !== zoomIndex) {\n storage.set(\"kanban_zoom\", zoomIndex);\n }\n return _.reduce(zooms, function(result, value, key) {\n if (key <= zoomIndex) {\n result = result.concat(value);\n }\n return result;\n });\n };\n scope.$watch('zoomIndex', function(zoomLevel) {\n var zoom;\n zoom = getZoomView(zoomLevel);\n return scope.onZoomChange({\n zoomLevel: zoomLevel,\n zoom: zoom\n });\n });\n return unwatch = scope.$watch(function() {\n return projectService.project;\n }, function(project) {\n if (project) {\n if (project.get('my_permissions').indexOf(\"view_tasks\") === -1) {\n scope.levels = 4;\n }\n return unwatch();\n }\n });\n };\n return {\n scope: {\n onZoomChange: \"&\"\n },\n template: \"\",\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgKanbanBoardZoom\", [\"$tgStorage\", \"tgProjectService\", KanbanBoardZoomDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Andrey Antukh \n * Copyright (C) 2014-2015 Jesús Espino Garcia \n * Copyright (C) 2014-2015 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: live-announcement.directive.coffee\n */\n\n(function() {\n var LiveAnnouncementDirective;\n\n LiveAnnouncementDirective = function(liveAnnouncementService) {\n var link;\n link = function(scope, el, attrs) {};\n return {\n restrict: \"AE\",\n scope: {},\n controllerAs: 'vm',\n controller: function() {\n this.close = function() {\n return liveAnnouncementService.open = false;\n };\n return Object.defineProperties(this, {\n open: {\n get: function() {\n return liveAnnouncementService.open;\n }\n },\n title: {\n get: function() {\n return liveAnnouncementService.title;\n }\n },\n desc: {\n get: function() {\n return liveAnnouncementService.desc;\n }\n }\n });\n },\n link: link,\n templateUrl: \"components/live-announcement/live-announcement.html\"\n };\n };\n\n LiveAnnouncementDirective.$inject = [\"tgLiveAnnouncementService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgLiveAnnouncement\", LiveAnnouncementDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: notification.service.coffee\n */\n\n(function() {\n var LiveAnnouncementService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n LiveAnnouncementService = (function(superClass) {\n extend(LiveAnnouncementService, superClass);\n\n function LiveAnnouncementService() {\n this.open = false;\n this.title = \"\";\n this.desc = \"\";\n }\n\n LiveAnnouncementService.prototype.show = function(title, desc) {\n this.open = true;\n this.title = title;\n return this.desc = desc;\n };\n\n return LiveAnnouncementService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgLiveAnnouncementService\", LiveAnnouncementService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-logo-big-src.directive.coffee\n */\n\n(function() {\n var ProjectLogoBigSrcDirective;\n\n ProjectLogoBigSrcDirective = function(projectLogoService) {\n var link;\n link = function(scope, el, attrs) {\n return scope.$watch('project', function(project) {\n var logo, projectLogo;\n project = Immutable.fromJS(project);\n if (!project) {\n return;\n }\n projectLogo = project.get('logo_big_url');\n if (projectLogo) {\n el.attr('src', projectLogo);\n return el.css('background', \"\");\n } else {\n logo = projectLogoService.getDefaultProjectLogo(project.get('slug'), project.get('id'));\n el.attr('src', logo.src);\n return el.css('background', logo.color);\n }\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoBigSrc\"\n }\n };\n };\n\n ProjectLogoBigSrcDirective.$inject = [\"tgProjectLogoService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoBigSrc\", ProjectLogoBigSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-logo-small-src.directive.coffee\n */\n\n(function() {\n var ProjectLogoSmallSrcDirective;\n\n ProjectLogoSmallSrcDirective = function(projectLogoService) {\n var link;\n link = function(scope, el, attrs) {\n return scope.$watch('project', function(project) {\n var logo, projectLogo;\n project = Immutable.fromJS(project);\n if (!project) {\n return;\n }\n projectLogo = project.get('logo_small_url');\n if (projectLogo) {\n el.attr('src', projectLogo);\n return el.css('background', \"\");\n } else {\n logo = projectLogoService.getDefaultProjectLogo(project.get('slug'), project.get('id'));\n el.attr('src', logo.src);\n return el.css('background', logo.color);\n }\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoSmallSrc\"\n }\n };\n };\n\n ProjectLogoSmallSrcDirective.$inject = [\"tgProjectLogoService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoSmallSrc\", ProjectLogoSmallSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-menu.controller.coffee\n */\n\n(function() {\n var ProjectMenuController;\n\n ProjectMenuController = (function() {\n ProjectMenuController.$inject = [\"tgProjectService\", \"tgLightboxFactory\"];\n\n function ProjectMenuController(projectService, lightboxFactory) {\n this.projectService = projectService;\n this.lightboxFactory = lightboxFactory;\n this.project = null;\n this.menu = Immutable.Map();\n }\n\n ProjectMenuController.prototype.show = function() {\n this.project = this.projectService.project;\n this.active = this._getActiveSection();\n this._setVideoConference();\n return this._setMenuPermissions();\n };\n\n ProjectMenuController.prototype.hide = function() {\n this.project = null;\n return this.menu = {};\n };\n\n ProjectMenuController.prototype.search = function() {\n return this.lightboxFactory.create(\"tg-search-box\", {\n \"class\": \"lightbox lightbox-search\"\n });\n };\n\n ProjectMenuController.prototype._setVideoConference = function() {\n var videoconferenceUrl;\n videoconferenceUrl = this._videoConferenceUrl();\n if (videoconferenceUrl) {\n return this.project = this.project.set(\"videoconferenceUrl\", videoconferenceUrl);\n }\n };\n\n ProjectMenuController.prototype._setMenuPermissions = function() {\n this.menu = Immutable.Map({\n epics: false,\n backlog: false,\n kanban: false,\n issues: false,\n wiki: false\n });\n if (this.project.get(\"is_epics_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_epics\") !== -1) {\n this.menu = this.menu.set(\"epics\", true);\n }\n if (this.project.get(\"is_backlog_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_us\") !== -1) {\n this.menu = this.menu.set(\"backlog\", true);\n }\n if (this.project.get(\"is_kanban_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_us\") !== -1) {\n this.menu = this.menu.set(\"kanban\", true);\n }\n if (this.project.get(\"is_issues_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_issues\") !== -1) {\n this.menu = this.menu.set(\"issues\", true);\n }\n if (this.project.get(\"is_wiki_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_wiki_pages\") !== -1) {\n return this.menu = this.menu.set(\"wiki\", true);\n }\n };\n\n ProjectMenuController.prototype._getActiveSection = function() {\n var indexBacklog, indexKanban, oldSectionName, sectionName, sectionsBreadcrumb;\n sectionName = this.projectService.section;\n sectionsBreadcrumb = this.projectService.sectionsBreadcrumb;\n indexBacklog = sectionsBreadcrumb.lastIndexOf(\"backlog\");\n indexKanban = sectionsBreadcrumb.lastIndexOf(\"kanban\");\n if (indexBacklog !== -1 || indexKanban !== -1) {\n if (indexKanban === -1 || indexBacklog > indexKanban) {\n oldSectionName = \"backlog\";\n } else {\n oldSectionName = \"kanban\";\n }\n }\n if (sectionName === \"backlog-kanban\") {\n if (oldSectionName === \"backlog\" || oldSectionName === \"kanban\") {\n sectionName = oldSectionName;\n } else if (this.project.get(\"is_backlog_activated\") && !this.project.get(\"is_kanban_activated\")) {\n sectionName = \"backlog\";\n } else if (!this.project.get(\"is_backlog_activated\") && this.project.get(\"is_kanban_activated\")) {\n sectionName = \"kanban\";\n }\n }\n return sectionName;\n };\n\n ProjectMenuController.prototype._videoConferenceUrl = function() {\n var baseUrl, url;\n if (this.project.get(\"videoconferences\") === \"appear-in\") {\n baseUrl = \"https://appear.in/\";\n } else if (this.project.get(\"videoconferences\") === \"talky\") {\n baseUrl = \"https://talky.io/\";\n } else if (this.project.get(\"videoconferences\") === \"jitsi\") {\n baseUrl = \"https://meet.jit.si/\";\n } else if (this.project.get(\"videoconferences\") === \"custom\") {\n return this.project.get(\"videoconferences_extra_data\");\n } else {\n return \"\";\n }\n if (this.project.get(\"videoconferences_extra_data\")) {\n url = this.project.get(\"slug\") + \"-\" + taiga.slugify(this.project.get(\"videoconferences_extra_data\"));\n } else {\n url = this.project.get(\"slug\");\n }\n if (this.project.get(\"videoconferences\") === \"jitsi\") {\n url = url.replace(/-/g, \"\");\n }\n return baseUrl + url;\n };\n\n return ProjectMenuController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"ProjectMenu\", ProjectMenuController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-menu.directive.coffee\n */\n\n(function() {\n var ProjectMenuDirective, taiga;\n\n taiga = this.taiga;\n\n ProjectMenuDirective = function(projectService, lightboxFactory) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var projectChange;\n projectChange = function() {\n if (projectService.project) {\n return ctrl.show();\n } else {\n return ctrl.hide();\n }\n };\n scope.$watch((function() {\n return projectService.project;\n }), projectChange);\n scope.vm.fixed = false;\n return $(window).on(\"scroll\", function() {\n var position;\n position = $(window).scrollTop();\n if (position > 100 && scope.vm.fixed === false) {\n scope.vm.fixed = true;\n return scope.$digest();\n } else if (position < 100 && scope.vm.fixed === true) {\n scope.vm.fixed = false;\n return scope.$digest();\n }\n });\n };\n return {\n scope: {},\n controller: \"ProjectMenu\",\n controllerAs: \"vm\",\n templateUrl: \"components/project-menu/project-menu.html\",\n link: link\n };\n };\n\n ProjectMenuDirective.$inject = [\"tgProjectService\", \"tgLightboxFactory\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectMenu\", ProjectMenuDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.directive.coffee\n */\n\n(function() {\n var TagOptionDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagOptionDirective = function() {\n var dispatch, link, select, stop;\n select = function(selected) {\n var containerHeight, diff, selectedPosition;\n selected.addClass('selected');\n selectedPosition = selected.position().top + selected.outerHeight();\n containerHeight = selected.parent().outerHeight();\n if (selectedPosition > containerHeight) {\n diff = selectedPosition - containerHeight;\n return selected.parent().scrollTop(selected.parent().scrollTop() + diff);\n } else if (selected.position().top < 0) {\n return selected.parent().scrollTop(selected.parent().scrollTop() + selected.position().top);\n }\n };\n dispatch = function(el, code, scope) {\n var activeElement, next, prev;\n activeElement = el.find(\".selected\");\n if (code === 40) {\n if (!activeElement.length) {\n return select(el.find('li:first'));\n } else {\n next = activeElement.next('li');\n if (next.length) {\n activeElement.removeClass('selected');\n return select(next);\n }\n }\n } else if (code === 38) {\n if (!activeElement.length) {\n return select(el.find('li:last'));\n } else {\n prev = activeElement.prev('li');\n if (prev.length) {\n activeElement.removeClass('selected');\n return select(prev);\n }\n }\n }\n };\n stop = function() {\n return $(document).off(\".tags-keyboard-navigation\");\n };\n link = function(scope, el) {\n stop();\n $(el).parent().on(\"keydown.tags-keyboard-navigation\", (function(_this) {\n return function(event) {\n var code;\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 40 || code === 38) {\n event.preventDefault();\n return dispatch(el, code, scope);\n }\n };\n })(this));\n return scope.$on(\"$destroy\", stop);\n };\n return {\n link: link,\n templateUrl: \"components/tags/tag-dropdown/tag-dropdown.html\",\n scope: {\n onSelectTag: \"&\",\n colorArray: \"=\",\n tag: \"=\"\n }\n };\n };\n\n module.directive(\"tgTagsDropdown\", TagOptionDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.controller.coffee\n */\n\n(function() {\n var TagLineCommonController, module, trim;\n\n trim = this.taiga.trim;\n\n module = angular.module('taigaCommon');\n\n TagLineCommonController = (function() {\n TagLineCommonController.$inject = [\"tgTagLineService\"];\n\n function TagLineCommonController(tagLineService) {\n this.tagLineService = tagLineService;\n this.disableColorSelection = false;\n this.newTag = {\n name: \"\",\n color: null\n };\n this.colorArray = [];\n this.addTag = false;\n }\n\n TagLineCommonController.prototype.checkPermissions = function() {\n return this.tagLineService.checkPermissions(this.project.my_permissions, this.permissions);\n };\n\n TagLineCommonController.prototype._createColorsArray = function(projectTagColors) {\n return this.colorArray = this.tagLineService.createColorsArray(projectTagColors);\n };\n\n TagLineCommonController.prototype.displayTagInput = function() {\n return this.addTag = true;\n };\n\n TagLineCommonController.prototype.addNewTag = function(name, color) {\n this.newTag.name = \"\";\n this.newTag.color = null;\n if (!name.length) {\n return;\n }\n if (this.disableColorSelection) {\n if (name.length) {\n return this.onAddTag({\n name: name,\n color: color\n });\n }\n } else {\n if (this.project.tags_colors[name]) {\n color = this.project.tags_colors[name];\n }\n return this.onAddTag({\n name: name,\n color: color\n });\n }\n };\n\n TagLineCommonController.prototype.selectColor = function(color) {\n return this.newTag.color = color;\n };\n\n return TagLineCommonController;\n\n })();\n\n module.controller(\"TagLineCommonCtrl\", TagLineCommonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.directive.coffee\n */\n\n(function() {\n var TagLineCommonDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagLineCommonDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n var unwatch;\n if (!_.isUndefined(attr.disableColorSelection)) {\n ctrl.disableColorSelection = true;\n }\n unwatch = scope.$watch(\"vm.project\", function(project) {\n if (!project || !Object.keys(project).length) {\n return;\n }\n unwatch();\n if (!ctrl.disableColorSelection) {\n return ctrl.colorArray = ctrl._createColorsArray(ctrl.project.tags_colors);\n }\n });\n return el.on(\"keydown\", \".tag-input\", function(event) {\n var tagName;\n if (event.keyCode === 27) {\n ctrl.addTag = false;\n ctrl.newTag.name = \"\";\n ctrl.newTag.color = \"\";\n event.stopPropagation();\n } else if (event.keyCode === 13) {\n event.preventDefault();\n if (el.find('.tags-dropdown .selected').length) {\n tagName = $('.tags-dropdown .selected .tags-dropdown-name').text();\n ctrl.addNewTag(tagName, null);\n } else {\n ctrl.addNewTag(ctrl.newTag.name, ctrl.newTag.color);\n }\n }\n return scope.$apply();\n });\n };\n return {\n link: link,\n scope: {\n permissions: \"@\",\n loadingAddTag: \"=\",\n loadingRemoveTag: \"=\",\n tags: \"=\",\n project: \"=\",\n onAddTag: \"&\",\n onDeleteTag: \"&\"\n },\n templateUrl: \"components/tags/tag-line-common/tag-line-common.html\",\n controller: \"TagLineCommonCtrl\",\n controllerAs: \"vm\",\n bindToController: true\n };\n };\n\n module.directive(\"tgTagLineCommon\", TagLineCommonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.controller.coffee\n */\n\n(function() {\n var TagLineController, module, trim;\n\n trim = this.taiga.trim;\n\n module = angular.module('taigaCommon');\n\n TagLineController = (function() {\n TagLineController.$inject = [\"$rootScope\", \"$tgConfirm\", \"$tgQueueModelTransformation\"];\n\n function TagLineController(rootScope, confirm, modelTransform) {\n this.rootScope = rootScope;\n this.confirm = confirm;\n this.modelTransform = modelTransform;\n this.loadingAddTag = false;\n }\n\n TagLineController.prototype.onDeleteTag = function(tag) {\n var onDeleteTagError, onDeleteTagSuccess, tagName, transform;\n this.loadingRemoveTag = tag[0];\n onDeleteTagSuccess = (function(_this) {\n return function(item) {\n _this.rootScope.$broadcast(\"object:updated\");\n _this.loadingRemoveTag = false;\n return item;\n };\n })(this);\n onDeleteTagError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.loadingRemoveTag = false;\n };\n })(this);\n tagName = trim(tag[0].toLowerCase());\n transform = this.modelTransform.save(function(item) {\n var itemtags;\n itemtags = _.clone(item.tags);\n _.remove(itemtags, function(tag) {\n return tag[0] === tagName;\n });\n item.tags = itemtags;\n return item;\n });\n return transform.then(onDeleteTagSuccess, onDeleteTagError);\n };\n\n TagLineController.prototype.onAddTag = function(tag, color) {\n var onAddTagError, onAddTagSuccess, transform;\n this.loadingAddTag = true;\n onAddTagSuccess = (function(_this) {\n return function(item) {\n _this.rootScope.$broadcast(\"object:updated\");\n _this.addTag = false;\n _this.loadingAddTag = false;\n return item;\n };\n })(this);\n onAddTagError = (function(_this) {\n return function() {\n _this.loadingAddTag = false;\n return _this.confirm.notify(\"error\");\n };\n })(this);\n transform = this.modelTransform.save((function(_this) {\n return function(item) {\n var itemtags, value;\n value = trim(tag.toLowerCase());\n itemtags = _.clone(item.tags);\n itemtags.push([tag, color]);\n item.tags = itemtags;\n return item;\n };\n })(this));\n return transform.then(onAddTagSuccess, onAddTagError);\n };\n\n return TagLineController;\n\n })();\n\n module.controller(\"TagLineCtrl\", TagLineController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.directive.coffee\n */\n\n(function() {\n var TagLineDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagLineDirective = function() {\n return {\n scope: {\n item: \"=\",\n permissions: \"@\",\n project: \"=\"\n },\n templateUrl: \"components/tags/tag-line-detail/tag-line-detail.html\",\n controller: \"TagLineCtrl\",\n controllerAs: \"vm\",\n bindToController: true\n };\n };\n\n module.directive(\"tgTagLine\", TagLineDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.service.coffee\n */\n\n(function() {\n var TagLineService, module,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n module = angular.module('taigaCommon');\n\n TagLineService = (function(superClass) {\n extend(TagLineService, superClass);\n\n TagLineService.$inject = [];\n\n function TagLineService() {}\n\n TagLineService.prototype.checkPermissions = function(myPermissions, projectPermissions) {\n return _.includes(myPermissions, projectPermissions);\n };\n\n TagLineService.prototype.createColorsArray = function(projectTagColors) {\n return _.map(projectTagColors, function(index, value) {\n return [value, index];\n });\n };\n\n return TagLineService;\n\n })(taiga.Service);\n\n module.service(\"tgTagLineService\", TagLineService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tag-line.directive.coffee\n */\n\n(function() {\n var TagDirective, module;\n\n module = angular.module('taigaCommon');\n\n TagDirective = function() {\n return {\n templateUrl: \"components/tags/tag/tag.html\",\n scope: {\n tag: \"<\",\n loadingRemoveTag: \"<\",\n onDeleteTag: \"&\",\n hasPermissions: \"@\"\n }\n };\n };\n\n module.directive(\"tgTag\", TagDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: taskboard-zoom.directive.coffee\n */\n\n(function() {\n var TaskboardZoomDirective;\n\n TaskboardZoomDirective = function(storage) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var getZoomView, zooms;\n scope.zoomIndex = storage.get(\"taskboard_zoom\") || 2;\n scope.levels = 4;\n zooms = [[\"ref\"], [\"subject\"], [\"owner\", \"tags\", \"extra_info\", \"unfold\"], [\"attachments\", \"empty_extra_info\"], [\"related_tasks\"]];\n getZoomView = function(zoomIndex) {\n if (zoomIndex == null) {\n zoomIndex = 0;\n }\n if (storage.get(\"taskboard_zoom\") !== zoomIndex) {\n storage.set(\"taskboard_zoom\", zoomIndex);\n }\n return _.reduce(zooms, function(result, value, key) {\n if (key <= zoomIndex) {\n result = result.concat(value);\n }\n return result;\n });\n };\n return scope.$watch('zoomIndex', function(zoomLevel) {\n var zoom;\n zoom = getZoomView(zoomLevel);\n return scope.onZoomChange({\n zoomLevel: zoomLevel,\n zoom: zoom\n });\n });\n };\n return {\n scope: {\n onZoomChange: \"&\"\n },\n template: \"\",\n link: link\n };\n };\n\n angular.module('taigaComponents').directive(\"tgTaskboardZoom\", [\"$tgStorage\", TaskboardZoomDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Andrey Antukh \n * Copyright (C) 2014-2015 Jesús Espino Garcia \n * Copyright (C) 2014-2015 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: terms-announcement.directive.coffee\n */\n\n(function() {\n var TermsAnnouncementDirective;\n\n TermsAnnouncementDirective = function(TermsAnnouncementService, $repo, $auth, $config, $model) {\n var link;\n link = function(scope, el, attrs) {\n scope.privacyPolicyUrl = $config.get(\"privacyPolicyUrl\");\n scope.termsOfServiceUrl = $config.get(\"termsOfServiceUrl\");\n return scope.GDPRUrl = $config.get(\"GDPRUrl\");\n };\n return {\n restrict: \"AE\",\n scope: {},\n controllerAs: 'vm',\n controller: function() {\n this.close = function() {\n var onSuccess, user, userData;\n TermsAnnouncementService.open = false;\n user = $auth.getUser();\n if (user.read_new_terms === void 0) {\n userData = user.getAttrs();\n userData.read_new_terms = false;\n user = $model.make_model(\"users\", userData);\n }\n user.read_new_terms = true;\n onSuccess = function(data) {\n return $auth.setUser(data);\n };\n return $repo.save(user).then(onSuccess);\n };\n return Object.defineProperties(this, {\n open: {\n get: function() {\n return TermsAnnouncementService.open;\n }\n }\n });\n },\n link: link,\n templateUrl: \"components/terms-announcement/terms-announcement.html\"\n };\n };\n\n TermsAnnouncementDirective.$inject = [\"tgTermsAnnouncementService\", \"$tgRepo\", \"$tgAuth\", \"$tgConfig\", \"$tgModel\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTermsAnnouncement\", TermsAnnouncementDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: terms-announcement.service.coffee\n */\n\n(function() {\n var TermsAnnouncementService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n TermsAnnouncementService = (function(superClass) {\n extend(TermsAnnouncementService, superClass);\n\n function TermsAnnouncementService() {\n this.open = false;\n }\n\n TermsAnnouncementService.prototype.show = function() {\n return this.open = true;\n };\n\n return TermsAnnouncementService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgTermsAnnouncementService\", TermsAnnouncementService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.directive.coffee\n */\n\n(function() {\n var TermsOfServiceAndPrivacyPolicyNoticeDirective;\n\n TermsOfServiceAndPrivacyPolicyNoticeDirective = function($config) {\n var link;\n link = function(scope, el, attrs) {\n scope.privacyPolicyUrl = $config.get(\"privacyPolicyUrl\");\n scope.termsOfServiceUrl = $config.get(\"termsOfServiceUrl\");\n scope.target = false;\n if (!scope.privacyPolicyUrl || !scope.termsOfServiceUrl) {\n scope.target = true;\n }\n return el.on(\"change\", \"input[name='accepted_terms']\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n scope.target = target.is(\":checked\");\n return scope.$apply();\n });\n };\n return {\n restrict: \"AE\",\n link: link,\n scope: {\n target: \"=\"\n },\n templateUrl: \"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgTermsOfServiceAndPrivacyPolicyNotice\", [\"$tgConfig\", TermsOfServiceAndPrivacyPolicyNoticeDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tribe-button.directive.coffee\n */\n\n(function() {\n var TribeButtonDirective;\n\n TribeButtonDirective = function(configService, locationService) {\n var link;\n link = function(scope, el, attrs) {\n scope.vm = {};\n scope.vm.tribeHost = configService.config.tribeHost;\n scope.vm.url = (locationService.protocol()) + \"://\" + (locationService.host());\n if (locationService.protocol() === \"http\" && locationService.port() !== 80) {\n return scope.vm.url = scope.vm.url + \":\" + (locationService.port());\n } else if (locationService.protocol() === \"https\" && locationService.port() !== 443) {\n return scope.vm.url = scope.vm.url + \":\" + (locationService.port());\n }\n };\n return {\n scope: {\n usId: \"=\",\n projectSlug: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/tribe-button/tribe-button.html\",\n link: link\n };\n };\n\n TribeButtonDirective.$inject = [\"$tgConfig\", \"$tgLocation\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTribeButton\", TribeButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tribe-linked.directive.coffee\n */\n\n(function() {\n var TribeLinkedDirective;\n\n TribeLinkedDirective = function(configService) {\n var directive, link;\n link = function(scope, el, attrs) {\n scope.vm = {};\n scope.vm.tribeHost = configService.config.tribeHost;\n scope.vm.show = function() {\n return scope.vm.open = true;\n };\n return scope.vm.hide = function(event) {\n return scope.vm.open = false;\n };\n };\n directive = {\n templateUrl: \"components/tribe-button/tribe-linked.html\",\n scope: {\n gigTitle: \"=\",\n gigId: \"=\"\n },\n link: link\n };\n return directive;\n };\n\n TribeLinkedDirective.$inject = [\"$tgConfig\"];\n\n angular.module(\"taigaComponents\").directive(\"tgTribeLinked\", TribeLinkedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: vote-button.controller.coffee\n */\n\n(function() {\n var VoteButtonController;\n\n VoteButtonController = (function() {\n VoteButtonController.$inject = [\"tgCurrentUserService\"];\n\n function VoteButtonController(currentUserService) {\n this.currentUserService = currentUserService;\n this.user = this.currentUserService.getUser();\n this.isMouseOver = false;\n this.loading = false;\n }\n\n VoteButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n VoteButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n VoteButtonController.prototype.toggleVote = function() {\n var promise;\n this.loading = true;\n if (!this.item.is_voter) {\n promise = this._upvote();\n } else {\n promise = this._downvote();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n VoteButtonController.prototype._upvote = function() {\n return this.onUpvote().then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this));\n };\n\n VoteButtonController.prototype._downvote = function() {\n return this.onDownvote();\n };\n\n return VoteButtonController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"VoteButton\", VoteButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: vote-button.directive.coffee\n */\n\n(function() {\n var VoteButtonDirective;\n\n VoteButtonDirective = function() {\n return {\n scope: {},\n controller: \"VoteButton\",\n bindToController: {\n item: \"=\",\n onUpvote: \"=\",\n onDownvote: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/vote-button/vote-button.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgVoteButton\", VoteButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-button.controller.coffee\n */\n\n(function() {\n var WatchButtonController;\n\n WatchButtonController = (function() {\n WatchButtonController.$inject = [\"tgCurrentUserService\", \"$rootScope\"];\n\n function WatchButtonController(currentUserService, rootScope) {\n this.currentUserService = currentUserService;\n this.rootScope = rootScope;\n this.user = this.currentUserService.getUser();\n this.isMouseOver = false;\n this.loading = false;\n }\n\n WatchButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n WatchButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n WatchButtonController.prototype.openWatchers = function() {\n return this.rootScope.$broadcast(\"watcher:add\", this.item);\n };\n\n WatchButtonController.prototype.getPerms = function() {\n var name, perms;\n if (!this.item) {\n return \"\";\n }\n name = this.item._name;\n perms = {\n userstories: 'modify_us',\n issues: 'modify_issue',\n tasks: 'modify_task',\n epics: 'modify_epic'\n };\n return perms[name];\n };\n\n WatchButtonController.prototype.toggleWatch = function() {\n var promise;\n this.loading = true;\n if (!this.item.is_watcher) {\n promise = this._watch();\n } else {\n promise = this._unwatch();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n WatchButtonController.prototype._watch = function() {\n return this.onWatch().then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this));\n };\n\n WatchButtonController.prototype._unwatch = function() {\n return this.onUnwatch();\n };\n\n return WatchButtonController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"WatchButton\", WatchButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-button.directive.coffee\n */\n\n(function() {\n var WatchButtonDirective;\n\n WatchButtonDirective = function() {\n return {\n scope: {},\n controller: \"WatchButton\",\n bindToController: {\n item: \"=\",\n onWatch: \"=\",\n onUnwatch: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: function(item, attributes) {\n return \"components/watch-button/watch-button-\" + attributes.environment + \".html\";\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWatchButton\", WatchButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/comment-edit-wysiwyg.directive.coffee\n */\n\n(function() {\n var CommentEditWysiwyg;\n\n CommentEditWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n types = {\n epics: \"epic\",\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file, true, true).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n return $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCommentEditWysiwyg\", [\"tgAttachmentsFullService\", CommentEditWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/comment-wysiwyg.directive.coffee\n */\n\n(function() {\n var CommentWysiwyg;\n\n CommentWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n $scope.editableDescription = false;\n $scope.saveComment = function(description, cb) {\n $scope.content = '';\n $scope.vm.type.comment = description;\n return $scope.vm.onAddComment({\n callback: cb\n });\n };\n types = {\n epics: \"epic\",\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.type.id, types[$scope.vm.type._name], file, true, true).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.onChange = function(markdown) {\n return $scope.vm.type.comment = markdown;\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.content = '';\n return $scope.$watch(\"vm.type\", function(value) {\n if (!value) {\n return;\n }\n return $scope.storageKey = \"comment-\" + value.project + \"-\" + value.id + \"-\" + value._name;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCommentWysiwyg\", [\"tgAttachmentsFullService\", CommentWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/comment-edit-wysiwyg.directive.coffee\n */\n\n(function() {\n var CustomFieldEditWysiwyg;\n\n CustomFieldEditWysiwyg = function(attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs) {\n var types, uploadFile;\n types = {\n userstories: \"us\",\n issues: \"issue\",\n tasks: \"task\"\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n return $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n
    \"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgCustomFieldEditWysiwyg\", [\"tgAttachmentsFullService\", CustomFieldEditWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/item-wysiwyg.directive.coffee\n */\n\n(function() {\n var ItemWysiwyg;\n\n ItemWysiwyg = function($modelTransform, $rootscope, $confirm, attachmentsFullService, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var uploadFile;\n $scope.editableDescription = false;\n $scope.saveDescription = function(description, cb) {\n var transform;\n transform = $modelTransform.save(function(item) {\n item.description = description;\n return item;\n });\n transform.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n transform.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return transform[\"finally\"](cb);\n };\n uploadFile = function(file, cb) {\n return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, $attrs.type, file).then(function(result) {\n return cb(result.getIn(['file', 'name']), result.getIn(['file', 'url']));\n });\n };\n $scope.uploadFiles = function(files, cb) {\n var file, i, len, results;\n results = [];\n for (i = 0, len = files.length; i < len; i++) {\n file = files[i];\n results.push(uploadFile(file, cb));\n }\n return results;\n };\n $scope.$watch($attrs.model, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n $scope.version = value.version;\n return $scope.storageKey = $scope.project.id + \"-\" + value.id + \"-\" + $attrs.type;\n });\n return $scope.$watch('project', function(project) {\n if (!project) {\n return;\n }\n return $scope.editableDescription = project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n });\n };\n return {\n scope: true,\n link: link,\n template: \"
    \\n \\n \\n\\n
    \\n\\n \\n {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}}\\n
    \\n\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgItemWysiwyg\", [\"$tgQueueModelTransformation\", \"$rootScope\", \"$tgConfirm\", \"tgAttachmentsFullService\", \"$translate\", ItemWysiwyg]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg-code-hightlighter.service.coffee\n */\n\n(function() {\n var WysiwygCodeHightlighterService;\n\n WysiwygCodeHightlighterService = (function() {\n function WysiwygCodeHightlighterService() {\n Prism.plugins.customClass.prefix('prism-');\n Prism.plugins.customClass.map({});\n }\n\n WysiwygCodeHightlighterService.prototype.getLanguages = function() {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n if (_this.languages) {\n return resolve(_this.languages);\n } else if (_this.loadPromise) {\n return _this.loadPromise.then(function() {\n return resolve(_this.languages);\n });\n } else {\n return _this.loadPromise = $.getJSON(\"/\" + window._version + \"/prism/prism-languages.json\").then(function(_languages_) {\n _this.loadPromise = null;\n _this.languages = _.map(_languages_, function(it) {\n it.url = (\"/\" + window._version + \"/prism/\") + it.file;\n return it;\n });\n return resolve(_this.languages);\n });\n }\n };\n })(this));\n };\n\n WysiwygCodeHightlighterService.prototype.getLanguageInClassList = function(classes) {\n var lan;\n lan = _.find(this.languages, function(it) {\n return !!_.find(classes, function(className) {\n return 'language-' + it.name === className;\n });\n });\n if (lan) {\n return lan.name;\n } else {\n return null;\n }\n };\n\n WysiwygCodeHightlighterService.prototype.loadLanguage = function(lan) {\n return new Promise(function(resolve) {\n if (!Prism.languages[lan]) {\n return ljs.load(\"/\" + window._version + \"/prism/prism-\" + lan + \".min.js\", resolve);\n } else {\n return resolve();\n }\n });\n };\n\n WysiwygCodeHightlighterService.prototype.replaceCodeBrToNl = function(code) {\n return $(code).find('br').replaceWith('\\n');\n };\n\n WysiwygCodeHightlighterService.prototype.hightlightCode = function(code) {\n var lan;\n this.replaceCodeBrToNl(code);\n lan = this.getLanguageInClassList(code.classList);\n if (lan) {\n return this.loadLanguage(lan).then(function() {\n return Prism.highlightElement(code);\n });\n }\n };\n\n WysiwygCodeHightlighterService.prototype.addHightlighter = function(element) {\n var codes;\n codes = $(element).find('code');\n return codes.each((function(_this) {\n return function(index, code) {\n return _this.hightlightCode(code);\n };\n })(this));\n };\n\n return WysiwygCodeHightlighterService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygCodeHightlighterService\", WysiwygCodeHightlighterService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.directive.coffee\n */\n\n(function() {\n var WysiwygCodeLightbox;\n\n WysiwygCodeLightbox = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch('visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n scope.open = true;\n lightboxService.open(el, null, scope.onClose);\n return scope.$applyAsync(function() {\n var textarea;\n textarea = el[0].querySelector('textarea');\n if (textarea) {\n return textarea.select();\n }\n });\n } else if (!visible && el.hasClass('open')) {\n scope.open = false;\n return lightboxService.close(el);\n }\n });\n };\n return {\n scope: {\n languages: '<',\n codeLanguage: '<',\n code: '<',\n visible: '<',\n onClose: '&',\n onSave: '&'\n },\n link: link,\n templateUrl: \"components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWysiwygCodeLightbox\", [\"lightboxService\", WysiwygCodeLightbox]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg-mention.service.coffee\n */\n\n(function() {\n var WysiwygMentionService;\n\n WysiwygMentionService = (function() {\n WysiwygMentionService.$inject = [\"tgProjectService\", \"tgWysiwygService\", \"$tgNavUrls\", \"$tgResources\"];\n\n function WysiwygMentionService(projectService, wysiwygService, navurls, rs) {\n this.projectService = projectService;\n this.wysiwygService = wysiwygService;\n this.navurls = navurls;\n this.rs = rs;\n this.cancelablePromise = null;\n }\n\n WysiwygMentionService.prototype.searchEmoji = function(name, cb) {\n var filteredEmojis;\n filteredEmojis = this.wysiwygService.searchEmojiByName(name);\n filteredEmojis = filteredEmojis.slice(0, 10);\n return cb(filteredEmojis);\n };\n\n WysiwygMentionService.prototype.searchUser = function(term, cb) {\n var searchProps, users;\n searchProps = ['username', 'full_name', 'full_name_display'];\n users = this.projectService.project.toJS().members.filter((function(_this) {\n return function(user) {\n var i, len, prop;\n for (i = 0, len = searchProps.length; i < len; i++) {\n prop = searchProps[i];\n if (taiga.slugify(user[prop]).indexOf(term) >= 0) {\n return true;\n } else if (user[prop].indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n })(this));\n users = users.slice(0, 10).map((function(_this) {\n return function(it) {\n it.url = _this.navurls.resolve('user-profile', {\n project: _this.projectService.project.get('slug'),\n username: it.username\n });\n return it;\n };\n })(this));\n return cb(users);\n };\n\n WysiwygMentionService.prototype.searchItem = function(term) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n var filter, searchProps, searchTypes, urls;\n term = taiga.slugify(term);\n searchTypes = ['issues', 'tasks', 'userstories'];\n urls = {\n issues: \"project-issues-detail\",\n tasks: \"project-tasks-detail\",\n userstories: \"project-userstories-detail\"\n };\n searchProps = ['ref', 'subject'];\n filter = function(item) {\n var i, len, prop;\n for (i = 0, len = searchProps.length; i < len; i++) {\n prop = searchProps[i];\n if (taiga.slugify(item[prop]).indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n if (_this.cancelablePromise) {\n _this.cancelablePromise.abort();\n }\n _this.cancelablePromise = _this.rs.search[\"do\"](_this.projectService.project.get('id'), term);\n return _this.cancelablePromise.then(function(res) {\n var i, items, len, result, type;\n if (res.count < 1 || res.count === res.wikipages.length) {\n return resolve([]);\n } else {\n result = [];\n for (i = 0, len = searchTypes.length; i < len; i++) {\n type = searchTypes[i];\n if (res[type] && res[type].length > 0) {\n items = res[type].filter(filter);\n items = items.map(function(it) {\n it.url = _this.navurls.resolve(urls[type], {\n project: _this.projectService.project.get('slug'),\n ref: it.ref\n });\n return it;\n });\n result = result.concat(items);\n }\n }\n result = _.sortBy(result, [\"ref\"]);\n return resolve(result.slice(0, 10));\n }\n });\n };\n })(this));\n };\n\n WysiwygMentionService.prototype.search = function(mention) {\n return new Promise((function(_this) {\n return function(resolve) {\n if ('#'.indexOf(mention[0]) !== -1) {\n return _this.searchItem(mention.replace('#', '')).then(resolve);\n } else if ('@'.indexOf(mention[0]) !== -1) {\n return _this.searchUser(mention.replace('@', ''), resolve);\n } else if (':'.indexOf(mention[0]) !== -1) {\n return _this.searchEmoji(mention.replace(':', ''), resolve);\n }\n };\n })(this));\n };\n\n return WysiwygMentionService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygMentionService\", WysiwygMentionService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg.directive.coffee\n */\n\n(function() {\n var Medium, bindOnce, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n Medium = function($translate, $confirm, $storage, wysiwygService, animationFrame, tgLoader, wysiwygCodeHightlighterService, wysiwygMentionService, analytics, $location) {\n var AlignRightButton, CodeButton, CustomPasteHandler, addCodeBlockAndHightlight, getIcon, getRangeCodeBlock, isCodeBlockSelected, link, oldIsBlockContainer, refreshCodeBlocks, removeCodeBlockAndHightlight, removeSelections;\n removeSelections = function() {\n if (window.getSelection) {\n if (window.getSelection().empty) {\n return window.getSelection().empty();\n }\n } else if (window.getSelection().removeAllRanges) {\n return window.getSelection().removeAllRanges();\n } else if (document.selection) {\n return document.selection.empty();\n }\n };\n getRangeCodeBlock = function(range) {\n return $(range.endContainer).parentsUntil('.editor', 'code');\n };\n isCodeBlockSelected = function(range) {\n return !!getRangeCodeBlock(range).length;\n };\n removeCodeBlockAndHightlight = function(selection, mediumInstance) {\n var code, p, pre;\n if ($(selection).is('code')) {\n code = selection;\n } else {\n code = $(selection).closest('code')[0];\n }\n pre = code.parentNode;\n p = document.createElement('p');\n p.innerText = code.innerText;\n pre.parentNode.replaceChild(p, pre);\n return mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n };\n addCodeBlockAndHightlight = function(range, mediumInstance) {\n var code, extract, pre, start;\n pre = document.createElement('pre');\n code = document.createElement('code');\n if (!range.startContainer.parentNode.nextSibling) {\n $('
    ').insertAfter(range.startContainer.parentNode);\n }\n start = range.endContainer.parentNode.nextSibling;\n extract = range.extractContents();\n code.appendChild(extract);\n pre.appendChild(code);\n start.parentNode.insertBefore(pre, start);\n refreshCodeBlocks(mediumInstance);\n return mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n };\n refreshCodeBlocks = function(mediumInstance) {\n var i, j, len, len1, mainChildren, p, pre, preList, ref, results;\n if (!mediumInstance) {\n return;\n }\n ref = mediumInstance.elements[0].children;\n for (i = 0, len = ref.length; i < len; i++) {\n mainChildren = ref[i];\n if (mainChildren && mainChildren.tagName.toLowerCase() === 'p' && !mainChildren.innerHTML.trim().length) {\n mainChildren.parentNode.removeChild(mainChildren);\n }\n }\n preList = mediumInstance.elements[0].querySelectorAll('pre');\n results = [];\n for (j = 0, len1 = preList.length; j < len1; j++) {\n pre = preList[j];\n pre.setAttribute('contenteditable', false);\n pre.setAttribute('title', $translate.instant(\"COMMON.WYSIWYG.DB_CLICK\"));\n pre.addEventListener('mousedown', function(e) {\n return e.preventDefault();\n });\n if (pre.nextElementSibling && pre.nextElementSibling.nodeName.toLowerCase() === 'p' && !pre.nextElementSibling.children.length) {\n results.push(pre.nextElementSibling.appendChild(document.createElement('br')));\n } else if (!pre.nextElementSibling || ['p', 'ul', 'h1', 'h2', 'h3'].indexOf(pre.nextElementSibling.nodeName.toLowerCase()) === -1) {\n p = document.createElement('p');\n p.appendChild(document.createElement('br'));\n results.push(pre.parentNode.insertBefore(p, pre.nextSibling));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n AlignRightButton = MediumEditor.extensions.button.extend({\n name: 'rtl',\n init: function() {\n var option;\n option = _.find(this.base.options.toolbar.buttons, function(it) {\n return it.name === 'rtl';\n });\n this.button = this.document.createElement('button');\n this.button.classList.add('medium-editor-action');\n this.button.innerHTML = option.contentDefault || 'RTL';\n this.button.title = 'RTL';\n return this.on(this.button, 'click', this.handleClick.bind(this));\n },\n getButton: function() {\n return this.button;\n },\n handleClick: function(event) {\n var range;\n range = MediumEditor.selection.getSelectionRange(document);\n if (range.commonAncestorContainer.parentNode.style.textAlign === 'right') {\n return document.execCommand('justifyLeft', false);\n } else {\n return document.execCommand('justifyRight', false);\n }\n }\n });\n getIcon = function(icon) {\n return \"\\n \\n\";\n };\n CodeButton = MediumEditor.extensions.button.extend({\n name: 'code',\n init: function() {\n var option;\n option = _.find(this.base.options.toolbar.buttons, function(it) {\n return it.name === 'code';\n });\n this.button = this.document.createElement('button');\n this.button.classList.add('medium-editor-action');\n this.button.innerHTML = option.contentDefault || 'Code';\n this.button.title = 'Code';\n return this.on(this.button, 'click', this.handleClick.bind(this));\n },\n getButton: function() {\n return this.button;\n },\n tagNames: ['code'],\n handleClick: function(event) {\n var range, toolbar;\n range = MediumEditor.selection.getSelectionRange(self.document);\n if (isCodeBlockSelected(range, this.base)) {\n removeCodeBlockAndHightlight(range.endContainer, this.base);\n } else {\n addCodeBlockAndHightlight(range, this.base);\n removeSelections();\n }\n toolbar = this.base.getExtensionByName('toolbar');\n if (toolbar) {\n return toolbar.hideToolbar();\n }\n }\n });\n CustomPasteHandler = MediumEditor.extensions.paste.extend({\n doPaste: function(pastedHTML, pastedPlain, editable) {\n var html;\n html = MediumEditor.util.htmlEntities(pastedPlain);\n return MediumEditor.util.insertHTMLCommand(this.document, html);\n }\n });\n oldIsBlockContainer = MediumEditor.util.isBlockContainer;\n MediumEditor.util.isBlockContainer = function(element) {\n var tagName;\n if (!element) {\n return oldIsBlockContainer(element);\n }\n if (element.tagName) {\n tagName = element.tagName;\n } else {\n tagName = element.parentNode.tagName;\n }\n if (tagName.toLowerCase() === 'code') {\n return true;\n }\n return oldIsBlockContainer(element);\n };\n link = function($scope, $el, $attrs) {\n var cancelWithConfirmation, change, clean, codeBlockSelected, create, discardLocalStorage, editorMarkdown, editorMedium, getCurrentContent, isDraft, isEditOnly, isOutdated, localSave, mediumInstance, notPersist, replaceCodeBrToNl, saveEnd, setEditMode, setHtmlMedium, throttleChange, unwatch, updateMarkdownWithCurrentHtml, uploadEnd;\n mediumInstance = null;\n editorMedium = $el.find('.medium');\n editorMarkdown = $el.find('.markdown');\n codeBlockSelected = null;\n isEditOnly = !!$attrs.$attr.editonly;\n notPersist = !!$attrs.$attr.notPersist;\n $scope.required = !!$attrs.$attr.required;\n $scope.editMode = isEditOnly || false;\n $scope.mode = $storage.get('editor-mode', 'html');\n $scope.markdown = '';\n $scope.codeEditorVisible = false;\n $scope.codeLans = [];\n wysiwygCodeHightlighterService.getLanguages().then(function(codeLans) {\n return $scope.codeLans = codeLans;\n });\n setEditMode = function(editMode) {\n return $scope.editMode = editMode;\n };\n setHtmlMedium = function(markdown) {\n var html;\n html = wysiwygService.getHTML(markdown);\n editorMedium.html(html);\n wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]);\n if ($scope.editMode) {\n return refreshCodeBlocks(mediumInstance);\n }\n };\n $scope.saveSnippet = function(lan, code) {\n var codePre;\n $scope.codeEditorVisible = false;\n codeBlockSelected.innerText = code;\n codePre = codeBlockSelected.parentNode;\n if (lan === 'remove-formating') {\n codeBlockSelected.className = '';\n codePre.className = '';\n removeCodeBlockAndHightlight(codeBlockSelected, mediumInstance);\n } else if (_.trim(code).length) {\n if (lan) {\n codeBlockSelected.className = 'language-' + lan;\n codePre.className = 'language-' + lan;\n } else {\n codeBlockSelected.className = '';\n codePre.className = '';\n }\n wysiwygCodeHightlighterService.hightlightCode(codeBlockSelected);\n mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n } else {\n codeBlockSelected.parentNode.parentNode.removeChild(codeBlockSelected.parentNode);\n mediumInstance.checkContentChanged(mediumInstance.elements[0]);\n }\n throttleChange();\n return null;\n };\n $scope.setMode = function(mode) {\n $storage.set('editor-mode', mode);\n if (mode === 'markdown') {\n updateMarkdownWithCurrentHtml();\n } else {\n setHtmlMedium($scope.markdown);\n }\n $scope.mode = mode;\n return mediumInstance.trigger('editableBlur', {}, editorMedium[0]);\n };\n $scope.save = function(e) {\n if (e) {\n e.preventDefault();\n }\n if ($scope.mode === 'html') {\n updateMarkdownWithCurrentHtml();\n }\n setHtmlMedium($scope.markdown);\n if ($scope.required && !$scope.markdown.length) {\n return;\n }\n $scope.saving = true;\n $scope.outdated = false;\n $scope.onSave({\n text: $scope.markdown,\n cb: saveEnd\n });\n };\n $scope.cancel = function(e) {\n if (e) {\n e.preventDefault();\n }\n if (!isEditOnly) {\n setEditMode(false);\n }\n if (notPersist) {\n clean();\n } else if ($scope.mode === 'html') {\n setHtmlMedium($scope.content || null);\n }\n $scope.markdown = $scope.content;\n discardLocalStorage();\n mediumInstance.trigger('blur', {}, editorMedium[0]);\n $scope.outdated = false;\n refreshCodeBlocks(mediumInstance);\n $scope.onCancel();\n };\n clean = function() {\n $scope.markdown = '';\n return editorMedium.html('');\n };\n saveEnd = function() {\n $scope.saving = false;\n if (!isEditOnly) {\n setEditMode(false);\n }\n if (notPersist) {\n clean();\n }\n discardLocalStorage();\n mediumInstance.trigger('blur', {}, editorMedium[0]);\n return analytics.trackEvent('develop', 'save wysiwyg', $scope.mode, 1);\n };\n uploadEnd = function(name, url) {\n if (taiga.isImage(name)) {\n return mediumInstance.pasteHTML(\"
    \");\n } else {\n name = $('
    ').text(name).html();\n return mediumInstance.pasteHTML(\"\" + name + \"
    \");\n }\n };\n isOutdated = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store && store.version && store.version !== $scope.version) {\n return true;\n }\n return false;\n };\n isDraft = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store) {\n return true;\n }\n return false;\n };\n getCurrentContent = function() {\n var store;\n store = $storage.get($scope.storageKey);\n if (store) {\n return store.text;\n }\n return $scope.content;\n };\n discardLocalStorage = function() {\n return $storage.remove($scope.storageKey);\n };\n cancelWithConfirmation = function() {\n var message, title;\n if ($scope.content === $scope.markdown) {\n $scope.cancel();\n document.activeElement.blur();\n document.body.click();\n return null;\n }\n title = $translate.instant(\"COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE\");\n message = $translate.instant(\"COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE\");\n return $confirm.ask(title, null, message).then(function(askResponse) {\n $scope.cancel();\n return askResponse.finish();\n });\n };\n replaceCodeBrToNl = function() {\n var html;\n html = $('
    ').html(editorMedium.html());\n html.find('code br').replaceWith('\\n');\n return html.html();\n };\n updateMarkdownWithCurrentHtml = function() {\n var html;\n html = replaceCodeBrToNl();\n return $scope.markdown = wysiwygService.getMarkdown(html);\n };\n localSave = function(markdown) {\n var store;\n if ($scope.storageKey) {\n store = {};\n store.version = $scope.version || 0;\n store.text = markdown;\n return $storage.set($scope.storageKey, store);\n }\n };\n change = function() {\n if ($scope.mode === 'html') {\n updateMarkdownWithCurrentHtml();\n }\n localSave($scope.markdown);\n return $scope.onChange({\n markdown: $scope.markdown\n });\n };\n throttleChange = _.throttle(change, 200);\n create = function(text, editMode) {\n var html;\n if (editMode == null) {\n editMode = false;\n }\n if (text.length) {\n html = wysiwygService.getHTML(text);\n editorMedium.html(html);\n }\n mediumInstance = new MediumEditor(editorMedium[0], {\n imageDragging: false,\n placeholder: {\n text: $scope.placeholder\n },\n toolbar: {\n buttons: [\n {\n name: 'bold',\n contentDefault: getIcon('editor-bold')\n }, {\n name: 'italic',\n contentDefault: getIcon('editor-italic')\n }, {\n name: 'strikethrough',\n contentDefault: getIcon('editor-cross-out')\n }, {\n name: 'anchor',\n contentDefault: getIcon('editor-link')\n }, {\n name: 'image',\n contentDefault: getIcon('editor-image')\n }, {\n name: 'orderedlist',\n contentDefault: getIcon('editor-list-n')\n }, {\n name: 'unorderedlist',\n contentDefault: getIcon('editor-list-o')\n }, {\n name: 'h1',\n contentDefault: getIcon('editor-h1')\n }, {\n name: 'h2',\n contentDefault: getIcon('editor-h2')\n }, {\n name: 'h3',\n contentDefault: getIcon('editor-h3')\n }, {\n name: 'quote',\n contentDefault: getIcon('editor-quote')\n }, {\n name: 'removeFormat',\n contentDefault: getIcon('editor-no-format')\n }, {\n name: 'rtl',\n contentDefault: getIcon('editor-rtl')\n }, {\n name: 'code',\n contentDefault: getIcon('editor-code')\n }\n ]\n },\n extensions: {\n paste: new CustomPasteHandler(),\n code: new CodeButton(),\n autolist: new AutoList(),\n alignright: new AlignRightButton(),\n mediumMention: new MentionExtension({\n getItems: function(mention, mentionCb) {\n return wysiwygMentionService.search(mention).then(mentionCb);\n }\n })\n }\n });\n $scope.changeMarkdown = throttleChange;\n mediumInstance.subscribe('editableInput', function(e) {\n return $scope.$applyAsync(throttleChange);\n });\n mediumInstance.subscribe(\"editableClick\", function(e) {\n var r;\n r = new RegExp('^(?:[a-z]+:)?//', 'i');\n if (e.target.href) {\n if (r.test(e.target.getAttribute('href')) || e.target.getAttribute('target') === '_blank') {\n e.stopPropagation();\n return window.open(e.target.href);\n } else {\n return $location.url(e.target.href);\n }\n }\n });\n mediumInstance.subscribe('editableDrop', function(event) {\n return $scope.onUploadFile({\n files: event.dataTransfer.files,\n cb: uploadEnd\n });\n });\n mediumInstance.subscribe('editableKeydown', function(e) {\n var code, mention;\n code = e.keyCode ? e.keyCode : e.which;\n mention = $('.medium-mention');\n if ((code === 40 || code === 38) && mention.length) {\n e.stopPropagation();\n e.preventDefault();\n return;\n }\n if ($scope.editMode && code === 27) {\n e.stopPropagation();\n return $scope.$applyAsync(cancelWithConfirmation);\n } else if (code === 27) {\n return editorMedium.blur();\n }\n });\n setEditMode(editMode);\n return $scope.$applyAsync(function() {\n wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]);\n return refreshCodeBlocks(mediumInstance);\n });\n };\n $(editorMedium[0]).on('mousedown', function(e) {\n if (e.target.href) {\n e.preventDefault();\n return e.stopPropagation();\n } else {\n return $scope.$applyAsync(function() {\n if (!$scope.editMode) {\n setEditMode(true);\n return refreshCodeBlocks(mediumInstance);\n }\n });\n }\n });\n $(editorMedium[0]).on('dblclick', 'pre', function(e) {\n return $scope.$applyAsync(function() {\n $scope.codeEditorVisible = true;\n codeBlockSelected = e.currentTarget.querySelector('code');\n $scope.currentCodeLanguage = wysiwygCodeHightlighterService.getLanguageInClassList(codeBlockSelected.classList);\n return $scope.code = codeBlockSelected.innerText;\n });\n });\n unwatch = $scope.$watch('content', function(content) {\n var unwatchLoader;\n if (!_.isUndefined(content)) {\n $scope.outdated = isOutdated();\n if (!mediumInstance && isDraft()) {\n setEditMode(true);\n }\n if (($scope.markdown.length || content.length) && $scope.markdown === content) {\n return;\n }\n content = getCurrentContent();\n $scope.markdown = content;\n if (mediumInstance) {\n mediumInstance.destroy();\n }\n if (tgLoader.open()) {\n unwatchLoader = tgLoader.onEnd(function() {\n create(content, $scope.editMode);\n return unwatchLoader();\n });\n } else {\n create(content, $scope.editMode);\n }\n return unwatch();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n if (mediumInstance) {\n if (editorMedium.length) {\n $(editorMedium[0]).off();\n }\n return mediumInstance.destroy();\n }\n });\n };\n return {\n templateUrl: \"common/components/wysiwyg-toolbar.html\",\n scope: {\n placeholder: '@',\n version: '<',\n storageKey: '<',\n content: '<',\n onCancel: '&',\n onSave: '&',\n onUploadFile: '&',\n onChange: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWysiwyg\", [\"$translate\", \"$tgConfirm\", \"$tgStorage\", \"tgWysiwygService\", \"animationFrame\", \"tgLoader\", \"tgWysiwygCodeHightlighterService\", \"tgWysiwygMentionService\", \"$tgAnalytics\", \"$location\", Medium]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/wysiwyg/wysiwyg.service.coffee\n */\n\n(function() {\n var WysiwygService;\n\n WysiwygService = (function() {\n WysiwygService.$inject = [\"tgWysiwygCodeHightlighterService\", \"tgProjectService\", \"$tgNavUrls\", \"$tgEmojis\"];\n\n function WysiwygService(wysiwygCodeHightlighterService, projectService, navurls, emojis) {\n this.wysiwygCodeHightlighterService = wysiwygCodeHightlighterService;\n this.projectService = projectService;\n this.navurls = navurls;\n this.emojis = emojis;\n }\n\n WysiwygService.prototype.searchEmojiByName = function(name) {\n return this.emojis.searchByName(name);\n };\n\n WysiwygService.prototype.pipeLinks = function(text) {\n return text.replace(/\\[\\[(.*?)\\]\\]/g, function(match, p1, offset, str) {\n var link, linkParams, title;\n linkParams = p1.split('|');\n link = linkParams[0];\n title = linkParams[1] || linkParams[0];\n return '[' + title + '](' + link + ')';\n });\n };\n\n WysiwygService.prototype.replaceUrls = function(html) {\n var el, i, len, link, links;\n el = document.createElement('html');\n el.innerHTML = html;\n links = el.querySelectorAll('a');\n for (i = 0, len = links.length; i < len; i++) {\n link = links[i];\n if (link.getAttribute('href').indexOf('/profile/') !== -1) {\n link.parentNode.replaceChild(document.createTextNode(link.innerText), link);\n } else if (link.getAttribute('href').indexOf('/t/') !== -1) {\n link.parentNode.replaceChild(document.createTextNode(link.innerText), link);\n }\n }\n return el.innerHTML;\n };\n\n WysiwygService.prototype.searchWikiLinks = function(html) {\n var el, i, len, link, links, url;\n el = document.createElement('html');\n el.innerHTML = html;\n links = el.querySelectorAll('a');\n for (i = 0, len = links.length; i < len; i++) {\n link = links[i];\n if (link.getAttribute('href').indexOf('/') === -1) {\n url = this.navurls.resolve('project-wiki-page', {\n project: this.projectService.project.get('slug'),\n slug: link.getAttribute('href')\n });\n link.setAttribute('href', url);\n }\n }\n return el.innerHTML;\n };\n\n WysiwygService.prototype.removeTrailingListBr = function(text) {\n return text.replace(/
  • (.*?)
    <\\/li>/g, '
  • $1
  • ');\n };\n\n WysiwygService.prototype.getMarkdown = function(html) {\n var cleanIssueConverter, codeLanguageConverter, markdown;\n cleanIssueConverter = {\n filter: ['html', 'body', 'span', 'div'],\n replacement: function(innerHTML) {\n return innerHTML;\n }\n };\n codeLanguageConverter = {\n filter: (function(_this) {\n return function(node) {\n return node.nodeName === 'PRE' && node.firstChild && node.firstChild.nodeName === 'CODE';\n };\n })(this),\n replacement: (function(_this) {\n return function(content, node) {\n var lan;\n lan = _this.wysiwygCodeHightlighterService.getLanguageInClassList(node.firstChild.classList);\n if (!lan) {\n lan = '';\n }\n return '\\n\\n```' + lan + '\\n' + _.trim(node.firstChild.textContent) + '\\n```\\n\\n';\n };\n })(this)\n };\n html = html.replace(/ (<\\/.*>)/g, \"$1\");\n html = this.emojis.replaceImgsByEmojiName(html);\n html = this.replaceUrls(html);\n html = this.removeTrailingListBr(html);\n markdown = toMarkdown(html, {\n gfm: true,\n converters: [cleanIssueConverter, codeLanguageConverter]\n });\n return markdown;\n };\n\n WysiwygService.prototype.parseMentionMatches = function(text) {\n var m, matches, offset, prevChar, regex, serviceName, tagBuilder;\n serviceName = 'twitter';\n tagBuilder = this.tagBuilder;\n matches = [];\n regex = /@[^\\s]{1,50}[^.\\s]/g;\n m = regex.exec(text);\n while (m !== null) {\n offset = m.index;\n prevChar = text.charAt(offset - 1);\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n m.forEach(function(match, groupIndex) {\n return matches.push(new Autolinker.match.Mention({\n tagBuilder: tagBuilder,\n matchedText: match,\n offset: offset,\n serviceName: serviceName,\n mention: match.slice(1)\n }));\n });\n m = regex.exec(text);\n }\n return matches;\n };\n\n WysiwygService.prototype.autoLinkHTML = function(html) {\n var autolinker, matchRegexStr;\n matchRegexStr = String(Autolinker.matcher.Mention.prototype.matcherRegexes.twitter);\n if (matchRegexStr.indexOf('.') === -1) {\n matchRegexStr = '@[^\\s]{1,50}[^.\\s]';\n }\n autolinker = new Autolinker({\n mention: 'twitter',\n hashtag: 'twitter',\n replaceFn: (function(_this) {\n return function(match) {\n var profileUrl, url;\n if (match.getType() === 'mention') {\n profileUrl = _this.navurls.resolve('user-profile', {\n project: _this.projectService.project.get('slug'),\n username: match.getMention()\n });\n return '@' + match.getMention() + '';\n } else if (match.getType() === 'hashtag') {\n url = _this.navurls.resolve('project-detail-ref', {\n project: _this.projectService.project.get('slug'),\n ref: match.getHashtag()\n });\n return '#' + match.getHashtag() + '';\n }\n };\n })(this)\n });\n Autolinker.matcher.Mention.prototype.parseMatches = this.parseMentionMatches.bind(autolinker);\n return autolinker.link(html);\n };\n\n WysiwygService.prototype.getHTML = function(text) {\n var md, options, result;\n if (!text || !text.length) {\n return \"\";\n }\n options = {\n breaks: true\n };\n text = this.emojis.replaceEmojiNameByImgs(text);\n text = this.pipeLinks(text);\n md = window.markdownit({\n breaks: true\n });\n md.use(window.markdownitLazyHeaders);\n result = md.render(text);\n result = this.searchWikiLinks(result);\n result = this.autoLinkHTML(result);\n return result;\n };\n\n return WysiwygService;\n\n })();\n\n angular.module(\"taigaComponents\").service(\"tgWysiwygService\", WysiwygService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home-order-by.controller.coffee\n */\n\n(function() {\n var DiscoverHomeOrderByController;\n\n DiscoverHomeOrderByController = (function() {\n DiscoverHomeOrderByController.$inject = ['$translate'];\n\n function DiscoverHomeOrderByController(translate) {\n this.translate = translate;\n this.is_open = false;\n this.texts = {\n week: this.translate.instant('DISCOVER.FILTERS.WEEK'),\n month: this.translate.instant('DISCOVER.FILTERS.MONTH'),\n year: this.translate.instant('DISCOVER.FILTERS.YEAR'),\n all: this.translate.instant('DISCOVER.FILTERS.ALL_TIME')\n };\n }\n\n DiscoverHomeOrderByController.prototype.currentText = function() {\n return this.texts[this.currentOrderBy];\n };\n\n DiscoverHomeOrderByController.prototype.open = function() {\n return this.is_open = true;\n };\n\n DiscoverHomeOrderByController.prototype.close = function() {\n return this.is_open = false;\n };\n\n DiscoverHomeOrderByController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n this.is_open = false;\n return this.onChange({\n orderBy: this.currentOrderBy\n });\n };\n\n return DiscoverHomeOrderByController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverHomeOrderBy\", DiscoverHomeOrderByController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home-order-by.directive.coffee\n */\n\n(function() {\n var DiscoverHomeOrderByDirective;\n\n DiscoverHomeOrderByDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"DiscoverHomeOrderBy\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"discover/components/discover-home-order-by/discover-home-order-by.html\",\n scope: {\n currentOrderBy: \"=orderBy\",\n onChange: \"&\"\n },\n link: link\n };\n };\n\n DiscoverHomeOrderByDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverHomeOrderBy\", DiscoverHomeOrderByDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-bar.controller.coffee\n */\n\n(function() {\n var DiscoverSearchBarController;\n\n DiscoverSearchBarController = (function() {\n DiscoverSearchBarController.$inject = ['tgDiscoverProjectsService'];\n\n function DiscoverSearchBarController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.discoverProjectsService.projectsCount;\n };\n })(this));\n this.discoverProjectsService.fetchStats();\n }\n\n DiscoverSearchBarController.prototype.selectFilter = function(filter) {\n return this.onChange({\n filter: filter,\n q: this.q\n });\n };\n\n DiscoverSearchBarController.prototype.submitFilter = function() {\n return this.onChange({\n filter: this.filter,\n q: this.q\n });\n };\n\n return DiscoverSearchBarController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearchBar\", DiscoverSearchBarController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.directive.coffee\n */\n\n(function() {\n var DiscoverSearchBarDirective;\n\n DiscoverSearchBarDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n controller: \"DiscoverSearchBar\",\n controllerAs: \"vm\",\n templateUrl: 'discover/components/discover-search-bar/discover-search-bar.html',\n bindToController: true,\n scope: {\n q: \"=\",\n filter: \"=\",\n onChange: \"&\"\n },\n compile: function(element, attrs) {\n if (!attrs.q) {\n return attrs.q = '';\n }\n },\n link: link\n };\n };\n\n DiscoverSearchBarDirective.$inject = [];\n\n angular.module('taigaDiscover').directive('tgDiscoverSearchBar', DiscoverSearchBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-list-header.controller.coffee\n */\n\n(function() {\n var DiscoverSearchListHeaderController;\n\n DiscoverSearchListHeaderController = (function() {\n DiscoverSearchListHeaderController.$inject = [];\n\n function DiscoverSearchListHeaderController() {\n this.like_is_open = this.orderBy.indexOf('-total_fans') === 0;\n this.activity_is_open = this.orderBy.indexOf('-total_activity') === 0;\n }\n\n DiscoverSearchListHeaderController.prototype.openLike = function() {\n this.like_is_open = true;\n this.activity_is_open = false;\n return this.setOrderBy('-total_fans_last_week');\n };\n\n DiscoverSearchListHeaderController.prototype.openActivity = function() {\n this.activity_is_open = true;\n this.like_is_open = false;\n return this.setOrderBy('-total_activity_last_week');\n };\n\n DiscoverSearchListHeaderController.prototype.setOrderBy = function(type) {\n if (type == null) {\n type = '';\n }\n if (!type) {\n this.like_is_open = false;\n this.activity_is_open = false;\n }\n return this.onChange({\n orderBy: type\n });\n };\n\n return DiscoverSearchListHeaderController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearchListHeader\", DiscoverSearchListHeaderController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-list-header.directive.coffee\n */\n\n(function() {\n var DiscoverSearchListHeaderDirective;\n\n DiscoverSearchListHeaderDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"DiscoverSearchListHeader\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"discover/components/discover-search-list-header/discover-search-list-header.html\",\n scope: {\n onChange: \"&\",\n orderBy: \"=\"\n },\n link: link\n };\n };\n\n DiscoverSearchListHeaderDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverSearchListHeader\", DiscoverSearchListHeaderDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: featured-projects.controller.coffee\n */\n\n(function() {\n var FeaturedProjectsController;\n\n FeaturedProjectsController = (function() {\n FeaturedProjectsController.$inject = [\"tgDiscoverProjectsService\"];\n\n function FeaturedProjectsController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"featured\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.featured;\n };\n })(this));\n this.discoverProjectsService.fetchFeatured();\n }\n\n return FeaturedProjectsController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"FeaturedProjects\", FeaturedProjectsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: featured-projects.directive.coffee\n */\n\n(function() {\n var FeaturedProjectsDirective;\n\n FeaturedProjectsDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"FeaturedProjects\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/featured-projects/featured-projects.html\",\n scope: {},\n link: link\n };\n };\n\n FeaturedProjectsDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgFeaturedProjects\", FeaturedProjectsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: highlighted.directive.coffee\n */\n\n(function() {\n var HighlightedDirective;\n\n HighlightedDirective = function() {\n return {\n templateUrl: \"discover/components/highlighted/highlighted.html\",\n scope: {\n loading: \"=\",\n highlighted: \"=\",\n orderBy: \"=\"\n }\n };\n };\n\n HighlightedDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgHighlighted\", HighlightedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-active.controller.coffee\n */\n\n(function() {\n var MostActiveController;\n\n MostActiveController = (function() {\n MostActiveController.$inject = [\"tgDiscoverProjectsService\"];\n\n function MostActiveController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"highlighted\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.mostActive;\n };\n })(this));\n this.currentOrderBy = 'week';\n this.order_by = this.getOrderBy();\n }\n\n MostActiveController.prototype.fetch = function() {\n this.loading = true;\n this.order_by = this.getOrderBy();\n return this.discoverProjectsService.fetchMostActive({\n order_by: this.order_by\n }).then((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n MostActiveController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n return this.fetch();\n };\n\n MostActiveController.prototype.getOrderBy = function(type) {\n if (this.currentOrderBy === 'all') {\n return '-total_activity';\n } else {\n return '-total_activity_last_' + this.currentOrderBy;\n }\n };\n\n return MostActiveController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"MostActive\", MostActiveController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-active.directive.coffee\n */\n\n(function() {\n var MostActiveDirective;\n\n MostActiveDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"MostActive\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/most-active/most-active.html\",\n scope: {},\n link: link\n };\n };\n\n MostActiveDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgMostActive\", MostActiveDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: msot-liked.controller.coffee\n */\n\n(function() {\n var MostLikedController;\n\n MostLikedController = (function() {\n MostLikedController.$inject = [\"tgDiscoverProjectsService\"];\n\n function MostLikedController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"highlighted\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.mostLiked;\n };\n })(this));\n this.currentOrderBy = 'week';\n this.order_by = this.getOrderBy();\n }\n\n MostLikedController.prototype.fetch = function() {\n this.loading = true;\n this.order_by = this.getOrderBy();\n return this.discoverProjectsService.fetchMostLiked({\n order_by: this.order_by\n }).then((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n MostLikedController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n return this.fetch();\n };\n\n MostLikedController.prototype.getOrderBy = function() {\n if (this.currentOrderBy === 'all') {\n return '-total_fans';\n } else {\n return '-total_fans_last_' + this.currentOrderBy;\n }\n };\n\n return MostLikedController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"MostLiked\", MostLikedController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-liked.directive.coffee\n */\n\n(function() {\n var MostLikedDirective;\n\n MostLikedDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"MostLiked\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/most-liked/most-liked.html\",\n scope: {},\n link: link\n };\n };\n\n MostLikedDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgMostLiked\", MostLikedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home.controller.coffee\n */\n\n(function() {\n var DiscoverHomeController;\n\n DiscoverHomeController = (function() {\n DiscoverHomeController.$inject = ['$tgLocation', '$tgNavUrls', 'tgAppMetaService', '$translate'];\n\n function DiscoverHomeController(location, navUrls, appMetaService, translate) {\n var description, title;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n title = this.translate.instant(\"DISCOVER.PAGE_TITLE\");\n description = this.translate.instant(\"DISCOVER.PAGE_DESCRIPTION\");\n this.appMetaService.setAll(title, description);\n }\n\n DiscoverHomeController.prototype.onSubmit = function(q) {\n var url;\n url = this.navUrls.resolve('discover-search');\n return this.location.search('text', q).path(url);\n };\n\n return DiscoverHomeController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverHome\", DiscoverHomeController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.controller.coffee\n */\n\n(function() {\n var DiscoverSearchController;\n\n DiscoverSearchController = (function() {\n DiscoverSearchController.$inject = ['$routeParams', 'tgDiscoverProjectsService', '$route', '$tgLocation', '$tgAnalytics', 'tgAppMetaService', '$translate'];\n\n function DiscoverSearchController(routeParams, discoverProjectsService, route, location, analytics, appMetaService, translate) {\n var description, title;\n this.routeParams = routeParams;\n this.discoverProjectsService = discoverProjectsService;\n this.route = route;\n this.location = location;\n this.analytics = analytics;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.page = 1;\n taiga.defineImmutableProperty(this, \"searchResult\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.searchResult;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"nextSearchPage\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.nextSearchPage;\n };\n })(this));\n this.q = this.routeParams.text;\n this.filter = this.routeParams.filter || 'all';\n this.orderBy = this.routeParams['order_by'] || '';\n this.loadingGlobal = false;\n this.loadingList = false;\n this.loadingPagination = false;\n title = this.translate.instant(\"DISCOVER.SEARCH.PAGE_TITLE\");\n description = this.translate.instant(\"DISCOVER.SEARCH.PAGE_DESCRIPTION\");\n this.appMetaService.setAll(title, description);\n this.analytics.trackPage(this.location.url(), \"Discover Search\");\n }\n\n DiscoverSearchController.prototype.fetch = function() {\n this.page = 1;\n this.discoverProjectsService.resetSearchList();\n return this.search();\n };\n\n DiscoverSearchController.prototype.fetchByGlobalSearch = function() {\n if (this.loadingGlobal) {\n return;\n }\n this.loadingGlobal = true;\n return this.fetch().then((function(_this) {\n return function() {\n return _this.loadingGlobal = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.fetchByOrderBy = function() {\n if (this.loadingList) {\n return;\n }\n this.loadingList = true;\n return this.fetch().then((function(_this) {\n return function() {\n return _this.loadingList = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.showMore = function() {\n if (this.loadingPagination) {\n return;\n }\n this.loadingPagination = true;\n this.page++;\n return this.search().then((function(_this) {\n return function() {\n return _this.loadingPagination = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.search = function() {\n var filter, params;\n filter = this.getFilter();\n params = {\n page: this.page,\n q: this.q,\n order_by: this.orderBy\n };\n _.assign(params, filter);\n return this.discoverProjectsService.fetchSearch(params);\n };\n\n DiscoverSearchController.prototype.getFilter = function() {\n if (this.filter === 'people') {\n return {\n is_looking_for_people: true\n };\n } else if (this.filter === 'scrum') {\n return {\n is_backlog_activated: true\n };\n } else if (this.filter === 'kanban') {\n return {\n is_kanban_activated: true\n };\n }\n return {};\n };\n\n DiscoverSearchController.prototype.onChangeFilter = function(filter, q) {\n this.filter = filter;\n this.q = q;\n this.route.updateParams({\n filter: this.filter,\n text: this.q\n });\n this.analytics.trackPage(this.location.url(), \"Discover Search\");\n return this.fetchByGlobalSearch();\n };\n\n DiscoverSearchController.prototype.onChangeOrder = function(orderBy) {\n this.orderBy = orderBy;\n this.route.updateParams({\n order_by: orderBy\n });\n this.analytics.trackPage(this.location.url(), \"Discover Search\");\n return this.fetchByOrderBy();\n };\n\n return DiscoverSearchController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearch\", DiscoverSearchController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.directive.coffee\n */\n\n(function() {\n var DiscoverSearchDirective;\n\n DiscoverSearchDirective = function() {\n var link;\n link = function(scope, element, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"DiscoverSearch\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n DiscoverSearchDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverSearch\", DiscoverSearchDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-projects.service.coffee\n */\n\n(function() {\n var DiscoverProjectsService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n DiscoverProjectsService = (function(superClass) {\n var _discoverParams;\n\n extend(DiscoverProjectsService, superClass);\n\n DiscoverProjectsService.$inject = [\"tgResources\", \"tgProjectsService\"];\n\n _discoverParams = {\n discover_mode: true\n };\n\n function DiscoverProjectsService(rs, projectsService) {\n this.rs = rs;\n this.projectsService = projectsService;\n this._mostLiked = Immutable.List();\n this._mostActive = Immutable.List();\n this._featured = Immutable.List();\n this._searchResult = Immutable.List();\n this._projectsCount = 0;\n this.decorate = this.projectsService._decorate.bind(this.projectsService);\n taiga.defineImmutableProperty(this, \"mostLiked\", (function(_this) {\n return function() {\n return _this._mostLiked;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"mostActive\", (function(_this) {\n return function() {\n return _this._mostActive;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"featured\", (function(_this) {\n return function() {\n return _this._featured;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"searchResult\", (function(_this) {\n return function() {\n return _this._searchResult;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"nextSearchPage\", (function(_this) {\n return function() {\n return _this._nextSearchPage;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"projectsCount\", (function(_this) {\n return function() {\n return _this._projectsCount;\n };\n })(this));\n }\n\n DiscoverProjectsService.prototype.fetchMostLiked = function(params) {\n var _params;\n _params = _.extend({}, _discoverParams, params);\n return this.rs.projects.getProjects(_params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 5);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._mostLiked = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchMostActive = function(params) {\n var _params;\n _params = _.extend({}, _discoverParams, params);\n return this.rs.projects.getProjects(_params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 5);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._mostActive = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchFeatured = function() {\n var _params;\n _params = _.extend({}, _discoverParams);\n _params.is_featured = true;\n return this.rs.projects.getProjects(_params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 4);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._featured = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.resetSearchList = function() {\n return this._searchResult = Immutable.List();\n };\n\n DiscoverProjectsService.prototype.fetchStats = function() {\n return this.rs.stats.discover().then((function(_this) {\n return function(discover) {\n return _this._projectsCount = discover.getIn(['projects', 'total']);\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchSearch = function(params) {\n var _params;\n _params = _.extend({}, _discoverParams, params);\n return this.rs.projects.getProjects(_params).then((function(_this) {\n return function(result) {\n var projects;\n _this._nextSearchPage = !!result.headers('X-Pagination-Next');\n projects = Immutable.fromJS(result.data);\n projects = projects.map(_this.decorate);\n return _this._searchResult = _this._searchResult.concat(projects);\n };\n })(this));\n };\n\n return DiscoverProjectsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaDiscover\").service(\"tgDiscoverProjectsService\", DiscoverProjectsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: create-epic.controller.coffee\n */\n\n(function() {\n var CreateEpicController, getRandomDefaultColor, taiga, trim;\n\n taiga = this.taiga;\n\n trim = taiga.trim;\n\n getRandomDefaultColor = taiga.getRandomDefaultColor;\n\n CreateEpicController = (function() {\n CreateEpicController.$inject = [\"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\", \"$tgAnalytics\"];\n\n function CreateEpicController(confirm, projectService, epicsService, analytics) {\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.analytics = analytics;\n this.project = this.projectService.project.toJS();\n this.newEpic = {\n color: getRandomDefaultColor(),\n status: this.project.default_epic_status,\n tags: []\n };\n this.attachments = Immutable.List();\n this.loading = false;\n }\n\n CreateEpicController.prototype.createEpic = function() {\n if (!this.validateForm()) {\n return;\n }\n this.loading = true;\n return this.epicsService.createEpic(this.newEpic, this.attachments).then((function(_this) {\n return function(response) {\n _this.analytics.trackEvent(\"epic\", \"create\", \"create epic\", 1);\n _this.onCreateEpic();\n return _this.loading = false;\n };\n })(this))[\"catch\"]((function(_this) {\n return function(response) {\n _this.loading = false;\n _this.setFormErrors(response.data);\n if (response.data._error_message) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this));\n };\n\n CreateEpicController.prototype.selectColor = function(color) {\n return this.newEpic.color = color;\n };\n\n CreateEpicController.prototype.addTag = function(name, color) {\n name = trim(name.toLowerCase());\n if (!_.find(this.newEpic.tags, function(it) {\n return it[0] === name;\n })) {\n return this.newEpic.tags.push([name, color]);\n }\n };\n\n CreateEpicController.prototype.deleteTag = function(tag) {\n return _.remove(this.newEpic.tags, function(it) {\n return it[0] === tag[0];\n });\n };\n\n CreateEpicController.prototype.addAttachment = function(attachment) {\n return this.attachments.push(attachment);\n };\n\n return CreateEpicController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"CreateEpicCtrl\", CreateEpicController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: create-epic.directive.coffee\n */\n\n(function() {\n var CreateEpicDirective;\n\n CreateEpicDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var form;\n form = el.find(\"form\").checksley();\n ctrl.validateForm = (function(_this) {\n return function() {\n return form.validate();\n };\n })(this);\n return ctrl.setFormErrors = (function(_this) {\n return function(errors) {\n return form.setErrors(errors);\n };\n })(this);\n };\n return {\n link: link,\n templateUrl: \"epics/create-epic/create-epic.html\",\n controller: \"CreateEpicCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n onCreateEpic: '&'\n },\n scope: {}\n };\n };\n\n angular.module('taigaEpics').directive(\"tgCreateEpic\", CreateEpicDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.controller.coffee\n */\n\n(function() {\n var EpicRowController;\n\n EpicRowController = (function() {\n EpicRowController.$inject = [\"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\"];\n\n function EpicRowController(confirm, projectService, epicsService) {\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.displayUserStories = false;\n this.displayAssignedTo = false;\n this.displayStatusList = false;\n this.loadingStatus = false;\n this.project = this.projectService.project.toJS();\n this._calculateProgressBar();\n }\n\n EpicRowController.prototype._calculateProgressBar = function() {\n var progress, total;\n if (this.epic.getIn(['status_extra_info', 'is_closed']) === true) {\n return this.percentage = \"100%\";\n } else {\n progress = this.epic.getIn(['user_stories_counts', 'progress']);\n total = this.epic.getIn(['user_stories_counts', 'total']);\n if (total === 0) {\n return this.percentage = \"0%\";\n } else {\n return this.percentage = (progress * 100 / total) + \"%\";\n }\n }\n };\n\n EpicRowController.prototype.canEditEpics = function() {\n return this.projectService.hasPermission(\"modify_epic\");\n };\n\n EpicRowController.prototype.toggleUserStoryList = function() {\n if (!this.displayUserStories) {\n return this.epicsService.listRelatedUserStories(this.epic).then((function(_this) {\n return function(userStories) {\n _this.epicStories = userStories;\n return _this.displayUserStories = true;\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this));\n } else {\n return this.displayUserStories = false;\n }\n };\n\n EpicRowController.prototype.updateStatus = function(statusId) {\n this.displayStatusList = false;\n this.loadingStatus = true;\n return this.epicsService.updateEpicStatus(this.epic, statusId)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loadingStatus = false;\n };\n })(this));\n };\n\n EpicRowController.prototype.updateAssignedTo = function(member) {\n this.assignLoader = true;\n return this.epicsService.updateEpicAssignedTo(this.epic, (member != null ? member.id : void 0) || null)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify('error');\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.assignLoader = false;\n };\n })(this));\n };\n\n return EpicRowController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicRowCtrl\", EpicRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.directive.coffee\n */\n\n(function() {\n var EpicRowDirective;\n\n EpicRowDirective = function() {\n return {\n templateUrl: \"epics/dashboard/epic-row/epic-row.html\",\n controller: \"EpicRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n epic: '=',\n column: '='\n }\n };\n };\n\n angular.module('taigaEpics').directive(\"tgEpicRow\", EpicRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics.dashboard.controller.coffee\n */\n\n(function() {\n var EpicsDashboardController, taiga;\n\n taiga = this.taiga;\n\n EpicsDashboardController = (function() {\n EpicsDashboardController.$inject = [\"$routeParams\", \"tgErrorHandlingService\", \"tgLightboxFactory\", \"lightboxService\", \"$tgConfirm\", \"tgProjectService\", \"tgEpicsService\", \"tgAppMetaService\", \"$translate\"];\n\n function EpicsDashboardController(params, errorHandlingService, lightboxFactory, lightboxService, confirm, projectService, epicsService, appMetaService, translate) {\n this.params = params;\n this.errorHandlingService = errorHandlingService;\n this.lightboxFactory = lightboxFactory;\n this.lightboxService = lightboxService;\n this.confirm = confirm;\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.sectionName = \"EPICS.SECTION_NAME\";\n taiga.defineImmutableProperty(this, 'project', (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this.epicsService.epics;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n }\n\n EpicsDashboardController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\"),\n projectDescription: this.project.get(\"description\")\n };\n return {\n title: this.translate.instant(\"EPICS.PAGE_TITLE\", ctx),\n description: this.translate.instant(\"EPICS.PAGE_DESCRIPTION\", ctx)\n };\n };\n\n EpicsDashboardController.prototype.loadInitialData = function() {\n this.epicsService.clear();\n return this.projectService.setProjectBySlug(this.params.pslug).then((function(_this) {\n return function() {\n if (!_this.projectService.isEpicsDashboardEnabled()) {\n return _this.errorHandlingService.notFound();\n }\n if (!_this.projectService.hasPermission(\"view_epics\")) {\n return _this.errorHandlingService.permissionDenied();\n }\n return _this.epicsService.fetchEpics();\n };\n })(this));\n };\n\n EpicsDashboardController.prototype.canCreateEpics = function() {\n return this.projectService.hasPermission(\"add_epic\");\n };\n\n EpicsDashboardController.prototype.onCreateEpic = function() {\n var onCreateEpic;\n onCreateEpic = (function(_this) {\n return function() {\n _this.lightboxService.closeAll();\n _this.confirm.notify(\"success\");\n };\n })(this);\n return this.lightboxFactory.create('tg-create-epic', {\n \"class\": \"lightbox lightbox-create-epic open\",\n \"on-create-epic\": \"onCreateEpic()\"\n }, {\n \"onCreateEpic\": onCreateEpic.bind(this)\n });\n };\n\n return EpicsDashboardController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicsDashboardCtrl\", EpicsDashboardController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-sortable.directive.coffee\n */\n\n(function() {\n var EpicsSortableDirective;\n\n EpicsSortableDirective = function($parse, projectService) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n if (!projectService.hasPermission(\"modify_epic\")) {\n return;\n }\n callback = $parse(attrs.tgEpicsSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('div.epics-table-body-row');\n }\n });\n drake.on('dragend', function(item) {\n var epic, itemEl, newIndex;\n itemEl = $(item);\n epic = itemEl.scope().epic;\n newIndex = itemEl.index();\n return scope.$apply(function() {\n return callback(scope, {\n epic: epic,\n newIndex: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n EpicsSortableDirective.$inject = [\"$parse\", \"tgProjectService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgEpicsSortable\", EpicsSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.controller.coffee\n */\n\n(function() {\n var EpicsTableController, generateHash, taiga;\n\n taiga = this.taiga;\n\n generateHash = this.taiga.generateHash;\n\n EpicsTableController = (function() {\n EpicsTableController.$inject = [\"$tgConfirm\", \"tgEpicsService\", \"$timeout\", \"$tgStorage\", \"tgProjectService\"];\n\n function EpicsTableController(confirm, epicsService, timeout, storage, projectService) {\n this.confirm = confirm;\n this.epicsService = epicsService;\n this.timeout = timeout;\n this.storage = storage;\n this.projectService = projectService;\n this.hash = generateHash([this.projectService.project.get('id'), 'epics']);\n this.displayOptions = false;\n this.displayVotes = true;\n this.column = this.storage.get(this.hash, {\n votes: true,\n name: true,\n project: true,\n sprint: true,\n assigned: true,\n status: true,\n progress: true\n });\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this.epicsService.epics;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'disabledEpicsPagination', (function(_this) {\n return function() {\n return _this.epicsService._disablePagination;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'loadingEpics', (function(_this) {\n return function() {\n return _this.epicsService._loadingEpics;\n };\n })(this));\n }\n\n EpicsTableController.prototype.toggleEpicTableOptions = function() {\n return this.displayOptions = !this.displayOptions;\n };\n\n EpicsTableController.prototype.reorderEpic = function(epic, newIndex) {\n if (epic.get('epics_order') === newIndex) {\n return null;\n }\n return this.epicsService.reorderEpic(epic, newIndex).then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n EpicsTableController.prototype.nextPage = function() {\n return this.epicsService.nextPage();\n };\n\n EpicsTableController.prototype.hoverEpicTableOption = function() {\n if (this.timer) {\n return this.timeout.cancel(this.timer);\n }\n };\n\n EpicsTableController.prototype.hideEpicTableOption = function() {\n return this.timer = this.timeout(((function(_this) {\n return function() {\n return _this.displayOptions = false;\n };\n })(this)), 400);\n };\n\n EpicsTableController.prototype.updateViewOptions = function() {\n return this.storage.set(this.hash, this.column);\n };\n\n return EpicsTableController;\n\n })();\n\n angular.module(\"taigaEpics\").controller(\"EpicsTableCtrl\", EpicsTableController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.directive.coffee\n */\n\n(function() {\n var EpicsTableDirective;\n\n EpicsTableDirective = function() {\n return {\n templateUrl: \"epics/dashboard/epics-table/epics-table.html\",\n controller: \"EpicsTableCtrl\",\n controllerAs: \"vm\",\n scope: {}\n };\n };\n\n angular.module('taigaEpics').directive(\"tgEpicsTable\", EpicsTableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.controller.coffee\n */\n\n(function() {\n var StoryRowController, module;\n\n module = angular.module(\"taigaEpics\");\n\n StoryRowController = (function() {\n StoryRowController.$inject = [];\n\n function StoryRowController() {\n this._calculateProgressBar();\n }\n\n StoryRowController.prototype._calculateProgressBar = function() {\n var totalTasks, totalTasksCompleted;\n if (this.story.get('is_closed') === true) {\n return this.percentage = \"100%\";\n } else {\n totalTasks = this.story.get('tasks').size;\n totalTasksCompleted = this.story.get('tasks').filter(function(it) {\n return it.get(\"is_closed\");\n }).size;\n if (totalTasks === 0) {\n return this.percentage = \"0%\";\n } else {\n return this.percentage = (totalTasksCompleted * 100 / totalTasks) + \"%\";\n }\n }\n };\n\n return StoryRowController;\n\n })();\n\n module.controller(\"StoryRowCtrl\", StoryRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-table.directive.coffee\n */\n\n(function() {\n var StoryRowDirective, module;\n\n module = angular.module('taigaEpics');\n\n StoryRowDirective = function() {\n return {\n templateUrl: \"epics/dashboard/story-row/story-row.html\",\n controller: \"StoryRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n story: '=',\n column: '='\n }\n };\n };\n\n module.directive(\"tgStoryRow\", StoryRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics.service.coffee\n */\n\n(function() {\n var EpicsService, taiga;\n\n taiga = this.taiga;\n\n EpicsService = (function() {\n EpicsService.$inject = ['tgProjectService', 'tgAttachmentsService', 'tgResources', 'tgXhrErrorService'];\n\n function EpicsService(projectService, attachmentsService, resources, xhrError) {\n this.projectService = projectService;\n this.attachmentsService = attachmentsService;\n this.resources = resources;\n this.xhrError = xhrError;\n this.clear();\n taiga.defineImmutableProperty(this, 'epics', (function(_this) {\n return function() {\n return _this._epics;\n };\n })(this));\n }\n\n EpicsService.prototype.clear = function() {\n this._loadingEpics = false;\n this._disablePagination = false;\n this._page = 1;\n return this._epics = Immutable.List();\n };\n\n EpicsService.prototype.fetchEpics = function(reset) {\n if (reset == null) {\n reset = false;\n }\n this._loadingEpics = true;\n this._disablePagination = true;\n return this.resources.epics.list(this.projectService.project.get('id'), this._page).then((function(_this) {\n return function(result) {\n if (reset) {\n _this.clear();\n _this._epics = result.list;\n } else {\n _this._epics = _this._epics.concat(result.list);\n }\n _this._loadingEpics = false;\n return _this._disablePagination = !result.headers('x-pagination-next');\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n EpicsService.prototype.nextPage = function() {\n this._page++;\n return this.fetchEpics();\n };\n\n EpicsService.prototype.listRelatedUserStories = function(epic) {\n return this.resources.userstories.listInEpic(epic.get('id'));\n };\n\n EpicsService.prototype.createEpic = function(epicData, attachments) {\n epicData.project = this.projectService.project.get('id');\n return this.resources.epics.post(epicData).then((function(_this) {\n return function(epic) {\n var promises;\n promises = _.map(attachments.toJS(), function(attachment) {\n return _this.attachmentsService.upload(attachment.file, epic.get('id'), epic.get('project'), 'epic');\n });\n return Promise.all(promises).then(_this.fetchEpics.bind(_this, true));\n };\n })(this));\n };\n\n EpicsService.prototype.reorderEpic = function(epic, newIndex) {\n var afterDestination, beforeDestination, data, newOrder, orderList, previous, previousWithTheSameOrder, setOrders, withoutMoved;\n orderList = {};\n this._epics.forEach(function(it) {\n return orderList[it.get('id')] = it.get('epics_order');\n });\n withoutMoved = this.epics.filter((function(_this) {\n return function(it) {\n return it.get('id') !== epic.get('id');\n };\n })(this));\n beforeDestination = withoutMoved.slice(0, newIndex);\n afterDestination = withoutMoved.slice(newIndex);\n previous = beforeDestination.last();\n newOrder = !previous ? 0 : previous.get('epics_order') + 1;\n orderList[epic.get('id')] = newOrder;\n previousWithTheSameOrder = beforeDestination.filter((function(_this) {\n return function(it) {\n return it.get('epics_order') === previous.get('epics_order');\n };\n })(this));\n setOrders = _.fromPairs(previousWithTheSameOrder.map((function(_this) {\n return function(it) {\n return [it.get('id'), it.get('epics_order')];\n };\n })(this)).toJS());\n afterDestination.forEach(function(it) {\n return orderList[it.get('id')] = it.get('epics_order') + 1;\n });\n this._epics = this._epics.map(function(it) {\n return it.set('epics_order', orderList[it.get('id')]);\n });\n this._epics = this._epics.sortBy(function(it) {\n return it.get('epics_order');\n });\n data = {\n epics_order: newOrder,\n version: epic.get('version')\n };\n return this.resources.epics.reorder(epic.get('id'), data, setOrders).then((function(_this) {\n return function(newEpic) {\n return _this._epics = _this._epics.map(function(it) {\n if (it.get('id') === newEpic.get('id')) {\n return newEpic;\n }\n return it;\n });\n };\n })(this));\n };\n\n EpicsService.prototype.reorderRelatedUserstory = function(epic, epicUserstories, userstory, newIndex) {\n var beforeDestination, data, epicId, newOrder, previous, previousWithTheSameOrder, setOrders, userstoryId, withoutMoved;\n withoutMoved = epicUserstories.filter((function(_this) {\n return function(it) {\n return it.get('id') !== userstory.get('id');\n };\n })(this));\n beforeDestination = withoutMoved.slice(0, newIndex);\n previous = beforeDestination.last();\n newOrder = !previous ? 0 : previous.get('epic_order') + 1;\n previousWithTheSameOrder = beforeDestination.filter((function(_this) {\n return function(it) {\n return it.get('epic_order') === previous.get('epic_order');\n };\n })(this));\n setOrders = _.fromPairs(previousWithTheSameOrder.map((function(_this) {\n return function(it) {\n return [it.get('id'), it.get('epic_order')];\n };\n })(this)).toJS());\n data = {\n order: newOrder\n };\n epicId = epic.get('id');\n userstoryId = userstory.get('id');\n return this.resources.epics.reorderRelatedUserstory(epicId, userstoryId, data, setOrders).then((function(_this) {\n return function() {\n return _this.listRelatedUserStories(epic);\n };\n })(this));\n };\n\n EpicsService.prototype.replaceEpic = function(epic) {\n return this._epics = this._epics.map(function(it) {\n if (it.get('id') === epic.get('id')) {\n return epic;\n }\n return it;\n });\n };\n\n EpicsService.prototype.updateEpicStatus = function(epic, statusId) {\n var data;\n data = {\n status: statusId,\n version: epic.get('version')\n };\n return this.resources.epics.patch(epic.get('id'), data).then(this.replaceEpic.bind(this));\n };\n\n EpicsService.prototype.updateEpicAssignedTo = function(epic, userId) {\n var data;\n data = {\n assigned_to: userId,\n version: epic.get('version')\n };\n return this.resources.epics.patch(epic.get('id'), data).then(this.replaceEpic.bind(this));\n };\n\n return EpicsService;\n\n })();\n\n angular.module('taigaEpics').service('tgEpicsService', EpicsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstories.controller.coffee\n */\n\n(function() {\n var RelatedUserStoriesController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserStoriesController = (function() {\n RelatedUserStoriesController.$inject = [\"tgProjectService\", \"tgEpicsService\"];\n\n function RelatedUserStoriesController(projectService, epicsService) {\n this.projectService = projectService;\n this.epicsService = epicsService;\n this.sectionName = \"Epics\";\n this.showCreateRelatedUserstoriesLightbox = false;\n }\n\n RelatedUserStoriesController.prototype.showRelatedUserStoriesSection = function() {\n var ref;\n return this.projectService.hasPermission(\"view_epics\") || ((ref = this.userstories) != null ? ref.length : void 0) > 0;\n };\n\n RelatedUserStoriesController.prototype.userCanSort = function() {\n return this.projectService.hasPermission(\"modify_epic\");\n };\n\n RelatedUserStoriesController.prototype.loadRelatedUserstories = function() {\n return this.epicsService.listRelatedUserStories(this.epic).then((function(_this) {\n return function(userstories) {\n return _this.userstories = userstories;\n };\n })(this));\n };\n\n RelatedUserStoriesController.prototype.reorderRelatedUserstory = function(us, newIndex) {\n return this.epicsService.reorderRelatedUserstory(this.epic, this.userstories, us, newIndex).then((function(_this) {\n return function(userstories) {\n return _this.userstories = userstories;\n };\n })(this));\n };\n\n return RelatedUserStoriesController;\n\n })();\n\n module.controller(\"RelatedUserStoriesCtrl\", RelatedUserStoriesController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstory-create.controller.coffee\n */\n\n(function() {\n var RelatedUserstoriesCreateController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserstoriesCreateController = (function() {\n RelatedUserstoriesCreateController.$inject = [\"tgCurrentUserService\", \"tgResources\", \"$tgConfirm\", \"$tgAnalytics\"];\n\n function RelatedUserstoriesCreateController(currentUserService, rs, confirm, analytics) {\n this.currentUserService = currentUserService;\n this.rs = rs;\n this.confirm = confirm;\n this.analytics = analytics;\n this.projects = null;\n this.projectUserstories = Immutable.List();\n this.loading = false;\n }\n\n RelatedUserstoriesCreateController.prototype.loadProjects = function() {\n if (this.projects === null) {\n return this.projects = this.currentUserService.projects.get(\"all\");\n }\n };\n\n RelatedUserstoriesCreateController.prototype.filterUss = function(selectedProjectId, filterText) {\n var promise;\n promise = this.rs.userstories.listInAllProjects({\n project: selectedProjectId,\n q: filterText\n }, true).then((function(_this) {\n return function(data) {\n var excludeIds, filteredData;\n excludeIds = _this.epicUserstories.map(function(us) {\n return us.get('id');\n });\n filteredData = data.filter(function(us) {\n return excludeIds.indexOf(us.get('id')) === -1;\n });\n return _this.projectUserstories = filteredData;\n };\n })(this));\n return promise;\n };\n\n RelatedUserstoriesCreateController.prototype.saveRelatedUserStory = function(selectedUserstoryId, onSavedRelatedUserstory) {\n var epicId, onError, onSuccess;\n if (!this.validateExistingUserstoryForm()) {\n return;\n }\n this.loading = true;\n onError = (function(_this) {\n return function(data) {\n _this.loading = false;\n _this.confirm.notify(\"error\");\n return _this.setExistingUserstoryFormErrors(data);\n };\n })(this);\n onSuccess = (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"epic related user story\", \"create\", \"create related user story on epic\", 1);\n _this.loading = false;\n if (onSavedRelatedUserstory) {\n onSavedRelatedUserstory();\n }\n return _this.loadRelatedUserstories();\n };\n })(this);\n epicId = this.epic.get('id');\n return this.rs.epics.addRelatedUserstory(epicId, selectedUserstoryId).then(onSuccess, onError);\n };\n\n RelatedUserstoriesCreateController.prototype.bulkCreateRelatedUserStories = function(selectedProjectId, userstoriesText, onCreatedRelatedUserstory) {\n var epicId, onError, onSuccess;\n if (!this.validateNewUserstoryForm()) {\n return;\n }\n this.loading = true;\n onError = (function(_this) {\n return function(data) {\n _this.loading = false;\n _this.confirm.notify(\"error\");\n return _this.setNewUserstoryFormErrors(data);\n };\n })(this);\n onSuccess = (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"epic related user story\", \"create\", \"create related user story on epic\", 1);\n _this.loading = false;\n if (onCreatedRelatedUserstory) {\n onCreatedRelatedUserstory();\n }\n return _this.loadRelatedUserstories();\n };\n })(this);\n epicId = this.epic.get('id');\n return this.rs.epics.bulkCreateRelatedUserStories(epicId, selectedProjectId, userstoriesText).then(onSuccess, onError);\n };\n\n return RelatedUserstoriesCreateController;\n\n })();\n\n module.controller(\"RelatedUserstoriesCreateCtrl\", RelatedUserstoriesCreateController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstory-create.directive.coffee\n */\n\n(function() {\n var RelatedUserstoriesCreateDirective, debounceLeading, module;\n\n module = angular.module('taigaEpics');\n\n debounceLeading = this.taiga.debounceLeading;\n\n RelatedUserstoriesCreateDirective = function(lightboxService1) {\n var link;\n this.lightboxService = lightboxService1;\n link = function(scope, el, attrs, ctrl) {\n var existingUserstoryForm, newUserstoryForm;\n newUserstoryForm = el.find(\".new-user-story-form\").checksley();\n existingUserstoryForm = el.find(\".existing-user-story-form\").checksley();\n ctrl.validateNewUserstoryForm = (function(_this) {\n return function() {\n return newUserstoryForm.validate();\n };\n })(this);\n ctrl.setNewUserstoryFormErrors = (function(_this) {\n return function(errors) {\n return newUserstoryForm.setErrors(errors);\n };\n })(this);\n ctrl.validateExistingUserstoryForm = (function(_this) {\n return function() {\n return existingUserstoryForm.validate();\n };\n })(this);\n ctrl.setExistingUserstoryFormErrors = (function(_this) {\n return function(errors) {\n return existingUserstoryForm.setErrors(errors);\n };\n })(this);\n scope.showLightbox = function(selectedProjectId) {\n ctrl.loadProjects();\n return scope.selectProject(selectedProjectId).then((function(_this) {\n return function() {\n return lightboxService.open(el.find(\".lightbox-create-related-user-stories\"));\n };\n })(this));\n };\n scope.closeLightbox = function() {\n scope.selectedUserstory = null;\n scope.searchUserstory = \"\";\n scope.relatedUserstoriesText = \"\";\n return lightboxService.close(el.find(\".lightbox-create-related-user-stories\"));\n };\n scope.$watch('vm.project', function(project) {\n if (project != null) {\n return scope.selectedProject = project.get('id');\n }\n });\n scope.selectProject = function(selectedProjectId) {\n scope.selectedUserstory = null;\n scope.searchUserstory = \"\";\n return ctrl.filterUss(selectedProjectId, scope.searchUserstory);\n };\n return scope.onUpdateSearchUserstory = debounceLeading(300, function() {\n scope.selectedUserstory = null;\n return ctrl.filterUss(scope.selectedProject, scope.searchUserstory);\n });\n };\n return {\n link: link,\n templateUrl: \"epics/related-userstories/related-userstories-create/related-userstories-create.html\",\n controller: \"RelatedUserstoriesCreateCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n showCreateRelatedUserstoriesLightbox: \"=\",\n project: \"=\",\n epic: \"=\",\n epicUserstories: \"=\",\n loadRelatedUserstories: \"&\"\n }\n };\n };\n\n RelatedUserstoriesCreateDirective.$inject = [\"lightboxService\"];\n\n module.directive(\"tgRelatedUserstoriesCreate\", RelatedUserstoriesCreateDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstories-sortable.directive.coffee\n */\n\n(function() {\n var RelatedUserstoriesSortableDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserstoriesSortableDirective = function($parse, projectService) {\n var link;\n link = function(scope, el, attrs) {\n var callback, drake, scroll;\n if (!projectService.hasPermission(\"modify_epic\")) {\n return;\n }\n callback = $parse(attrs.tgRelatedUserstoriesSortable);\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).is('tg-related-userstory-row');\n }\n });\n drake.on('dragend', function(item) {\n var itemEl, newIndex, us;\n itemEl = $(item);\n us = itemEl.scope().us;\n newIndex = itemEl.index();\n return scope.$apply(function() {\n return callback(scope, {\n us: us,\n newIndex: newIndex\n });\n });\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n return {\n link: link\n };\n };\n\n RelatedUserstoriesSortableDirective.$inject = [\"$parse\", \"tgProjectService\"];\n\n module.directive(\"tgRelatedUserstoriesSortable\", RelatedUserstoriesSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstories.directive.coffee\n */\n\n(function() {\n var RelatedUserStoriesDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserStoriesDirective = function() {\n return {\n templateUrl: \"epics/related-userstories/related-userstories.html\",\n controller: \"RelatedUserStoriesCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n userstories: '=',\n project: '=',\n epic: '='\n }\n };\n };\n\n RelatedUserStoriesDirective.$inject = [];\n\n module.directive(\"tgRelatedUserstories\", RelatedUserStoriesDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: reñated-userstory-row.controller.coffee\n */\n\n(function() {\n var RelatedUserstoryRowController, module;\n\n module = angular.module(\"taigaEpics\");\n\n RelatedUserstoryRowController = (function() {\n RelatedUserstoryRowController.$inject = [\"tgAvatarService\", \"$translate\", \"$tgConfirm\", \"tgResources\"];\n\n function RelatedUserstoryRowController(avatarService, translate, confirm, rs) {\n this.avatarService = avatarService;\n this.translate = translate;\n this.confirm = confirm;\n this.rs = rs;\n }\n\n RelatedUserstoryRowController.prototype.setAvatarData = function() {\n var member;\n member = this.userstory.get('assigned_to_extra_info');\n return this.avatar = this.avatarService.getAvatar(member);\n };\n\n RelatedUserstoryRowController.prototype.getAssignedToFullNameDisplay = function() {\n if (this.userstory.get('assigned_to')) {\n return this.userstory.getIn(['assigned_to_extra_info', 'full_name_display']);\n }\n return this.translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\");\n };\n\n RelatedUserstoryRowController.prototype.onDeleteRelatedUserstory = function() {\n var message, title;\n title = this.translate.instant('EPIC.TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY');\n message = this.translate.instant('EPIC.MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY', {\n subject: this.userstory.get('subject')\n });\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var epicId, onError, onSuccess, userstoryId;\n onError = function() {\n message = _this.translate.instant('EPIC.ERROR_UNLINK_RELATED_USERSTORY', {\n errorMessage: message\n });\n _this.confirm.notify(\"error\", null, message);\n return askResponse.finish(false);\n };\n onSuccess = function() {\n _this.loadRelatedUserstories();\n return askResponse.finish();\n };\n epicId = _this.epic.get('id');\n userstoryId = _this.userstory.get('id');\n return _this.rs.epics.deleteRelatedUserstory(epicId, userstoryId).then(onSuccess, onError);\n };\n })(this));\n };\n\n return RelatedUserstoryRowController;\n\n })();\n\n module.controller(\"RelatedUserstoryRowCtrl\", RelatedUserstoryRowController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: related-userstory-row.directive.coffee\n */\n\n(function() {\n var RelatedUserstoryRowDirective, module;\n\n module = angular.module('taigaEpics');\n\n RelatedUserstoryRowDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.setAvatarData();\n };\n return {\n link: link,\n templateUrl: \"epics/related-userstories/related-userstory-row/related-userstory-row.html\",\n controller: \"RelatedUserstoryRowCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n userstory: '=',\n epic: '=',\n project: '=',\n loadRelatedUserstories: \"&\"\n }\n };\n };\n\n RelatedUserstoryRowDirective.$inject = [];\n\n module.directive(\"tgRelatedUserstoryRow\", RelatedUserstoryRowDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-app.controller.coffee\n */\n\n(function() {\n var ExternalAppController, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ExternalAppController = (function(superClass) {\n extend(ExternalAppController, superClass);\n\n ExternalAppController.$inject = [\"$routeParams\", \"tgExternalAppsService\", \"$window\", \"tgCurrentUserService\", \"$location\", \"$tgNavUrls\", \"tgXhrErrorService\", \"tgLoader\"];\n\n function ExternalAppController(routeParams, externalAppsService, window, currentUserService, location, navUrls, xhrError, loader) {\n var loginUrl, nextUrl;\n this.routeParams = routeParams;\n this.externalAppsService = externalAppsService;\n this.window = window;\n this.currentUserService = currentUserService;\n this.location = location;\n this.navUrls = navUrls;\n this.xhrError = xhrError;\n this.loader = loader;\n this.createApplicationToken = bind(this.createApplicationToken, this);\n this._getApplicationToken = bind(this._getApplicationToken, this);\n this._redirect = bind(this._redirect, this);\n this.loader.start(false);\n this._applicationId = this.routeParams.application;\n this._state = this.routeParams.state;\n this._getApplicationToken();\n this._user = this.currentUserService.getUser();\n this._application = null;\n nextUrl = encodeURIComponent(this.location.url());\n loginUrl = this.navUrls.resolve(\"login\");\n this.loginWithAnotherUserUrl = loginUrl + \"?next=\" + nextUrl;\n taiga.defineImmutableProperty(this, \"user\", (function(_this) {\n return function() {\n return _this._user;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"application\", (function(_this) {\n return function() {\n return _this._application;\n };\n })(this));\n }\n\n ExternalAppController.prototype._redirect = function(applicationToken) {\n var nextUrl;\n nextUrl = applicationToken.get(\"next_url\");\n return this.window.open(nextUrl, \"_self\");\n };\n\n ExternalAppController.prototype._getApplicationToken = function() {\n return this.externalAppsService.getApplicationToken(this._applicationId, this._state).then((function(_this) {\n return function(data) {\n _this._application = data.get(\"application\");\n if (data.get(\"auth_code\")) {\n return _this._redirect(data);\n } else {\n return _this.loader.pageLoaded();\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n _this.loader.pageLoaded();\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n ExternalAppController.prototype.cancel = function() {\n return this.window.history.back();\n };\n\n ExternalAppController.prototype.createApplicationToken = function() {\n return this.externalAppsService.authorizeApplicationToken(this._applicationId, this._state).then((function(_this) {\n return function(data) {\n return _this._redirect(data);\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n return ExternalAppController;\n\n })(taiga.Controller);\n\n angular.module(\"taigaExternalApps\").controller(\"ExternalApp\", ExternalAppController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-app.service.coffee\n */\n\n(function() {\n var ExternalAppsService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n ExternalAppsService = (function(superClass) {\n extend(ExternalAppsService, superClass);\n\n ExternalAppsService.$inject = [\"tgResources\"];\n\n function ExternalAppsService(rs) {\n this.rs = rs;\n }\n\n ExternalAppsService.prototype.getApplicationToken = function(applicationId, state) {\n return this.rs.externalapps.getApplicationToken(applicationId, state);\n };\n\n ExternalAppsService.prototype.authorizeApplicationToken = function(applicationId, state) {\n return this.rs.externalapps.authorizeApplicationToken(applicationId, state);\n };\n\n return ExternalAppsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaExternalApps\").service(\"tgExternalAppsService\", ExternalAppsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: feedback.service.coffee\n */\n\n(function() {\n var FeedbackService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n FeedbackService = (function(superClass) {\n extend(FeedbackService, superClass);\n\n FeedbackService.$inject = [\"tgLightboxFactory\"];\n\n function FeedbackService(lightboxFactory) {\n this.lightboxFactory = lightboxFactory;\n }\n\n FeedbackService.prototype.sendFeedback = function() {\n return this.lightboxFactory.create(\"tg-lb-feedback\", {\n \"class\": \"lightbox lightbox-feedback lightbox-generic-form\"\n });\n };\n\n return FeedbackService;\n\n })(taiga.Service);\n\n angular.module(\"taigaFeedback\").service(\"tgFeedbackService\", FeedbackService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.controller.coffee\n */\n\n(function() {\n var CommentController, module;\n\n module = angular.module(\"taigaHistory\");\n\n CommentController = (function() {\n CommentController.$inject = [\"tgCurrentUserService\", \"tgCheckPermissionsService\", \"tgLightboxFactory\"];\n\n function CommentController(currentUserService, permissionService, lightboxFactory) {\n this.currentUserService = currentUserService;\n this.permissionService = permissionService;\n this.lightboxFactory = lightboxFactory;\n this.hiddenDeletedComment = true;\n }\n\n CommentController.prototype.showDeletedComment = function() {\n return this.hiddenDeletedComment = false;\n };\n\n CommentController.prototype.hideDeletedComment = function() {\n return this.hiddenDeletedComment = true;\n };\n\n CommentController.prototype.checkCancelComment = function(event) {\n if (event.keyCode === 27) {\n return this.onEditMode({\n commentId: this.comment.id\n });\n }\n };\n\n CommentController.prototype.canEditDeleteComment = function() {\n if (this.currentUserService.getUser()) {\n this.user = this.currentUserService.getUser();\n return this.user.get('id') === this.comment.user.pk || this.permissionService.check('modify_project');\n }\n };\n\n CommentController.prototype.saveComment = function(text, cb) {\n return this.onEditComment({\n commentId: this.comment.id,\n commentData: text,\n callback: cb\n });\n };\n\n CommentController.prototype.displayCommentHistory = function() {\n return this.lightboxFactory.create('tg-lb-display-historic', {\n \"class\": \"lightbox lightbox-display-historic\",\n \"comment\": \"comment\",\n \"name\": \"name\",\n \"object\": \"object\"\n }, {\n \"comment\": this.comment,\n \"name\": this.name,\n \"object\": this.object\n });\n };\n\n return CommentController;\n\n })();\n\n module.controller(\"CommentCtrl\", CommentController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comment.directive.coffee\n */\n\n(function() {\n var CommentDirective, module;\n\n module = angular.module('taigaHistory');\n\n CommentDirective = function() {\n return {\n scope: {\n name: \"@\",\n object: \"@\",\n comment: \"<\",\n type: \"<\",\n loading: \"<\",\n editing: \"<\",\n deleting: \"<\",\n objectId: \"<\",\n editMode: \"<\",\n onEditMode: \"&\",\n onDeleteComment: \"&\",\n onRestoreDeletedComment: \"&\",\n onEditComment: \"&\"\n },\n templateUrl: \"history/comments/comment.html\",\n bindToController: true,\n controller: 'CommentCtrl',\n controllerAs: \"vm\"\n };\n };\n\n module.directive(\"tgComment\", CommentDirective);\n\n}).call(this);\n\n\n/*\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comments.controller.coffee\n */\n\n(function() {\n var CommentsController, module;\n\n module = angular.module(\"taigaHistory\");\n\n CommentsController = (function() {\n CommentsController.$inject = [];\n\n function CommentsController() {}\n\n CommentsController.prototype.initializePermissions = function() {\n return this.canAddCommentPermission = 'comment_' + this.name;\n };\n\n return CommentsController;\n\n })();\n\n module.controller(\"CommentsCtrl\", CommentsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comments.directive.coffee\n */\n\n(function() {\n var CommentsDirective, module;\n\n module = angular.module('taigaHistory');\n\n CommentsDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.initializePermissions();\n };\n return {\n scope: {\n type: \"<\",\n name: \"@\",\n object: \"@\",\n comments: \"<\",\n onEditMode: \"&\",\n onDeleteComment: \"&\",\n onRestoreDeletedComment: \"&\",\n onAddComment: \"&\",\n onEditComment: \"&\",\n editMode: \"<\",\n loading: \"<\",\n deleting: \"<\",\n editing: \"<\",\n projectId: \"=\"\n },\n templateUrl: \"history/comments/comments.html\",\n bindToController: true,\n controller: 'CommentsCtrl',\n controllerAs: \"vm\",\n link: link\n };\n };\n\n module.directive(\"tgComments\", CommentsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.controller.coffee\n */\n\n(function() {\n var LightboxDisplayHistoricController, module;\n\n module = angular.module(\"taigaHistory\");\n\n LightboxDisplayHistoricController = (function() {\n LightboxDisplayHistoricController.$inject = [\"$tgResources\"];\n\n function LightboxDisplayHistoricController(rs) {\n this.rs = rs;\n }\n\n LightboxDisplayHistoricController.prototype._loadHistoric = function() {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.object;\n activityId = this.comment.id;\n return this.rs.history.getCommentHistory(type, objectId, activityId).then((function(_this) {\n return function(data) {\n return _this.commentHistoryEntries = data;\n };\n })(this));\n };\n\n return LightboxDisplayHistoricController;\n\n })();\n\n module.controller(\"LightboxDisplayHistoricCtrl\", LightboxDisplayHistoricController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comment.directive.coffee\n */\n\n(function() {\n var LightboxDisplayHistoricDirective;\n\n LightboxDisplayHistoricDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n ctrl._loadHistoric();\n return lightboxService.open(el);\n };\n return {\n scope: {},\n bindToController: {\n name: '=',\n object: '=',\n comment: '='\n },\n templateUrl: \"history/history-lightbox/comment-history-lightbox.html\",\n controller: \"LightboxDisplayHistoricCtrl\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n LightboxDisplayHistoricDirective.$inject = [\"lightboxService\"];\n\n angular.module('taigaHistory').directive(\"tgLbDisplayHistoric\", LightboxDisplayHistoricDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: comment.directive.coffee\n */\n\n(function() {\n var HistoryEntryDirective;\n\n HistoryEntryDirective = function() {\n return {\n scope: {\n entry: \"<\"\n },\n templateUrl: \"history/history-lightbox/history-entry.html\"\n };\n };\n\n angular.module('taigaHistory').directive(\"tgHistoryEntry\", HistoryEntryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history-tabs.directive.coffee\n */\n\n(function() {\n var HistoryTabsDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryTabsDirective = function() {\n return {\n templateUrl: \"history/history-tabs/history-tabs.html\",\n scope: {\n showCommentTab: \"&\",\n showActivityTab: \"&\",\n onActiveComments: \"&\",\n onActiveActivities: \"&\",\n onOrderComments: \"&\",\n activeTab: \"<\",\n commentsNum: \"<\",\n activitiesNum: \"<\",\n onReverse: \"<\"\n }\n };\n };\n\n module.directive(\"tgHistoryTabs\", HistoryTabsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.controller.coffee\n */\n\n(function() {\n var HistorySectionController, module;\n\n module = angular.module(\"taigaHistory\");\n\n HistorySectionController = (function() {\n HistorySectionController.$inject = [\"$tgResources\", \"$tgRepo\", \"$tgStorage\", \"tgProjectService\"];\n\n function HistorySectionController(rs, repo, storage, projectService) {\n this.rs = rs;\n this.repo = repo;\n this.storage = storage;\n this.projectService = projectService;\n this.editing = null;\n this.deleting = null;\n this.editMode = {};\n this.viewComments = true;\n this.reverse = this.storage.get(\"orderComments\");\n this._loadHistory();\n }\n\n HistorySectionController.prototype._loadHistory = function() {\n return this.rs.history.get(this.name, this.id).then((function(_this) {\n return function(history) {\n _this._getComments(history);\n return _this._getActivities(history);\n };\n })(this));\n };\n\n HistorySectionController.prototype._getComments = function(comments) {\n this.comments = _.filter(comments, function(item) {\n return item.comment !== \"\";\n });\n if (this.reverse) {\n this.comments - _.reverse(this.comments);\n }\n return this.commentsNum = this.comments.length;\n };\n\n HistorySectionController.prototype._getActivities = function(activities) {\n this.activities = _.filter(activities, function(item) {\n return Object.keys(item.values_diff).length > 0;\n });\n return this.activitiesNum = this.activities.length;\n };\n\n HistorySectionController.prototype.showHistorySection = function() {\n return this.showCommentTab() || this.showActivityTab();\n };\n\n HistorySectionController.prototype.showCommentTab = function() {\n return this.commentsNum > 0 || this.projectService.hasPermission(\"comment_\" + this.name);\n };\n\n HistorySectionController.prototype.showActivityTab = function() {\n return this.activitiesNum > 0;\n };\n\n HistorySectionController.prototype.toggleEditMode = function(commentId) {\n return this.editMode[commentId] = !this.editMode[commentId];\n };\n\n HistorySectionController.prototype.onActiveHistoryTab = function(active) {\n return this.viewComments = active;\n };\n\n HistorySectionController.prototype.deleteComment = function(commentId) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.deleting = commentId;\n return this.rs.history.deleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n _this._loadHistory();\n return _this.deleting = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.editComment = function(commentId, comment) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.editing = commentId;\n return this.rs.history.editComment(type, objectId, activityId, comment).then((function(_this) {\n return function() {\n _this._loadHistory();\n _this.toggleEditMode(commentId);\n return _this.editing = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.restoreDeletedComment = function(commentId) {\n var activityId, objectId, type;\n type = this.name;\n objectId = this.id;\n activityId = commentId;\n this.editing = commentId;\n return this.rs.history.undeleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n _this._loadHistory();\n return _this.editing = null;\n };\n })(this));\n };\n\n HistorySectionController.prototype.addComment = function(cb) {\n return this.repo.save(this.type).then((function(_this) {\n return function() {\n _this._loadHistory();\n return cb();\n };\n })(this));\n };\n\n HistorySectionController.prototype.onOrderComments = function() {\n this.reverse = !this.reverse;\n this.storage.set(\"orderComments\", this.reverse);\n return this._loadHistory();\n };\n\n return HistorySectionController;\n\n })();\n\n module.controller(\"HistorySection\", HistorySectionController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.directive.coffee\n */\n\n(function() {\n var HistorySectionDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistorySectionDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n return scope.$on(\"object:updated\", function() {\n return ctrl._loadHistory(scope.type, scope.id);\n });\n };\n return {\n link: link,\n templateUrl: \"history/history.html\",\n controller: \"HistorySection\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n type: \"=\",\n name: \"@\",\n id: \"=\",\n projectId: \"=\"\n }\n };\n };\n\n HistorySectionDirective.$inject = [];\n\n module.directive(\"tgHistorySection\", HistorySectionDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.controller.coffee\n */\n\n(function() {\n var ActivitiesDiffController, module;\n\n module = angular.module(\"taigaHistory\");\n\n ActivitiesDiffController = (function() {\n ActivitiesDiffController.$inject = [];\n\n function ActivitiesDiffController() {}\n\n ActivitiesDiffController.prototype.diffTags = function() {\n if (this.type === 'tags') {\n this.diffRemoveTags = _.difference(this.diff[0], this.diff[1]).toString();\n return this.diffAddTags = _.difference(this.diff[1], this.diff[0]).toString();\n }\n };\n\n return ActivitiesDiffController;\n\n })();\n\n module.controller(\"ActivitiesDiffCtrl\", ActivitiesDiffController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.directive.coffee\n */\n\n(function() {\n var HistoryDiffDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryDiffDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.diffTags();\n };\n return {\n scope: {\n type: \"<\",\n diff: \"<\"\n },\n templateUrl: \"history/history/history-diff.html\",\n controller: \"ActivitiesDiffCtrl\",\n controllerAs: 'vm',\n bindToController: true,\n link: link\n };\n };\n\n module.directive(\"tgHistoryDiff\", HistoryDiffDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: history.directive.coffee\n */\n\n(function() {\n var HistoryDirective, module;\n\n module = angular.module('taigaHistory');\n\n HistoryDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n scope: {\n activities: \"<\"\n },\n templateUrl: \"history/history/history.html\",\n link: link\n };\n };\n\n module.directive(\"tgHistory\", HistoryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: duty.directive.coffee\n */\n\n(function() {\n var DutyDirective;\n\n DutyDirective = function(navurls, $translate) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.duty = scope.duty;\n scope.vm.type = scope.type;\n return scope.vm.getDutyType = function() {\n if (scope.vm.duty) {\n if (scope.vm.duty.get('_name') === \"epics\") {\n return $translate.instant(\"COMMON.EPIC\");\n }\n if (scope.vm.duty.get('_name') === \"userstories\") {\n return $translate.instant(\"COMMON.USER_STORY\");\n }\n if (scope.vm.duty.get('_name') === \"tasks\") {\n return $translate.instant(\"COMMON.TASK\");\n }\n if (scope.vm.duty.get('_name') === \"issues\") {\n return $translate.instant(\"COMMON.ISSUE\");\n }\n }\n };\n };\n return {\n templateUrl: \"home/duties/duty.html\",\n scope: {\n \"duty\": \"=tgDuty\",\n \"type\": \"@\"\n },\n link: link\n };\n };\n\n DutyDirective.$inject = [\"$tgNavUrls\", \"$translate\"];\n\n angular.module(\"taigaHome\").directive(\"tgDuty\", DutyDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.controller.coffee\n */\n\n(function() {\n var HomeController;\n\n HomeController = (function() {\n HomeController.$inject = [\"tgCurrentUserService\", \"$location\", \"$tgNavUrls\"];\n\n function HomeController(currentUserService, location, navUrls) {\n this.currentUserService = currentUserService;\n this.location = location;\n this.navUrls = navUrls;\n if (!this.currentUserService.getUser()) {\n this.location.path(this.navUrls.resolve(\"discover\"));\n }\n }\n\n return HomeController;\n\n })();\n\n angular.module(\"taigaHome\").controller(\"Home\", HomeController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.service.coffee\n */\n\n(function() {\n var HomeService, groupBy,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n groupBy = this.taiga.groupBy;\n\n HomeService = (function(superClass) {\n extend(HomeService, superClass);\n\n HomeService.$inject = [\"$tgNavUrls\", \"tgResources\", \"tgProjectsService\"];\n\n function HomeService(navurls, rs, projectsService) {\n this.navurls = navurls;\n this.rs = rs;\n this.projectsService = projectsService;\n }\n\n HomeService.prototype._attachProjectInfoToWorkInProgress = function(workInProgress, projectsById) {\n var _attachProjectInfoToDuty, _duties, _getValidDutiesAndAttachProjectInfo, assignedTo, watching;\n _attachProjectInfoToDuty = (function(_this) {\n return function(duty, objType) {\n var ctx, project, url;\n project = projectsById.get(String(duty.get('project')));\n ctx = {\n project: project.get('slug'),\n ref: duty.get('ref')\n };\n url = _this.navurls.resolve(\"project-\" + objType + \"-detail\", ctx);\n duty = duty.set('url', url);\n duty = duty.set('project', project);\n duty = duty.set(\"_name\", objType);\n return duty;\n };\n })(this);\n _getValidDutiesAndAttachProjectInfo = function(duties, dutyType) {\n duties = duties.filter(function(duty) {\n return projectsById.get(String(duty.get('project')));\n });\n duties = duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, dutyType);\n });\n return duties;\n };\n assignedTo = workInProgress.get(\"assignedTo\");\n if (assignedTo.get(\"epics\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"epics\"), \"epics\");\n assignedTo = assignedTo.set(\"epics\", _duties);\n }\n if (assignedTo.get(\"userStories\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"userStories\"), \"userstories\");\n assignedTo = assignedTo.set(\"userStories\", _duties);\n }\n if (assignedTo.get(\"tasks\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"tasks\"), \"tasks\");\n assignedTo = assignedTo.set(\"tasks\", _duties);\n }\n if (assignedTo.get(\"issues\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(assignedTo.get(\"issues\"), \"issues\");\n assignedTo = assignedTo.set(\"issues\", _duties);\n }\n watching = workInProgress.get(\"watching\");\n if (watching.get(\"epics\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"epics\"), \"epics\");\n watching = watching.set(\"epics\", _duties);\n }\n if (watching.get(\"userStories\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"userStories\"), \"userstories\");\n watching = watching.set(\"userStories\", _duties);\n }\n if (watching.get(\"tasks\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"tasks\"), \"tasks\");\n watching = watching.set(\"tasks\", _duties);\n }\n if (watching.get(\"issues\")) {\n _duties = _getValidDutiesAndAttachProjectInfo(watching.get(\"issues\"), \"issues\");\n watching = watching.set(\"issues\", _duties);\n }\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo);\n return workInProgress = workInProgress.set(\"watching\", watching);\n };\n\n HomeService.prototype.getWorkInProgress = function(userId) {\n var assignedEpicsPromise, assignedIssuesPromise, assignedTasksPromise, assignedTo, assignedUserStoriesPromise, params_epics, params_issues, params_tasks, params_uss, projectsById, projectsPromise, watching, watchingEpicsPromise, watchingIssuesPromise, watchingTasksPromise, watchingUserStoriesPromise, workInProgress;\n projectsById = Immutable.Map();\n projectsPromise = this.projectsService.getProjectsByUserId(userId).then(function(projects) {\n return projectsById = Immutable.fromJS(groupBy(projects.toJS(), function(p) {\n return p.id;\n }));\n });\n assignedTo = Immutable.Map();\n params_epics = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_uss = {\n is_closed: false,\n assigned_users: userId\n };\n params_tasks = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_issues = {\n status__is_closed: false,\n assigned_to: userId\n };\n assignedEpicsPromise = this.rs.epics.listInAllProjects(params_epics).then(function(epics) {\n return assignedTo = assignedTo.set(\"epics\", epics);\n });\n assignedUserStoriesPromise = this.rs.userstories.listInAllProjects(params_uss).then(function(userstories) {\n return assignedTo = assignedTo.set(\"userStories\", userstories);\n });\n assignedTasksPromise = this.rs.tasks.listInAllProjects(params_tasks).then(function(tasks) {\n return assignedTo = assignedTo.set(\"tasks\", tasks);\n });\n assignedIssuesPromise = this.rs.issues.listInAllProjects(params_issues).then(function(issues) {\n return assignedTo = assignedTo.set(\"issues\", issues);\n });\n params_epics = {\n status__is_closed: false,\n watchers: userId\n };\n params_uss = {\n is_closed: false,\n watchers: userId\n };\n params_tasks = {\n status__is_closed: false,\n watchers: userId\n };\n params_issues = {\n status__is_closed: false,\n watchers: userId\n };\n watching = Immutable.Map();\n watchingEpicsPromise = this.rs.epics.listInAllProjects(params_epics).then(function(epics) {\n return watching = watching.set(\"epics\", epics);\n });\n watchingUserStoriesPromise = this.rs.userstories.listInAllProjects(params_uss).then(function(userstories) {\n return watching = watching.set(\"userStories\", userstories);\n });\n watchingTasksPromise = this.rs.tasks.listInAllProjects(params_tasks).then(function(tasks) {\n return watching = watching.set(\"tasks\", tasks);\n });\n watchingIssuesPromise = this.rs.issues.listInAllProjects(params_issues).then(function(issues) {\n return watching = watching.set(\"issues\", issues);\n });\n workInProgress = Immutable.Map();\n return Promise.all([projectsPromise, assignedEpicsPromise, watchingEpicsPromise, assignedUserStoriesPromise, watchingUserStoriesPromise, assignedTasksPromise, watchingTasksPromise, assignedIssuesPromise, watchingIssuesPromise]).then((function(_this) {\n return function() {\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo);\n workInProgress = workInProgress.set(\"watching\", watching);\n workInProgress = _this._attachProjectInfoToWorkInProgress(workInProgress, projectsById);\n return workInProgress;\n };\n })(this));\n };\n\n return HomeService;\n\n })(taiga.Service);\n\n angular.module(\"taigaHome\").service(\"tgHomeService\", HomeService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home-project-list.directive.coffee\n */\n\n(function() {\n var HomeProjectListDirective;\n\n HomeProjectListDirective = function(currentUserService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n return taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n };\n directive = {\n templateUrl: \"home/projects/home-project-list.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n HomeProjectListDirective.$inject = [\"tgCurrentUserService\"];\n\n angular.module(\"taigaHome\").directive(\"tgHomeProjectList\", HomeProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: working-on.controller.coffee\n */\n\n(function() {\n var WorkingOnController;\n\n WorkingOnController = (function() {\n WorkingOnController.$inject = [\"tgHomeService\"];\n\n function WorkingOnController(homeService) {\n this.homeService = homeService;\n this.assignedTo = Immutable.Map();\n this.watching = Immutable.Map();\n }\n\n WorkingOnController.prototype._setAssignedTo = function(workInProgress) {\n var epics, issues, tasks, userStories;\n epics = workInProgress.get(\"assignedTo\").get(\"epics\");\n userStories = workInProgress.get(\"assignedTo\").get(\"userStories\");\n tasks = workInProgress.get(\"assignedTo\").get(\"tasks\");\n issues = workInProgress.get(\"assignedTo\").get(\"issues\");\n this.assignedTo = userStories.concat(tasks).concat(issues).concat(epics);\n if (this.assignedTo.size > 0) {\n return this.assignedTo = this.assignedTo.sortBy(function(elem) {\n return elem.get(\"modified_date\");\n }).reverse();\n }\n };\n\n WorkingOnController.prototype._setWatching = function(workInProgress) {\n var epics, issues, tasks, userStories;\n epics = workInProgress.get(\"watching\").get(\"epics\");\n userStories = workInProgress.get(\"watching\").get(\"userStories\");\n tasks = workInProgress.get(\"watching\").get(\"tasks\");\n issues = workInProgress.get(\"watching\").get(\"issues\");\n this.watching = userStories.concat(tasks).concat(issues).concat(epics);\n if (this.watching.size > 0) {\n return this.watching = this.watching.sortBy(function(elem) {\n return elem.get(\"modified_date\");\n }).reverse();\n }\n };\n\n WorkingOnController.prototype.getWorkInProgress = function(userId) {\n return this.homeService.getWorkInProgress(userId).then((function(_this) {\n return function(workInProgress) {\n _this._setAssignedTo(workInProgress);\n return _this._setWatching(workInProgress);\n };\n })(this));\n };\n\n return WorkingOnController;\n\n })();\n\n angular.module(\"taigaHome\").controller(\"WorkingOn\", WorkingOnController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: working-on.directive.coffee\n */\n\n(function() {\n var WorkingOnDirective;\n\n WorkingOnDirective = function(homeService, currentUserService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var user, userId;\n user = currentUserService.getUser();\n if (user) {\n userId = user.get(\"id\");\n return ctrl.getWorkInProgress(userId);\n }\n };\n return {\n controller: \"WorkingOn\",\n controllerAs: \"vm\",\n templateUrl: \"home/working-on/working-on.html\",\n scope: {},\n link: link\n };\n };\n\n WorkingOnDirective.$inject = [\"tgHomeService\", \"tgCurrentUserService\"];\n\n angular.module(\"taigaHome\").directive(\"tgWorkingOn\", WorkingOnDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: add-members.controller.coffee\n */\n\n(function() {\n var InviteMembersFormController, taiga;\n\n taiga = this.taiga;\n\n InviteMembersFormController = (function() {\n InviteMembersFormController.$inject = [\"tgProjectService\", \"$tgResources\", \"lightboxService\", \"$tgConfirm\", \"$rootScope\"];\n\n function InviteMembersFormController(projectService, rs, lightboxService, confirm, rootScope) {\n this.projectService = projectService;\n this.rs = rs;\n this.lightboxService = lightboxService;\n this.confirm = confirm;\n this.rootScope = rootScope;\n this.project = this.projectService.project;\n this.roles = this.projectService.project.get('roles');\n this.rolesValues = {};\n this.loading = false;\n this.defaultMaxInvites = 4;\n }\n\n InviteMembersFormController.prototype._areRolesValidated = function() {\n return Object.defineProperty(this, 'areRolesValidated', {\n get: (function(_this) {\n return function() {\n var roleIds;\n roleIds = _.filter(Object.values(_this.rolesValues), function(it) {\n return it;\n });\n return roleIds.length === _this.contactsToInvite.size + _this.emailsToInvite.size;\n };\n })(this)\n });\n };\n\n InviteMembersFormController.prototype._checkLimitMemberships = function() {\n var pendingMembersCount;\n if (this.project.get('max_memberships') === null) {\n this.membersLimit = this.defaultMaxInvites;\n } else {\n pendingMembersCount = Math.max(this.project.get('max_memberships') - this.project.get('total_memberships'), 0);\n this.membersLimit = Math.min(pendingMembersCount, this.defaultMaxInvites);\n }\n return this.showWarningMessage = this.membersLimit < this.defaultMaxInvites;\n };\n\n InviteMembersFormController.prototype.sendInvites = function() {\n this.setInvitedContacts = [];\n _.forEach(this.rolesValues, (function(_this) {\n return function(key, value) {\n return _this.setInvitedContacts.push({\n 'role_id': key,\n 'username': value\n });\n };\n })(this));\n this.loading = true;\n return this.rs.memberships.bulkCreateMemberships(this.project.get('id'), this.setInvitedContacts, this.inviteContactsMessage).then((function(_this) {\n return function(response) {\n return _this.projectService.fetchProject().then(function() {\n _this.loading = false;\n _this.lightboxService.closeAll();\n _this.rootScope.$broadcast(\"membersform:new:success\");\n return _this.confirm.notify('success');\n });\n };\n })(this))[\"catch\"]((function(_this) {\n return function(response) {\n _this.loading = false;\n if (response.data._error_message) {\n return _this.confirm.notify(\"error\", response.data._error_message);\n }\n };\n })(this));\n };\n\n return InviteMembersFormController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"InviteMembersFormCtrl\", InviteMembersFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: invite-members.directive.coffee\n */\n\n(function() {\n var InviteMembersFormDirective;\n\n InviteMembersFormDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n ctrl._areRolesValidated();\n return ctrl._checkLimitMemberships();\n };\n return {\n scope: {},\n templateUrl: \"invite-members/invite-members-form/invite-members-form.html\",\n controller: \"InviteMembersFormCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n contactsToInvite: '<',\n emailsToInvite: '=',\n onDisplayContactList: '&',\n onRemoveInvitedContact: '&',\n onRemoveInvitedEmail: '&',\n onSendInvites: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgInviteMembersForm\", InviteMembersFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: add-members.controller.coffee\n */\n\n(function() {\n var AddMembersController, taiga;\n\n taiga = this.taiga;\n\n AddMembersController = (function() {\n AddMembersController.$inject = [\"tgUserService\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function AddMembersController(userService, currentUserService, projectService) {\n this.userService = userService;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n this.contactsToInvite = Immutable.List();\n this.emailsToInvite = Immutable.List();\n this.displayContactList = false;\n }\n\n AddMembersController.prototype._getContacts = function() {\n var excludeProjectId, userId;\n userId = this.currentUserService.getUser().get(\"id\");\n excludeProjectId = this.projectService.project.get(\"id\");\n return this.userService.getContacts(userId, excludeProjectId).then((function(_this) {\n return function(contacts) {\n return _this.contacts = contacts;\n };\n })(this));\n };\n\n AddMembersController.prototype._filterContacts = function(invited) {\n return this.contacts = this.contacts.filter((function(_this) {\n return function(contact) {\n return contact.get('id') !== invited.get('id');\n };\n })(this));\n };\n\n AddMembersController.prototype.inviteSuggested = function(contact) {\n this.contactsToInvite = this.contactsToInvite.push(contact);\n this._filterContacts(contact);\n return this.displayContactList = true;\n };\n\n AddMembersController.prototype.removeContact = function(invited) {\n this.contactsToInvite = this.contactsToInvite.filter((function(_this) {\n return function(contact) {\n return contact.get('id') !== invited.id;\n };\n })(this));\n invited = Immutable.fromJS(invited);\n this.contacts = this.contacts.push(invited);\n return this.testEmptyContacts();\n };\n\n AddMembersController.prototype.inviteEmail = function(email) {\n var emailData;\n emailData = Immutable.Map({\n 'email': email\n });\n this.emailsToInvite = this.emailsToInvite.push(emailData);\n return this.displayContactList = true;\n };\n\n AddMembersController.prototype.removeEmail = function(invited) {\n this.emailsToInvite = this.emailsToInvite.filter((function(_this) {\n return function(email) {\n return email.get('email') !== invited.email;\n };\n })(this));\n return this.testEmptyContacts();\n };\n\n AddMembersController.prototype.testEmptyContacts = function() {\n if (this.emailsToInvite.size + this.contactsToInvite.size === 0) {\n return this.displayContactList = false;\n }\n };\n\n return AddMembersController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"AddMembersCtrl\", AddMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: add-member.directive.coffee\n */\n\n(function() {\n var LightboxAddMembersDirective;\n\n LightboxAddMembersDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n lightboxService.open(el);\n return ctrl._getContacts();\n };\n return {\n scope: {},\n templateUrl: \"invite-members/lightbox-add-members.html\",\n controller: \"AddMembersCtrl\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgLbAddMembers\", [\"lightboxService\", LightboxAddMembersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: suggest-add-members.controller.coffee\n */\n\n(function() {\n var SuggestAddMembersController, taiga;\n\n taiga = this.taiga;\n\n SuggestAddMembersController = (function() {\n SuggestAddMembersController.$inject = [];\n\n function SuggestAddMembersController() {\n this.contactQuery = \"\";\n }\n\n SuggestAddMembersController.prototype.isEmail = function() {\n return taiga.isEmail(this.contactQuery);\n };\n\n SuggestAddMembersController.prototype.filterContacts = function() {\n return this.filteredContacts = this.contacts.filter((function(_this) {\n return function(contact) {\n return contact.get('full_name_display').toLowerCase().includes(_this.contactQuery.toLowerCase()) || contact.get('username').toLowerCase().includes(_this.contactQuery.toLowerCase());\n };\n })(this)).slice(0, 12);\n };\n\n SuggestAddMembersController.prototype.setInvited = function(contact) {\n return this.onInviteSuggested({\n 'contact': contact\n });\n };\n\n return SuggestAddMembersController;\n\n })();\n\n angular.module(\"taigaAdmin\").controller(\"SuggestAddMembersCtrl\", SuggestAddMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: suggest-add-member.directive.coffee\n */\n\n(function() {\n var SuggestAddMembersDirective;\n\n SuggestAddMembersDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch(\"vm.contacts\", (function(_this) {\n return function(contacts) {\n if (contacts) {\n return ctrl.filterContacts();\n }\n };\n })(this));\n };\n return {\n scope: {},\n templateUrl: \"invite-members/suggest-add-members/suggest-add-members.html\",\n controller: \"SuggestAddMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: {\n contacts: '=',\n onInviteSuggested: '&',\n onInviteEmail: '&'\n },\n link: link\n };\n };\n\n angular.module(\"taigaAdmin\").directive(\"tgSuggestAddMembers\", [\"lightboxService\", SuggestAddMembersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: dropdown-project-list.directive.coffee\n */\n\n(function() {\n var DropdownProjectListDirective;\n\n DropdownProjectListDirective = function(currentUserService, projectsService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n return scope.vm.newProject = function() {\n return projectsService.newProject();\n };\n };\n directive = {\n templateUrl: \"navigation-bar/dropdown-project-list/dropdown-project-list.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n DropdownProjectListDirective.$inject = [\"tgCurrentUserService\", \"tgProjectsService\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownProjectList\", DropdownProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: dropdown-user.directive.coffee\n */\n\n(function() {\n var DropdownUserDirective;\n\n DropdownUserDirective = function(authService, configService, locationService, navUrlsService, feedbackService, $rootScope) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.isFeedbackEnabled = configService.get(\"feedbackEnabled\");\n scope.vm.supportUrl = configService.get(\"supportUrl\");\n taiga.defineImmutableProperty(scope.vm, \"user\", function() {\n return authService.userData;\n });\n scope.vm.logout = function() {\n authService.logout();\n locationService.url(navUrlsService.resolve(\"discover\"));\n return locationService.search({});\n };\n scope.vm.sendFeedback = function() {\n return feedbackService.sendFeedback();\n };\n return scope.vm.userSettingsPlugins = _.filter($rootScope.userSettingsPlugins, {\n userMenu: true\n });\n };\n directive = {\n templateUrl: \"navigation-bar/dropdown-user/dropdown-user.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n DropdownUserDirective.$inject = [\"$tgAuth\", \"$tgConfig\", \"$tgLocation\", \"$tgNavUrls\", \"tgFeedbackService\", \"$rootScope\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownUser\", DropdownUserDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.directive.coffee\n */\n\n(function() {\n var NavigationBarDirective;\n\n NavigationBarDirective = function(currentUserService, navigationBarService, locationService, navUrlsService, config) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n taiga.defineImmutableProperty(scope.vm, \"isAuthenticated\", function() {\n return currentUserService.isAuthenticated();\n });\n taiga.defineImmutableProperty(scope.vm, \"isEnabledHeader\", function() {\n return navigationBarService.isEnabledHeader();\n });\n scope.vm.publicRegisterEnabled = config.get(\"publicRegisterEnabled\");\n scope.vm.supportUrl = config.get(\"supportUrl\");\n scope.vm.login = function() {\n var nextUrl;\n nextUrl = encodeURIComponent(locationService.url());\n locationService.url(navUrlsService.resolve(\"login\"));\n return locationService.search({\n next: nextUrl\n });\n };\n return scope.$on(\"$routeChangeSuccess\", function() {\n if (locationService.path() === \"/\") {\n return scope.vm.active = true;\n } else {\n return scope.vm.active = false;\n }\n });\n };\n directive = {\n templateUrl: \"navigation-bar/navigation-bar.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n NavigationBarDirective.$inject = [\"tgCurrentUserService\", \"tgNavigationBarService\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfig\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgNavigationBar\", NavigationBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.service.coffee\n */\n\n(function() {\n var NavigationBarService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n NavigationBarService = (function(superClass) {\n extend(NavigationBarService, superClass);\n\n function NavigationBarService() {\n this.disableHeader();\n }\n\n NavigationBarService.prototype.enableHeader = function() {\n return this.enabledHeader = true;\n };\n\n NavigationBarService.prototype.disableHeader = function() {\n return this.enabledHeader = false;\n };\n\n NavigationBarService.prototype.isEnabledHeader = function() {\n return this.enabledHeader;\n };\n\n return NavigationBarService;\n\n })(taiga.Service);\n\n angular.module(\"taigaNavigationBar\").service(\"tgNavigationBarService\", NavigationBarService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-bar.controller.coffee\n */\n\n(function() {\n var ProfileBarController;\n\n ProfileBarController = (function() {\n ProfileBarController.$inject = [\"tgUserService\"];\n\n function ProfileBarController(userService) {\n this.userService = userService;\n this.loadStats();\n }\n\n ProfileBarController.prototype.loadStats = function() {\n return this.userService.getStats(this.user.get(\"id\")).then((function(_this) {\n return function(stats) {\n return _this.stats = stats;\n };\n })(this));\n };\n\n return ProfileBarController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileBar\", ProfileBarController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-bar.directive.coffee\n */\n\n(function() {\n var ProfileBarDirective;\n\n ProfileBarDirective = function() {\n return {\n templateUrl: \"profile/profile-bar/profile-bar.html\",\n controller: \"ProfileBar\",\n controllerAs: \"vm\",\n scope: {\n user: \"=user\",\n isCurrentUser: \"=iscurrentuser\"\n },\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileBar\", ProfileBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-contacts.controller.coffee\n */\n\n(function() {\n var ProfileContactsController;\n\n ProfileContactsController = (function() {\n ProfileContactsController.$inject = [\"tgUserService\", \"tgCurrentUserService\"];\n\n function ProfileContactsController(userService, currentUserService) {\n this.userService = userService;\n this.currentUserService = currentUserService;\n this.currentUser = this.currentUserService.getUser();\n this.isCurrentUser = false;\n if (this.currentUser && this.currentUser.get(\"id\") === this.user.get(\"id\")) {\n this.isCurrentUser = true;\n }\n }\n\n ProfileContactsController.prototype.loadContacts = function() {\n return this.userService.getContacts(this.user.get(\"id\")).then((function(_this) {\n return function(contacts) {\n return _this.contacts = contacts;\n };\n })(this));\n };\n\n return ProfileContactsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileContacts\", ProfileContactsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-contacts.directive.coffee\n */\n\n(function() {\n var ProfileContactsDirective;\n\n ProfileContactsDirective = function() {\n var link;\n link = function(scope, elm, attrs, ctrl) {\n return ctrl.loadContacts();\n };\n return {\n templateUrl: \"profile/profile-contacts/profile-contacts.html\",\n scope: {\n user: \"=\"\n },\n controllerAs: \"vm\",\n controller: \"ProfileContacts\",\n link: link,\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileContacts\", ProfileContactsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: items.directive.coffee\n */\n\n(function() {\n var FavItemDirective;\n\n FavItemDirective = function() {\n var link, templateUrl;\n link = function(scope, el, attrs, ctrl) {\n return scope.vm = {\n item: scope.item\n };\n };\n templateUrl = function(el, attrs) {\n if (attrs.itemType === \"project\") {\n return \"profile/profile-favs/items/project.html\";\n } else {\n return \"profile/profile-favs/items/ticket.html\";\n }\n };\n return {\n scope: {\n \"item\": \"=tgFavItem\"\n },\n link: link,\n templateUrl: templateUrl\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgFavItem\", FavItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-favs.controller.coffee\n */\n\n(function() {\n var FavsBaseController, ProfileLikedController, ProfileVotedController, ProfileWatchedController, debounceLeading,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n debounceLeading = this.taiga.debounceLeading;\n\n FavsBaseController = (function() {\n function FavsBaseController() {\n this._init();\n }\n\n FavsBaseController.prototype._init = function() {\n this.enableFilterByAll = true;\n this.enableFilterByProjects = true;\n this.enableFilterByEpics = true;\n this.enableFilterByUserStories = true;\n this.enableFilterByTasks = true;\n this.enableFilterByIssues = true;\n this.enableFilterByTextQuery = true;\n this._resetList();\n this.q = null;\n return this.type = null;\n };\n\n FavsBaseController.prototype._resetList = function() {\n this.items = Immutable.List();\n this.scrollDisabled = false;\n return this._page = 1;\n };\n\n FavsBaseController.prototype._enableLoadingSpinner = function() {\n return this.isLoading = true;\n };\n\n FavsBaseController.prototype._disableLoadingSpinner = function() {\n return this.isLoading = false;\n };\n\n FavsBaseController.prototype._enableScroll = function() {\n return this.scrollDisabled = false;\n };\n\n FavsBaseController.prototype._disableScroll = function() {\n return this.scrollDisabled = true;\n };\n\n FavsBaseController.prototype._checkIfHasMorePages = function(hasNext) {\n if (hasNext) {\n this._page += 1;\n return this._enableScroll();\n } else {\n return this._disableScroll();\n }\n };\n\n FavsBaseController.prototype._checkIfHasNoResults = function() {\n return this.hasNoResults = this.items.size === 0;\n };\n\n FavsBaseController.prototype.loadItems = function() {\n this._enableLoadingSpinner();\n this._disableScroll();\n return this._getItems(this.user.get(\"id\"), this._page, this.type, this.q).then((function(_this) {\n return function(response) {\n _this.items = _this.items.concat(response.get(\"data\"));\n _this._checkIfHasMorePages(response.get(\"next\"));\n _this._checkIfHasNoResults();\n _this._disableLoadingSpinner();\n return _this.items;\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n _this._disableLoadingSpinner();\n return _this.items;\n };\n })(this));\n };\n\n FavsBaseController.prototype.filterByTextQuery = debounceLeading(500, function() {\n this._resetList();\n return this.loadItems();\n });\n\n FavsBaseController.prototype.showAll = function() {\n if (this.type !== null) {\n this.type = null;\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showProjectsOnly = function() {\n if (this.type !== \"project\") {\n this.type = \"project\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showEpicsOnly = function() {\n if (this.type !== \"epic\") {\n this.type = \"epic\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showUserStoriesOnly = function() {\n if (this.type !== \"userstory\") {\n this.type = \"userstory\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showTasksOnly = function() {\n if (this.type !== \"task\") {\n this.type = \"task\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showIssuesOnly = function() {\n if (this.type !== \"issue\") {\n this.type = \"issue\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n return FavsBaseController;\n\n })();\n\n ProfileLikedController = (function(superClass) {\n extend(ProfileLikedController, superClass);\n\n ProfileLikedController.$inject = [\"tgUserService\"];\n\n function ProfileLikedController(userService) {\n this.userService = userService;\n ProfileLikedController.__super__.constructor.call(this);\n this.tabName = 'likes';\n this.enableFilterByAll = false;\n this.enableFilterByProjects = false;\n this.enableFilterByEpics = false;\n this.enableFilterByUserStories = false;\n this.enableFilterByTasks = false;\n this.enableFilterByIssues = false;\n this.enableFilterByTextQuery = true;\n this._getItems = this.userService.getLiked;\n }\n\n return ProfileLikedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileLiked\", ProfileLikedController);\n\n ProfileVotedController = (function(superClass) {\n extend(ProfileVotedController, superClass);\n\n ProfileVotedController.$inject = [\"tgUserService\"];\n\n function ProfileVotedController(userService) {\n this.userService = userService;\n ProfileVotedController.__super__.constructor.call(this);\n this.tabName = 'upvotes';\n this.enableFilterByAll = true;\n this.enableFilterByProjects = false;\n this.enableFilterByEpics = true;\n this.enableFilterByUserStories = true;\n this.enableFilterByTasks = true;\n this.enableFilterByIssues = true;\n this.enableFilterByTextQuery = true;\n this._getItems = this.userService.getVoted;\n }\n\n return ProfileVotedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileVoted\", ProfileVotedController);\n\n ProfileWatchedController = (function(superClass) {\n extend(ProfileWatchedController, superClass);\n\n ProfileWatchedController.$inject = [\"tgUserService\"];\n\n function ProfileWatchedController(userService) {\n this.userService = userService;\n ProfileWatchedController.__super__.constructor.call(this);\n this.tabName = 'watchers';\n this._getItems = this.userService.getWatched;\n }\n\n return ProfileWatchedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileWatched\", ProfileWatchedController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-favs.directive.coffee\n */\n\n(function() {\n var ProfileLikedDirective, ProfileVotedDirective, ProfileWatchedDirective, base;\n\n base = {\n scope: {},\n bindToController: {\n user: \"=\",\n type: \"@\",\n q: \"@\",\n scrollDisabled: \"@\",\n isLoading: \"@\",\n hasNoResults: \"@\"\n },\n controller: null,\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-favs/profile-favs.html\"\n };\n\n ProfileLikedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileLiked\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileLiked\", ProfileLikedDirective);\n\n ProfileVotedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileVoted\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileVoted\", ProfileVotedDirective);\n\n ProfileWatchedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileWatched\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileWatched\", ProfileWatchedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-hints.controller.coffee\n */\n\n(function() {\n var ProfileHints;\n\n ProfileHints = (function() {\n ProfileHints.prototype.HINTS = [\n {\n url: \"https://tree.taiga.io/support/admin/import-export-projects/\"\n }, {\n url: \"https://tree.taiga.io/support/admin/custom-fields/\"\n }, {}, {}\n ];\n\n function ProfileHints(translate) {\n var hintKey;\n this.translate = translate;\n hintKey = Math.floor(Math.random() * this.HINTS.length) + 1;\n this.hint = this.HINTS[hintKey - 1];\n this.hint.linkText = this.hint.linkText || 'HINTS.LINK';\n this.hint.title = this.translate.instant(\"HINTS.HINT\" + hintKey + \"_TITLE\");\n this.hint.text = this.translate.instant(\"HINTS.HINT\" + hintKey + \"_TEXT\");\n }\n\n return ProfileHints;\n\n })();\n\n ProfileHints.$inject = [\"$translate\"];\n\n angular.module(\"taigaProfile\").controller(\"ProfileHints\", ProfileHints);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-hints.directive.coffee\n */\n\n(function() {\n var ProfileHints;\n\n ProfileHints = function($translate) {\n return {\n scope: {},\n controller: \"ProfileHints\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-hints/profile-hints.html\"\n };\n };\n\n ProfileHints.$inject = [\"$translate\"];\n\n angular.module(\"taigaProfile\").directive(\"tgProfileHints\", ProfileHints);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-projects.controller.coffee\n */\n\n(function() {\n var ProfileProjectsController;\n\n ProfileProjectsController = (function() {\n ProfileProjectsController.$inject = [\"tgProjectsService\", \"tgUserService\"];\n\n function ProfileProjectsController(projectsService, userService) {\n this.projectsService = projectsService;\n this.userService = userService;\n }\n\n ProfileProjectsController.prototype.loadProjects = function() {\n return this.projectsService.getProjectsByUserId(this.user.get(\"id\")).then((function(_this) {\n return function(projects) {\n return _this.userService.attachUserContactsToProjects(_this.user.get(\"id\"), projects);\n };\n })(this)).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n return ProfileProjectsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileProjects\", ProfileProjectsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-projects.directive.coffee\n */\n\n(function() {\n var ProfileProjectsDirective;\n\n ProfileProjectsDirective = function() {\n var link;\n link = function(scope, elm, attr, ctrl) {\n return ctrl.loadProjects();\n };\n return {\n templateUrl: \"profile/profile-projects/profile-projects.html\",\n scope: {\n user: \"=\"\n },\n link: link,\n bindToController: true,\n controllerAs: \"vm\",\n controller: \"ProfileProjects\"\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileProjects\", ProfileProjectsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tab.directive.coffee\n */\n\n(function() {\n var ProfileTabDirective;\n\n ProfileTabDirective = function() {\n var link;\n link = function(scope, element, attrs, ctrl, transclude) {\n scope.tab = {};\n attrs.$observe(\"tgProfileTab\", function(name) {\n return scope.tab.name = name;\n });\n attrs.$observe(\"tabTitle\", function(title) {\n return scope.tab.title = title;\n });\n scope.tab.icon = attrs.tabIcon;\n scope.tab.active = !!attrs.tabActive;\n if (scope.$eval(attrs.tabDisabled) !== true) {\n return ctrl.addTab(scope.tab);\n }\n };\n return {\n templateUrl: \"profile/profile-tab/profile-tab.html\",\n scope: {},\n require: \"^tgProfileTabs\",\n link: link,\n transclude: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileTab\", ProfileTabDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tabs.controller.coffee\n */\n\n(function() {\n var ProfileTabsController;\n\n ProfileTabsController = (function() {\n function ProfileTabsController() {\n this.tabs = [];\n }\n\n ProfileTabsController.prototype.addTab = function(tab) {\n return this.tabs.push(tab);\n };\n\n ProfileTabsController.prototype.toggleTab = function(tab) {\n _.map(this.tabs, function(tab) {\n return tab.active = false;\n });\n return tab.active = true;\n };\n\n return ProfileTabsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileTabs\", ProfileTabsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tabs.directive.coffee\n */\n\n(function() {\n var ProfileTabsDirective;\n\n ProfileTabsDirective = function() {\n return {\n scope: {},\n controller: \"ProfileTabs\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-tabs/profile-tabs.html\",\n transclude: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileTabs\", ProfileTabsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile.controller.coffee\n */\n\n(function() {\n var ProfileController;\n\n ProfileController = (function() {\n ProfileController.$inject = [\"tgAppMetaService\", \"tgCurrentUserService\", \"$routeParams\", \"tgUserService\", \"tgXhrErrorService\", \"$translate\"];\n\n function ProfileController(appMetaService, currentUserService, routeParams, userService, xhrError, translate) {\n this.appMetaService = appMetaService;\n this.currentUserService = currentUserService;\n this.routeParams = routeParams;\n this.userService = userService;\n this.xhrError = xhrError;\n this.translate = translate;\n this.isCurrentUser = false;\n if (this.routeParams.slug) {\n this.userService.getUserByUserName(this.routeParams.slug).then((function(_this) {\n return function(user) {\n if (!user.get('is_active')) {\n return _this.xhrError.notFound();\n } else {\n _this.user = user;\n _this.isCurrentUser = false;\n _this._setMeta(_this.user);\n return user;\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n } else {\n this.user = this.currentUserService.getUser();\n this.isCurrentUser = true;\n this._setMeta(this.user);\n }\n }\n\n ProfileController.prototype._setMeta = function(user) {\n var ctx, description, title;\n ctx = {\n userFullName: user.get(\"full_name_display\"),\n userUsername: user.get(\"username\")\n };\n title = this.translate.instant(\"USER.PROFILE.PAGE_TITLE\", ctx);\n description = user.get(\"bio\");\n return this.appMetaService.setAll(title, description);\n };\n\n return ProfileController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"Profile\", ProfileController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: blocked-project-explanation.directive.coffee\n */\n\n(function() {\n var BlockedProjectExplanationDirective;\n\n BlockedProjectExplanationDirective = function() {\n return {\n templateUrl: \"projects/project/blocked-project-explanation.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgBlockedProjectExplanation\", BlockedProjectExplanationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.controller.coffee\n */\n\n(function() {\n var ContactProjectButtonController;\n\n ContactProjectButtonController = (function() {\n ContactProjectButtonController.$inject = ['tgLightboxFactory'];\n\n function ContactProjectButtonController(lightboxFactory) {\n this.lightboxFactory = lightboxFactory;\n }\n\n ContactProjectButtonController.prototype.launchContactForm = function() {\n return this.lightboxFactory.create('tg-lb-contact-project', {\n \"class\": \"lightbox lightbox-contact-project e2e-lightbox-contact-project\",\n \"project\": \"project\"\n }, {\n \"project\": this.project\n });\n };\n\n return ContactProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ContactProjectButtonCtrl\", ContactProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: contact-project-button.directive.coffee\n */\n\n(function() {\n var ContactProjectButtonDirective;\n\n ContactProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"ContactProjectButtonCtrl\",\n bindToController: {\n project: '=',\n layout: '@'\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/contact-project-button/contact-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgContactProjectButton\", ContactProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: lb-contact-team.controller.coffee\n */\n\n(function() {\n var ContactProjectLbController;\n\n ContactProjectLbController = (function() {\n ContactProjectLbController.$inject = [\"lightboxService\", \"tgResources\", \"$tgConfirm\"];\n\n function ContactProjectLbController(lightboxService, rs, confirm) {\n this.lightboxService = lightboxService;\n this.rs = rs;\n this.confirm = confirm;\n this.contact = {};\n }\n\n ContactProjectLbController.prototype.contactProject = function() {\n var message, project, promise;\n project = this.project.get('id');\n message = this.contact.message;\n promise = this.rs.projects.contactProject(project, message);\n this.sendingFeedback = true;\n return promise.then((function(_this) {\n return function() {\n _this.lightboxService.closeAll();\n _this.sendingFeedback = false;\n return _this.confirm.notify(\"success\");\n };\n })(this));\n };\n\n return ContactProjectLbController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ContactProjectLbCtrl\", ContactProjectLbController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: lb-contact-team.directive.coffee\n */\n\n(function() {\n var ContactProjectLbDirective;\n\n ContactProjectLbDirective = function(lightboxService) {\n var link;\n this.inject = ['lightboxService'];\n link = function(scope, el) {\n return lightboxService.open(el);\n };\n return {\n controller: \"ContactProjectLbCtrl\",\n bindToController: {\n project: '='\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/lb-contact-project/lb-contact-project.html\",\n link: link\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgLbContactProject\", [\"lightboxService\", ContactProjectLbDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.controller.coffee\n */\n\n(function() {\n var LikeProjectButtonController;\n\n LikeProjectButtonController = (function() {\n LikeProjectButtonController.$inject = [\"$tgConfirm\", \"tgLikeProjectButtonService\"];\n\n function LikeProjectButtonController(confirm, likeButtonService) {\n this.confirm = confirm;\n this.likeButtonService = likeButtonService;\n this.isMouseOver = false;\n this.loading = false;\n }\n\n LikeProjectButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n LikeProjectButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n LikeProjectButtonController.prototype.toggleLike = function() {\n var promise;\n this.loading = true;\n if (!this.project.get(\"is_fan\")) {\n promise = this._like();\n } else {\n promise = this._unlike();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n LikeProjectButtonController.prototype._like = function() {\n return this.likeButtonService.like(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n LikeProjectButtonController.prototype._unlike = function() {\n return this.likeButtonService.unlike(this.project.get('id'))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n return LikeProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"LikeProjectButton\", LikeProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.directive.coffee\n */\n\n(function() {\n var LikeProjectButtonDirective;\n\n LikeProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"LikeProjectButton\",\n bindToController: {\n project: '='\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/like-project-button/like-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgLikeProjectButton\", LikeProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.service.coffee\n */\n\n(function() {\n var LikeProjectButtonService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n LikeProjectButtonService = (function(superClass) {\n extend(LikeProjectButtonService, superClass);\n\n LikeProjectButtonService.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function LikeProjectButtonService(rs, currentUserService, projectService) {\n this.rs = rs;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n }\n\n LikeProjectButtonService.prototype._getProjectIndex = function(projectId) {\n return this.currentUserService.projects.get('all').findIndex(function(project) {\n return project.get('id') === projectId;\n });\n };\n\n LikeProjectButtonService.prototype._updateProjects = function(projectId, isFan) {\n var projectIndex, projects;\n projectIndex = this._getProjectIndex(projectId);\n if (projectIndex === -1) {\n return;\n }\n projects = this.currentUserService.projects.get('all').update(projectIndex, function(project) {\n var totalFans;\n totalFans = project.get(\"total_fans\");\n if (isFan) {\n totalFans++;\n } else {\n totalFans--;\n }\n return project.merge({\n is_fan: isFan,\n total_fans: totalFans\n });\n });\n return this.currentUserService.setProjects(projects);\n };\n\n LikeProjectButtonService.prototype._updateCurrentProject = function(isFan) {\n var project, totalFans;\n totalFans = this.projectService.project.get(\"total_fans\");\n if (isFan) {\n totalFans++;\n } else {\n totalFans--;\n }\n project = this.projectService.project.merge({\n is_fan: isFan,\n total_fans: totalFans\n });\n return this.projectService.setProject(project);\n };\n\n LikeProjectButtonService.prototype.like = function(projectId) {\n return this.rs.projects.likeProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, true);\n return _this._updateCurrentProject(true);\n };\n })(this));\n };\n\n LikeProjectButtonService.prototype.unlike = function(projectId) {\n return this.rs.projects.unlikeProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, false);\n return _this._updateCurrentProject(false);\n };\n })(this));\n };\n\n return LikeProjectButtonService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgLikeProjectButtonService\", LikeProjectButtonService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: sort-projects.directive.coffee\n */\n\n(function() {\n var SortProjectsDirective;\n\n SortProjectsDirective = function(currentUserService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n var drake, itemEl, scroll;\n itemEl = null;\n drake = dragula([el[0]], {\n copySortSource: false,\n copy: false,\n mirrorContainer: el[0],\n moves: function(item) {\n return $(item).hasClass('list-itemtype-project');\n }\n });\n drake.on('dragend', function(item) {\n var i, index, len, project, sortData, sorted_project_ids, value;\n itemEl = $(item);\n project = itemEl.scope().project;\n index = itemEl.index();\n sorted_project_ids = _.map(scope.projects.toJS(), function(p) {\n return p.id;\n });\n sorted_project_ids = _.without(sorted_project_ids, project.get(\"id\"));\n sorted_project_ids.splice(index, 0, project.get('id'));\n sortData = [];\n for (index = i = 0, len = sorted_project_ids.length; i < len; index = ++i) {\n value = sorted_project_ids[index];\n sortData.push({\n \"project_id\": value,\n \"order\": index\n });\n }\n return currentUserService.bulkUpdateProjectsOrder(sortData);\n });\n scroll = autoScroll(window, {\n margin: 20,\n pixels: 30,\n scrollWhenOutside: true,\n autoScroll: function() {\n return this.down && drake.dragging;\n }\n });\n return scope.$on(\"$destroy\", function() {\n el.off();\n return drake.destroy();\n });\n };\n directive = {\n scope: {\n projects: \"=tgSortProjects\"\n },\n link: link\n };\n return directive;\n };\n\n angular.module(\"taigaProjects\").directive(\"tgSortProjects\", [\"tgCurrentUserService\", SortProjectsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.controller.coffee\n */\n\n(function() {\n var WatchProjectButtonController;\n\n WatchProjectButtonController = (function() {\n WatchProjectButtonController.$inject = [\"$tgConfirm\", \"tgWatchProjectButtonService\"];\n\n function WatchProjectButtonController(confirm, watchButtonService) {\n this.confirm = confirm;\n this.watchButtonService = watchButtonService;\n this.showWatchOptions = false;\n this.loading = false;\n }\n\n WatchProjectButtonController.prototype.toggleWatcherOptions = function() {\n return this.showWatchOptions = !this.showWatchOptions;\n };\n\n WatchProjectButtonController.prototype.closeWatcherOptions = function() {\n return this.showWatchOptions = false;\n };\n\n WatchProjectButtonController.prototype.watch = function(notifyLevel) {\n if (notifyLevel === this.project.get('notify_level')) {\n return;\n }\n this.loading = true;\n this.closeWatcherOptions();\n return this.watchButtonService.watch(this.project.get('id'), notifyLevel)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n WatchProjectButtonController.prototype.unwatch = function() {\n this.loading = true;\n this.closeWatcherOptions();\n return this.watchButtonService.unwatch(this.project.get('id'))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n return WatchProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"WatchProjectButton\", WatchProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.directive.coffee\n */\n\n(function() {\n var WatchProjectButtonDirective;\n\n WatchProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"WatchProjectButton\",\n bindToController: {\n project: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/watch-project-button/watch-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgWatchProjectButton\", WatchProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.service.coffee\n */\n\n(function() {\n var WatchProjectButtonService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n WatchProjectButtonService = (function(superClass) {\n extend(WatchProjectButtonService, superClass);\n\n WatchProjectButtonService.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function WatchProjectButtonService(rs, currentUserService, projectService) {\n this.rs = rs;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n }\n\n WatchProjectButtonService.prototype._getProjectIndex = function(projectId) {\n return this.currentUserService.projects.get('all').findIndex(function(project) {\n return project.get('id') === projectId;\n });\n };\n\n WatchProjectButtonService.prototype._updateProjects = function(projectId, notifyLevel, isWatcher) {\n var projectIndex, projects;\n projectIndex = this._getProjectIndex(projectId);\n if (projectIndex === -1) {\n return;\n }\n projects = this.currentUserService.projects.get('all').update(projectIndex, (function(_this) {\n return function(project) {\n var totalWatchers;\n totalWatchers = project.get('total_watchers');\n if (!_this.projectService.project.get('is_watcher') && isWatcher) {\n totalWatchers++;\n } else if (_this.projectService.project.get('is_watcher') && !isWatcher) {\n totalWatchers--;\n }\n return project.merge({\n is_watcher: isWatcher,\n total_watchers: totalWatchers,\n notify_level: notifyLevel\n });\n };\n })(this));\n return this.currentUserService.setProjects(projects);\n };\n\n WatchProjectButtonService.prototype._updateCurrentProject = function(notifyLevel, isWatcher) {\n var project, totalWatchers;\n totalWatchers = this.projectService.project.get(\"total_watchers\");\n if (!this.projectService.project.get('is_watcher') && isWatcher) {\n totalWatchers++;\n } else if (this.projectService.project.get('is_watcher') && !isWatcher) {\n totalWatchers--;\n }\n project = this.projectService.project.merge({\n is_watcher: isWatcher,\n notify_level: notifyLevel,\n total_watchers: totalWatchers\n });\n return this.projectService.setProject(project);\n };\n\n WatchProjectButtonService.prototype.watch = function(projectId, notifyLevel) {\n return this.rs.projects.watchProject(projectId, notifyLevel).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, notifyLevel, true);\n return _this._updateCurrentProject(notifyLevel, true);\n };\n })(this));\n };\n\n WatchProjectButtonService.prototype.unwatch = function(projectId) {\n return this.rs.projects.unwatchProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, null, false);\n return _this._updateCurrentProject(null, false);\n };\n })(this));\n };\n\n return WatchProjectButtonService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgWatchProjectButtonService\", WatchProjectButtonService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import-project-form.controller.coffee\n */\n\n(function() {\n var AsanaImportProjectFormController;\n\n AsanaImportProjectFormController = (function() {\n AsanaImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function AsanaImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Asana\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n this.projectForm.project_type = \"scrum\";\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n AsanaImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n AsanaImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n AsanaImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n AsanaImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return AsanaImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('AsanaImportProjectFormCtrl', AsanaImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import-project-form.directive.coffee\n */\n\n(function() {\n var AsanaImportProjectFormDirective;\n\n AsanaImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/asana-import/asana-import-project-form/asana-import-project-form.html\",\n controller: \"AsanaImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n AsanaImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgAsanaImportProjectForm\", AsanaImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import.controller.coffee\n */\n\n(function() {\n var AsanaImportController;\n\n AsanaImportController = (function() {\n AsanaImportController.$inject = ['tgAsanaImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function AsanaImportController(asanaImportService, confirm, translate, importProjectService) {\n this.asanaImportService = asanaImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-asana';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.asanaImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.asanaImportService.projectUsers;\n };\n })(this));\n }\n\n AsanaImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-asana';\n return this.asanaImportService.fetchProjects();\n };\n\n AsanaImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-asana';\n this.project = project;\n this.fetchingUsers = true;\n return this.asanaImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n AsanaImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-asana';\n };\n\n AsanaImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-asana';\n };\n\n AsanaImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.asanaImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), this.project.get('project_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n AsanaImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return AsanaImportController;\n\n })();\n\n angular.module('taigaProjects').controller('AsanaImportCtrl', AsanaImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import.directive.coffee\n */\n\n(function() {\n var AsanaImportDirective;\n\n AsanaImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/asana-import/asana-import.html\",\n controller: \"AsanaImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n AsanaImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgAsanaImport\", AsanaImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: asana-import.service.coffee\n */\n\n(function() {\n var AsanaImportService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n AsanaImportService = (function(superClass) {\n extend(AsanaImportService, superClass);\n\n AsanaImportService.$inject = ['tgResources', '$location'];\n\n function AsanaImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n this.token = null;\n }\n\n AsanaImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n AsanaImportService.prototype.fetchProjects = function() {\n return this.resources.asanaImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n AsanaImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.asanaImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n AsanaImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n return this.resources.asanaImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType);\n };\n\n AsanaImportService.prototype.getAuthUrl = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.asanaImporter.getAuthUrl().then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n AsanaImportService.prototype.authorize = function(code) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.asanaImporter.authorize(code).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return AsanaImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgAsanaImportService\", AsanaImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: create-project-form.controller.coffee\n */\n\n(function() {\n var CreatetProjectFormController;\n\n CreatetProjectFormController = (function() {\n CreatetProjectFormController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\", \"$projectUrl\", \"$location\", \"$tgNavUrls\", \"$tgAnalytics\"];\n\n function CreatetProjectFormController(currentUserService, projectsService, projectUrl, location, navUrls, analytics) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n this.projectUrl = projectUrl;\n this.location = location;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.projectForm = {\n is_private: false\n };\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n if (this.type === 'scrum') {\n this.projectForm.creation_template = 1;\n } else {\n this.projectForm.creation_template = 2;\n }\n }\n\n CreatetProjectFormController.prototype.submit = function() {\n this.formSubmitLoading = true;\n return this.projectsService.create(this.projectForm).then((function(_this) {\n return function(project) {\n _this.analytics.trackEvent(\"project\", \"create\", \"project creation\", {\n slug: project.get('slug'),\n id: project.get('id')\n });\n return _this.location.url(_this.projectUrl.get(project));\n };\n })(this));\n };\n\n CreatetProjectFormController.prototype.onCancelForm = function() {\n return this.location.path(this.navUrls.resolve(\"create-project\"));\n };\n\n CreatetProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n CreatetProjectFormController.prototype.isDisabled = function() {\n return this.formSubmitLoading || !this.canCreateProject();\n };\n\n return CreatetProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('CreateProjectFormCtrl', CreatetProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: create-project-form.directive.coffee\n */\n\n(function() {\n var CreateProjectFormDirective;\n\n CreateProjectFormDirective = function() {\n return {\n templateUrl: \"projects/create/create-project-form/create-project-form.html\",\n controller: \"CreateProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n type: '@'\n }\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgCreateProjectForm\", CreateProjectFormDirective);\n\n}).call(this);\n\n(function() {\n var createProjectMembersRestrictionsDirective, module;\n\n module = angular.module(\"taigaProject\");\n\n createProjectMembersRestrictionsDirective = function() {\n return {\n scope: {\n isPrivate: '=',\n limitMembersPrivateProject: '=',\n limitMembersPublicProject: '='\n },\n templateUrl: \"projects/create/create-project-members-restrictions/create-project-members-restrictions.html\"\n };\n };\n\n module.directive('tgCreateProjectMembersRestrictions', [createProjectMembersRestrictionsDirective]);\n\n}).call(this);\n\n(function() {\n var createProjectRestrictionsDirective, module;\n\n module = angular.module(\"taigaProject\");\n\n createProjectRestrictionsDirective = function() {\n return {\n scope: {\n isPrivate: '=',\n canCreatePrivateProjects: '=',\n canCreatePublicProjects: '='\n },\n templateUrl: \"projects/create/create-project-restrictions/create-project-restrictions.html\"\n };\n };\n\n module.directive('tgCreateProjectRestrictions', [createProjectRestrictionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.controller.coffee\n */\n\n(function() {\n var CreateProjectController;\n\n CreateProjectController = (function() {\n CreateProjectController.$inject = [\"tgAppMetaService\", \"$translate\", \"tgProjectService\", \"$location\", \"$tgAuth\"];\n\n function CreateProjectController(appMetaService, translate, projectService, location, authService) {\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.projectService = projectService;\n this.location = location;\n this.authService = authService;\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n this.authService.refresh();\n this.displayScrumDesc = false;\n this.displayKanbanDesc = false;\n }\n\n CreateProjectController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\")\n };\n return {\n title: this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx),\n description: this.project.get(\"description\")\n };\n };\n\n CreateProjectController.prototype.displayHelp = function(type, $event) {\n $event.stopPropagation();\n $event.preventDefault();\n if (type === 'scrum') {\n this.displayScrumDesc = !this.displayScrumDesc;\n }\n if (type === 'kanban') {\n return this.displayKanbanDesc = !this.displayKanbanDesc;\n }\n };\n\n return CreateProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"CreateProjectCtrl\", CreateProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.controller.coffee\n */\n\n(function() {\n var DuplicateProjectController;\n\n DuplicateProjectController = (function() {\n DuplicateProjectController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\", \"$tgLocation\", \"$tgNavUrls\"];\n\n function DuplicateProjectController(currentUserService, projectsService, location, navUrls) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n this.location = location;\n this.navUrls = navUrls;\n this.user = this.currentUserService.getUser();\n this.members = Immutable.List();\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\n this.projectForm = {\n is_private: false\n };\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n DuplicateProjectController.prototype.refreshReferenceProject = function(slug) {\n return this.projectsService.getProjectBySlug(slug).then((function(_this) {\n return function(project) {\n _this.referenceProject = project;\n _this.members = project.get('members').filter(function(it) {\n return it.get('id') !== _this.user.get('id');\n });\n _this.invitedMembers = _this.members.map(function(it) {\n return it.get('id');\n });\n return _this.checkUsersLimit();\n };\n })(this));\n };\n\n DuplicateProjectController.prototype.toggleInvitedMember = function(member) {\n if (this.invitedMembers.includes(member)) {\n this.invitedMembers = this.invitedMembers.filter(function(it) {\n return it !== member;\n });\n } else {\n this.invitedMembers = this.invitedMembers.push(member);\n }\n return this.checkUsersLimit();\n };\n\n DuplicateProjectController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.invitedMembers.size + 1);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.invitedMembers.size + 1);\n };\n\n DuplicateProjectController.prototype.submit = function() {\n var data, projectId;\n projectId = this.referenceProject.get('id');\n data = this.projectForm;\n data.users = this.invitedMembers;\n this.formSubmitLoading = true;\n return this.projectsService.duplicate(projectId, data).then((function(_this) {\n return function(newProject) {\n _this.formSubmitLoading = false;\n _this.location.path(_this.navUrls.resolve(\"project\", {\n project: newProject.data.slug\n }));\n return _this.currentUserService.loadProjects();\n };\n })(this));\n };\n\n DuplicateProjectController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid && this.limitMembersPrivateProject.valid;\n } else {\n return this.canCreatePublicProjects.valid && this.limitMembersPublicProject.valid;\n }\n };\n\n DuplicateProjectController.prototype.isDisabled = function() {\n return this.formSubmitLoading || !this.canCreateProject();\n };\n\n DuplicateProjectController.prototype.onCancelForm = function() {\n return this.location.path(this.navUrls.resolve(\"create-project\"));\n };\n\n return DuplicateProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"DuplicateProjectCtrl\", DuplicateProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: duplicate-project.directive.coffee\n */\n\n(function() {\n var DuplicateProjectDirective;\n\n DuplicateProjectDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {};\n return {\n link: link,\n templateUrl: \"projects/create/duplicate/duplicate-project.html\",\n controller: \"DuplicateProjectCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {}\n };\n };\n\n DuplicateProjectDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgDuplicateProject\", DuplicateProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import-project-form.controller.coffee\n */\n\n(function() {\n var GithubImportProjectFormController;\n\n GithubImportProjectFormController = (function() {\n GithubImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function GithubImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Github\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n this.projectForm.project_type = \"kanban\";\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n GithubImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n GithubImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n GithubImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n GithubImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return GithubImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('GithubImportProjectFormCtrl', GithubImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import-project-form.directive.coffee\n */\n\n(function() {\n var GithubImportProjectFormDirective;\n\n GithubImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/github-import/github-import-project-form/github-import-project-form.html\",\n controller: \"GithubImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n GithubImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgGithubImportProjectForm\", GithubImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import.controller.coffee\n */\n\n(function() {\n var GithubImportController;\n\n GithubImportController = (function() {\n GithubImportController.$inject = ['tgGithubImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function GithubImportController(githubImportService, confirm, translate, importProjectService) {\n this.githubImportService = githubImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-github';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.githubImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.githubImportService.projectUsers;\n };\n })(this));\n }\n\n GithubImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-github';\n return this.githubImportService.fetchProjects();\n };\n\n GithubImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-github';\n this.project = project;\n this.fetchingUsers = true;\n return this.githubImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n GithubImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-github';\n };\n\n GithubImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-github';\n };\n\n GithubImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.githubImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), this.project.get('project_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n GithubImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return GithubImportController;\n\n })();\n\n angular.module('taigaProjects').controller('GithubImportCtrl', GithubImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import.directive.coffee\n */\n\n(function() {\n var GithubImportDirective;\n\n GithubImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/github-import/github-import.html\",\n controller: \"GithubImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n GithubImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgGithubImport\", GithubImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: github-import.service.coffee\n */\n\n(function() {\n var GithubImportService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n GithubImportService = (function(superClass) {\n extend(GithubImportService, superClass);\n\n GithubImportService.$inject = ['tgResources'];\n\n function GithubImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n }\n\n GithubImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n GithubImportService.prototype.fetchProjects = function() {\n return this.resources.githubImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n GithubImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.githubImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n GithubImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n return this.resources.githubImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType);\n };\n\n GithubImportService.prototype.getAuthUrl = function(callbackUri) {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.githubImporter.getAuthUrl(callbackUri).then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n GithubImportService.prototype.authorize = function(code) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.githubImporter.authorize(code).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return GithubImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgGithubImportService\", GithubImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project-members.controller.coffee\n */\n\n(function() {\n var ImportProjectMembersController;\n\n ImportProjectMembersController = (function() {\n ImportProjectMembersController.$inject = ['tgCurrentUserService', 'tgUserService'];\n\n function ImportProjectMembersController(currentUserService, userService) {\n this.currentUserService = currentUserService;\n this.userService = userService;\n this.selectImportUserLightbox = false;\n this.warningImportUsers = false;\n this.displayEmailSelector = true;\n this.cancelledUsers = Immutable.List();\n this.selectedUsers = Immutable.List();\n this.selectableUsers = Immutable.List();\n this.userContacts = Immutable.List();\n }\n\n ImportProjectMembersController.prototype.fetchUser = function() {\n this.currentUser = this.currentUserService.getUser();\n return this.userService.getContacts(this.currentUser.get('id')).then((function(_this) {\n return function(userContacts) {\n _this.userContacts = userContacts;\n return _this.refreshSelectableUsers();\n };\n })(this));\n };\n\n ImportProjectMembersController.prototype.searchUser = function(user) {\n this.selectImportUserLightbox = true;\n return this.searchingUser = user;\n };\n\n ImportProjectMembersController.prototype.beforeSubmitUsers = function() {\n if (this.selectedUsers.size !== this.members.size) {\n return this.warningImportUsers = true;\n } else {\n return this.submit();\n }\n };\n\n ImportProjectMembersController.prototype.confirmUser = function(externalUser, taigaUser) {\n var user;\n this.selectImportUserLightbox = false;\n user = Immutable.Map();\n user = user.set('user', externalUser);\n user = user.set('taigaUser', taigaUser);\n this.selectedUsers = this.selectedUsers.push(user);\n this.discardSuggestedUser(externalUser);\n return this.refreshSelectableUsers();\n };\n\n ImportProjectMembersController.prototype.unselectUser = function(user) {\n var index;\n index = this.selectedUsers.findIndex(function(it) {\n return it.getIn(['user', 'id']) === user.get('id');\n });\n this.selectedUsers = this.selectedUsers[\"delete\"](index);\n return this.refreshSelectableUsers();\n };\n\n ImportProjectMembersController.prototype.discardSuggestedUser = function(member) {\n return this.cancelledUsers = this.cancelledUsers.push(member.get('id'));\n };\n\n ImportProjectMembersController.prototype.getSelectedMember = function(member) {\n return this.selectedUsers.find(function(it) {\n return it.getIn(['user', 'id']) === member.get('id');\n });\n };\n\n ImportProjectMembersController.prototype.isMemberSelected = function(member) {\n return !!this.getSelectedMember(member);\n };\n\n ImportProjectMembersController.prototype.getUser = function(user) {\n var userSelected;\n userSelected = this.getSelectedMember(user);\n if (userSelected) {\n return userSelected.get('taigaUser');\n } else {\n return null;\n }\n };\n\n ImportProjectMembersController.prototype.submit = function() {\n var users;\n this.warningImportUsers = false;\n users = Immutable.Map();\n this.selectedUsers.map(function(it) {\n var id;\n id = '';\n if (_.isString(it.get('taigaUser'))) {\n id = it.get('taigaUser');\n } else {\n id = it.getIn(['taigaUser', 'id']);\n }\n return users = users.set(it.getIn(['user', 'id']), id);\n });\n return this.onSubmit({\n users: users\n });\n };\n\n ImportProjectMembersController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size + 1);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size + 1);\n };\n\n ImportProjectMembersController.prototype.showSuggestedMatch = function(member) {\n return member.get('user') && this.cancelledUsers.indexOf(member.get('id')) === -1 && !this.isMemberSelected(member);\n };\n\n ImportProjectMembersController.prototype.getDistinctSelectedTaigaUsers = function() {\n var ids, users;\n ids = [];\n users = this.selectedUsers.filter(function(it) {\n var id;\n id = it.getIn(['taigaUser', 'id']);\n if (ids.indexOf(id) === -1) {\n ids.push(id);\n return true;\n }\n return false;\n });\n return users.filter((function(_this) {\n return function(it) {\n return it.getIn(['taigaUser', 'id']) !== _this.currentUser.get('id');\n };\n })(this));\n };\n\n ImportProjectMembersController.prototype.refreshSelectableUsers = function() {\n var users;\n this.importMoreUsersDisabled = this.isImportMoreUsersDisabled();\n if (this.importMoreUsersDisabled) {\n users = this.getDistinctSelectedTaigaUsers();\n this.selectableUsers = users.map(function(it) {\n return it.get('taigaUser');\n });\n this.displayEmailSelector = false;\n } else {\n this.selectableUsers = this.userContacts;\n this.displayEmailSelector = true;\n }\n return this.selectableUsers = this.selectableUsers.push(this.currentUser);\n };\n\n ImportProjectMembersController.prototype.isImportMoreUsersDisabled = function() {\n var total, users;\n users = this.getDistinctSelectedTaigaUsers();\n total = users.size + 2;\n if (this.project.get('is_private')) {\n return !this.currentUserService.canAddMembersPrivateProject(total).valid;\n } else {\n return !this.currentUserService.canAddMembersPublicProject(total).valid;\n }\n };\n\n return ImportProjectMembersController;\n\n })();\n\n angular.module('taigaProjects').controller('ImportProjectMembersCtrl', ImportProjectMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project-form.directive.coffee\n */\n\n(function() {\n var ImportProjectMembersDirective;\n\n ImportProjectMembersDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n ctrl.fetchUser();\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/import-project-members/import-project-members.html\",\n controller: \"ImportProjectMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSubmit: '&',\n platform: '@',\n logo: '@',\n onCancel: '&'\n }\n };\n };\n\n ImportProjectMembersDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgImportProjectMembers\", ImportProjectMembersDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project-selector.controller.coffee\n */\n\n(function() {\n var ImportProjectSelectorController;\n\n ImportProjectSelectorController = (function() {\n function ImportProjectSelectorController() {}\n\n ImportProjectSelectorController.prototype.selectProject = function(project) {\n return this.onSelectProject({\n project: Immutable.fromJS(project)\n });\n };\n\n return ImportProjectSelectorController;\n\n })();\n\n angular.module('taigaProjects').controller('ImportProjectSelectorCtrl', ImportProjectSelectorController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project-selector.directive.coffee\n */\n\n(function() {\n var ImportProjectSelectorDirective;\n\n ImportProjectSelectorDirective = function() {\n return {\n templateUrl: \"projects/create/import-project-selector/import-project-selector.html\",\n controller: \"ImportProjectSelectorCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n projects: '<',\n onCancel: '&',\n onSelectProject: '&',\n logo: '@',\n noProjectsMsg: '@',\n search: '@'\n }\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgImportProjectSelector\", ImportProjectSelectorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project.controller.coffee\n */\n\n(function() {\n var ImportTaigaController;\n\n ImportTaigaController = (function() {\n ImportTaigaController.$inject = ['$tgConfirm', '$tgResources', 'tgImportProjectService', '$translate', '$tgAnalytics'];\n\n function ImportTaigaController(confirm, rs, importProjectService, translate, analytics) {\n this.confirm = confirm;\n this.rs = rs;\n this.importProjectService = importProjectService;\n this.translate = translate;\n this.analytics = analytics;\n }\n\n ImportTaigaController.prototype.importTaiga = function(files) {\n var file, loader, promise;\n this.analytics.trackEvent(\"import\", \"taiga\", \"Start import from taiga\", 1);\n file = files[0];\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.rs.projects[\"import\"](file, loader.update);\n this.importProjectService.importPromise(promise)[\"finally\"]((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n return ImportTaigaController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ImportTaigaCtrl\", ImportTaigaController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-taiga.directive.coffee\n */\n\n(function() {\n var ImportTaigaDirective;\n\n ImportTaigaDirective = function() {\n return {\n templateUrl: \"projects/create/import-taiga/import-taiga.html\",\n controller: \"ImportTaigaCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {}\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgImportTaiga\", ImportTaigaDirective);\n\n}).call(this);\n\n(function() {\n var LbImportErrorDirective;\n\n LbImportErrorDirective = function(lightboxService) {\n var link;\n link = function(scope, el, attrs) {\n lightboxService.open(el);\n return scope.close = function() {\n lightboxService.close(el);\n };\n };\n return {\n templateUrl: \"projects/create/import/import-project-error-lb.html\",\n link: link\n };\n };\n\n LbImportErrorDirective.$inject = [\"lightboxService\"];\n\n angular.module(\"taigaProjects\").directive(\"tgLbImportError\", LbImportErrorDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project.controller.coffee\n */\n\n(function() {\n var ImportProjectController;\n\n ImportProjectController = (function() {\n ImportProjectController.$inject = ['tgTrelloImportService', 'tgJiraImportService', 'tgGithubImportService', 'tgAsanaImportService', '$location', '$window', '$routeParams', '$tgNavUrls', '$tgConfig', '$tgConfirm', '$tgAnalytics'];\n\n function ImportProjectController(trelloService, jiraService, githubService, asanaService, location, window, routeParams, tgNavUrls, config, confirm, analytics) {\n this.trelloService = trelloService;\n this.jiraService = jiraService;\n this.githubService = githubService;\n this.asanaService = asanaService;\n this.location = location;\n this.window = window;\n this.routeParams = routeParams;\n this.tgNavUrls = tgNavUrls;\n this.config = config;\n this.confirm = confirm;\n this.analytics = analytics;\n }\n\n ImportProjectController.prototype.start = function() {\n var asanaOauthToken, githubOauthToken, jiraOauthToken, jiraOauthVerifier, locationSearch, trelloOauthToken;\n this.token = null;\n this.from = this.routeParams.platform;\n locationSearch = this.location.search();\n if (this.from) {\n this.analytics.trackEvent(\"import\", this.from, \"Start import from \" + this.from, 1);\n }\n if (this.from === \"asana\") {\n asanaOauthToken = locationSearch.code;\n if (locationSearch.code) {\n asanaOauthToken = locationSearch.code;\n return this.asanaService.authorize(asanaOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: encodeURIComponent(JSON.stringify(token))\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else {\n this.token = JSON.parse(decodeURIComponent(locationSearch.token));\n this.asanaService.setToken(this.token);\n }\n }\n if (this.from === 'trello') {\n if (locationSearch.oauth_verifier) {\n trelloOauthToken = locationSearch.oauth_verifier;\n return this.trelloService.authorize(trelloOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: token\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else if (locationSearch.token) {\n this.token = locationSearch.token;\n this.trelloService.setToken(locationSearch.token);\n }\n }\n if (this.from === \"github\") {\n if (locationSearch.code) {\n githubOauthToken = locationSearch.code;\n return this.githubService.authorize(githubOauthToken).then(((function(_this) {\n return function(token) {\n return _this.location.search({\n token: token\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else if (locationSearch.token) {\n this.token = locationSearch.token;\n this.githubService.setToken(locationSearch.token);\n }\n }\n if (this.from === \"jira\") {\n jiraOauthToken = locationSearch.oauth_token;\n if (jiraOauthToken) {\n jiraOauthVerifier = locationSearch.oauth_verifier;\n return this.jiraService.authorize(jiraOauthVerifier).then(((function(_this) {\n return function(data) {\n return _this.location.search({\n token: data.token,\n url: data.url\n });\n };\n })(this)), this.cancelCurrentImport.bind(this));\n } else {\n this.token = locationSearch.token;\n return this.jiraService.setToken(locationSearch.token, locationSearch.url);\n }\n }\n };\n\n ImportProjectController.prototype.select = function(from) {\n var callbackUri;\n if (from === \"trello\") {\n return this.trelloService.getAuthUrl().then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else if (from === \"jira\") {\n return this.jiraService.getAuthUrl(this.jiraUrl).then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this), (function(_this) {\n return function(err) {\n return _this.confirm.notify('error', err);\n };\n })(this));\n } else if (from === \"github\") {\n callbackUri = this.location.absUrl() + \"/github\";\n return this.githubService.getAuthUrl(callbackUri).then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else if (from === \"asana\") {\n return this.asanaService.getAuthUrl().then((function(_this) {\n return function(url) {\n return _this.window.open(url, \"_self\");\n };\n })(this));\n } else {\n return this.from = from;\n }\n };\n\n ImportProjectController.prototype.unfoldOptions = function(options) {\n return this.unfoldedOptions = options;\n };\n\n ImportProjectController.prototype.isActiveImporter = function(importer) {\n if (this.config.get('importers').indexOf(importer) === -1) {\n return false;\n }\n return true;\n };\n\n ImportProjectController.prototype.cancelCurrentImport = function() {\n return this.location.url(this.tgNavUrls.resolve('create-project-import'));\n };\n\n ImportProjectController.prototype.backToCreate = function() {\n return this.location.url(this.tgNavUrls.resolve('create-project'));\n };\n\n return ImportProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ImportProjectCtrl\", ImportProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project.directive.coffee\n */\n\n(function() {\n var ImportProjectDirective;\n\n ImportProjectDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {\n return ctrl.start();\n };\n return {\n link: link,\n templateUrl: \"projects/create/import/import-project.html\",\n controller: \"ImportProjectCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancelImport: '&'\n }\n };\n };\n\n ImportProjectDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgImportProject\", ImportProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: import-project.service.coffee\n */\n\n(function() {\n var ImportProjectService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n ImportProjectService = (function(superClass) {\n extend(ImportProjectService, superClass);\n\n ImportProjectService.$inject = ['tgCurrentUserService', '$tgAuth', 'tgLightboxFactory', '$translate', '$tgConfirm', '$location', '$tgNavUrls'];\n\n function ImportProjectService(currentUserService, tgAuth, lightboxFactory, translate, confirm, location, tgNavUrls) {\n this.currentUserService = currentUserService;\n this.tgAuth = tgAuth;\n this.lightboxFactory = lightboxFactory;\n this.translate = translate;\n this.confirm = confirm;\n this.location = location;\n this.tgNavUrls = tgNavUrls;\n }\n\n ImportProjectService.prototype.importPromise = function(promise) {\n return promise.then(this.importSuccess.bind(this), this.importError.bind(this));\n };\n\n ImportProjectService.prototype.importSuccess = function(result) {\n var promise;\n promise = this.currentUserService.loadProjects();\n promise.then((function(_this) {\n return function() {\n var ctx, message, msg, title;\n if (result.status === 202) {\n title = _this.translate.instant('PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE');\n message = _this.translate.instant('PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE');\n _this.location.path(_this.tgNavUrls.resolve('home'));\n return _this.confirm.success(title, message);\n } else {\n ctx = {\n project: result.data.slug\n };\n _this.location.path(_this.tgNavUrls.resolve('project-admin-project-profile-details', ctx));\n msg = _this.translate.instant('PROJECT.IMPORT.SYNC_SUCCESS');\n return _this.confirm.notify('success', msg);\n }\n };\n })(this));\n return promise;\n };\n\n ImportProjectService.prototype.importError = function(result) {\n var promise;\n promise = this.tgAuth.refresh();\n promise.then((function(_this) {\n return function() {\n var errorMsg, ref, restrictionError;\n restrictionError = _this.getRestrictionError(result);\n if (restrictionError) {\n return _this.lightboxFactory.create('tg-lb-import-error', {\n \"class\": 'lightbox lightbox-import-error'\n }, restrictionError);\n } else {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = _this.translate.instant(\"PROJECT.IMPORT.ERROR_MESSAGE\", {\n error_message: result.data._error_message\n });\n }\n return _this.confirm.notify(\"error\", errorMsg);\n }\n };\n })(this));\n return promise;\n };\n\n ImportProjectService.prototype.getRestrictionError = function(result) {\n var errorKey, maxMemberships, membersError, privateError, publicError, user;\n if (result.headers) {\n errorKey = '';\n user = this.currentUserService.getUser();\n maxMemberships = null;\n if (result.headers.isPrivate) {\n privateError = !this.currentUserService.canCreatePrivateProjects().valid;\n if (user.get('max_memberships_private_projects') !== null && result.headers.memberships >= user.get('max_memberships_private_projects')) {\n membersError = true;\n } else {\n membersError = false;\n }\n if (privateError && membersError) {\n errorKey = 'private-space-members';\n maxMemberships = user.get('max_memberships_private_projects');\n } else if (privateError) {\n errorKey = 'private-space';\n } else if (membersError) {\n errorKey = 'private-members';\n maxMemberships = user.get('max_memberships_private_projects');\n }\n } else {\n publicError = !this.currentUserService.canCreatePublicProjects().valid;\n if (user.get('max_memberships_public_projects') !== null && result.headers.memberships >= user.get('max_memberships_public_projects')) {\n membersError = true;\n } else {\n membersError = false;\n }\n if (publicError && membersError) {\n errorKey = 'public-space-members';\n maxMemberships = user.get('max_memberships_public_projects');\n } else if (publicError) {\n errorKey = 'public-space';\n } else if (membersError) {\n errorKey = 'public-members';\n maxMemberships = user.get('max_memberships_public_projects');\n }\n }\n if (!errorKey) {\n return false;\n }\n return {\n key: errorKey,\n values: {\n max_memberships: maxMemberships,\n members: result.headers.memberships\n }\n };\n } else {\n return false;\n }\n };\n\n return ImportProjectService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgImportProjectService\", ImportProjectService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: invite-members.controller.coffee\n */\n\n(function() {\n var InviteMembersController;\n\n InviteMembersController = (function() {\n function InviteMembersController() {}\n\n InviteMembersController.$inject = [];\n\n InviteMembersController.prototype.isDisabled = function(id) {\n return this.invitedMembers.indexOf(id) === -1;\n };\n\n return InviteMembersController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"InviteMembersCtrl\", InviteMembersController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: invite-members.directive.coffee\n */\n\n(function() {\n var InviteMembersDirective;\n\n InviteMembersDirective = function() {\n var link;\n link = function(scope, el, attr, ctrl) {};\n return {\n link: link,\n templateUrl: \"projects/create/invite-members/invite-members.html\",\n controller: \"InviteMembersCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n invitedMembers: '<',\n members: '<',\n onToggleInvitedMember: '&'\n }\n };\n };\n\n InviteMembersDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgInviteMembers\", InviteMembersDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: single-member.directive.coffee\n */\n\n(function() {\n var SingleMemberDirective;\n\n SingleMemberDirective = function() {\n return {\n templateUrl: \"projects/create/invite-members/single-member/single-member.html\",\n scope: {\n disabled: \"<\",\n avatar: \"=\"\n }\n };\n };\n\n SingleMemberDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgSingleMember\", SingleMemberDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import-project-form.controller.coffee\n */\n\n(function() {\n var JiraImportProjectFormController;\n\n JiraImportProjectFormController = (function() {\n JiraImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function JiraImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n if (this.projectForm.importer_type === \"agile\") {\n this.projectForm.project_type = null;\n } else {\n this.projectForm.project_type = \"scrum\";\n }\n this.projectForm.create_subissues = true;\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n JiraImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n JiraImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n JiraImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n JiraImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return JiraImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('JiraImportProjectFormCtrl', JiraImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import-project-form.directive.coffee\n */\n\n(function() {\n var JiraImportProjectFormDirective;\n\n JiraImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/jira-import/jira-import-project-form/jira-import-project-form.html\",\n controller: \"JiraImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n JiraImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgJiraImportProjectForm\", JiraImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import.controller.coffee\n */\n\n(function() {\n var JiraImportController;\n\n JiraImportController = (function() {\n JiraImportController.$inject = ['tgJiraImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function JiraImportController(jiraImportService, confirm, translate, importProjectService) {\n this.jiraImportService = jiraImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.step = 'autorization-jira';\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.jiraImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.jiraImportService.projectUsers;\n };\n })(this));\n }\n\n JiraImportController.prototype.startProjectSelector = function() {\n this.step = 'project-select-jira';\n return this.jiraImportService.fetchProjects();\n };\n\n JiraImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-jira';\n this.project = project;\n this.fetchingUsers = true;\n return this.jiraImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n JiraImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-jira';\n };\n\n JiraImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-jira';\n };\n\n JiraImportController.prototype.startImport = function(users) {\n var loader, projectType, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n projectType = this.project.get('project_type');\n if (projectType === \"issues\" && this.project.get('create_subissues')) {\n projectType = \"issues-with-subissues\";\n }\n promise = this.jiraImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'), projectType, this.project.get('importer_type'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n JiraImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return JiraImportController;\n\n })();\n\n angular.module('taigaProjects').controller('JiraImportCtrl', JiraImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import.directive.coffee\n */\n\n(function() {\n var JiraImportDirective;\n\n JiraImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/jira-import/jira-import.html\",\n controller: \"JiraImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n JiraImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgJiraImport\", JiraImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: jira-import.service.coffee\n */\n\n(function() {\n var JiraImportService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n JiraImportService = (function(superClass) {\n extend(JiraImportService, superClass);\n\n JiraImportService.$inject = ['tgResources', '$location'];\n\n function JiraImportService(resources, location) {\n this.resources = resources;\n this.location = location;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n }\n\n JiraImportService.prototype.setToken = function(token, url) {\n this.token = token;\n return this.url = url;\n };\n\n JiraImportService.prototype.fetchProjects = function() {\n return this.resources.jiraImporter.listProjects(this.url, this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n JiraImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.jiraImporter.listUsers(this.url, this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n JiraImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType) {\n return this.resources.jiraImporter.importProject(this.url, this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType);\n };\n\n JiraImportService.prototype.getAuthUrl = function(url) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.jiraImporter.getAuthUrl(url).then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n }, function(err) {\n return reject(err.data._error_message);\n });\n };\n })(this));\n };\n\n JiraImportService.prototype.authorize = function(oauth_verifier) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.jiraImporter.authorize(oauth_verifier).then((function(response) {\n _this.token = response.data.token;\n _this.url = response.data.url;\n return resolve(response.data);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return JiraImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgJiraImportService\", JiraImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import-project-members.controller.coffee\n */\n\n(function() {\n var SelectImportUserLightboxCtrl;\n\n SelectImportUserLightboxCtrl = (function() {\n SelectImportUserLightboxCtrl.$inject = [];\n\n function SelectImportUserLightboxCtrl() {}\n\n SelectImportUserLightboxCtrl.prototype.start = function() {\n this.mode = 'search';\n return this.invalid = false;\n };\n\n SelectImportUserLightboxCtrl.prototype.assignUser = function() {\n return this.onSelectUser({\n user: this.user,\n taigaUser: this.userEmail\n });\n };\n\n SelectImportUserLightboxCtrl.prototype.selectUser = function(taigaUser) {\n return this.onSelectUser({\n user: this.user,\n taigaUser: Immutable.fromJS(taigaUser)\n });\n };\n\n return SelectImportUserLightboxCtrl;\n\n })();\n\n angular.module('taigaProjects').controller('SelectImportUserLightboxCtrl', SelectImportUserLightboxCtrl);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: select-import-user-lightbox.directive.coffee\n */\n\n(function() {\n var SelectImportUserLightboxDirective;\n\n SelectImportUserLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return scope.$watch('vm.visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n ctrl.start();\n return lightboxService.open(el, null, scope.vm.onClose).then(function() {\n el.find('input').focus();\n return lightboxKeyboardNavigationService.init(el);\n });\n } else if (!visible && el.hasClass('open')) {\n return lightboxService.close(el).then(function() {\n ctrl.userEmail = '';\n return ctrl.usersSearch = '';\n });\n }\n });\n };\n return {\n controller: \"SelectImportUserLightboxCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n user: '<',\n visible: '<',\n onClose: '&',\n onSelectUser: '&',\n selectableUsers: '<',\n isPrivate: '<',\n limitMembersPrivateProject: '<',\n limitMembersPublicProject: '<',\n displayEmailSelector: '<'\n },\n templateUrl: 'projects/create/select-import-user-lightbox/select-import-user-lightbox.html',\n link: link\n };\n };\n\n SelectImportUserLightboxDirective.$inject = ['lightboxService', 'lightboxKeyboardNavigationService'];\n\n angular.module(\"taigaProjects\").directive(\"tgSelectImportUserLightbox\", SelectImportUserLightboxDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import-project-form.controller.coffee\n */\n\n(function() {\n var TrelloImportProjectFormController;\n\n TrelloImportProjectFormController = (function() {\n TrelloImportProjectFormController.$inject = [\"tgCurrentUserService\"];\n\n function TrelloImportProjectFormController(currentUserService) {\n this.currentUserService = currentUserService;\n this.canCreatePublicProjects = this.currentUserService.canCreatePublicProjects();\n this.canCreatePrivateProjects = this.currentUserService.canCreatePrivateProjects();\n this.projectForm = this.project.toJS();\n this.platformName = \"Trello\";\n this.projectForm.is_private = false;\n this.projectForm.keepExternalReference = false;\n if (!this.canCreatePublicProjects.valid && this.canCreatePrivateProjects.valid) {\n this.projectForm.is_private = true;\n }\n }\n\n TrelloImportProjectFormController.prototype.checkUsersLimit = function() {\n this.limitMembersPrivateProject = this.currentUserService.canAddMembersPrivateProject(this.members.size);\n return this.limitMembersPublicProject = this.currentUserService.canAddMembersPublicProject(this.members.size);\n };\n\n TrelloImportProjectFormController.prototype.saveForm = function() {\n return this.onSaveProjectDetails({\n project: Immutable.fromJS(this.projectForm)\n });\n };\n\n TrelloImportProjectFormController.prototype.canCreateProject = function() {\n if (this.projectForm.is_private) {\n return this.canCreatePrivateProjects.valid;\n } else {\n return this.canCreatePublicProjects.valid;\n }\n };\n\n TrelloImportProjectFormController.prototype.isDisabled = function() {\n return !this.canCreateProject();\n };\n\n return TrelloImportProjectFormController;\n\n })();\n\n angular.module('taigaProjects').controller('TrelloImportProjectFormCtrl', TrelloImportProjectFormController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import-project-form.directive.coffee\n */\n\n(function() {\n var TrelloImportProjectFormDirective;\n\n TrelloImportProjectFormDirective = function() {\n return {\n link: function(scope, elm, attr, ctrl) {\n return scope.$watch('vm.members', ctrl.checkUsersLimit.bind(ctrl));\n },\n templateUrl: \"projects/create/trello-import/trello-import-project-form/trello-import-project-form.html\",\n controller: \"TrelloImportProjectFormCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n members: '<',\n project: '<',\n onSaveProjectDetails: '&',\n onCancelForm: '&',\n fetchingUsers: '<'\n }\n };\n };\n\n TrelloImportProjectFormDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgTrelloImportProjectForm\", TrelloImportProjectFormDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import.controller.coffee\n */\n\n(function() {\n var TrelloImportController;\n\n TrelloImportController = (function() {\n TrelloImportController.$inject = ['tgTrelloImportService', '$tgConfirm', '$translate', 'tgImportProjectService'];\n\n function TrelloImportController(trelloImportService, confirm, translate, importProjectService) {\n this.trelloImportService = trelloImportService;\n this.confirm = confirm;\n this.translate = translate;\n this.importProjectService = importProjectService;\n this.project = null;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.trelloImportService.projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'members', (function(_this) {\n return function() {\n return _this.trelloImportService.projectUsers;\n };\n })(this));\n }\n\n TrelloImportController.prototype.startProjectSelector = function() {\n return this.trelloImportService.fetchProjects().then((function(_this) {\n return function() {\n return _this.step = 'project-select-trello';\n };\n })(this));\n };\n\n TrelloImportController.prototype.onSelectProject = function(project) {\n this.step = 'project-form-trello';\n this.project = project;\n this.fetchingUsers = true;\n return this.trelloImportService.fetchUsers(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.fetchingUsers = false;\n };\n })(this));\n };\n\n TrelloImportController.prototype.onSaveProjectDetails = function(project) {\n this.project = project;\n return this.step = 'project-members-trello';\n };\n\n TrelloImportController.prototype.onCancelMemberSelection = function() {\n return this.step = 'project-form-trello';\n };\n\n TrelloImportController.prototype.startImport = function(users) {\n var loader, promise;\n loader = this.confirm.loader(this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.TITLE'), this.translate.instant('PROJECT.IMPORT.IN_PROGRESS.DESCRIPTION'), true);\n loader.start();\n promise = this.trelloImportService.importProject(this.project.get('name'), this.project.get('description'), this.project.get('id'), users, this.project.get('keepExternalReference'), this.project.get('is_private'));\n return this.importProjectService.importPromise(promise).then((function(_this) {\n return function() {\n return loader.stop();\n };\n })(this));\n };\n\n TrelloImportController.prototype.submitUserSelection = function(users) {\n this.startImport(users);\n return null;\n };\n\n return TrelloImportController;\n\n })();\n\n angular.module('taigaProjects').controller('TrelloImportCtrl', TrelloImportController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import.directive.coffee\n */\n\n(function() {\n var TrelloImportDirective;\n\n TrelloImportDirective = function() {\n return {\n link: function(scope, elm, attrs, ctrl) {\n return ctrl.startProjectSelector();\n },\n templateUrl: \"projects/create/trello-import/trello-import.html\",\n controller: \"TrelloImportCtrl\",\n controllerAs: \"vm\",\n bindToController: true,\n scope: {\n onCancel: '&'\n }\n };\n };\n\n TrelloImportDirective.$inject = [];\n\n angular.module(\"taigaProjects\").directive(\"tgTrelloImport\", TrelloImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: trello-import.service.coffee\n */\n\n(function() {\n var TrelloImportService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n TrelloImportService = (function(superClass) {\n extend(TrelloImportService, superClass);\n\n TrelloImportService.$inject = ['tgResources'];\n\n function TrelloImportService(resources) {\n this.resources = resources;\n this.projects = Immutable.List();\n this.projectUsers = Immutable.List();\n this.token = null;\n }\n\n TrelloImportService.prototype.setToken = function(token) {\n return this.token = token;\n };\n\n TrelloImportService.prototype.fetchProjects = function() {\n return this.resources.trelloImporter.listProjects(this.token).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n TrelloImportService.prototype.fetchUsers = function(projectId) {\n return this.resources.trelloImporter.listUsers(this.token, projectId).then((function(_this) {\n return function(users) {\n return _this.projectUsers = users;\n };\n })(this));\n };\n\n TrelloImportService.prototype.importProject = function(name, description, projectId, userBindings, keepExternalReference, isPrivate) {\n return this.resources.trelloImporter.importProject(this.token, name, description, projectId, userBindings, keepExternalReference, isPrivate);\n };\n\n TrelloImportService.prototype.getAuthUrl = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n return _this.resources.trelloImporter.getAuthUrl().then(function(response) {\n _this.authUrl = response.data.url;\n return resolve(_this.authUrl);\n });\n };\n })(this));\n };\n\n TrelloImportService.prototype.authorize = function(verifyCode) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n return _this.resources.trelloImporter.authorize(verifyCode).then((function(response) {\n _this.token = response.data.token;\n return resolve(_this.token);\n }), function(error) {\n return reject(new Error(error.status));\n });\n };\n })(this));\n };\n\n return TrelloImportService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgTrelloImportService\", TrelloImportService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: warning-user-import.directive.coffee\n */\n\n(function() {\n var WarningUserImportDirective;\n\n WarningUserImportDirective = function(lightboxService, lightboxKeyboardNavigationService) {\n return {\n link: function(scope, el, attr) {\n return scope.$watch('visible', function(visible) {\n if (visible && !el.hasClass('open')) {\n return lightboxService.open(el, scope.onClose).then(function() {\n el.find('input').focus();\n return lightboxKeyboardNavigationService.init(el);\n });\n } else if (!visible && el.hasClass('open')) {\n return lightboxService.close(el);\n }\n });\n },\n templateUrl: \"projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html\",\n scope: {\n visible: '<',\n onClose: '&',\n onConfirm: '&'\n }\n };\n };\n\n WarningUserImportDirective.$inject = ['lightboxService', 'lightboxKeyboardNavigationService'];\n\n angular.module(\"taigaProjects\").directive(\"tgWarningUserImportLightbox\", WarningUserImportDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects-listing.controller.coffee\n */\n\n(function() {\n var ProjectsListingController;\n\n ProjectsListingController = (function() {\n ProjectsListingController.$inject = [\"tgCurrentUserService\"];\n\n function ProjectsListingController(currentUserService) {\n this.currentUserService = currentUserService;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\n }\n\n return ProjectsListingController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ProjectsListing\", ProjectsListingController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.controller.coffee\n */\n\n(function() {\n var ProjectController;\n\n ProjectController = (function() {\n ProjectController.$inject = [\"$routeParams\", \"tgAppMetaService\", \"$tgAuth\", \"$translate\", \"tgProjectService\"];\n\n function ProjectController(routeParams, appMetaService, auth, translate, projectService) {\n this.routeParams = routeParams;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\n this.user = this.auth.userData;\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"members\", (function(_this) {\n return function() {\n return _this.projectService.activeMembers;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n }\n\n ProjectController.prototype._setMeta = function() {\n var ctx;\n if (!this.project) {\n return null;\n }\n ctx = {\n projectName: this.project.get(\"name\")\n };\n return {\n title: this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx),\n description: this.project.get(\"description\")\n };\n };\n\n return ProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"Project\", ProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects.service.coffee\n */\n\n(function() {\n var ProjectsService, groupBy, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n ProjectsService = (function(superClass) {\n extend(ProjectsService, superClass);\n\n ProjectsService.$inject = [\"tgResources\", \"$projectUrl\"];\n\n function ProjectsService(rs, projectUrl) {\n this.rs = rs;\n this.projectUrl = projectUrl;\n }\n\n ProjectsService.prototype.create = function(data) {\n return this.rs.projects.create(data);\n };\n\n ProjectsService.prototype.duplicate = function(projectId, data) {\n return this.rs.projects.duplicate(projectId, data);\n };\n\n ProjectsService.prototype.getProjectBySlug = function(projectSlug) {\n return this.rs.projects.getProjectBySlug(projectSlug).then((function(_this) {\n return function(project) {\n return _this._decorate(project);\n };\n })(this));\n };\n\n ProjectsService.prototype.getProjectStats = function(projectId) {\n return this.rs.projects.getProjectStats(projectId);\n };\n\n ProjectsService.prototype.getProjectsByUserId = function(userId, paginate) {\n return this.rs.projects.getProjectsByUserId(userId, paginate).then((function(_this) {\n return function(projects) {\n return projects.map(_this._decorate.bind(_this));\n };\n })(this));\n };\n\n ProjectsService.prototype._decorate = function(project) {\n var url;\n url = this.projectUrl.get(project.toJS());\n project = project.set(\"url\", url);\n return project;\n };\n\n ProjectsService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.rs.projects.bulkUpdateOrder(sortData);\n };\n\n ProjectsService.prototype.transferValidateToken = function(projectId, token) {\n return this.rs.projects.transferValidateToken(projectId, token);\n };\n\n ProjectsService.prototype.transferAccept = function(projectId, token, reason) {\n return this.rs.projects.transferAccept(projectId, token, reason);\n };\n\n ProjectsService.prototype.transferReject = function(projectId, token, reason) {\n return this.rs.projects.transferReject(projectId, token, reason);\n };\n\n return ProjectsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgProjectsService\", ProjectsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: cant-own-project-explanation.directive.coffee\n */\n\n(function() {\n var CantOwnProjectExplanationDirective;\n\n CantOwnProjectExplanationDirective = function() {\n return {\n templateUrl: \"projects/transfer/cant-own-project-explanation.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgCantOwnProjectExplanation\", CantOwnProjectExplanationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: transfer-project.directive.coffee\n */\n\n(function() {\n var TransferProject, module;\n\n module = angular.module('taigaProjects');\n\n TransferProject = (function() {\n TransferProject.$inject = [\"$routeParams\", \"tgProjectsService\", \"$location\", \"$tgAuth\", \"tgCurrentUserService\", \"$tgNavUrls\", \"$translate\", \"$tgConfirm\", \"tgErrorHandlingService\"];\n\n function TransferProject(routeParams, projectService, location, authService, currentUserService, navUrls, translate, confirmService, errorHandlingService) {\n this.routeParams = routeParams;\n this.projectService = projectService;\n this.location = location;\n this.authService = authService;\n this.currentUserService = currentUserService;\n this.navUrls = navUrls;\n this.translate = translate;\n this.confirmService = confirmService;\n this.errorHandlingService = errorHandlingService;\n }\n\n TransferProject.prototype.initialize = function() {\n this.projectId = this.project.get(\"id\");\n this.token = this.routeParams.token;\n this.showAddComment = false;\n return this._refreshUserData();\n };\n\n TransferProject.prototype._validateToken = function() {\n return this.projectService.transferValidateToken(this.projectId, this.token).then(null, (function(_this) {\n return function(data, status) {\n return _this.errorHandlingService.notfound();\n };\n })(this));\n };\n\n TransferProject.prototype._refreshUserData = function() {\n return this.authService.refresh().then((function(_this) {\n return function() {\n _this._validateToken();\n _this._setProjectData();\n return _this._checkOwnerData();\n };\n })(this));\n };\n\n TransferProject.prototype._setProjectData = function() {\n return this.canBeOwnedByUser = this.currentUserService.canOwnProject(this.project);\n };\n\n TransferProject.prototype._checkOwnerData = function() {\n var currentUser, maxMemberships;\n currentUser = this.currentUserService.getUser();\n if (this.project.get('is_private')) {\n this.ownerMessage = 'ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PRIVATE';\n this.maxProjects = currentUser.get('max_private_projects');\n if (this.maxProjects === null) {\n this.maxProjects = this.translate.instant('ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS');\n }\n this.currentProjects = currentUser.get('total_private_projects');\n maxMemberships = currentUser.get('max_memberships_private_projects');\n } else {\n this.ownerMessage = 'ADMIN.PROJECT_TRANSFER.OWNER_MESSAGE.PUBLIC';\n this.maxProjects = currentUser.get('max_public_projects');\n if (this.maxProjects === null) {\n this.maxProjects = this.translate.instant('ADMIN.PROJECT_TRANSFER.UNLIMITED_PROJECTS');\n }\n this.currentProjects = currentUser.get('total_public_projects');\n maxMemberships = currentUser.get('max_memberships_public_projects');\n }\n return this.validNumberOfMemberships = maxMemberships === null || this.project.get('total_memberships') <= maxMemberships;\n };\n\n TransferProject.prototype.transferAccept = function(token, reason) {\n this.loadingAccept = true;\n return this.projectService.transferAccept(this.project.get(\"id\"), token, reason).then((function(_this) {\n return function() {\n var newUrl;\n newUrl = _this.navUrls.resolve(\"project-admin-project-profile-details\", {\n project: _this.project.get(\"slug\")\n });\n _this.loadingAccept = false;\n _this.location.path(newUrl);\n _this.confirmService.notify(\"success\", _this.translate.instant(\"ADMIN.PROJECT_TRANSFER.ACCEPTED_PROJECT_OWNERNSHIP\"), '', 5000);\n };\n })(this));\n };\n\n TransferProject.prototype.transferReject = function(token, reason) {\n this.loadingReject = true;\n return this.projectService.transferReject(this.project.get(\"id\"), token, reason).then((function(_this) {\n return function() {\n var newUrl;\n newUrl = _this.navUrls.resolve(\"home\", {\n project: _this.project.get(\"slug\")\n });\n _this.loadingReject = false;\n _this.location.path(newUrl);\n _this.confirmService.notify(\"success\", _this.translate.instant(\"ADMIN.PROJECT_TRANSFER.REJECTED_PROJECT_OWNERNSHIP\"), '', 5000);\n };\n })(this));\n };\n\n TransferProject.prototype.addComment = function() {\n return this.showAddComment = true;\n };\n\n TransferProject.prototype.hideComment = function() {\n this.showAddComment = false;\n return this.reason = '';\n };\n\n return TransferProject;\n\n })();\n\n module.controller(\"TransferProjectController\", TransferProject);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: transfer-project.directive.coffee\n */\n\n(function() {\n var TransferProjectDirective, module;\n\n module = angular.module('taigaProjects');\n\n TransferProjectDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.initialize();\n };\n return {\n link: link,\n scope: {},\n bindToController: {\n project: \"=\"\n },\n templateUrl: \"projects/transfer/transfer-project.html\",\n controller: 'TransferProjectController',\n controllerAs: 'vm'\n };\n };\n\n module.directive('tgTransferProject', TransferProjectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-resource.service.coffee\n */\n\n(function() {\n var Resource, module, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n Resource = function(urlsService, http, config, $rootScope, $q, storage) {\n var service;\n service = {};\n service.list = function(type, objectId, projectId) {\n var httpOptions, params, url, urlname;\n urlname = \"attachments/\" + type;\n params = {\n object_id: objectId,\n project: projectId\n };\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n url = urlsService.resolve(urlname);\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service[\"delete\"] = function(type, id) {\n var url, urlname;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname) + (\"/\" + id);\n return http[\"delete\"](url);\n };\n service.patch = function(type, id, patch) {\n var url, urlname;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname) + (\"/\" + id);\n return http.patch(url, patch);\n };\n service.create = function(type, projectId, objectId, file, from_comment) {\n var data, defered, maxFileSize, response, token, uploadComplete, uploadFailed, uploadProgress, url, urlname, xhr;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname);\n defered = $q.defer();\n if (file === void 0) {\n defered.reject(null);\n return defered.promise;\n }\n maxFileSize = config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered.reject(response);\n return defered.promise;\n }\n uploadProgress = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n file.status = \"in-progress\";\n file.size = sizeFormat(evt.total);\n file.progressMessage = \"upload \" + (sizeFormat(evt.loaded)) + \" of \" + (sizeFormat(evt.total));\n return file.progressPercent = (Math.round((evt.loaded / evt.total) * 100)) + \"%\";\n });\n };\n })(this);\n uploadComplete = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n var attachment, ref, status;\n file.status = \"done\";\n status = evt.target.status;\n try {\n attachment = JSON.parse(evt.target.responseText);\n } catch (error) {\n attachment = {};\n }\n if (status >= 200 && status < 400) {\n attachment = Immutable.fromJS(attachment);\n return defered.resolve(attachment);\n } else {\n response = {\n status: status,\n data: {\n _error_message: (ref = data['attached_file']) != null ? ref[0] : void 0\n }\n };\n return defered.reject(response);\n }\n });\n };\n })(this);\n uploadFailed = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n file.status = \"error\";\n return defered.reject(\"fail\");\n });\n };\n })(this);\n data = new FormData();\n data.append(\"project\", projectId);\n data.append(\"object_id\", objectId);\n data.append(\"attached_file\", file);\n data.append(\"from_comment\", from_comment);\n xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.addEventListener(\"load\", uploadComplete, false);\n xhr.addEventListener(\"error\", uploadFailed, false);\n token = storage.get('token');\n xhr.open(\"POST\", url);\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + token);\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send(data);\n return defered.promise;\n };\n return function() {\n return {\n \"attachments\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"$tgConfig\", \"$rootScope\", \"$q\", \"$tgStorage\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgAttachmentsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: epics-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"epics\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.list = function(projectId, page) {\n var params, url;\n if (page == null) {\n page = 0;\n }\n url = urlsService.resolve(\"epics\");\n params = {\n project: projectId,\n page: page\n };\n return http.get(url, params).then(function(result) {\n return {\n list: Immutable.fromJS(result.data),\n headers: result.headers\n };\n });\n };\n service.patch = function(id, patch) {\n var url;\n url = urlsService.resolve(\"epics\") + (\"/\" + id);\n return http.patch(url, patch).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.post = function(params) {\n var url;\n url = urlsService.resolve(\"epics\");\n return http.post(url, params).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.reorder = function(id, data, setOrders) {\n var options, url;\n url = urlsService.resolve(\"epics\") + (\"/\" + id);\n options = {\n \"headers\": {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n return http.patch(url, data, null, options).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.addRelatedUserstory = function(epicId, userstoryId) {\n var params, url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId);\n params = {\n user_story: userstoryId,\n epic: epicId\n };\n return http.post(url, params);\n };\n service.reorderRelatedUserstory = function(epicId, userstoryId, data, setOrders) {\n var options, url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId) + (\"/\" + userstoryId);\n options = {\n \"headers\": {\n \"set-orders\": JSON.stringify(setOrders)\n }\n };\n return http.patch(url, data, null, options);\n };\n service.bulkCreateRelatedUserStories = function(epicId, projectId, bulk_userstories) {\n var params, url;\n url = urlsService.resolve(\"epic-related-userstories-bulk-create\", epicId);\n params = {\n bulk_userstories: bulk_userstories,\n project_id: projectId\n };\n return http.post(url, params);\n };\n service.deleteRelatedUserstory = function(epicId, userstoryId) {\n var url;\n url = urlsService.resolve(\"epic-related-userstories\", epicId) + (\"/\" + userstoryId);\n return http[\"delete\"](url);\n };\n return function() {\n return {\n \"epics\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgEpicsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-apps-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.getApplicationToken = function(applicationId, state) {\n var url;\n url = urlsService.resolve(\"applications\");\n url = url + \"/\" + applicationId + \"/token?state=\" + state;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.authorizeApplicationToken = function(applicationId, state) {\n var data, url;\n url = urlsService.resolve(\"application-tokens\");\n url = url + \"/authorize\";\n data = {\n \"state\": state,\n \"application\": applicationId\n };\n return http.post(url, data).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"externalapps\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgExternalAppsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/importers.coffee\n */\n\n(function() {\n var AsanaResource, GithubResource, JiraResource, TrelloResource, module, taiga;\n\n taiga = this.taiga;\n\n TrelloResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(url) {\n url = urlsService.resolve(\"importers-trello-auth-url\");\n return http.get(url);\n };\n service.authorize = function(verifyCode) {\n var url;\n url = urlsService.resolve(\"importers-trello-authorize\");\n return http.post(url, {\n code: verifyCode\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-trello-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-trello-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate) {\n var data, url;\n url = urlsService.resolve(\"importers-trello-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: \"kanban\"\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"trelloImporter\": service\n };\n };\n };\n\n TrelloResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n JiraResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(jira_url) {\n var url;\n url = urlsService.resolve(\"importers-jira-auth-url\") + \"?url=\" + jira_url;\n return http.get(url);\n };\n service.authorize = function(oauth_verifier) {\n var url;\n url = urlsService.resolve(\"importers-jira-authorize\");\n return http.post(url, {\n oauth_verifier: oauth_verifier\n });\n };\n service.listProjects = function(jira_url, token) {\n var url;\n url = urlsService.resolve(\"importers-jira-list-projects\");\n return http.post(url, {\n url: jira_url,\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(jira_url, token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-jira-list-users\");\n return http.post(url, {\n url: jira_url,\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(jira_url, token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType, importerType) {\n var data, projectTemplate, url;\n url = urlsService.resolve(\"importers-jira-import-project\");\n projectTemplate = \"kanban\";\n if (projectType !== \"kanban\") {\n projectTemplate = \"scrum\";\n }\n data = {\n url: jira_url,\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n project_type: projectType,\n importer_type: importerType,\n template: projectTemplate\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"jiraImporter\": service\n };\n };\n };\n\n JiraResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n GithubResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function(callbackUri) {\n var url;\n url = urlsService.resolve(\"importers-github-auth-url\") + \"?uri=\" + callbackUri;\n return http.get(url);\n };\n service.authorize = function(code) {\n var url;\n url = urlsService.resolve(\"importers-github-authorize\");\n return http.post(url, {\n code: code\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-github-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-github-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n var data, url;\n url = urlsService.resolve(\"importers-github-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: projectType\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"githubImporter\": service\n };\n };\n };\n\n GithubResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n AsanaResource = function(urlsService, http) {\n var service;\n service = {};\n service.getAuthUrl = function() {\n var url;\n url = urlsService.resolve(\"importers-asana-auth-url\");\n return http.get(url);\n };\n service.authorize = function(code) {\n var url;\n url = urlsService.resolve(\"importers-asana-authorize\");\n return http.post(url, {\n code: code\n });\n };\n service.listProjects = function(token) {\n var url;\n url = urlsService.resolve(\"importers-asana-list-projects\");\n return http.post(url, {\n token: token\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.listUsers = function(token, projectId) {\n var url;\n url = urlsService.resolve(\"importers-asana-list-users\");\n return http.post(url, {\n token: token,\n project: projectId\n }).then(function(response) {\n return Immutable.fromJS(response.data);\n });\n };\n service.importProject = function(token, name, description, projectId, userBindings, keepExternalReference, isPrivate, projectType) {\n var data, url;\n url = urlsService.resolve(\"importers-asana-import-project\");\n data = {\n token: token,\n name: name,\n description: description,\n project: projectId,\n users_bindings: userBindings.toJS(),\n keep_external_reference: keepExternalReference,\n is_private: isPrivate,\n template: projectType\n };\n return http.post(url, data);\n };\n return function() {\n return {\n \"asanaImporter\": service\n };\n };\n };\n\n AsanaResource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgTrelloImportResource\", TrelloResource);\n\n module.factory(\"tgJiraImportResource\", JiraResource);\n\n module.factory(\"tgGithubImportResource\", GithubResource);\n\n module.factory(\"tgAsanaImportResource\", AsanaResource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: issues-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"issues\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"issues\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgIssuesResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects-resource.service.coffee\n */\n\n(function() {\n var Resource, module, pagination;\n\n pagination = function() {};\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.create = function(data) {\n var url;\n url = urlsService.resolve('projects');\n return http.post(url, JSON.stringify(data)).then((function(_this) {\n return function(result) {\n return Immutable.fromJS(result.data);\n };\n })(this));\n };\n service.duplicate = function(projectId, data) {\n var members, params, url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/\" + projectId + \"/duplicate\";\n members = data.users.map((function(_this) {\n return function(member) {\n return {\n \"id\": member\n };\n };\n })(this));\n params = {\n \"name\": data.name,\n \"description\": data.description,\n \"is_private\": data.is_private,\n \"users\": members\n };\n return http.post(url, params);\n };\n service.getProjects = function(params, pagination) {\n var httpOptions, url;\n if (params == null) {\n params = {};\n }\n if (pagination == null) {\n pagination = true;\n }\n url = urlsService.resolve(\"projects\");\n httpOptions = {};\n if (!pagination) {\n httpOptions = {\n headers: {\n \"x-lazy-pagination\": true\n }\n };\n }\n return http.get(url, params, httpOptions);\n };\n service.getProjectBySlug = function(projectSlug) {\n var url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/by_slug?slug=\" + projectSlug;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getProjectsByUserId = function(userId, paginate) {\n var httpOptions, params, url;\n if (paginate == null) {\n paginate = false;\n }\n url = urlsService.resolve(\"projects\");\n httpOptions = {};\n if (!paginate) {\n httpOptions.headers = {\n \"x-disable-pagination\": \"1\"\n };\n }\n params = {\n \"member\": userId,\n \"order_by\": \"user_order\"\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getProjectStats = function(projectId) {\n var url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/\" + projectId;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.bulkUpdateOrder = function(bulkData) {\n var url;\n url = urlsService.resolve(\"bulk-update-projects-order\");\n return http.post(url, bulkData);\n };\n service.getTimeline = function(projectId, page) {\n var params, url;\n params = {\n page: page,\n only_relevant: true\n };\n url = urlsService.resolve(\"timeline-project\");\n url = url + \"/\" + projectId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.likeProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-like\", projectId);\n return http.post(url);\n };\n service.unlikeProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-unlike\", projectId);\n return http.post(url);\n };\n service.watchProject = function(projectId, notifyLevel) {\n var data, url;\n data = {\n notify_level: notifyLevel,\n live_notify_level: notifyLevel\n };\n url = urlsService.resolve(\"project-watch\", projectId);\n return http.post(url, data);\n };\n service.unwatchProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-unwatch\", projectId);\n return http.post(url);\n };\n service.contactProject = function(projectId, message) {\n var params, url;\n params = {\n project: projectId,\n comment: message\n };\n url = urlsService.resolve(\"project-contact\");\n return http.post(url, params);\n };\n service.transferValidateToken = function(projectId, token) {\n var data, url;\n data = {\n token: token\n };\n url = urlsService.resolve(\"project-transfer-validate-token\", projectId);\n return http.post(url, data);\n };\n service.transferAccept = function(projectId, token, reason) {\n var data, url;\n data = {\n token: token,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-accept\", projectId);\n return http.post(url, data);\n };\n service.transferReject = function(projectId, token, reason) {\n var data, url;\n data = {\n token: token,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-reject\", projectId);\n return http.post(url, data);\n };\n service.transferRequest = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-transfer-request\", projectId);\n return http.post(url);\n };\n service.transferStart = function(projectId, userId, reason) {\n var data, url;\n data = {\n user: userId,\n reason: reason\n };\n url = urlsService.resolve(\"project-transfer-start\", projectId);\n return http.post(url, data);\n };\n return function() {\n return {\n \"projects\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgProjectsResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: resources.coffee\n */\n\n(function() {\n var Resources, services;\n\n services = [\"tgProjectsResources\", \"tgUserResources\", \"tgUsersResources\", \"tgUserstoriesResource\", \"tgTasksResource\", \"tgIssuesResource\", \"tgExternalAppsResource\", \"tgAttachmentsResource\", \"tgStatsResource\", \"tgWikiHistory\", \"tgEpicsResource\", \"tgTrelloImportResource\", \"tgJiraImportResource\", \"tgGithubImportResource\", \"tgAsanaImportResource\"];\n\n Resources = function($injector) {\n var i, j, len, len1, ref, service, serviceFn, serviceName, serviceProperty;\n for (i = 0, len = services.length; i < len; i++) {\n serviceName = services[i];\n serviceFn = $injector.get(serviceName);\n service = $injector.invoke(serviceFn);\n ref = Object.keys(service);\n for (j = 0, len1 = ref.length; j < len1; j++) {\n serviceProperty = ref[j];\n if (this[serviceProperty]) {\n console.warn(\"repeated resource \" + serviceProperty);\n }\n this[serviceProperty] = service[serviceProperty];\n }\n }\n return this;\n };\n\n Resources.$inject = [\"$injector\"];\n\n angular.module(\"taigaResources2\").service(\"tgResources\", Resources);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: stats-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.discover = function(applicationId, state) {\n var url;\n url = urlsService.resolve(\"stats-discover\");\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"stats\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgStatsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tasks-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"tasks\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"tasks\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgTasksResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getUserStorage = function(key) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-storage\");\n if (key) {\n url += '/' + key;\n }\n httpOptions = {};\n return http.get(url, {}).then(function(response) {\n return response.data.value;\n });\n };\n service.setUserStorage = function(key, value) {\n var params, url;\n url = urlsService.resolve(\"user-storage\") + '/' + key;\n params = {\n key: key,\n value: value\n };\n return http.put(url, params);\n };\n service.createUserStorage = function(key, value) {\n var params, url;\n url = urlsService.resolve(\"user-storage\");\n params = {\n key: key,\n value: value\n };\n return http.post(url, params);\n };\n return function() {\n return {\n \"user\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUserResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: users-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getUserByUsername = function(username) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"by_username\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n username: username\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getStats = function(userId) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-stats\", userId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, {}, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getContacts = function(userId, excludeProjectId) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"user-contacts\", userId);\n params = {};\n if (excludeProjectId != null) {\n params.exclude_project = excludeProjectId;\n }\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getLiked = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-liked\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n params.only_relevant = true;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getVoted = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-voted\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getWatched = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-watched\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getProfileTimeline = function(userId, page) {\n var params, url;\n params = {\n page: page\n };\n url = urlsService.resolve(\"timeline-profile\");\n url = url + \"/\" + userId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getUserTimeline = function(userId, page) {\n var params, url;\n params = {\n page: page,\n only_relevant: true\n };\n url = urlsService.resolve(\"timeline-user\");\n url = url + \"/\" + userId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n return function() {\n return {\n \"users\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUsersResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: userstories-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params, pagination) {\n var httpOptions, url;\n if (pagination == null) {\n pagination = false;\n }\n url = urlsService.resolve(\"userstories\");\n if (!pagination) {\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n }\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.listAllInProject = function(projectId) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n project: projectId\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.listInEpic = function(epicIid) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n epic: epicIid,\n order_by: 'epic_order',\n include_tasks: true\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"userstories\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUserstoriesResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.getWikiHistory = function(wikiId) {\n var httpOptions, url;\n url = urlsService.resolve(\"history/wiki\", wikiId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, null, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"wikiHistory\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgWikiHistory\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: app-meta.service.coffee\n */\n\n(function() {\n var AppMetaService, taiga, truncate;\n\n taiga = this.taiga;\n\n truncate = taiga.truncate;\n\n AppMetaService = (function() {\n AppMetaService.$inject = [\"$rootScope\"];\n\n function AppMetaService(rootScope) {\n this.rootScope = rootScope;\n }\n\n AppMetaService.prototype._set = function(key, value) {\n var meta;\n if (!key) {\n return;\n }\n if (key === \"title\") {\n meta = $(\"head title\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.text(value || \"\");\n } else if (key.indexOf(\"og:\") === 0) {\n meta = $(\"head meta[property='\" + key + \"']\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.attr(\"content\", value || \"\");\n } else {\n meta = $(\"head meta[name='\" + key + \"']\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.attr(\"content\", value || \"\");\n }\n };\n\n AppMetaService.prototype.setTitle = function(title) {\n return this._set('title', title);\n };\n\n AppMetaService.prototype.setDescription = function(description) {\n return this._set(\"description\", truncate(description, 250));\n };\n\n AppMetaService.prototype.setTwitterMetas = function(title, description) {\n this._set(\"twitter:card\", \"summary\");\n this._set(\"twitter:site\", \"@taigaio\");\n this._set(\"twitter:title\", title);\n this._set(\"twitter:description\", truncate(description, 300));\n return this._set(\"twitter:image\", window.location.origin + \"/\" + window._version + \"/images/logo-color.png\");\n };\n\n AppMetaService.prototype.setOpenGraphMetas = function(title, description) {\n this._set(\"og:type\", \"object\");\n this._set(\"og:site_name\", \"Taiga - Love your projects\");\n this._set(\"og:title\", title);\n this._set(\"og:description\", truncate(description, 300));\n this._set(\"og:image\", window.location.origin + \"/\" + window._version + \"/images/logo-color.png\");\n return this._set(\"og:url\", window.location.href);\n };\n\n AppMetaService.prototype.setAll = function(title, description) {\n this.setTitle(title);\n this.setDescription(description);\n this.setTwitterMetas(title, description);\n return this.setOpenGraphMetas(title, description);\n };\n\n AppMetaService.prototype.addMobileViewport = function() {\n return $(\"head\").append(\"\");\n };\n\n AppMetaService.prototype.removeMobileViewport = function() {\n return $(\"head meta[name=\\\"viewport\\\"]\").remove();\n };\n\n AppMetaService.prototype.setfn = function(fn) {\n if (this.listener) {\n this._listener();\n }\n return this._listener = this.rootScope.$watchCollection(fn, (function(_this) {\n return function(metas) {\n if (metas) {\n _this.setAll(metas.title, metas.description);\n return _this._listener();\n }\n };\n })(this));\n };\n\n return AppMetaService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAppMetaService\", AppMetaService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments.service.coffee\n */\n\n(function() {\n var AttachmentsService, sizeFormat;\n\n sizeFormat = this.taiga.sizeFormat;\n\n AttachmentsService = (function() {\n AttachmentsService.$inject = [\"$tgConfirm\", \"$tgConfig\", \"$translate\", \"tgResources\"];\n\n function AttachmentsService(confirm, config, translate, rs) {\n this.confirm = confirm;\n this.config = config;\n this.translate = translate;\n this.rs = rs;\n this.maxFileSize = this.getMaxFileSize();\n if (this.maxFileSize) {\n this.maxFileSizeFormated = sizeFormat(this.maxFileSize);\n }\n }\n\n AttachmentsService.prototype.sizeError = function(file) {\n var message;\n message = this.translate.instant(\"ATTACHMENT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name,\n fileSize: sizeFormat(file.size),\n maxFileSize: this.maxFileSizeFormated\n });\n return this.confirm.notify(\"error\", message);\n };\n\n AttachmentsService.prototype.validate = function(file) {\n if (this.maxFileSize && file.size > this.maxFileSize) {\n this.sizeError(file);\n return false;\n }\n return true;\n };\n\n AttachmentsService.prototype.getMaxFileSize = function() {\n return this.config.get(\"maxUploadFileSize\", null);\n };\n\n AttachmentsService.prototype.list = function(type, objId, projectId) {\n return this.rs.attachments.list(type, objId, projectId).then((function(_this) {\n return function(attachments) {\n return attachments.sortBy(function(attachment) {\n return attachment.get('order');\n });\n };\n })(this));\n };\n\n AttachmentsService.prototype[\"delete\"] = function(type, id) {\n return this.rs.attachments[\"delete\"](type, id);\n };\n\n AttachmentsService.prototype.saveError = function(file, data) {\n var message;\n message = \"\";\n if (file) {\n message = this.translate.instant(\"ATTACHMENT.ERROR_UPLOAD_ATTACHMENT\", {\n fileName: file.name,\n errorMessage: data.data._error_message\n });\n }\n return this.confirm.notify(\"error\", message);\n };\n\n AttachmentsService.prototype.upload = function(file, objId, projectId, type, from_comment) {\n var promise;\n if (from_comment == null) {\n from_comment = false;\n }\n promise = this.rs.attachments.create(type, projectId, objId, file, from_comment);\n promise.then(null, this.saveError.bind(this, file));\n return promise;\n };\n\n AttachmentsService.prototype.patch = function(id, type, patch) {\n var promise;\n promise = this.rs.attachments.patch(type, id, patch);\n promise.then(null, this.saveError.bind(this, null));\n return promise;\n };\n\n return AttachmentsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAttachmentsService\", AttachmentsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: avatar.service.coffee\n */\n\n(function() {\n var AvatarService,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n AvatarService = (function() {\n function AvatarService(config) {\n var COLORS, IMAGES;\n this.config = config;\n IMAGES = [\"/\" + window._version + \"/images/user-avatars/user-avatar-01.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-02.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-03.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-04.png\", \"/\" + window._version + \"/images/user-avatars/user-avatar-05.png\"];\n COLORS = [\"rgba( 178, 176, 204, 1 )\", \"rgba( 183, 203, 131, 1 )\", \"rgba( 210, 198, 139, 1 )\", \"rgba( 214, 161, 212, 1 )\", \"rgba( 247, 154, 154, 1 )\"];\n this.logos = _.cartesianProduct(IMAGES, COLORS);\n }\n\n AvatarService.prototype.getDefault = function(key) {\n var idx, logo;\n idx = modulo(murmurhash3_32_gc(key, 42), this.logos.length);\n logo = this.logos[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n\n AvatarService.prototype.getUnnamed = function() {\n return {\n url: \"/\" + window._version + \"/images/unnamed.png\"\n };\n };\n\n AvatarService.prototype.getAvatar = function(user, type) {\n var avatarParamName, gravatar, logo, logoUrl, photo, root;\n if (!user) {\n return this.getUnnamed();\n }\n avatarParamName = 'photo';\n if (type === 'avatarBig') {\n avatarParamName = 'big_photo';\n }\n photo = null;\n if (user instanceof Immutable.Map) {\n gravatar = user.get('gravatar_id');\n photo = user.get(avatarParamName);\n } else {\n gravatar = user.gravatar_id;\n photo = user[avatarParamName];\n }\n if (!gravatar) {\n return this.getUnnamed();\n }\n if (photo) {\n return {\n url: photo\n };\n } else if (location.host.indexOf('localhost') !== -1 || !this.config.get(\"gravatar\", true)) {\n root = location.protocol + '//' + location.host;\n logo = this.getDefault(gravatar);\n return {\n url: root + logo.src,\n bg: logo.color\n };\n } else {\n root = location.protocol + '//' + location.host;\n logo = this.getDefault(gravatar);\n logoUrl = encodeURIComponent(root + logo.src);\n return {\n url: 'https://www.gravatar.com/avatar/' + gravatar + \"?s=200&d=\" + logoUrl,\n bg: logo.color\n };\n }\n };\n\n return AvatarService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAvatarService\", [\"$tgConfig\", AvatarService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: check-permissions.service.coffee\n */\n\n(function() {\n var CheckPermissionsService, taiga;\n\n taiga = this.taiga;\n\n CheckPermissionsService = (function() {\n CheckPermissionsService.$inject = [\"tgProjectService\"];\n\n function CheckPermissionsService(projectService) {\n this.projectService = projectService;\n }\n\n CheckPermissionsService.prototype.check = function(permission) {\n if (!this.projectService.project) {\n return false;\n }\n return this.projectService.project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n return CheckPermissionsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCheckPermissionsService\", CheckPermissionsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: current-user.service.coffee\n */\n\n(function() {\n var CurrentUserService, groupBy, taiga;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n CurrentUserService = (function() {\n CurrentUserService.$inject = [\"tgProjectsService\", \"$tgStorage\", \"tgResources\"];\n\n function CurrentUserService(projectsService, storageService, rs) {\n this.projectsService = projectsService;\n this.storageService = storageService;\n this.rs = rs;\n this._user = null;\n this._projects = Immutable.Map();\n this._projectsById = Immutable.Map();\n this._joyride = null;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this._projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"projectsById\", (function(_this) {\n return function() {\n return _this._projectsById;\n };\n })(this));\n }\n\n CurrentUserService.prototype.isAuthenticated = function() {\n if (this.getUser() !== null) {\n return true;\n }\n return false;\n };\n\n CurrentUserService.prototype.getUser = function() {\n var userData;\n if (!this._user) {\n userData = this.storageService.get(\"userInfo\");\n if (userData) {\n userData = Immutable.fromJS(userData);\n this.setUser(userData);\n }\n }\n return this._user;\n };\n\n CurrentUserService.prototype.removeUser = function() {\n this._user = null;\n this._projects = Immutable.Map();\n this._projectsById = Immutable.Map();\n return this._joyride = null;\n };\n\n CurrentUserService.prototype.setUser = function(user) {\n this._user = user;\n return this._loadUserInfo();\n };\n\n CurrentUserService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.projectsService.bulkUpdateProjectsOrder(sortData).then((function(_this) {\n return function() {\n return _this.loadProjects();\n };\n })(this));\n };\n\n CurrentUserService.prototype.loadProjects = function() {\n return this.projectsService.getProjectsByUserId(this._user.get(\"id\")).then((function(_this) {\n return function(projects) {\n return _this.setProjects(projects);\n };\n })(this));\n };\n\n CurrentUserService.prototype.disableJoyRide = function(section) {\n if (!this.isAuthenticated()) {\n return;\n }\n if (section) {\n this._joyride[section] = false;\n } else {\n this._joyride = {\n backlog: false,\n kanban: false,\n dashboard: false\n };\n }\n return this.rs.user.setUserStorage('joyride', this._joyride);\n };\n\n CurrentUserService.prototype.loadJoyRideConfig = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n if (_this._joyride !== null) {\n resolve(_this._joyride);\n return;\n }\n return _this.rs.user.getUserStorage('joyride').then(function(config) {\n _this._joyride = config;\n return resolve(_this._joyride);\n })[\"catch\"](function() {\n _this._joyride = {\n backlog: true,\n kanban: true,\n dashboard: true\n };\n _this.rs.user.createUserStorage('joyride', _this._joyride);\n return resolve(_this._joyride);\n });\n };\n })(this));\n };\n\n CurrentUserService.prototype._loadUserInfo = function() {\n return Promise.all([this.loadProjects()]);\n };\n\n CurrentUserService.prototype.setProjects = function(projects) {\n this._projects = this._projects.set(\"all\", projects);\n this._projects = this._projects.set(\"recents\", projects.slice(0, 10));\n this._projectsById = Immutable.fromJS(groupBy(projects.toJS(), function(p) {\n return p.id;\n }));\n return this.projects;\n };\n\n CurrentUserService.prototype.canCreatePrivateProjects = function() {\n var user;\n user = this.getUser();\n if (user.get('max_private_projects') !== null && user.get('total_private_projects') >= user.get('max_private_projects')) {\n return {\n valid: false,\n reason: 'max_private_projects',\n type: 'private_project',\n current: user.get('total_private_projects'),\n max: user.get('max_private_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canCreatePublicProjects = function() {\n var user;\n user = this.getUser();\n if (user.get('max_public_projects') !== null && user.get('total_public_projects') >= user.get('max_public_projects')) {\n return {\n valid: false,\n reason: 'max_public_projects',\n type: 'public_project',\n current: user.get('total_public_projects'),\n max: user.get('max_public_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canAddMembersPublicProject = function(totalMembers) {\n var user;\n user = this.getUser();\n if (user.get('max_memberships_public_projects') !== null && totalMembers > user.get('max_memberships_public_projects')) {\n return {\n valid: false,\n reason: 'max_members_public_projects',\n type: 'public_project',\n current: totalMembers,\n max: user.get('max_memberships_public_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canAddMembersPrivateProject = function(totalMembers) {\n var user;\n user = this.getUser();\n if (user.get('max_memberships_private_projects') !== null && totalMembers > user.get('max_memberships_private_projects')) {\n return {\n valid: false,\n reason: 'max_members_private_projects',\n type: 'private_project',\n current: totalMembers,\n max: user.get('max_memberships_private_projects')\n };\n }\n return {\n valid: true\n };\n };\n\n CurrentUserService.prototype.canOwnProject = function(project) {\n var membersResult, result, user;\n user = this.getUser();\n if (project.get('is_private')) {\n result = this.canCreatePrivateProjects();\n if (!result.valid) {\n return result;\n }\n membersResult = this.canAddMembersPrivateProject(project.get('total_memberships'));\n if (!membersResult.valid) {\n return membersResult;\n }\n } else {\n result = this.canCreatePublicProjects();\n if (!result.valid) {\n return result;\n }\n membersResult = this.canAddMembersPublicProject(project.get('total_memberships'));\n if (!membersResult.valid) {\n return membersResult;\n }\n }\n return {\n valid: true\n };\n };\n\n return CurrentUserService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCurrentUserService\", CurrentUserService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: error-handling.service.coffee\n */\n\n(function() {\n var ErrorHandlingService, taiga;\n\n taiga = this.taiga;\n\n ErrorHandlingService = (function() {\n ErrorHandlingService.$inject = [\"$rootScope\"];\n\n function ErrorHandlingService(rootScope) {\n this.rootScope = rootScope;\n }\n\n ErrorHandlingService.prototype.init = function() {\n return this.rootScope.errorHandling = {};\n };\n\n ErrorHandlingService.prototype.notfound = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.notfound = true;\n };\n\n ErrorHandlingService.prototype.error = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.error = true;\n };\n\n ErrorHandlingService.prototype.permissionDenied = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.permissionDenied = true;\n };\n\n ErrorHandlingService.prototype.block = function() {\n this.rootScope.errorHandling.showingError = true;\n return this.rootScope.errorHandling.blocked = true;\n };\n\n return ErrorHandlingService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgErrorHandlingService\", ErrorHandlingService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: lightbox-factory.service.coffee\n */\n\n(function() {\n var LightboxFactory;\n\n LightboxFactory = (function() {\n LightboxFactory.$inject = [\"$rootScope\", \"$compile\"];\n\n function LightboxFactory(rootScope, compile) {\n this.rootScope = rootScope;\n this.compile = compile;\n }\n\n LightboxFactory.prototype.create = function(name, attrs, scopeAttrs) {\n var elm, html, scope;\n scope = this.rootScope.$new();\n scope = _.merge(scope, scopeAttrs);\n elm = $(\"
    \").attr(name, true).attr(\"tg-bind-scope\", true);\n if (attrs) {\n elm.attr(attrs);\n }\n elm.addClass(\"remove-on-close\");\n html = this.compile(elm)(scope);\n $(document.body).append(html);\n };\n\n return LightboxFactory;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgLightboxFactory\", LightboxFactory);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: paginate-response.service.coffee\n */\n\n(function() {\n var PaginateResponse;\n\n PaginateResponse = function() {\n return function(result) {\n var paginateResponse;\n paginateResponse = Immutable.Map({\n \"data\": result.get(\"data\"),\n \"next\": !!result.get(\"headers\")(\"x-pagination-next\"),\n \"prev\": !!result.get(\"headers\")(\"x-pagination-prev\"),\n \"current\": result.get(\"headers\")(\"x-pagination-current\"),\n \"count\": result.get(\"headers\")(\"x-pagination-count\")\n });\n return paginateResponse;\n };\n };\n\n angular.module(\"taigaCommon\").factory(\"tgPaginateResponseService\", PaginateResponse);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-logo.service.coffee\n */\n\n(function() {\n var ProjectLogoService,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n ProjectLogoService = (function() {\n function ProjectLogoService() {\n var COLORS, IMAGES;\n IMAGES = [\"/\" + window._version + \"/images/project-logos/project-logo-01.png\", \"/\" + window._version + \"/images/project-logos/project-logo-02.png\", \"/\" + window._version + \"/images/project-logos/project-logo-03.png\", \"/\" + window._version + \"/images/project-logos/project-logo-04.png\", \"/\" + window._version + \"/images/project-logos/project-logo-05.png\"];\n COLORS = [\"rgba( 153, 214, 220, 1 )\", \"rgba( 213, 156, 156, 1 )\", \"rgba( 214, 161, 212, 1 )\", \"rgba( 164, 162, 219, 1 )\", \"rgba( 152, 224, 168, 1 )\"];\n this.logos = _.cartesianProduct(IMAGES, COLORS);\n }\n\n ProjectLogoService.prototype.getDefaultProjectLogo = function(slug, id) {\n var idx, key, logo;\n key = slug + \"-\" + id;\n idx = modulo(murmurhash3_32_gc(key, 42), this.logos.length);\n logo = this.logos[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n\n return ProjectLogoService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgProjectLogoService\", ProjectLogoService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.service.coffee\n */\n\n(function() {\n var ProjectService, taiga;\n\n taiga = this.taiga;\n\n ProjectService = (function() {\n ProjectService.$inject = [\"tgProjectsService\", \"tgXhrErrorService\", \"tgUserActivityService\", \"$interval\"];\n\n function ProjectService(projectsService, xhrError, userActivityService, interval) {\n this.projectsService = projectsService;\n this.xhrError = xhrError;\n this.userActivityService = userActivityService;\n this.interval = interval;\n this._project = null;\n this._section = null;\n this._sectionsBreadcrumb = Immutable.List();\n this._activeMembers = Immutable.List();\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this._project;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"section\", (function(_this) {\n return function() {\n return _this._section;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"sectionsBreadcrumb\", (function(_this) {\n return function() {\n return _this._sectionsBreadcrumb;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"activeMembers\", (function(_this) {\n return function() {\n return _this._activeMembers;\n };\n })(this));\n if (!window.localStorage.e2e) {\n this.autoRefresh();\n }\n }\n\n ProjectService.prototype.cleanProject = function() {\n this._project = null;\n this._activeMembers = Immutable.List();\n this._section = null;\n return this._sectionsBreadcrumb = Immutable.List();\n };\n\n ProjectService.prototype.autoRefresh = function() {\n var intervalId;\n intervalId = this.interval((function(_this) {\n return function() {\n return _this.fetchProject();\n };\n })(this), 60 * 10 * 1000);\n this.userActivityService.onInactive((function(_this) {\n return function() {\n return _this.interval.cancel(intervalId);\n };\n })(this));\n return this.userActivityService.onActive((function(_this) {\n return function() {\n _this.fetchProject();\n return _this.autoRefresh();\n };\n })(this));\n };\n\n ProjectService.prototype.setSection = function(section) {\n this._section = section;\n if (section) {\n return this._sectionsBreadcrumb = this._sectionsBreadcrumb.push(this._section);\n } else {\n return this._sectionsBreadcrumb = Immutable.List();\n }\n };\n\n ProjectService.prototype.setProject = function(project) {\n this._project = project;\n return this._activeMembers = this._project.get('members').filter(function(member) {\n return member.get('is_active');\n });\n };\n\n ProjectService.prototype.setProjectBySlug = function(pslug) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n if (!_this.project || _this.project.get('slug') !== pslug) {\n return _this.projectsService.getProjectBySlug(pslug).then(function(project) {\n _this.setProject(project);\n return resolve();\n })[\"catch\"](function(xhr) {\n return _this.xhrError.response(xhr);\n });\n } else {\n return resolve();\n }\n };\n })(this));\n };\n\n ProjectService.prototype.fetchProject = function() {\n var pslug;\n if (!this.project) {\n return;\n }\n pslug = this.project.get('slug');\n return this.projectsService.getProjectBySlug(pslug).then((function(_this) {\n return function(project) {\n return _this.setProject(project);\n };\n })(this));\n };\n\n ProjectService.prototype.hasPermission = function(permission) {\n return this._project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n ProjectService.prototype.isEpicsDashboardEnabled = function() {\n return this._project.get(\"is_epics_activated\");\n };\n\n return ProjectService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgProjectService\", ProjectService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: theme.service.coffee\n */\n\n(function() {\n var ThemeService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ThemeService = (function(superClass) {\n extend(ThemeService, superClass);\n\n function ThemeService() {\n return ThemeService.__super__.constructor.apply(this, arguments);\n }\n\n return ThemeService;\n\n })(taiga.Service = function() {\n return {\n use: function(themeName) {\n var stylesheetEl;\n stylesheetEl = $(\"link[rel='stylesheet']:first\");\n if (stylesheetEl.length === 0) {\n stylesheetEl = $(\"\");\n $(\"head\").append(stylesheetEl);\n }\n return stylesheetEl.attr(\"href\", \"/\" + window._version + \"/styles/theme-\" + themeName + \".css\");\n }\n };\n });\n\n angular.module(\"taigaCommon\").service(\"tgThemeService\", ThemeService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-activity.service.coffee\n */\n\n(function() {\n var UserActivityService, groupBy, taiga;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n UserActivityService = (function() {\n UserActivityService.$inject = ['$timeout'];\n\n UserActivityService.prototype.idleTimeout = 60 * 5 * 1000;\n\n function UserActivityService(timeout) {\n this.timeout = timeout;\n if (window.localStorage.e2e) {\n return null;\n }\n window.addEventListener('mousemove', this.resetTimer.bind(this), false);\n window.addEventListener('mousedown', this.resetTimer.bind(this), false);\n window.addEventListener('keypress', this.resetTimer.bind(this), false);\n window.addEventListener('mousewheel', this.resetTimer.bind(this), false);\n window.addEventListener('touchmove', this.resetTimer.bind(this), false);\n this.subscriptionsActive = [];\n this.subscriptionsInactive = [];\n this.isActive = true;\n this.startTimer();\n }\n\n UserActivityService.prototype.startTimer = function() {\n return this.timerId = this.timeout(this._fireInactive.bind(this), this.idleTimeout);\n };\n\n UserActivityService.prototype.resetTimer = function() {\n if (!this.isActive) {\n this._fireActive();\n }\n this.timeout.cancel(this.timerId);\n this.startTimer();\n return this.isActive = true;\n };\n\n UserActivityService.prototype.onActive = function(cb) {\n this.subscriptionsActive.push(cb);\n return this._unSubscriptionsActive.bind(this, cb);\n };\n\n UserActivityService.prototype.onInactive = function(cb) {\n this.subscriptionsInactive.push(cb);\n return this._unSubscriptionsInactive.bind(this, cb);\n };\n\n UserActivityService.prototype._fireActive = function() {\n return this.subscriptionsActive.forEach(function(it) {\n return it();\n });\n };\n\n UserActivityService.prototype._fireInactive = function() {\n this.isActive = false;\n return this.subscriptionsInactive.forEach(function(it) {\n return it();\n });\n };\n\n UserActivityService.prototype._unSubscriptionsActive = function(cb) {\n return this.subscriptionsActive = this.subscriptionsActive.filter(function(fn) {\n return fn !== cb;\n });\n };\n\n UserActivityService.prototype._unSubscriptionsInactive = function(cb) {\n return this.subscriptionsInactive = this.subscriptionsInactive.filter(function(fn) {\n return fn !== cb;\n });\n };\n\n return UserActivityService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgUserActivityService\", UserActivityService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user.service.coffee\n */\n\n(function() {\n var UserService, bindMethods, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n bindMethods = taiga.bindMethods;\n\n UserService = (function(superClass) {\n extend(UserService, superClass);\n\n UserService.$inject = [\"tgResources\"];\n\n function UserService(rs) {\n this.rs = rs;\n bindMethods(this);\n }\n\n UserService.prototype.getUserByUserName = function(username) {\n return this.rs.users.getUserByUsername(username);\n };\n\n UserService.prototype.getContacts = function(userId, excludeProjectId) {\n return this.rs.users.getContacts(userId, excludeProjectId);\n };\n\n UserService.prototype.getLiked = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getLiked(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getVoted = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getVoted(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getWatched = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getWatched(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getStats = function(userId) {\n return this.rs.users.getStats(userId);\n };\n\n UserService.prototype.attachUserContactsToProjects = function(userId, projects) {\n return this.getContacts(userId).then(function(contacts) {\n projects = projects.map(function(project) {\n var contactsFiltered;\n contactsFiltered = contacts.filter(function(contact) {\n var contactId;\n contactId = contact.get(\"id\");\n return project.get('members').indexOf(contactId) !== -1;\n });\n project = project.set(\"contacts\", contactsFiltered);\n return project;\n });\n return projects;\n });\n };\n\n return UserService;\n\n })(taiga.Service);\n\n angular.module(\"taigaCommon\").service(\"tgUserService\", UserService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: xhrError.service.coffee\n */\n\n(function() {\n var xhrError,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n xhrError = (function(superClass) {\n extend(xhrError, superClass);\n\n xhrError.$inject = [\"$q\", \"tgErrorHandlingService\"];\n\n function xhrError(q, errorHandlingService) {\n this.q = q;\n this.errorHandlingService = errorHandlingService;\n }\n\n xhrError.prototype.notFound = function() {\n return this.errorHandlingService.notfound();\n };\n\n xhrError.prototype.permissionDenied = function() {\n return this.errorHandlingService.permissionDenied();\n };\n\n xhrError.prototype.response = function(xhr) {\n if (xhr) {\n if (xhr.status === 404) {\n this.notFound();\n } else if (xhr.status === 403) {\n this.permissionDenied();\n }\n }\n return this.q.reject(xhr);\n };\n\n return xhrError;\n\n })(taiga.Service);\n\n angular.module(\"taigaCommon\").service(\"tgXhrErrorService\", xhrError);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-attachment.directive.coffee\n */\n\n(function() {\n var UserTimelineAttachmentDirective;\n\n UserTimelineAttachmentDirective = function(template, $compile) {\n var isImage, link, validFileExtensions;\n validFileExtensions = [\".jpg\", \".jpeg\", \".bmp\", \".gif\", \".png\"];\n isImage = function(url) {\n url = url.toLowerCase();\n return _.some(validFileExtensions, function(extension) {\n return url.indexOf(extension, url - extension.length) !== -1;\n });\n };\n link = function(scope, el) {\n var is_image, templateHtml;\n is_image = isImage(scope.attachment.get('url'));\n if (is_image) {\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment-image.html\");\n } else {\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment.html\");\n }\n el.html(templateHtml);\n $compile(el.contents())(scope);\n return el.find(\"img\").error(function() {\n return this.remove();\n });\n };\n return {\n link: link,\n scope: {\n attachment: \"=tgUserTimelineAttachment\"\n }\n };\n };\n\n UserTimelineAttachmentDirective.$inject = [\"$tgTemplate\", \"$compile\"];\n\n angular.module(\"taigaUserTimeline\").directive(\"tgUserTimelineAttachment\", UserTimelineAttachmentDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item-title.service.coffee\n */\n\n(function() {\n var UserTimelineItemTitle, unslugify;\n\n unslugify = this.taiga.unslugify;\n\n UserTimelineItemTitle = (function() {\n UserTimelineItemTitle.$inject = [\"$translate\", \"$sce\"];\n\n UserTimelineItemTitle.prototype._fieldTranslationKey = {\n 'status': 'COMMON.FIELDS.STATUS',\n 'subject': 'COMMON.FIELDS.SUBJECT',\n 'description_diff': 'COMMON.FIELDS.DESCRIPTION',\n 'points': 'COMMON.FIELDS.POINTS',\n 'assigned_to': 'COMMON.FIELDS.ASSIGNED_TO',\n 'assigned_users': 'COMMON.FIELDS.ASSIGNED_USERS',\n 'severity': 'ISSUES.FIELDS.SEVERITY',\n 'priority': 'ISSUES.FIELDS.PRIORITY',\n 'type': 'ISSUES.FIELDS.TYPE',\n 'is_iocaine': 'TASK.FIELDS.IS_IOCAINE',\n 'is_blocked': 'COMMON.FIELDS.IS_BLOCKED',\n 'color': 'COMMON.FIELDS.COLOR',\n 'due_date': 'COMMON.FIELDS.DUE_DATE',\n 'due_date_reason': 'COMMON.FIELDS.DUE_DATE_REASON'\n };\n\n UserTimelineItemTitle.prototype._params = {\n username: function(timeline, event) {\n var title_attr, url, user;\n user = timeline.getIn(['data', 'user']);\n if (user.get('is_profile_visible')) {\n title_attr = this.translate.instant('COMMON.SEE_USER_PROFILE', {\n username: user.get('username')\n });\n url = \"user-profile:username=timeline.getIn(['data', 'user', 'username'])\";\n return this._getLink(url, user.get('name'), title_attr);\n } else {\n return this._getUsernameSpan(user.get('name'));\n }\n },\n field_name: function(timeline, event) {\n var field_name;\n field_name = timeline.getIn(['data', 'value_diff', 'key']);\n return this.translate.instant(this._fieldTranslationKey[field_name]);\n },\n project_name: function(timeline, event) {\n var url;\n url = \"project:project=timeline.getIn(['data', 'project', 'slug'])\";\n return this._getLink(url, timeline.getIn([\"data\", \"project\", \"name\"]));\n },\n new_value: function(timeline, event) {\n var new_value, prettyDate, value;\n if (_.isArray(timeline.getIn([\"data\", \"value_diff\", \"value\"]).toJS())) {\n value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).get(1);\n if (value === null && timeline.getIn([\"data\", \"value_diff\", \"key\"]) === 'assigned_to') {\n value = this.translate.instant('ACTIVITY.VALUES.UNASSIGNED');\n }\n if (value === null && timeline.getIn([\"data\", \"value_diff\", \"key\"]) === 'assigned_users') {\n value = this.translate.instant('ACTIVITY.VALUES.UNASSIGNED');\n } else if (timeline.getIn([\"data\", \"value_diff\", \"key\"]) === 'due_date') {\n if (value) {\n prettyDate = this.translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n value = moment(value, \"YYYY-MM-DD\").format(prettyDate);\n } else {\n value = this.translate.instant('ACTIVITY.VALUES.NOT_SET');\n }\n }\n new_value = value;\n } else {\n new_value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).first().get(1);\n }\n return _.escape(new_value);\n },\n sprint_name: function(timeline, event) {\n var url;\n url = \"project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])\";\n return this._getLink(url, timeline.getIn(['data', 'milestone', 'name']));\n },\n us_name: function(timeline, event) {\n var event_us, obj, text, url;\n obj = this._getTimelineObj(timeline, event).get('userstory');\n event_us = {\n obj: 'parent_userstory'\n };\n url = this._getDetailObjUrl(event_us);\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n related_us_name: function(timeline, event) {\n var obj, text, url;\n obj = timeline.getIn([\"data\", \"userstory\"]);\n url = \"project-userstories-detail:project=timeline.getIn(['data', 'userstory', 'project', 'slug']),ref=timeline.getIn(['data', 'userstory', 'ref'])\";\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n epic_name: function(timeline, event) {\n var obj, text, url;\n obj = timeline.getIn([\"data\", \"epic\"]);\n url = \"project-epics-detail:project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['data', 'epic', 'ref'])\";\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n obj_name: function(timeline, event) {\n var obj, text, url;\n obj = this._getTimelineObj(timeline, event);\n url = this._getDetailObjUrl(event);\n if (event.obj === 'wikipage') {\n text = unslugify(obj.get('slug'));\n } else if (event.obj === 'milestone') {\n text = obj.get('name');\n } else {\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n }\n return this._getLink(url, text);\n },\n role_name: function(timeline, event) {\n return _.escape(timeline.getIn(['data', 'value_diff', 'value']).keySeq().first());\n }\n };\n\n function UserTimelineItemTitle(translate, sce) {\n this.translate = translate;\n this.sce = sce;\n }\n\n UserTimelineItemTitle.prototype._translateTitleParams = function(param, timeline, event) {\n return this._params[param].call(this, timeline, event);\n };\n\n UserTimelineItemTitle.prototype._getTimelineObj = function(timeline, event) {\n return timeline.getIn(['data', event.obj]);\n };\n\n UserTimelineItemTitle.prototype._getDetailObjUrl = function(event) {\n var url;\n url = {\n \"issue\": [\"project-issues-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"wikipage\": [\"project-wiki-page\", \":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])\"],\n \"task\": [\"project-tasks-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"parent_userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])\"],\n \"milestone\": [\"project-taskboard\", \":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])\"],\n \"epic\": [\"project-epics-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"]\n };\n return url[event.obj][0] + url[event.obj][1];\n };\n\n UserTimelineItemTitle.prototype._getLink = function(url, text, title) {\n var span;\n title = title || text;\n span = $('').attr('ng-non-bindable', true).text(text);\n return $('').attr('tg-nav', url).attr('title', title).append(span).prop('outerHTML');\n };\n\n UserTimelineItemTitle.prototype._getUsernameSpan = function(text) {\n var title;\n title = title || text;\n return $('').addClass('username').text(text).prop('outerHTML');\n };\n\n UserTimelineItemTitle.prototype._getParams = function(timeline, event, timeline_type) {\n var params;\n params = {};\n timeline_type.translate_params.forEach((function(_this) {\n return function(param) {\n return params[param] = _this._translateTitleParams(param, timeline, event);\n };\n })(this));\n return params;\n };\n\n UserTimelineItemTitle.prototype.getTitle = function(timeline, event, type) {\n var params, paramsKeys, translation;\n params = this._getParams(timeline, event, type);\n paramsKeys = {};\n Object.keys(params).forEach(function(key) {\n return paramsKeys[key] = '{{' + key + '}}';\n });\n translation = this.translate.instant(type.key, paramsKeys);\n Object.keys(params).forEach(function(key) {\n var find;\n find = '{{' + key + '}}';\n return translation = translation.replace(new RegExp(find, 'g'), params[key]);\n });\n return translation;\n };\n\n return UserTimelineItemTitle;\n\n })();\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineItemTitle\", UserTimelineItemTitle);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item-type.service.coffee\n */\n\n(function() {\n var UserTimelineType, timelineType;\n\n timelineType = function(timeline, event) {\n var types;\n types = [\n {\n check: function(timeline, event) {\n return event.obj === 'membership';\n },\n key: 'TIMELINE.NEW_MEMBER',\n translate_params: ['project_name'],\n member: function(timeline) {\n return Immutable.Map({\n user: timeline.getIn(['data', 'user']),\n role: timeline.getIn(['data', 'role'])\n });\n }\n }, {\n check: function(timeline, event) {\n return event.obj === 'project' && event.type === 'create';\n },\n key: 'TIMELINE.NEW_PROJECT',\n translate_params: ['username', 'project_name'],\n description: function(timeline) {\n return timeline.getIn(['data', 'project', 'description']);\n }\n }, {\n check: function(timeline, event) {\n return event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'attachments';\n },\n key: 'TIMELINE.UPLOAD_ATTACHMENT',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'create';\n },\n key: 'TIMELINE.US_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'create';\n },\n key: 'TIMELINE.ISSUE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'wikipage' && event.type === 'create';\n },\n key: 'TIMELINE.WIKI_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'create' && !timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'create' && timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_CREATED_WITH_US',\n translate_params: ['username', 'project_name', 'obj_name', 'us_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'milestone' && event.type === 'create';\n },\n key: 'TIMELINE.MILESTONE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'create';\n },\n key: 'TIMELINE.EPIC_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'relateduserstory' && event.type === 'create';\n },\n key: 'TIMELINE.EPIC_RELATED_USERSTORY_CREATED',\n translate_params: ['username', 'project_name', 'related_us_name', 'epic_name']\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'userstory';\n },\n key: 'TIMELINE.NEW_COMMENT_US',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'issue';\n },\n key: 'TIMELINE.NEW_COMMENT_ISSUE',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'task';\n },\n key: 'TIMELINE.NEW_COMMENT_TASK',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'epic';\n },\n key: 'TIMELINE.NEW_COMMENT_EPIC',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && timeline.hasIn(['data', 'value_diff', 'value', 'backlog_order']) && event.type === 'change';\n },\n key: 'TIMELINE.US_MOVED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && event.type === 'change' && event.obj === 'userstory') {\n return timeline.getIn(['data', 'value_diff', 'value', 'milestone']).get(1) === null;\n }\n return false;\n },\n key: 'TIMELINE.US_REMOVED_FROM_MILESTONE',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && event.type === 'change' && event.obj === 'userstory';\n },\n key: 'TIMELINE.US_ADDED_MILESTONE',\n translate_params: ['username', 'obj_name', 'sprint_name']\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'blocked' && event.type === 'change') {\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) === true;\n }\n return false;\n },\n key: 'TIMELINE.BLOCKED',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n if (timeline.hasIn(['data', 'value_diff', 'value', 'blocked_note_html'])) {\n text = timeline.getIn(['data', 'value_diff', 'value', 'blocked_note_html']).get(1);\n return $($.parseHTML(text)).text();\n } else {\n return false;\n }\n }\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'blocked' && event.type === 'change') {\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) === false;\n }\n return false;\n },\n key: 'TIMELINE.UNBLOCKED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'milestone' && event.type === 'change';\n },\n key: 'TIMELINE.MILESTONE_UPDATED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'wikipage' && event.type === 'change';\n },\n key: 'TIMELINE.WIKI_UPDATED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'points';\n },\n key: 'TIMELINE.US_UPDATED_POINTS',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value', 'role_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.US_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change';\n },\n key: 'TIMELINE.US_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.ISSUE_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'change';\n },\n key: 'TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.TASK_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_US',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.EPIC_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'color';\n },\n key: 'TIMELINE.EPIC_UPDATED_WITH_NEW_COLOR',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'epic' && event.type === 'change';\n },\n key: 'TIMELINE.EPIC_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'user' && event.type === 'create';\n },\n key: 'TIMELINE.NEW_USER',\n translate_params: ['username']\n }\n ];\n return _.find(types, function(obj) {\n return obj.check(timeline, event);\n });\n };\n\n UserTimelineType = (function() {\n function UserTimelineType() {}\n\n UserTimelineType.prototype.getType = function(timeline, event) {\n return timelineType(timeline, event);\n };\n\n return UserTimelineType;\n\n })();\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineItemType\", UserTimelineType);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item.directive.coffee\n */\n\n(function() {\n var UserTimelineItemDirective;\n\n UserTimelineItemDirective = function() {\n return {\n templateUrl: \"user-timeline/user-timeline-item/user-timeline-item.html\",\n scope: {\n timeline: \"=tgUserTimelineItem\"\n }\n };\n };\n\n angular.module(\"taigaUserTimeline\").directive(\"tgUserTimelineItem\", UserTimelineItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-pagination-sequence.service.coffee\n */\n\n(function() {\n var UserTimelinePaginationSequence;\n\n UserTimelinePaginationSequence = function() {\n var obj;\n obj = {};\n obj.generate = function(config) {\n var getContent, items, next, page;\n page = 1;\n items = Immutable.List();\n config.minItems = config.minItems || 20;\n next = function() {\n items = Immutable.List();\n return getContent();\n };\n getContent = function() {\n return config.fetch(page).then(function(response) {\n var data;\n page++;\n data = response.get(\"data\");\n if (config.filter) {\n data = config.filter(data);\n }\n if (config.map) {\n data = data.map(config.map);\n }\n items = items.concat(data);\n if (items.size < config.minItems && response.get(\"next\")) {\n return getContent();\n }\n return Immutable.Map({\n items: items,\n next: response.get(\"next\")\n });\n });\n };\n return {\n next: function() {\n return next();\n }\n };\n };\n return obj;\n };\n\n angular.module(\"taigaUserTimeline\").factory(\"tgUserTimelinePaginationSequenceService\", UserTimelinePaginationSequence);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Andrey Antukh \n * Copyright (C) 2014-2017 Jesús Espino Garcia \n * Copyright (C) 2014-2017 David Barragán Merino \n * Copyright (C) 2014-2017 Alejandro Alonso \n * Copyright (C) 2014-2017 Juan Francisco Alcántara \n * Copyright (C) 2014-2017 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/profile/profile-timeline/profile-timeline.controller.coffee\n */\n\n(function() {\n var UserTimelineController, mixOf, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n UserTimelineController = (function(superClass) {\n extend(UserTimelineController, superClass);\n\n UserTimelineController.$inject = [\"tgUserTimelineService\"];\n\n function UserTimelineController(userTimelineService) {\n this.userTimelineService = userTimelineService;\n this.timelineList = Immutable.List();\n this.scrollDisabled = false;\n this.timeline = null;\n if (this.projectId) {\n this.timeline = this.userTimelineService.getProjectTimeline(this.projectId);\n } else if (this.currentUser) {\n this.timeline = this.userTimelineService.getProfileTimeline(this.user.get(\"id\"));\n } else {\n this.timeline = this.userTimelineService.getUserTimeline(this.user.get(\"id\"));\n }\n }\n\n UserTimelineController.prototype.loadTimeline = function() {\n this.scrollDisabled = true;\n return this.timeline.next().then((function(_this) {\n return function(response) {\n _this.timelineList = _this.timelineList.concat(response.get(\"items\"));\n if (response.get(\"next\")) {\n _this.scrollDisabled = false;\n }\n return _this.timelineList;\n };\n })(this));\n };\n\n return UserTimelineController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n angular.module(\"taigaUserTimeline\").controller(\"UserTimeline\", UserTimelineController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.directive.coffee\n */\n\n(function() {\n var UserTimelineDirective;\n\n UserTimelineDirective = function() {\n return {\n templateUrl: \"user-timeline/user-timeline/user-timeline.html\",\n controller: \"UserTimeline\",\n controllerAs: \"vm\",\n scope: {\n projectId: \"=projectid\",\n user: \"=\",\n currentUser: \"=\"\n },\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgUserTimeline\", UserTimelineDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.service.coffee\n */\n\n(function() {\n var UserTimelineService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n UserTimelineService = (function(superClass) {\n extend(UserTimelineService, superClass);\n\n UserTimelineService.$inject = [\"tgResources\", \"tgUserTimelinePaginationSequenceService\", \"tgUserTimelineItemType\", \"tgUserTimelineItemTitle\"];\n\n function UserTimelineService(rs, userTimelinePaginationSequenceService, userTimelineItemType, userTimelineItemTitle) {\n this.rs = rs;\n this.userTimelinePaginationSequenceService = userTimelinePaginationSequenceService;\n this.userTimelineItemType = userTimelineItemType;\n this.userTimelineItemTitle = userTimelineItemTitle;\n }\n\n UserTimelineService.prototype._valid_fields = ['status', 'subject', 'description_diff', 'assigned_users', 'assigned_to', 'points', 'severity', 'priority', 'type', 'attachments', 'is_iocaine', 'content_diff', 'name', 'estimated_finish', 'estimated_start', 'blocked', 'moveInBacklog', 'milestone', 'color', 'due_date', 'due_date_reason'];\n\n UserTimelineService.prototype._invalid = [\n {\n check: function(timeline) {\n var fieldKey, value_diff;\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n if (value_diff) {\n fieldKey = value_diff.get('key');\n if (this._valid_fields.indexOf(fieldKey) === -1) {\n return true;\n } else if (fieldKey === 'attachments' && value_diff.get('value').get('new').size === 0) {\n return true;\n }\n }\n return false;\n }\n }, {\n check: function(timeline) {\n var event, value_diff;\n event = timeline.get('event_type').split(\".\");\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n return event[2] === 'change' && value_diff === void 0;\n }\n }, {\n check: function(timeline) {\n var event;\n event = timeline.get('event_type').split(\".\");\n return event[2] === 'delete';\n }\n }, {\n check: function(timeline) {\n var event;\n event = timeline.get('event_type').split(\".\");\n return event[1] === 'project' && event[2] === 'change';\n }\n }, {\n check: function(timeline) {\n return !!timeline.get(\"data\").get(\"comment_deleted\");\n }\n }, {\n check: function(timeline) {\n var event, value_diff;\n event = timeline.get('event_type').split(\".\");\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n if (value_diff && event[1] === \"task\" && event[2] === \"change\" && value_diff.get(\"key\") === \"milestone\") {\n return timeline.get(\"data\").get(\"value_diff\").get(\"value\");\n }\n return false;\n }\n }\n ];\n\n UserTimelineService.prototype._isInValidTimeline = function(timeline) {\n return _.some(this._invalid, (function(_this) {\n return function(invalid) {\n return invalid.check.call(_this, timeline);\n };\n })(this));\n };\n\n UserTimelineService.prototype._parseEventType = function(event_type) {\n event_type = event_type.split(\".\");\n return {\n section: event_type[0],\n obj: event_type[1],\n type: event_type[2]\n };\n };\n\n UserTimelineService.prototype._getTimelineObject = function(timeline, event) {\n if (timeline.get('data').get(event.obj)) {\n return timeline.get('data').get(event.obj);\n }\n };\n\n UserTimelineService.prototype._attachExtraInfoToTimelineEntry = function(timeline, event, type) {\n var title;\n title = this.userTimelineItemTitle.getTitle(timeline, event, type);\n timeline = timeline.set('title_html', title);\n timeline = timeline.set('obj', this._getTimelineObject(timeline, event));\n if (type.description) {\n timeline = timeline.set('description', type.description(timeline));\n }\n if (type.member) {\n timeline = timeline.set('member', type.member(timeline));\n }\n if (timeline.getIn(['data', 'value_diff', 'key']) === 'attachments' && timeline.hasIn(['data', 'value_diff', 'value', 'new'])) {\n timeline = timeline.set('attachments', timeline.getIn(['data', 'value_diff', 'value', 'new']));\n }\n return timeline;\n };\n\n UserTimelineService.prototype._parseTimeline = function(response) {\n var newdata;\n newdata = Immutable.List();\n response.get('data').forEach((function(_this) {\n return function(item) {\n var data, event, newItem, values_diff;\n event = _this._parseEventType(item.get('event_type'));\n data = item.get('data');\n values_diff = data.get('values_diff');\n if (values_diff && values_diff.count()) {\n if (values_diff.has('is_blocked')) {\n values_diff = Immutable.Map({\n 'blocked': values_diff\n });\n }\n if (values_diff.has('milestone')) {\n if (event.obj === 'userstory') {\n values_diff = Immutable.Map({\n 'moveInBacklog': values_diff\n });\n } else {\n values_diff = values_diff.deleteIn(['values_diff', 'milestone']);\n }\n } else if (event.obj === 'milestone') {\n values_diff = Immutable.Map({\n 'milestone': values_diff\n });\n }\n return values_diff.forEach(function(value, key) {\n var newItem, obj;\n obj = Immutable.Map({\n key: key,\n value: value\n });\n newItem = item.setIn(['data', 'value_diff'], obj);\n newItem = newItem.deleteIn(['data', 'values_diff']);\n return newdata = newdata.push(newItem);\n });\n } else {\n newItem = item.deleteIn(['data', 'values_diff']);\n return newdata = newdata.push(newItem);\n }\n };\n })(this));\n return response.set('data', newdata);\n };\n\n UserTimelineService.prototype._addEntyAttributes = function(item) {\n var event, type;\n event = this._parseEventType(item.get('event_type'));\n type = this.userTimelineItemType.getType(item, event);\n return this._attachExtraInfoToTimelineEntry(item, event, type);\n };\n\n UserTimelineService.prototype.getProfileTimeline = function(userId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.users.getProfileTimeline(userId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n UserTimelineService.prototype.getUserTimeline = function(userId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.users.getUserTimeline(userId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n UserTimelineService.prototype.getProjectTimeline = function(projectId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.projects.getTimeline(projectId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n return UserTimelineService;\n\n })(taiga.Service);\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineService\", UserTimelineService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: isolate-click.directive.coffee\n */\n\n(function() {\n var IsolateClickDirective;\n\n IsolateClickDirective = function() {\n var link;\n link = function(scope, el, attrs) {\n return el.on('click', (function(_this) {\n return function(e) {\n return e.stopPropagation();\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n angular.module(\"taigaUtils\").directive(\"tgIsolateClick\", IsolateClickDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryDiffDirective, module;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryDiffDirective = function() {\n return {\n templateUrl: \"wiki/history/wiki-history-diff.html\",\n scope: {\n key: \"<\",\n diff: \"<\"\n }\n };\n };\n\n module.directive(\"tgWikiHistoryDiff\", WikiHistoryDiffDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryEntryDirective, module;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryEntryDirective = function() {\n var link;\n link = function(scope, el, attr) {\n return scope.singleHistoryEntry = scope.historyEntry.toJS();\n };\n return {\n link: link,\n templateUrl: \"wiki/history/wiki-history-entry.html\",\n scope: {\n historyEntry: \"<\"\n }\n };\n };\n\n module.directive(\"tgWikiHistoryEntry\", WikiHistoryEntryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.controller.coffee\n */\n\n(function() {\n var WikiHistoryController, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaWikiHistory\");\n\n WikiHistoryController = (function() {\n WikiHistoryController.$inject = [\"tgWikiHistoryService\"];\n\n function WikiHistoryController(wikiHistoryService) {\n this.wikiHistoryService = wikiHistoryService;\n taiga.defineImmutableProperty(this, 'historyEntries', (function(_this) {\n return function() {\n return _this.wikiHistoryService.historyEntries;\n };\n })(this));\n this.toggle = false;\n }\n\n WikiHistoryController.prototype.initializeHistoryEntries = function(wikiId) {\n if (wikiId) {\n this.wikiHistoryService.setWikiId(wikiId);\n }\n return this.wikiHistoryService.loadHistoryEntries();\n };\n\n return WikiHistoryController;\n\n })();\n\n module.controller(\"WikiHistoryCtrl\", WikiHistoryController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.directive.coffee\n */\n\n(function() {\n var WikiHistoryDirective, bindOnce, module;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return bindOnce(scope, 'vm.wikiId', function(value) {\n return ctrl.initializeHistoryEntries(value);\n });\n };\n return {\n scope: {},\n bindToController: {\n wikiId: \"<\"\n },\n controller: \"WikiHistoryCtrl\",\n controllerAs: \"vm\",\n templateUrl: \"wiki/history/wiki-history.html\",\n link: link\n };\n };\n\n module.directive(\"tgWikiHistory\", WikiHistoryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2017 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: wiki-history.service.coffee\n */\n\n(function() {\n var WikiHistoryService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module('taigaWikiHistory');\n\n WikiHistoryService = (function(superClass) {\n extend(WikiHistoryService, superClass);\n\n WikiHistoryService.$inject = [\"tgResources\", \"tgXhrErrorService\"];\n\n function WikiHistoryService(rs, xhrError) {\n this.rs = rs;\n this.xhrError = xhrError;\n this._wikiId = null;\n this._historyEntries = Immutable.List();\n taiga.defineImmutableProperty(this, \"wikiId\", (function(_this) {\n return function() {\n return _this._wikiId;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"historyEntries\", (function(_this) {\n return function() {\n return _this._historyEntries;\n };\n })(this));\n }\n\n WikiHistoryService.prototype.setWikiId = function(wikiId) {\n this._wikiId = wikiId;\n return this._historyEntries = Immutable.List();\n };\n\n WikiHistoryService.prototype.loadHistoryEntries = function() {\n if (!this._wikiId) {\n return;\n }\n return this.rs.wikiHistory.getWikiHistory(this._wikiId).then((function(_this) {\n return function(historyEntries) {\n if (historyEntries.size) {\n return _this._historyEntries = historyEntries.reverse();\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n _;\n\n return WikiHistoryService;\n\n })(taiga.Service);\n\n module.service(\"tgWikiHistoryService\", WikiHistoryService);\n\n}).call(this);\n\n//# sourceMappingURL=maps/app.js.map\n"]} \ No newline at end of file diff --git a/dist/v-1527758585938/js/maps/libs.js.map b/dist/v-1528953702317/js/maps/libs.js.map similarity index 100% rename from dist/v-1527758585938/js/maps/libs.js.map rename to dist/v-1528953702317/js/maps/libs.js.map diff --git a/dist/v-1528953702317/js/templates.js b/dist/v-1528953702317/js/templates.js new file mode 100644 index 0000000..d91a2b8 --- /dev/null +++ b/dist/v-1528953702317/js/templates.js @@ -0,0 +1,16 @@ +angular.module("templates",[]).run(["$templateCache",function(t){t.put("auth/change-password-from-recovery.html",'\n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n\n\n
    \n

    Taiga

    \n
    \n


    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("auth/forgot-password.html",'\n
    '),t.put("auth/invitation.html",'\n
    \n
    \n
    \n

    \n

    \n
    \n \n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("auth/login-text.html",'\n'),t.put("auth/login.html",'\n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n\n\n
    \n

    Taiga

    \n

    \n \n
    \n
    \n
    '),t.put("auth/register.html",'\n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n\n\n
    \n

    Taiga

    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-membership-paginator.html",'\n
      <% if (showPrevious) { %>\n <% } %>\n <% _.each(pages, function(item) { %>\n
    • <% if (item.type === "page") { %><%- item.num %><% } else if (item.type === "page-active") { %><%- item.num %><% } else { %>...<% } %>
    • <% }); %>\n <% if (showNext) { %>\n <% } %>\n
    '),t.put("admin/admin-memberships-row-checkbox.html",'\n
    \n \n
    \n
    '),t.put("admin/admin-memberships.html",'\n
    \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-change-owner.html",'\n
    {{::owner.full_name_display}}
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.PROJECT_OWNER\' | translate }}
    \n
    {{::owner.full_name_display}}
    \n
    {{ \'ADMIN.PROJECT_PROFILE.CHANGE_OWNER\' | translate }}'),t.put("admin/admin-project-default-values.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-export.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n \n \n
    \n
    '),t.put("admin/admin-project-modules.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n

    \n
    \n \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    '), +t.put("admin/admin-project-profile.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.RECRUITING\' | translate }}\n \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.FEEDBACK\' | translate }}\n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n {{\'ADMIN.PROJECT_PROFILE.PRIVATE_OR_PUBLIC\' | translate }}\n
    \n {{ \'ADMIN.PROJECT_PROFILE.DELETE\' | translate }}\n
    \n
    \n
    \n
    \n'),t.put("admin/admin-project-reports.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n
    '),t.put("admin/admin-project-request-ownership.html",'\n
    {{::owner.full_name_display}}
    \n
    \n
    {{ \'ADMIN.PROJECT_PROFILE.PROJECT_OWNER\' | translate }}
    \n
    {{::owner.full_name_display}}
    \n
    {{ \'ADMIN.PROJECT_PROFILE.REQUEST_OWNERSHIP\' | translate }}'),t.put("admin/admin-project-restrictions.html",'\n
    {{ \'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PRIVATE_PROJECTS_MEMBERS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS\' | translate }}{{ \'ADMIN.PROJECT_PROFILE.MAX_PUBLIC_PROJECTS_MEMBERS\' | translate }}
    '),t.put("admin/admin-project-values-custom-fields.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ customFieldSectionTitle | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ customFieldSectionTitle | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ customFieldSectionTitle | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ customFieldSectionTitle | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ attr.name }}
    \n
    {{ attr.description }}
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    '), +t.put("admin/admin-project-values-points.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{sectionName | translate}}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{ value.name }}
    \n
    {{ value.value }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-priorities.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-severities.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-status.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n
    \n \n
    \n
    {{ value.wip_limit }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n
    {{ value.slug }}
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '), +t.put("admin/admin-project-values-tags.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{\'BACKLOG.EMPTY\' | translate}}\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    {{\'BACKLOG.EMPTY\' | translate}}\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-project-values-types.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n
    \n

    {{ sectionName | translate }}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{ value.name }}
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-roles.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n \n \n
    \n

    {{ role.name }}\n

    \n
    \n
    \n

    {{ role.name }}

    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("admin/admin-third-parties-bitbucket.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n \n
    \n \n
    \n
    '),t.put("admin/admin-third-parties-github.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    '),t.put("admin/admin-third-parties-gitlab.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n \n
    \n \n
    \n
    '), +t.put("admin/admin-third-parties-gogs.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    '),t.put("admin/admin-third-parties-webhooks.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("admin/lightbox-add-members.html",'\n\n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n

    \n
    '),t.put("admin/memberships-row-avatar.html",'\n
    <%- full_name %>\n
    \n
    <%- full_name %><% if (isOwner) { %>\n <% } %>\n
    \n
    <% if (pending) { %><%- pending %><% } %>
    \n
    \n
    '),t.put("admin/memberships-warning-message.html",'\n

    \n

    '),t.put("admin/no-more-memberships-explanation.html",'\n

    \n

    '),t.put("admin/project-csv.html",'\n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n \n \n
    \n
    '),t.put("backlog/backlog.html",'\n
    \n \n \n \n \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    --
    \n
    --
    \n
    --
    \n
    --
    \n
    \n \n
    \n
    \n
    \n \n
    \n

    \n

    {{\'BACKLOG.CUSTOMIZE_GRAPH_TEXT\' | translate}} {{\'BACKLOG.CUSTOMIZE_GRAPH_ADMIN\' | translate}}

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n {{ ::us.total_voters }}\n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    {{\'BACKLOG.EMPTY\' | translate}}\n

    \n
    \n
    \n \n
    \n
    \n

    \n \n
    \n
    {{\'BACKLOG.SPRINTS.EMPTY\' | translate}}\n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT_ANONYMOUS\' | translate }}{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT_ANONYMOUS\' | translate }}{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '), +t.put("backlog/progress-bar.html",'\n
    \n
    \n
    '),t.put("backlog/sprint-header.html",'\n\n
    \n
    {{::estimatedDateRange}}
    \n
      \n
    • {{::closedPoints | number}}
    • \n
    • {{::totalPoints | number}}
    • \n
    \n
    '),t.put("backlog/us-role-points-popover.html",'\n'),t.put("common/lightbox-feedback.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("contrib/main.html",'\n
    \n \n \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    '),t.put("contrib/user-settings.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    '),t.put("custom-attributes/custom-attribute-value-edit.html",'\n
    \n
    \n <% if (description){ %><%- description %><% } %>\n
    \n
    <% if (type=="text") { %>\n <% } else if (type=="multiline") { %>\n <% } else if (type=="richtext") { %>\n <% } else if (type=="date") { %>\n <% } else if (type=="url") { %>\n <% } else { %>\n <% } %>\n
    <% if (type != "richtext") { %>\n <% } %>\n
    '),t.put("custom-attributes/custom-attribute-value.html",'\n
    \n
    <%- name %><% if (description){ %><%- description %><% } %>
    <% if (type=="url") { %>\n <% } else if (type=="richtext") { %>\n
    \n
    \n
    <% } else { %>\n
    <%- value %>
    <% } %>\n <% if (isEditable) { %>\n <% } %>\n
    '),t.put("custom-attributes/custom-attributes-values.html",'\n
    \n \n
    \n
    \n
    \n
    '),t.put("epic/epic-detail.html",'\n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n \n \n \n
    '),t.put("error/error.html",'\n
    \n
    TAIGA\n

    Taiga

    \n

    \n
    \n
    '),t.put("error/not-found.html",'\n
    \n
    TAIGA\n

    \n

    \n
    \n
    '),t.put("error/permission-denied.html",'\n
    \n
    TAIGA\n

    \n

    \n
    \n
    '),t.put("issue/iocaine-button.html",'\n
    \n \n \n
    '),t.put("issue/issue-paginator.html",'\n
      <% if (showPrevious) { %>\n <% } %>\n <% _.each(pages, function(item) { %>\n
    • <% if (item.type === "page") { %><%- item.num %><% } else if (item.type === "page-active") { %><%- item.num %><% } else { %>...<% } %>
    • <% }); %>\n <% if (showNext) { %>\n <% } %>\n
    '),t.put("issue/issue-priority-button.html",'\n
    <%- priority.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issue-severity-button.html",'\n
    <%- severity.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issue-status-inline-edition-selection.html",'\n'),t.put("issue/issue-type-button.html",'\n
    <%- type.name %><% if(editable){ %>\n <% }%>\n \n
    '),t.put("issue/issues-detail.html",'\n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n \n \n \n
    '),t.put("issue/issues.html",'\n'),t.put("issue/promote-issue-to-us-button.html",'\n '),t.put("kanban/kanban.html",'\n
    \n \n
    \n \n
    \n
    \n

    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    {{ usByStatus.get(s.id.toString()).size }}0
    \n
    \n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '), +t.put("search/lightbox-search.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("search/search.html",'\n
    \n \n \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n \n
    \n \n \n \n \n \n
    \n
    '),t.put("task/related-task-create-form.html",'\n'),t.put("task/related-task-row-edit.html",'\n
    \n \n
    \n\n\n
    \n
    \n
    \n \n
    \n
    '),t.put("task/related-task-row.html",'\n\n
    <% if(perms.modify_task) { %>\n <% } %>\n <% if(perms.delete_task) { %>\n <% } %>\n
    \n\n
    \n
    \n
    <% if(perms.modify_task) { %>\n <% } %>\n
    \n
    '),t.put("task/task-detail.html",'\n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n \n \n \n
    '),t.put("taskboard/taskboard-user.html",'\n
    \n'),t.put("taskboard/taskboard.html",'\n
    \n \n
    \n \n
    \n

    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    {{rolePoint.points}}{{rolePoint.name}}
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n

    \n \n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n

    \n

    \n

    \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n

    \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    '), +t.put("team/leave-project.html",'\n {{ \'TEAM.ACTION_LEAVE_PROJECT\' | translate }}'),t.put("team/team-filter.html",'\n'),t.put("team/team-member-current-user.html",'\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("team/team-member-stats.html",'\n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("team/team-members.html",'\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("team/team.html",'\n
    \n \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{filtersRole.name || ("TEAM.SECTION_FILTER_ALL" | translate)}}

    \n
    \n
    \n
    '),t.put("us/us-client-requirement-button.html",'\n\n'),t.put("us/us-detail.html",'\n
    \n \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n \n
    \n \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n {{\'US.TRIBE.PUBLISH_INFO\' | translate}}\n
    \n
    \n \n \n \n \n \n
    \n
    \n \n \n \n \n
    '),t.put("us/us-team-requirement-button.html",'\n\n'),t.put("user/cancel-account.html",'\n'),t.put("user/change-email.html",'\n
    \n
    \n
    \n
    \n\n \n \n \n \n \n \n \n \n \n\n\n
    \n

    Taiga

    \n
    \n

    \n

    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("user/live-notifications.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    {{sectionName | translate}}

    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("user/mail-notifications.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    {{sectionName | translate}}

    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("user/user-change-password.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    {{sectionName | translate}}

    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("user/user-profile.html",'\n
    \n \n
    \n \n
    \n
    \n \n
    \n'),t.put("wiki/wiki-list.html",'\n
    \n \n \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    {{wikipage.editions}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '), +t.put("wiki/wiki-nav.html",'\n
    \n

    \n
    \n\n\n<% if (addWikiLinkPermission) { %>\n <% } %>\n'),t.put("wiki/wiki-summary.html",'\n
    \n
    <%- user.name %>
    \n
    <%- user.name %>
    \n
    \n
    <%- lastModifiedDate %>
    \n
    <%- totalEditions %>
    \n'),t.put("wiki/wiki.html",'\n
    \n \n \n
    \n
    \n

    \n
    \n \n
    \n \n \n
    \n
    '),t.put("common/estimation/us-estimation-points-per-role.html",'\n
      <% _.each(roles, function(role) { %>\n
    • <%- role.points %>\n <%- role.name %>
    • <% }); %>\n
    • <%- totalPoints %>
    • \n
    '),t.put("common/estimation/us-estimation-points.html",'\n'),t.put("common/estimation/us-estimation-total.html",'<%= text %><% if (editable) { %>\n <% } %>'),t.put("common/estimation/us-points-roles-popover.html",'\n'),t.put("common/components/add-button.html",'\n '),t.put("common/components/assigned-to.html",'\n
    <%- fullName %><% if (isIocaine) { %>\n
    \n \n
    <% }; %>\n
    \n
    <% if (isUnassigned) { %>\n
    {{ "COMMON.ASSIGNED_TO.NOT_ASSIGNED" | translate }}
    <% } else { %>\n
    {{ "COMMON.FIELDS.ASSIGNED_TO" | translate }}
    <% }; %>\n
    <% if (!isEditable && fullNameVisible) { %><%- fullName %><% }; %>\n <% if (isEditable) { %>\n <% if (fullNameVisible) { %>\n <%- fullName %>\n <% }; %>\n <% if (!isUnassigned) { %>\n <% }; %><% }; %>\n <% if (isEditable && isUnassigned) { %> {{ "COMMON.ASSIGNED_TO.SELF" | translate }}<% }; %>\n
    <% if (isEditable && !isUnassigned) { %>\n <% } %>\n
    '),t.put("common/components/assigned-users.html",'\n
    {{ "COMMON.ASSIGNED_TO.NOT_ASSIGNED" | translate }}
    \n
    {{ "COMMON.FIELDS.ASSIGNED_TO" | translate }}
    \n\n
    \n {{ "COMMON.ASSIGNED_USERS.ADD_ASSIGNED" | translate }}\n
    '),t.put("common/components/block-button.html",'\n \n '),t.put("common/components/created-by.html",'\n
    \n
    {{date}}
    \n
    \n
    {{owner.full_name_display}}
    '),t.put("common/components/delete-button.html",'\n '),t.put("common/components/editable-description-msg-edit-mode.html",'\n

    '),t.put("common/components/editable-description-msg-read-mode.html",'\n

    '),t.put("common/components/editable-subject.html",'\n
    {{ item.subject }}\n \n
    \n
    \n \n \n
    '),t.put("common/components/kanban-placeholder.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'KANBAN.PLACEHOLDER_CARD_TITLE\' | translate}}

    \n

    {{\'KANBAN.PLACEHOLDER_CARD_TEXT\' | translate}}

    '),t.put("common/components/level.html",'\n
    '),t.put("common/components/list-item-assigned-to-avatar.html",'\n
    <%- name %><%- name %>
    '),t.put("common/components/main-title.html",'{{ projectName }}{{ sectionName | translate }}'),t.put("common/components/progress-bar.html",'\n
    '),t.put("common/components/status-button.html",'<%- status.name %><% if(editable){ %>\n <% }%>\n'),t.put("common/components/status-display.html",'<% if (is_closed) { %><% } else { %><% } %>'),t.put("common/components/taskboard-placeholder.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'TASKBOARD.PLACEHOLDER_CARD_TITLE\' | translate}}

    \n

    {{\'TASKBOARD.PLACEHOLDER_CARD_TEXT\' | translate}}

    '),t.put("common/components/user-display.html",'\n
    {{user.full_name_display}}
    {{user.full_name_display}}\n
    {{user.full_name_display}}
    {{user.full_name_display}}'),t.put("common/components/watchers.html",'\n
    \n
    {{watcher.full_name_display}}
    \n
    {{watcher.full_name_display}}\n \n
    \n
    '),t.put("common/components/wysiwyg-toolbar.html",'\n
    \n
    \n

    {{\'COMMON.WYSIWYG.OUTDATED\' | translate}}

    \n
    \n
    \n \n
    Markdown ModeHTML Mode\n
    \n
    \n\n'),t.put("common/popover/popover-related-task-status.html",'\n'),t.put("common/popover/popover-us-status.html",'\n'),t.put("common/lightbox/lightbox-assigned-to-users.html",'<% if (selected) { %>\n<% } %>\n<% _.each(users, function(user) { %>\n<% }) %>\n<% if (showMore) { %>\n
    <% } %>'),t.put("common/lightbox/lightbox-assigned-to.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n
    '),t.put("common/lightbox/lightbox-assigned-users-users.html",'<% _.each(selected, function(user) { %>\n<% }) %>\n<% _.each(users, function(user) { %>\n<% }) %>\n<% if (showMore) { %>\n
    <% } %>'),t.put("common/lightbox/lightbox-assigned-users.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n
    \n
    '),t.put("common/lightbox/lightbox-block.html",'\n\n
    \n

    \n
    \n \n
    \n
    '),t.put("common/lightbox/lightbox-blocking-message-input.html",'\n'),t.put("common/lightbox/lightbox-change-owner.html",'\n\n
    \n

    \n
    \n \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n \n
    '),t.put("common/lightbox/lightbox-due-date.html",'\n\n
    \n

    \n
    \n \n
      \n
    • {{ \'LIGHTBOX.SET_DUE_DATE.SUGGESTIONS.IN_ONE_WEEK\' | translate }}
    • \n
    • {{ \'LIGHTBOX.SET_DUE_DATE.SUGGESTIONS.IN_TWO_WEEKS\' | translate }}
    • \n
    • {{ \'LIGHTBOX.SET_DUE_DATE.SUGGESTIONS.IN_ONE_MONTH\' | translate }}
    • \n
    • {{ \'LIGHTBOX.SET_DUE_DATE.SUGGESTIONS.IN_THREE_MONTHS\' | translate }}
    • \n
    \n
    \n
    {{ \'LIGHTBOX.SET_DUE_DATE.REASON_FOR_DUE_DATE\' | translate }}\n \n
    \n \n \n
    '),t.put("common/lightbox/lightbox-leave-project-warning.html",'\n\n
    \n \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.TITLE\' | translate}}

    \n
    \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.CURRENT_USER_OWNER.DESC\' | translate}}

    \n
    \n
    \n

    {{\'LIGHTBOX.LEAVE_PROJECT_WARNING.OTHER_USER_OWNER.DESC\' | translate}}

    \n
    \n
    '),t.put("common/lightbox/lightbox-request-ownership.html",'\n\n
    \n

    \n

    \n
    '),t.put("common/lightbox/lightbox-users.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n
    \n
    '),t.put("common/tag/lb-tag-line-tags.html",'<% _.each(tags, function(tag) { %><%- tag.name %>\n <% }); %>'),t.put("common/tag/lb-tag-line.html",'\n
    \n'),t.put("common/tag/tag-line.html",'\n
    \n '),t.put("common/tag/tags-line-tags.html",'\n<% _.each(tags, function(tag) { %>\n<% if (tag.name == deleteTagLoading) { %>\n
    <% } else { %><%- tag.name %><% if (isEditable) { %>\n <% } %><% } %>\n<% }); %>\n
    '),t.put("common/wysiwyg/wysiwyg-markitup-preview.html",'\n
    \n
    \n \n
    <%= data %>
    \n
    \n
    '),t.put("user/lightbox/lightbox-delete-account.html",'\n\n
    \n

    \n

    \n
    \n
    '),t.put("projects/create/asana-import/asana-import-project-form/asana-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n

    \n

    \n
    \n \n \n
    \n
    \n
    \n
    '),t.put("projects/create/github-import/github-import-project-form/github-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    '), +t.put("projects/create/invite-members/single-member/single-member.html",'\n'),t.put("projects/create/jira-import/jira-import-project-form/jira-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n

    \n

    \n
    \n

    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    '),t.put("projects/create/trello-import/trello-import-project-form/trello-import-project-form.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    '),t.put("external-apps/external-app.html",'\n
    \n \n

    Taiga

    \n

    \n
    \n
    \n
    {{::vm.user.get(\'full_name_display\')}}
    \n
    \n

    {{ ::vm.user.get("full_name_display") }}

    \n

    {{ ::vm.user.get("email") }}

    \n
    \n
    \n
    \n
    \n
    \n
    {{::vm.application.get(\'name\')}}
    \n
    \n

    {{ ::vm.application.get("name") }}

    {{ ::vm.application.get(\'web\') }}\n

    {{ ::vm.application.get("description") }}

    \n
    \n
    \n
    \n
    '),t.put("home/home.html",'\n
    \n
    \n

    {{"HOME.DASHBOARD" | translate}}

    \n \n
    \n \n
    '),t.put("history/history.html",'\n
    \n \n \n \n
    '),t.put("invite-members/lightbox-add-members.html",'\n\n
    \n

    \n \n \n
    '),t.put("navigation-bar/navigation-bar.html",'\n'),t.put("profile/profile.html",'\n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    '),t.put("components/assigned-to/assigned-to.html",'{{vm.assignedTo.get(\'full_name_display\')}}{{vm.assignedTo.get(\'full_name_display\')}}{{\'EPICS.DASHBOARD.UNASSIGNED\' | translate}}{{\'EPICS.DASHBOARD.UNASSIGNED\' | translate}}'),t.put("components/attachment/attachment-gallery.html","\n"),t.put("components/attachment/attachment.html",'\n
    \n \n
    {{\'ATTACHMENT.DEPRECATED\' | translate}}{{vm.attachment.getIn([\'file\', \'description\'])}}
    \n
    {{::vm.attachment.getIn([\'file\', \'size\']) | sizeFormat}}
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n \n
    '),t.put("components/attachments-full/attachments-full.html",'\n
    \n
    \n

    {{vm.attachments.size}}

    \n
    \n \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    {{\'ATTACHMENT.DROP\' | translate}}
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n {{file.name}}\n
    \n
    {{file.size | sizeFormat}}
    \n
    {{file.progressMessage}}\n
    \n
    \n
    \n
    \n
    \n \n
    \n'),t.put("components/attachments-preview/attachments-preview.html",'\n
    \n \n \n
    '),t.put("components/attachments-simple/attachments-simple.html",'\n
    \n
    \n

    {{vm.attachments.size}}

    \n
    \n \n \n
    \n
    \n
    \n
    {{\'ATTACHMENT.DROP\' | translate}}
    \n
    \n
    \n
    \n
    \n {{attachment.get(\'name\')}}\n
    \n
    {{attachment.get(\'size\') | sizeFormat}}
    \n \n
    \n
    \n
    '),t.put("components/belong-to-epics/belong-to-epics-pill.html","\n
    "),t.put("components/belong-to-epics/belong-to-epics-text.html",""),t.put("components/board-zoom/board-zoom.html",'\n'),t.put("components/card/card.html",'\n
    \n
    \n
    \n
    \n
    {{vm.item.getIn([\'assigned_to\', \'full_name\'])}}\n \n
    \n \n \n
    \n \n \n
    \n
    \n \n
    {{"COMMON.FIELDS.POINTS" | translate}} {{vm.item.getIn([\'model\', \'total_points\'])}}\n
    \n \n
    \n \n
    \n
    \n {{vm.item.getIn([\'model\', \'total_voters\'])}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'watchers\']).size}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'total_comments\'])}}\n
    \n
    \n {{vm.item.getIn([\'model\', \'attachments\']).size}}\n
    \n
    \n
    \n
    \n
    \n
    tasks {{vm.getClosedTasks().size}}/{{vm.item.getIn([\'model\', \'tasks\']).size}}\n
    \n
      \n
    • \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '), +t.put("components/card-slideshow/card-slideshow.html",'\n
    \n \n \n
    \n \n
    \n
    '),t.put("components/color-selector/color-selector.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
      \n
    • \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    '),t.put("components/due-date/due-date-button.html",'\n'),t.put("components/due-date/due-date-icon.html",'\n'),t.put("components/filter/filter.html",'\n

    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    {{it.name}}\n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    '),t.put("components/live-announcement/live-announcement.html",'\n
    \n
    Loading...\n
    \n

    {{vm.title}}

    \n

    \n \n
    \n
    \n
    '),t.put("components/project-menu/project-menu.html",'\n'),t.put("components/terms-announcement/terms-announcement.html",'\n
    \n
    Loading...\n
    \n

    {{\'LEGAL.GDPR_ANNOUNCEMENT_TITLE\' | translate}}

    \n

    {{ \'LEGAL.GDPR_ANNOUNCEMENT_DESCRIPTION\' | translate }}

    {{\'LEGAL.GDPR_ANNOUNCEMENT_INFOLINK\' | translate}}\n \n
    \n
    \n
    '),t.put("components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html",'\n

    \n \n

    '),t.put("components/tribe-button/tribe-button.html",'{{ \'US.TRIBE.PUBLISH\' | translate }}'),t.put("components/tribe-button/tribe-linked.html",'\n'),t.put("components/vote-button/vote-button.html",'\n {{ vm.item.total_voters }}\n {{ ::vm.item.total_voters }}'),t.put("components/watch-button/watch-button-ticket.html",'\n
    {{ vm.item.watchers.length }} {{\'COMMON.WATCHERS.WATCHERS\' | translate}}
    \n'),t.put("components/watch-button/watch-button.html",'\n {{ vm.item.watchers.length }}\n {{ vm.item.watchers.length }}'),t.put("discover/discover-home/discover-home.html",'\n
    \n
    \n \n
    \n
    \n \n \n
    \n \n
    '),t.put("discover/discover-search/discover-search.html",'\n
    \n \n
    {{ DISCOVER.EMPTY | translate }}\n

    \n
    \n
    \n
    \n
    \n \n
    \n
      \n
    • \n
      {{::project.get(\'name\')}}\n
      \n

      {{project.get(\'name\')}}\n \n

      \n

      {{ ::project.get(\'description\') | limitTo:300 }}...

      \n
      \n
      \n
      \n {{::project.get(\'total_fans\')}}\n {{::project.get(\'total_watchers\')}}\n {{ ::project.get(\'members\').size }}
      \n
    • \n
    {{ \'DISCOVER.VIEW_MORE\' | translate }}\n
    \n
    \n
    '),t.put("epics/create-epic/create-epic.html",'\n\n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    '),t.put("epics/dashboard/epics-dashboard.html",'\n
    \n \n
    \n
    \n

    \n
    \n \n
    \n
    \n \n
    \n

    \n

    \n \n
    \n
    \n
    '),t.put("epics/related-userstories/related-userstories.html",'\n'),t.put("home/duties/duty.html","\n
    \n
    \n
    \n

    {{ ::vm.duty.getIn(['project', 'name']) }}{{ ::vm.getDutyType() }}{{ ::vm.duty.get('status_extra_info').get('name') }}\n \n

    \n

    {{ 'COMMON.BLOCKED' | translate }}

    \n
    "),t.put("home/projects/home-project-list.html",'\n
    \n
    \n
    \n
    \n

    {{::project.get(\'name\')}}\n \n \n \n

    \n
    \n

    {{::project.get(\'description\')| limitTo:100 }}...

    \n
    \n {{::project.get(\'total_fans\')}}\n {{::project.get(\'total_watchers\')}}\n {{ ::project.get(\'members\').size }}\n
    \n
    \n
    \n
    \n
    \n \n

    \n
    '), +t.put("home/working-on/empty.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("home/working-on/working-on.html",'\n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    '),t.put("history/comments/comment.html",'\n
    \n
    \n
    {{vm.comment.user.name}}{{vm.comment.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}\n
    {{vm.comment.edit_comment_date | momentFormat:\'DD MMM YYYY HH:mm\'}}-\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    - {{vm.comment.delete_comment_date | momentFormat:\'DD MMM YYYY HH:mm\'}}\n \n \n
    \n

    \n
    '),t.put("history/comments/comments.html",'\n
    \n
    \n \n
    \n \n
    '),t.put("history/history/history-diff.html",'\n
    \n
    {{diff[0]}}\n {{diff[1]}}\n
    \n
    \n
    \n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    \n
    \n
    \n
    {{vm.diff[0]}}...\n {{vm.diff[1]}}...\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    \n

    \n

    \n

    \n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0] | momentFormat:\'DD MMM YYYY\'}}\n {{vm.diff[1] | momentFormat:\'DD MMM YYYY\'}}\n
    \n
    \n
    \n
    \n

    {{vm.diffRemoveTags}}

    \n

    {{vm.diffAddTags}}

    \n
    \n
    \n
    \n
    ({{newCustom.name}})\n

    {{newCustom.value}}
    \n
    ({{changeCustom.name}})\n

    {{changeCustom.changes.value[0]}}\n {{changeCustom.changes.value[1]}}
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    \n
    \n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    \n
    '),t.put("history/history/history.html",'\n
    \n
    \n
    \n
    \n
    {{activity.user.name}}{{activity.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}
    \n
    \n
    \n
    \n
    \n
    '),t.put("history/history-lightbox/comment-history-lightbox.html",'\n\n
    \n

    \n
    \n \n
    \n
    '),t.put("history/history-lightbox/history-entry.html",'\n
    \n
    \n
    {{entry.user.full_name_display}}\n \n
    \n
    \n
    \n
    '),t.put("history/history-tabs/history-tabs.html",'\n'),t.put("invite-members/invite-members-form/invite-members-form.html",'\n
    \n
      \n
    • \n
      {{contact.full_name}}{{contact.full_name}}
      \n \n
    • \n
    • \n
      {{userMail.email}}
      \n \n
    • \n
    \n
    \n \n
    \n \n \n \n

    \n
    '),t.put("invite-members/suggest-add-members/suggest-add-members.html",'\n
    \n
    \n \n \n
    \n
      \n
    • {{contact.get(\'full_name_display\')}}{{contact.get(\'full_name_display\')}}
    • \n
    \n
    '),t.put("navigation-bar/dropdown-project-list/dropdown-project-list.html",'\n \n'),t.put("navigation-bar/dropdown-user/dropdown-user.html",'{{ vm.user.get(\'full_name_display\') }}{{ vm.user.get(\'full_name_display\') }}\n'),t.put("projects/create/create-project.html",'\n'),t.put("projects/listing/projects-listing.html",'\n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
      \n
    • \n
      \n
      {{::project.get(\'name\')}}\n
      \n

      {{project.get(\'name\')}}\n \n \n \n

      \n

      {{ ::project.get(\'description\') | limitTo:300 }}...

      \n
      \n
      \n
      \n \n
    • \n
    \n
    \n \n
    \n
    '),t.put("projects/project/blocked-project-explanation.html","\n
    \n
    {{'PROJECT.BLOCKED_PROJECT.THIS_PROJECT_IS_BLOCKED' | translate}}
    \n
    \n
    \n
    {{'PROJECT.BLOCKED_PROJECT.TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF' | translate}}
    \n
    "),t.put("projects/project/blocked-project.html",'\n
    \n
    \n
    \n
    {{::vm.project.get(\'name\')}}\n \n
    {{::vm.project.get("name")}}\n
    \n
    \n

    {{\'PROJECT.BLOCKED_PROJECT.BLOCKED\' | translate}}

    \n \n
    \n
    \n
    '),t.put("projects/project/project.html",'\n
    \n \n
    \n
    \n \n
    \n
    \n
    \n

    {{::vm.project.get("name")}}

    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n {{ ::vm.project.get(\'total_fans\') }}\n {{ ::vm.project.get(\'total_watchers\') }}
    \n
    \n
    \n

    {{vm.project.get(\'description\')}}

    \n
    \n
    \n
    {{::tag}}
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    {{\'PROJECT.LOOKING_FOR_PEOPLE\' | translate}}

    \n

    {{::vm.project.get(\'looking_for_people_note\')}}

    \n \n
    \n

    {{"PROJECT.SECTION.TEAM" | translate}}

    \n \n
    \n
    \n
    \n
    '), +t.put("projects/transfer/cant-own-project-explanation.html",'\n

    '),t.put("projects/transfer/transfer-page.html",'\n'),t.put("projects/transfer/transfer-project.html",'\n
    \n

    \n
    {{vm.project.get(\'name\')}}\n
    \n

    {{::vm.project.get("name")}}

    \n
    \n \n {{::vm.project.get("total_memberships")}}
    \n
    \n
    \n

    \n
    \n

    \n
    \n
    \n \n \n
    \n \n
    \n
    \n
    \n \n
    '),t.put("profile/profile-bar/profile-bar.html",'\n
    \n
    {{::vm.user.get(\'full_name\')}}
    \n
    \n

    {{::vm.user.get("full_name_display")}}

    \n
    @{{::vm.user.get("username")}}
    \n

    {{::vm.stats.get(\'roles\').join(", ")}}

    \n
    \n
    \n
    {{::vm.stats.get(\'total_num_projects\')}}
    \n
    {{::vm.stats.get(\'total_num_closed_userstories\')}}
    \n
    {{::vm.stats.get(\'total_num_contacts\')}}
    \n
    \n
    {{::vm.user.get("bio") | limitTo:210 }}{{vm.user.get("bio").length < 210 ? \'\' : \'...\'}}
    \n
    '),t.put("profile/profile-contacts/profile-contacts.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    {{ \'USER.PROFILE.CONTACTS_EMPTY\' | translate }}\n
    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n
    {{::contact.get(\'full_name\')}}\n
    \n

    {{::contact.get(\'full_name_display\')}}

    \n

    {{::contact.get(\'roles\').join(", ")}}

    \n

    {{::contact.get(\'bio\')}}

    \n
    \n
    \n
    '),t.put("profile/profile-favs/profile-favs.html",'\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{ \'COMMON.LOADING\'|translate }}
    \n
    \n
    {{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}\n

    {{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}

    \n
    \n
    '),t.put("profile/profile-hints/profile-hints.html",'\n

    \n \n

    \n

    {{::vm.hint.title}}

    \n

    \n {{::vm.hint.text}}\n  \n

    '),t.put("profile/profile-projects/profile-projects.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    \n \n

    \n
    \n
    \n
    \n
    {{::project.get(\'name\')}}\n
    \n

    {{::project.get(\'name\')}}\n \n

    \n

    {{ ::project.get(\'description\') | limitTo:300 }}

    \n
    \n
    \n
    \n
    \n
    \n {{ ::project.get(\'total_fans\') }}\n {{ ::project.get(\'total_watchers\') }}
    \n
    {{::contact.get(\'full_name\')}}
    \n
    \n
    \n
    '),t.put("profile/profile-tab/profile-tab.html",'\n
    \n \n
    '),t.put("profile/profile-tabs/profile-tabs.html",'\n'),t.put("user-timeline/user-timeline/user-timeline.html",'\n
    \n
    \n
    Loading...
    \n
    \n
    \n
    \n
    \n
    '),t.put("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html",'\n\n
    \n
    {{::attachment.get(\'filename\')}}
    \n
    '),t.put("user-timeline/user-timeline-attachment/user-timeline-attachment.html",'\n'),t.put("user-timeline/user-timeline-item/user-timeline-item.html","\n
    {{::timeline.get('created') | momentFromNow}}\n
    \n
    \n \n
    \"{{::timeline.getIn(['data',
    \n \n
    \"{{::timeline.getIn(['data',
    \n

    \n
    \n
    {{::timeline.get('description') | limitTo:300}}
    \n
    \"{{::timeline.getIn(['member','user',\n
    {{::timeline.getIn(['member','user', 'name'])}}\n

    {{::timeline.getIn(['member','role', 'name'])}}

    \n
    \n
    \n
    \n
    \n
    \n
    "),t.put("wiki/history/wiki-history-diff.html",'\n
    \n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    \n
    \n
    \n

    \n

    \n
    '),t.put("wiki/history/wiki-history-entry.html",'\n
    \n
    \n
    {{singleHistoryEntry.user.name}}{{singleHistoryEntry.created_at | momentFormat:\'DD MMM YYYY HH:mm\'}}
    \n
    \n
    \n
    '),t.put("wiki/history/wiki-history.html",'\n\n
    \n \n
    '),t.put("components/assigned-to/assigned-item/assigned-item.html",'\n
    \n
    {{member.full_name}}
    \n
    '),t.put("components/assigned-to/assigned-to-selector/assigned-to-selector.html",'\n\n
    \n

    \n \n
      \n
    • \n \n \n
    • \n
    • \n \n
    • \n
    \n
    '),t.put("components/detail/header/detail-header.html",'\n
    \n

    {{\'#\' + vm.item.ref}}\n \n \n

    \n
    \n \n \n
    \n
    \n
    \n \n
    \n\n
    \n\n\n
    {{vm.item.blocked_note}}
    \n'),t.put("components/card/card-templates/card-completion.html","\n
    \n
    \n
    tasks {{vm.getClosedTasks().size}}/{{vm.item.getIn(['model', 'tasks']).size}}\n
    "),t.put("components/card/card-templates/card-data.html","\n
    {{\"COMMON.FIELDS.POINTS\" | translate}} {{vm.item.getIn(['model', 'total_points'])}}\n
    \n \n
    \n \n
    \n
    \n {{vm.item.getIn(['model', 'total_voters'])}}\n
    \n
    \n {{vm.item.getIn(['model', 'watchers']).size}}\n
    \n
    \n {{vm.item.getIn(['model', 'total_comments'])}}\n
    \n
    \n {{vm.item.getIn(['model', 'attachments']).size}}\n
    \n
    \n
    "),t.put("components/card/card-templates/card-owner.html",'\n
    \n
    \n
    {{vm.item.getIn([\'assigned_to\', \'full_name\'])}}\n \n
    \n \n \n
    \n \n \n
    \n
    '),t.put("components/card/card-templates/card-tags.html",'\n
    '),t.put("components/card/card-templates/card-tasks.html","\n
      \n
    • \n
    "),t.put("components/card/card-templates/card-title.html","\n

    {{::\"#\" + vm.item.getIn(['model', 'ref'])}}\n

    "), +t.put("components/card/card-templates/card-unfold.html",'\n
    \n \n
    \n
    '),t.put("components/tags/tag/tag.html",'\n'),t.put("components/tags/components/add-tag-button.html",'\n '),t.put("components/tags/components/add-tag-input.html",'\n
    \n \n \n \n \n
    '),t.put("components/tags/tag-dropdown/tag-dropdown.html",'\n
      \n
    • \n
      {{tag[0]}}
      \n
    • \n
    '),t.put("components/tags/tag-line-common/tag-line-common.html",'\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n \n \n
    '),t.put("components/tags/tag-line-detail/tag-line-detail.html",'\n'),t.put("components/wysiwyg/wysiwyg-code-lightbox/wysiwyg-code-lightbox.html",'\n\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    '),t.put("discover/components/discover-home-order-by/discover-home-order-by.html",'\n
    {{vm.currentText()}}\n \n
      \n
    • {{ \'DISCOVER.FILTERS.WEEK\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.MONTH\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.YEAR\' | translate }}
    • \n
    • {{ \'DISCOVER.FILTERS.ALL_TIME\' | translate }}
    • \n
    \n
    '),t.put("discover/components/discover-search-bar/discover-search-bar.html",'\n
    \n
    \n

    {{ \'DISCOVER.DISCOVER_TITLE\' | translate }}

    \n

    \n
    \n \n
    \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n
    '),t.put("discover/components/discover-search-list-header/discover-search-list-header.html",'\n'),t.put("discover/components/featured-projects/featured-projects.html",'\n'),t.put("discover/components/highlighted/highlighted.html",'\n
    \n
    \n
    \n
    \n
    \n

    {{::project.get(\'name\')}}\n \n

    \n
    \n {{::project.get(\'total_fans\')}}\n {{::project.get(\'total_watchers\')}}\n {{ ::project.get(\'members\').size }}
    \n
    \n

    {{ ::project.get(\'description\') | limitTo:150 }}{{ ::project.get(\'description\').length < 150 ? \'\' : \'...\'}}

    \n
    \n
    \n \n
    '),t.put("discover/components/most-active/most-active.html",'\n
    \n
    \n
    \n \n

    {{ \'DISCOVER.MOST_ACTIVE\' | translate }}

    \n
    \n \n
    \n \n
    \n
    \n {{ \'DISCOVER.MOST_ACTIVE_EMPTY\' | translate }}\n
    '),t.put("discover/components/most-liked/most-liked.html",'\n
    \n
    \n
    \n \n

    {{ \'DISCOVER.MOST_LIKED\' | translate }}

    \n
    \n \n
    \n \n
    \n
    \n {{ \'DISCOVER.MOST_LIKED_EMPTY\' | translate }}\n
    '),t.put("epics/dashboard/epic-row/epic-row.html",'\n
    \n \n
    \n {{::vm.epic.get(\'total_voters\')}}\n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    {{vm.epic.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n \n
      \n
    • {{status.name}}
    • \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    '),t.put("epics/dashboard/epics-table/epics-table.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("epics/dashboard/story-row/story-row.html",'\n
    \n
    \n {{::vm.story.get(\'total_voters\')}}\n
    \n
    \n \n
    \n
    {{::vm.story.getIn([\'project_extra_info\', \'name\'])}}
    \n
    {{::vm.story.get(\'milestone_name\')}}
    \n
    {{::vm.story.getIn([\'assigned_to_extra_info\', \'full_name_display\'])}}
    \n
    {{EPICS.DASHBOARD.UNASSIGNED | translate}}
    \n
    {{vm.story.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n
    \n
    \n
    \n
    '),t.put("epics/related-userstories/related-userstories-create/related-userstories-create.html",'\n \n'), +t.put("epics/related-userstories/related-userstory-row/related-userstory-row.html",'\n\n
    \n \n
    \n\n
    {{::vm.userstory.getIn([\'project_extra_info\', \'name\'])}}
    \n
    {{vm.userstory.getIn([\'status_extra_info\', \'name\'])}}
    \n
    \n
    {{ vm.avatar.full_name_display }}\n
    {{ vm.getAssignedToFullNameDisplay() }}
    \n
    \n
    \n
    '),t.put("history/history/history-templates/blocked.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/client-requirement.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-assigned-users.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-assigned.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-attachments.html",'\n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    '),t.put("history/history/history-templates/history-color.html",'\n
    \n \n
    '),t.put("history/history/history-templates/history-custom-attributes.html",'\n
    ({{newCustom.name}})\n

    {{newCustom.value}}
    \n
    ({{changeCustom.name}})\n

    {{changeCustom.changes.value[0]}}\n {{changeCustom.changes.value[1]}}
    '),t.put("history/history/history-templates/history-description.html",'\n
    \n

    \n

    \n

    \n
    '),t.put("history/history/history-templates/history-due-date.html",'\n
    {{vm.diff[0] | momentFormat:\'DD MMM YYYY\'}}\n {{vm.diff[1] | momentFormat:\'DD MMM YYYY\'}}\n
    '),t.put("history/history/history-templates/history-milestone.html",'\n
    {{vm.diff[0]}}...\n {{vm.diff[1]}}...\n
    '),t.put("history/history/history-templates/history-points.html",'\n
    {{diff[0]}}\n {{diff[1]}}\n
    '),t.put("history/history/history-templates/history-priority.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-severity.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-status.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-subject.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/history-tags.html",'\n
    \n

    {{vm.diffRemoveTags}}

    \n

    {{vm.diffAddTags}}

    \n
    '),t.put("history/history/history-templates/history-type.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("history/history/history-templates/team-requirement.html",'\n
    {{vm.diff[0]}}\n {{vm.diff[1]}}\n
    '),t.put("projects/components/contact-project-button/contact-project-button.html",'\n'),t.put("projects/components/lb-contact-project/lb-contact-project.html",'\n\n'),t.put("projects/components/watch-project-button/watch-project-button.html",'\n\n'),t.put("projects/components/like-project-button/like-project-button.html",'\n'),t.put("projects/create/asana-import/asana-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/create-project-form/create-project-form.html",'\n
    \n
    \n \n

    \n
    \n

    \n
    \n \n

    \n
    \n

    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    '),t.put("projects/create/create-project-members-restrictions/create-project-members-restrictions.html",'\n
    \n \n
    \n
    \n \n
    '),t.put("projects/create/create-project-restrictions/create-project-restrictions.html",'\n
    \n {{ \'PROJECT.CREATE.MAX_PRIVATE_PROJECTS\' | translate }}\n
    \n
    \n {{ \'PROJECT.CREATE.MAX_PUBLIC_PROJECTS\' | translate }}\n
    '),t.put("projects/create/duplicate/duplicate-project.html",'\n
    \n

    \n

    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    '),t.put("projects/create/github-import/github-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/import/import-header.html",'\n
    \n

    \n

    \n
    '),t.put("projects/create/import/import-project-error-lb.html",'\n\n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n

    \n

    \n
    \n
    \n
    '),t.put("projects/create/import/import-project.html",'\n
    \n
    \n
      \n
    • \n
    • \n \n
      Jira\n

      \n
      \n \n \n \n
      \n
      \n
    • \n
    • \n \n
      Github\n

      \n
      \n
    • \n
    • \n \n
      Trello\n

      \n
      \n
    • \n
    • \n \n
      Asana\n

      \n
      \n
    • \n
    \n
    \n \n
    \n
    \n\n\n\n'),t.put("projects/create/import-project-form-common/actions.html",'\n
    \n \n \n
    '),t.put("projects/create/import-project-form-common/description.html",'\n
    \n \n
    '),t.put("projects/create/import-project-form-common/links.html",'\n
    \n \n
    \n \n
    \n
    \n
    '),t.put("projects/create/import-project-form-common/name.html",'\n
    \n \n \n
    '),t.put("projects/create/import-project-form-common/project-privacy.html",'\n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    '),t.put("projects/create/import-project-members/import-project-members.html",'\n
    \n
    \n

    \n

    \n \n
    \n \n \n
    \n
      \n
    • \n
      \n
      {{member.get(\'full_name\')[0].toUpperCase()}}
      \n
      {{member.get(\'full_name\') || member.get(\'username\') }}\n
      \n
      \n
      \n \n \n
      \n
      \n {{vm.getUser(member).get(\'full_name\') || vm.getUser(member)}}\n
      \n \n
      \n
    • \n
    \n
    \n \n \n
    \n \n \n
    '), +t.put("projects/create/import-project-selector/import-project-selector.html",'\n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
      \n
    • {{project.name}}
    • \n
    \n
    \n

    {{ vm.noProjectsMsg }}

    \n
    \n
    \n

    \n
    \n
    \n \n
    \n
    \n
    \n
    '),t.put("projects/create/import-taiga/import-taiga.html",'\n\n\n
    Taiga\n

    \n
    '),t.put("projects/create/invite-members/invite-members.html",'\n
    \n
    \n \n
    \n
    '),t.put("projects/create/jira-import/jira-import.html",'\n
    \n

    autorization...

    \n
    \n\n\n'),t.put("projects/create/select-import-user-lightbox/select-import-user-lightbox.html",'\n\n
    \n
    \n
    {{vm.user.get(\'full_name\')[0].toUpperCase() || vm.user.get(\'username\')[0].toUpperCase()}}
    \n
    {{vm.user.get(\'full_name\') || vm.user.get(\'username\')}}\n
    \n

    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    '),t.put("projects/create/trello-import/trello-import.html",'\n\n\n'),t.put("projects/create/warning-user-import-lightbox/warning-user-import-lightbox.html",'\n\n
    \n

    \n

    \n
    \n \n \n
    \n
    '),t.put("profile/profile-favs/items/project.html",'\n
    \n
    \n
    \n
    \n

    {{ ::vm.item.get(\'name\') }}\n \n \n

    \n

    {{ ::vm.item.get(\'description\') }}

    \n
    \n
    \n
    \n
    \n {{ ::vm.item.get(\'total_fans\') }}\n {{ ::vm.item.get(\'total_watchers\') }}
    \n
    '),t.put("profile/profile-favs/items/ticket.html",'\n
    {{ ::vm.item.getIn([\'assigned_to_extra_info\', \'full_name_display\']) }}{{ \'COMMON.ASSIGNED_TO.NOT_ASSIGNED\'|translate }}\n
    \n

    {{:: vm.item.get(\'project_name\') }}{{:: vm.item.get(\'status\') }}\n \n

    \n

    \n
    \n
    \n {{ ::vm.item.get(\'total_voters\') }}\n {{ ::vm.item.get(\'total_watchers\') }}
    \n
    '),t.put("wiki/history/history-templates/history-attachments.html",'\n
    {{newAttachment.filename}}
    \n
    {{editAttachment.changes.description[0]}}...\n {{editAttachment.changes.description[1]}}
    \n
    {{deletedAttachment.filename}}
    ')}]); \ No newline at end of file diff --git a/dist/v-1527758585938/locales/moment-locales/af.js b/dist/v-1528953702317/locales/moment-locales/af.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/af.js rename to dist/v-1528953702317/locales/moment-locales/af.js diff --git a/dist/v-1527758585938/locales/moment-locales/ar-dz.js b/dist/v-1528953702317/locales/moment-locales/ar-dz.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ar-dz.js rename to dist/v-1528953702317/locales/moment-locales/ar-dz.js diff --git a/dist/v-1527758585938/locales/moment-locales/ar-kw.js b/dist/v-1528953702317/locales/moment-locales/ar-kw.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ar-kw.js rename to dist/v-1528953702317/locales/moment-locales/ar-kw.js diff --git a/dist/v-1527758585938/locales/moment-locales/ar-ly.js b/dist/v-1528953702317/locales/moment-locales/ar-ly.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ar-ly.js rename to dist/v-1528953702317/locales/moment-locales/ar-ly.js diff --git a/dist/v-1527758585938/locales/moment-locales/ar-ma.js b/dist/v-1528953702317/locales/moment-locales/ar-ma.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ar-ma.js rename to dist/v-1528953702317/locales/moment-locales/ar-ma.js diff --git a/dist/v-1527758585938/locales/moment-locales/ar-sa.js b/dist/v-1528953702317/locales/moment-locales/ar-sa.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ar-sa.js rename to dist/v-1528953702317/locales/moment-locales/ar-sa.js diff --git a/dist/v-1527758585938/locales/moment-locales/ar-tn.js b/dist/v-1528953702317/locales/moment-locales/ar-tn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ar-tn.js rename to dist/v-1528953702317/locales/moment-locales/ar-tn.js diff --git a/dist/v-1527758585938/locales/moment-locales/ar.js b/dist/v-1528953702317/locales/moment-locales/ar.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ar.js rename to dist/v-1528953702317/locales/moment-locales/ar.js diff --git a/dist/v-1527758585938/locales/moment-locales/az.js b/dist/v-1528953702317/locales/moment-locales/az.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/az.js rename to dist/v-1528953702317/locales/moment-locales/az.js diff --git a/dist/v-1527758585938/locales/moment-locales/be.js b/dist/v-1528953702317/locales/moment-locales/be.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/be.js rename to dist/v-1528953702317/locales/moment-locales/be.js diff --git a/dist/v-1527758585938/locales/moment-locales/bg.js b/dist/v-1528953702317/locales/moment-locales/bg.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/bg.js rename to dist/v-1528953702317/locales/moment-locales/bg.js diff --git a/dist/v-1527758585938/locales/moment-locales/bm.js b/dist/v-1528953702317/locales/moment-locales/bm.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/bm.js rename to dist/v-1528953702317/locales/moment-locales/bm.js diff --git a/dist/v-1527758585938/locales/moment-locales/bn.js b/dist/v-1528953702317/locales/moment-locales/bn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/bn.js rename to dist/v-1528953702317/locales/moment-locales/bn.js diff --git a/dist/v-1527758585938/locales/moment-locales/bo.js b/dist/v-1528953702317/locales/moment-locales/bo.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/bo.js rename to dist/v-1528953702317/locales/moment-locales/bo.js diff --git a/dist/v-1527758585938/locales/moment-locales/br.js b/dist/v-1528953702317/locales/moment-locales/br.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/br.js rename to dist/v-1528953702317/locales/moment-locales/br.js diff --git a/dist/v-1527758585938/locales/moment-locales/bs.js b/dist/v-1528953702317/locales/moment-locales/bs.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/bs.js rename to dist/v-1528953702317/locales/moment-locales/bs.js diff --git a/dist/v-1527758585938/locales/moment-locales/ca.js b/dist/v-1528953702317/locales/moment-locales/ca.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ca.js rename to dist/v-1528953702317/locales/moment-locales/ca.js diff --git a/dist/v-1527758585938/locales/moment-locales/cs.js b/dist/v-1528953702317/locales/moment-locales/cs.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/cs.js rename to dist/v-1528953702317/locales/moment-locales/cs.js diff --git a/dist/v-1527758585938/locales/moment-locales/cv.js b/dist/v-1528953702317/locales/moment-locales/cv.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/cv.js rename to dist/v-1528953702317/locales/moment-locales/cv.js diff --git a/dist/v-1527758585938/locales/moment-locales/cy.js b/dist/v-1528953702317/locales/moment-locales/cy.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/cy.js rename to dist/v-1528953702317/locales/moment-locales/cy.js diff --git a/dist/v-1527758585938/locales/moment-locales/da.js b/dist/v-1528953702317/locales/moment-locales/da.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/da.js rename to dist/v-1528953702317/locales/moment-locales/da.js diff --git a/dist/v-1527758585938/locales/moment-locales/de-at.js b/dist/v-1528953702317/locales/moment-locales/de-at.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/de-at.js rename to dist/v-1528953702317/locales/moment-locales/de-at.js diff --git a/dist/v-1527758585938/locales/moment-locales/de-ch.js b/dist/v-1528953702317/locales/moment-locales/de-ch.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/de-ch.js rename to dist/v-1528953702317/locales/moment-locales/de-ch.js diff --git a/dist/v-1527758585938/locales/moment-locales/de.js b/dist/v-1528953702317/locales/moment-locales/de.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/de.js rename to dist/v-1528953702317/locales/moment-locales/de.js diff --git a/dist/v-1527758585938/locales/moment-locales/dv.js b/dist/v-1528953702317/locales/moment-locales/dv.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/dv.js rename to dist/v-1528953702317/locales/moment-locales/dv.js diff --git a/dist/v-1527758585938/locales/moment-locales/el.js b/dist/v-1528953702317/locales/moment-locales/el.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/el.js rename to dist/v-1528953702317/locales/moment-locales/el.js diff --git a/dist/v-1527758585938/locales/moment-locales/en-au.js b/dist/v-1528953702317/locales/moment-locales/en-au.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/en-au.js rename to dist/v-1528953702317/locales/moment-locales/en-au.js diff --git a/dist/v-1527758585938/locales/moment-locales/en-ca.js b/dist/v-1528953702317/locales/moment-locales/en-ca.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/en-ca.js rename to dist/v-1528953702317/locales/moment-locales/en-ca.js diff --git a/dist/v-1527758585938/locales/moment-locales/en-gb.js b/dist/v-1528953702317/locales/moment-locales/en-gb.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/en-gb.js rename to dist/v-1528953702317/locales/moment-locales/en-gb.js diff --git a/dist/v-1527758585938/locales/moment-locales/en-ie.js b/dist/v-1528953702317/locales/moment-locales/en-ie.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/en-ie.js rename to dist/v-1528953702317/locales/moment-locales/en-ie.js diff --git a/dist/v-1527758585938/locales/moment-locales/en-il.js b/dist/v-1528953702317/locales/moment-locales/en-il.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/en-il.js rename to dist/v-1528953702317/locales/moment-locales/en-il.js diff --git a/dist/v-1527758585938/locales/moment-locales/en-nz.js b/dist/v-1528953702317/locales/moment-locales/en-nz.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/en-nz.js rename to dist/v-1528953702317/locales/moment-locales/en-nz.js diff --git a/dist/v-1527758585938/locales/moment-locales/eo.js b/dist/v-1528953702317/locales/moment-locales/eo.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/eo.js rename to dist/v-1528953702317/locales/moment-locales/eo.js diff --git a/dist/v-1527758585938/locales/moment-locales/es-do.js b/dist/v-1528953702317/locales/moment-locales/es-do.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/es-do.js rename to dist/v-1528953702317/locales/moment-locales/es-do.js diff --git a/dist/v-1527758585938/locales/moment-locales/es-us.js b/dist/v-1528953702317/locales/moment-locales/es-us.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/es-us.js rename to dist/v-1528953702317/locales/moment-locales/es-us.js diff --git a/dist/v-1527758585938/locales/moment-locales/es.js b/dist/v-1528953702317/locales/moment-locales/es.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/es.js rename to dist/v-1528953702317/locales/moment-locales/es.js diff --git a/dist/v-1527758585938/locales/moment-locales/et.js b/dist/v-1528953702317/locales/moment-locales/et.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/et.js rename to dist/v-1528953702317/locales/moment-locales/et.js diff --git a/dist/v-1527758585938/locales/moment-locales/eu.js b/dist/v-1528953702317/locales/moment-locales/eu.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/eu.js rename to dist/v-1528953702317/locales/moment-locales/eu.js diff --git a/dist/v-1527758585938/locales/moment-locales/fa.js b/dist/v-1528953702317/locales/moment-locales/fa.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/fa.js rename to dist/v-1528953702317/locales/moment-locales/fa.js diff --git a/dist/v-1527758585938/locales/moment-locales/fi.js b/dist/v-1528953702317/locales/moment-locales/fi.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/fi.js rename to dist/v-1528953702317/locales/moment-locales/fi.js diff --git a/dist/v-1527758585938/locales/moment-locales/fo.js b/dist/v-1528953702317/locales/moment-locales/fo.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/fo.js rename to dist/v-1528953702317/locales/moment-locales/fo.js diff --git a/dist/v-1527758585938/locales/moment-locales/fr-ca.js b/dist/v-1528953702317/locales/moment-locales/fr-ca.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/fr-ca.js rename to dist/v-1528953702317/locales/moment-locales/fr-ca.js diff --git a/dist/v-1527758585938/locales/moment-locales/fr-ch.js b/dist/v-1528953702317/locales/moment-locales/fr-ch.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/fr-ch.js rename to dist/v-1528953702317/locales/moment-locales/fr-ch.js diff --git a/dist/v-1527758585938/locales/moment-locales/fr.js b/dist/v-1528953702317/locales/moment-locales/fr.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/fr.js rename to dist/v-1528953702317/locales/moment-locales/fr.js diff --git a/dist/v-1527758585938/locales/moment-locales/fy.js b/dist/v-1528953702317/locales/moment-locales/fy.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/fy.js rename to dist/v-1528953702317/locales/moment-locales/fy.js diff --git a/dist/v-1527758585938/locales/moment-locales/gd.js b/dist/v-1528953702317/locales/moment-locales/gd.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/gd.js rename to dist/v-1528953702317/locales/moment-locales/gd.js diff --git a/dist/v-1527758585938/locales/moment-locales/gl.js b/dist/v-1528953702317/locales/moment-locales/gl.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/gl.js rename to dist/v-1528953702317/locales/moment-locales/gl.js diff --git a/dist/v-1527758585938/locales/moment-locales/gom-latn.js b/dist/v-1528953702317/locales/moment-locales/gom-latn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/gom-latn.js rename to dist/v-1528953702317/locales/moment-locales/gom-latn.js diff --git a/dist/v-1527758585938/locales/moment-locales/gu.js b/dist/v-1528953702317/locales/moment-locales/gu.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/gu.js rename to dist/v-1528953702317/locales/moment-locales/gu.js diff --git a/dist/v-1527758585938/locales/moment-locales/he.js b/dist/v-1528953702317/locales/moment-locales/he.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/he.js rename to dist/v-1528953702317/locales/moment-locales/he.js diff --git a/dist/v-1527758585938/locales/moment-locales/hi.js b/dist/v-1528953702317/locales/moment-locales/hi.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/hi.js rename to dist/v-1528953702317/locales/moment-locales/hi.js diff --git a/dist/v-1527758585938/locales/moment-locales/hr.js b/dist/v-1528953702317/locales/moment-locales/hr.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/hr.js rename to dist/v-1528953702317/locales/moment-locales/hr.js diff --git a/dist/v-1527758585938/locales/moment-locales/hu.js b/dist/v-1528953702317/locales/moment-locales/hu.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/hu.js rename to dist/v-1528953702317/locales/moment-locales/hu.js diff --git a/dist/v-1527758585938/locales/moment-locales/hy-am.js b/dist/v-1528953702317/locales/moment-locales/hy-am.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/hy-am.js rename to dist/v-1528953702317/locales/moment-locales/hy-am.js diff --git a/dist/v-1527758585938/locales/moment-locales/id.js b/dist/v-1528953702317/locales/moment-locales/id.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/id.js rename to dist/v-1528953702317/locales/moment-locales/id.js diff --git a/dist/v-1527758585938/locales/moment-locales/is.js b/dist/v-1528953702317/locales/moment-locales/is.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/is.js rename to dist/v-1528953702317/locales/moment-locales/is.js diff --git a/dist/v-1527758585938/locales/moment-locales/it.js b/dist/v-1528953702317/locales/moment-locales/it.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/it.js rename to dist/v-1528953702317/locales/moment-locales/it.js diff --git a/dist/v-1527758585938/locales/moment-locales/ja.js b/dist/v-1528953702317/locales/moment-locales/ja.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ja.js rename to dist/v-1528953702317/locales/moment-locales/ja.js diff --git a/dist/v-1527758585938/locales/moment-locales/jv.js b/dist/v-1528953702317/locales/moment-locales/jv.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/jv.js rename to dist/v-1528953702317/locales/moment-locales/jv.js diff --git a/dist/v-1527758585938/locales/moment-locales/ka.js b/dist/v-1528953702317/locales/moment-locales/ka.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ka.js rename to dist/v-1528953702317/locales/moment-locales/ka.js diff --git a/dist/v-1527758585938/locales/moment-locales/kk.js b/dist/v-1528953702317/locales/moment-locales/kk.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/kk.js rename to dist/v-1528953702317/locales/moment-locales/kk.js diff --git a/dist/v-1527758585938/locales/moment-locales/km.js b/dist/v-1528953702317/locales/moment-locales/km.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/km.js rename to dist/v-1528953702317/locales/moment-locales/km.js diff --git a/dist/v-1527758585938/locales/moment-locales/kn.js b/dist/v-1528953702317/locales/moment-locales/kn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/kn.js rename to dist/v-1528953702317/locales/moment-locales/kn.js diff --git a/dist/v-1527758585938/locales/moment-locales/ko.js b/dist/v-1528953702317/locales/moment-locales/ko.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ko.js rename to dist/v-1528953702317/locales/moment-locales/ko.js diff --git a/dist/v-1527758585938/locales/moment-locales/ky.js b/dist/v-1528953702317/locales/moment-locales/ky.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ky.js rename to dist/v-1528953702317/locales/moment-locales/ky.js diff --git a/dist/v-1527758585938/locales/moment-locales/lb.js b/dist/v-1528953702317/locales/moment-locales/lb.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/lb.js rename to dist/v-1528953702317/locales/moment-locales/lb.js diff --git a/dist/v-1527758585938/locales/moment-locales/lo.js b/dist/v-1528953702317/locales/moment-locales/lo.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/lo.js rename to dist/v-1528953702317/locales/moment-locales/lo.js diff --git a/dist/v-1527758585938/locales/moment-locales/lt.js b/dist/v-1528953702317/locales/moment-locales/lt.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/lt.js rename to dist/v-1528953702317/locales/moment-locales/lt.js diff --git a/dist/v-1527758585938/locales/moment-locales/lv.js b/dist/v-1528953702317/locales/moment-locales/lv.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/lv.js rename to dist/v-1528953702317/locales/moment-locales/lv.js diff --git a/dist/v-1527758585938/locales/moment-locales/me.js b/dist/v-1528953702317/locales/moment-locales/me.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/me.js rename to dist/v-1528953702317/locales/moment-locales/me.js diff --git a/dist/v-1527758585938/locales/moment-locales/mi.js b/dist/v-1528953702317/locales/moment-locales/mi.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/mi.js rename to dist/v-1528953702317/locales/moment-locales/mi.js diff --git a/dist/v-1527758585938/locales/moment-locales/mk.js b/dist/v-1528953702317/locales/moment-locales/mk.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/mk.js rename to dist/v-1528953702317/locales/moment-locales/mk.js diff --git a/dist/v-1527758585938/locales/moment-locales/ml.js b/dist/v-1528953702317/locales/moment-locales/ml.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ml.js rename to dist/v-1528953702317/locales/moment-locales/ml.js diff --git a/dist/v-1527758585938/locales/moment-locales/mr.js b/dist/v-1528953702317/locales/moment-locales/mr.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/mr.js rename to dist/v-1528953702317/locales/moment-locales/mr.js diff --git a/dist/v-1527758585938/locales/moment-locales/ms-my.js b/dist/v-1528953702317/locales/moment-locales/ms-my.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ms-my.js rename to dist/v-1528953702317/locales/moment-locales/ms-my.js diff --git a/dist/v-1527758585938/locales/moment-locales/ms.js b/dist/v-1528953702317/locales/moment-locales/ms.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ms.js rename to dist/v-1528953702317/locales/moment-locales/ms.js diff --git a/dist/v-1527758585938/locales/moment-locales/mt.js b/dist/v-1528953702317/locales/moment-locales/mt.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/mt.js rename to dist/v-1528953702317/locales/moment-locales/mt.js diff --git a/dist/v-1527758585938/locales/moment-locales/my.js b/dist/v-1528953702317/locales/moment-locales/my.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/my.js rename to dist/v-1528953702317/locales/moment-locales/my.js diff --git a/dist/v-1527758585938/locales/moment-locales/nb.js b/dist/v-1528953702317/locales/moment-locales/nb.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/nb.js rename to dist/v-1528953702317/locales/moment-locales/nb.js diff --git a/dist/v-1527758585938/locales/moment-locales/ne.js b/dist/v-1528953702317/locales/moment-locales/ne.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ne.js rename to dist/v-1528953702317/locales/moment-locales/ne.js diff --git a/dist/v-1527758585938/locales/moment-locales/nl-be.js b/dist/v-1528953702317/locales/moment-locales/nl-be.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/nl-be.js rename to dist/v-1528953702317/locales/moment-locales/nl-be.js diff --git a/dist/v-1527758585938/locales/moment-locales/nl.js b/dist/v-1528953702317/locales/moment-locales/nl.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/nl.js rename to dist/v-1528953702317/locales/moment-locales/nl.js diff --git a/dist/v-1527758585938/locales/moment-locales/nn.js b/dist/v-1528953702317/locales/moment-locales/nn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/nn.js rename to dist/v-1528953702317/locales/moment-locales/nn.js diff --git a/dist/v-1527758585938/locales/moment-locales/pa-in.js b/dist/v-1528953702317/locales/moment-locales/pa-in.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/pa-in.js rename to dist/v-1528953702317/locales/moment-locales/pa-in.js diff --git a/dist/v-1527758585938/locales/moment-locales/pl.js b/dist/v-1528953702317/locales/moment-locales/pl.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/pl.js rename to dist/v-1528953702317/locales/moment-locales/pl.js diff --git a/dist/v-1527758585938/locales/moment-locales/pt-br.js b/dist/v-1528953702317/locales/moment-locales/pt-br.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/pt-br.js rename to dist/v-1528953702317/locales/moment-locales/pt-br.js diff --git a/dist/v-1527758585938/locales/moment-locales/pt.js b/dist/v-1528953702317/locales/moment-locales/pt.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/pt.js rename to dist/v-1528953702317/locales/moment-locales/pt.js diff --git a/dist/v-1527758585938/locales/moment-locales/ro.js b/dist/v-1528953702317/locales/moment-locales/ro.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ro.js rename to dist/v-1528953702317/locales/moment-locales/ro.js diff --git a/dist/v-1527758585938/locales/moment-locales/ru.js b/dist/v-1528953702317/locales/moment-locales/ru.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ru.js rename to dist/v-1528953702317/locales/moment-locales/ru.js diff --git a/dist/v-1527758585938/locales/moment-locales/sd.js b/dist/v-1528953702317/locales/moment-locales/sd.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/sd.js rename to dist/v-1528953702317/locales/moment-locales/sd.js diff --git a/dist/v-1527758585938/locales/moment-locales/se.js b/dist/v-1528953702317/locales/moment-locales/se.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/se.js rename to dist/v-1528953702317/locales/moment-locales/se.js diff --git a/dist/v-1527758585938/locales/moment-locales/si.js b/dist/v-1528953702317/locales/moment-locales/si.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/si.js rename to dist/v-1528953702317/locales/moment-locales/si.js diff --git a/dist/v-1527758585938/locales/moment-locales/sk.js b/dist/v-1528953702317/locales/moment-locales/sk.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/sk.js rename to dist/v-1528953702317/locales/moment-locales/sk.js diff --git a/dist/v-1527758585938/locales/moment-locales/sl.js b/dist/v-1528953702317/locales/moment-locales/sl.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/sl.js rename to dist/v-1528953702317/locales/moment-locales/sl.js diff --git a/dist/v-1527758585938/locales/moment-locales/sq.js b/dist/v-1528953702317/locales/moment-locales/sq.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/sq.js rename to dist/v-1528953702317/locales/moment-locales/sq.js diff --git a/dist/v-1527758585938/locales/moment-locales/sr-cyrl.js b/dist/v-1528953702317/locales/moment-locales/sr-cyrl.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/sr-cyrl.js rename to dist/v-1528953702317/locales/moment-locales/sr-cyrl.js diff --git a/dist/v-1527758585938/locales/moment-locales/sr.js b/dist/v-1528953702317/locales/moment-locales/sr.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/sr.js rename to dist/v-1528953702317/locales/moment-locales/sr.js diff --git a/dist/v-1527758585938/locales/moment-locales/ss.js b/dist/v-1528953702317/locales/moment-locales/ss.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ss.js rename to dist/v-1528953702317/locales/moment-locales/ss.js diff --git a/dist/v-1527758585938/locales/moment-locales/sv.js b/dist/v-1528953702317/locales/moment-locales/sv.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/sv.js rename to dist/v-1528953702317/locales/moment-locales/sv.js diff --git a/dist/v-1527758585938/locales/moment-locales/sw.js b/dist/v-1528953702317/locales/moment-locales/sw.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/sw.js rename to dist/v-1528953702317/locales/moment-locales/sw.js diff --git a/dist/v-1527758585938/locales/moment-locales/ta.js b/dist/v-1528953702317/locales/moment-locales/ta.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ta.js rename to dist/v-1528953702317/locales/moment-locales/ta.js diff --git a/dist/v-1527758585938/locales/moment-locales/te.js b/dist/v-1528953702317/locales/moment-locales/te.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/te.js rename to dist/v-1528953702317/locales/moment-locales/te.js diff --git a/dist/v-1527758585938/locales/moment-locales/tet.js b/dist/v-1528953702317/locales/moment-locales/tet.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/tet.js rename to dist/v-1528953702317/locales/moment-locales/tet.js diff --git a/dist/v-1527758585938/locales/moment-locales/tg.js b/dist/v-1528953702317/locales/moment-locales/tg.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/tg.js rename to dist/v-1528953702317/locales/moment-locales/tg.js diff --git a/dist/v-1527758585938/locales/moment-locales/th.js b/dist/v-1528953702317/locales/moment-locales/th.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/th.js rename to dist/v-1528953702317/locales/moment-locales/th.js diff --git a/dist/v-1527758585938/locales/moment-locales/tl-ph.js b/dist/v-1528953702317/locales/moment-locales/tl-ph.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/tl-ph.js rename to dist/v-1528953702317/locales/moment-locales/tl-ph.js diff --git a/dist/v-1527758585938/locales/moment-locales/tlh.js b/dist/v-1528953702317/locales/moment-locales/tlh.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/tlh.js rename to dist/v-1528953702317/locales/moment-locales/tlh.js diff --git a/dist/v-1527758585938/locales/moment-locales/tr.js b/dist/v-1528953702317/locales/moment-locales/tr.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/tr.js rename to dist/v-1528953702317/locales/moment-locales/tr.js diff --git a/dist/v-1527758585938/locales/moment-locales/tzl.js b/dist/v-1528953702317/locales/moment-locales/tzl.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/tzl.js rename to dist/v-1528953702317/locales/moment-locales/tzl.js diff --git a/dist/v-1527758585938/locales/moment-locales/tzm-latn.js b/dist/v-1528953702317/locales/moment-locales/tzm-latn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/tzm-latn.js rename to dist/v-1528953702317/locales/moment-locales/tzm-latn.js diff --git a/dist/v-1527758585938/locales/moment-locales/tzm.js b/dist/v-1528953702317/locales/moment-locales/tzm.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/tzm.js rename to dist/v-1528953702317/locales/moment-locales/tzm.js diff --git a/dist/v-1527758585938/locales/moment-locales/ug-cn.js b/dist/v-1528953702317/locales/moment-locales/ug-cn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ug-cn.js rename to dist/v-1528953702317/locales/moment-locales/ug-cn.js diff --git a/dist/v-1527758585938/locales/moment-locales/uk.js b/dist/v-1528953702317/locales/moment-locales/uk.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/uk.js rename to dist/v-1528953702317/locales/moment-locales/uk.js diff --git a/dist/v-1527758585938/locales/moment-locales/ur.js b/dist/v-1528953702317/locales/moment-locales/ur.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/ur.js rename to dist/v-1528953702317/locales/moment-locales/ur.js diff --git a/dist/v-1527758585938/locales/moment-locales/uz-latn.js b/dist/v-1528953702317/locales/moment-locales/uz-latn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/uz-latn.js rename to dist/v-1528953702317/locales/moment-locales/uz-latn.js diff --git a/dist/v-1527758585938/locales/moment-locales/uz.js b/dist/v-1528953702317/locales/moment-locales/uz.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/uz.js rename to dist/v-1528953702317/locales/moment-locales/uz.js diff --git a/dist/v-1527758585938/locales/moment-locales/vi.js b/dist/v-1528953702317/locales/moment-locales/vi.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/vi.js rename to dist/v-1528953702317/locales/moment-locales/vi.js diff --git a/dist/v-1527758585938/locales/moment-locales/x-pseudo.js b/dist/v-1528953702317/locales/moment-locales/x-pseudo.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/x-pseudo.js rename to dist/v-1528953702317/locales/moment-locales/x-pseudo.js diff --git a/dist/v-1527758585938/locales/moment-locales/yo.js b/dist/v-1528953702317/locales/moment-locales/yo.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/yo.js rename to dist/v-1528953702317/locales/moment-locales/yo.js diff --git a/dist/v-1527758585938/locales/moment-locales/zh-cn.js b/dist/v-1528953702317/locales/moment-locales/zh-cn.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/zh-cn.js rename to dist/v-1528953702317/locales/moment-locales/zh-cn.js diff --git a/dist/v-1527758585938/locales/moment-locales/zh-hk.js b/dist/v-1528953702317/locales/moment-locales/zh-hk.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/zh-hk.js rename to dist/v-1528953702317/locales/moment-locales/zh-hk.js diff --git a/dist/v-1527758585938/locales/moment-locales/zh-tw.js b/dist/v-1528953702317/locales/moment-locales/zh-tw.js similarity index 100% rename from dist/v-1527758585938/locales/moment-locales/zh-tw.js rename to dist/v-1528953702317/locales/moment-locales/zh-tw.js diff --git a/dist/v-1527758585938/locales/taiga/locale-ca.json b/dist/v-1528953702317/locales/taiga/locale-ca.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-ca.json rename to dist/v-1528953702317/locales/taiga/locale-ca.json diff --git a/dist/v-1528953702317/locales/taiga/locale-de.json b/dist/v-1528953702317/locales/taiga/locale-de.json new file mode 100644 index 0000000..eeb2fe8 --- /dev/null +++ b/dist/v-1528953702317/locales/taiga/locale-de.json @@ -0,0 +1 @@ +{"COMMON":{"YES":"Ja","NO":"Nein","OR":"oder","LOADING":"Wird geladen...","DATE":"DD. MMM YYYY","DATETIME":"DD. MMM YYYY HH:mm","SAVE":"Speichern","CANCEL":"Abbrechen","ACCEPT":"Akzeptieren","DELETE":"Löschen","UNLINK":"Verknüpfung auflösen","CREATE":"Erzeugen","ADD":"Hinzufügen","COPY_TO_CLIPBOARD":"Ins Clipboard übernehmen: Strg+C","EDIT":"Bearbeiten","DRAG":"Ziehen","TAG_LINE":"Dein agiles, freies und quelloffenes Projekt-Management Tool","TAG_LINE_2":"LIEBE DEIN PROJEKT","BLOCK":"Blockieren","BLOCK_TITLE":"Blockiere dieses Item, zum Beispiel wenn es Abhänigkeiten besitzt die noch nicht erfüllt sind","BLOCKED":"Blockiert","UNBLOCK":"Blockierung aufheben","UNBLOCK_TITLE":"Dieses Item freigeben","BLOCKED_NOTE":"Wieso ist es blockiert?","BLOCKED_REASON":"Bitte erklären Sie den Grund","CREATED_BY":"Erstellt durch {{fullDisplayName}}","CLOSE":"schließen","GO_HOME":"Führe mich heim","PLUGINS":"Plugins","ONE_ITEM_LINE":"Ein Eintrag pro Zeile...","NEW_BULK":"Neue Massenerstellung","RELATED_TASKS":"Verbundene Aufgaben","PREVIOUS":"Zurück","NEXT":"Weiter","LOGOUT":"Ausloggen","EXTERNAL_USER":"ein externer Benutzer","GENERIC_ERROR":"Eins unserer Helferlein sagt {{error}}.","IOCAINE_TEXT":"Dieses Mitglied fühlt sich ein bisschen überfordert mit dieser Aufgabe. Mit der Zeit und deiner Hilfe wird er gegen das Iocaine Pulver immun werden. Aber jetzt braucht er eine Umarmung.","CLIENT_REQUIREMENT":"Client requirement is new requirement that was not previously expected and it is required to be part of the project","TEAM_REQUIREMENT":"Team requirement is a requirement that must exist in the project but should have no cost for the client","OWNER":"Projekteigentümer","CAPSLOCK_WARNING":"Achtung! Sie verwenden Großbuchstaben in einem Eingabefeld, dass Groß- und Kleinschreibung berücksichtigt.","CONFIRM_CLOSE_EDIT_MODE_TITLE":"Sind Sie sicher, dass Sie den Bearbeitungsmodus beenden möchten?","CONFIRM_CLOSE_EDIT_MODE_MESSAGE":"Beachten Sie, dass alle Änderungen verloren gehen, wenn Sie den Bearbeitungsmodus schließen, ohne vorher zu speichern.","RELATED_USERSTORIES":"Verwandte User Stories","CARD":{"ASSIGN_TO":"Zuweisen an","EDIT":"Karte bearbeiten","DELETE":"Karte Löschen"},"FORM_ERRORS":{"DEFAULT_MESSAGE":"Dieser Wert scheint ungültig zu sein.","TYPE_EMAIL":"Dieser Wert sollte eine gültige E-Mail Adresse enthalten.","TYPE_URL":"Dieser Wert sollte eine gültige URL enthalten.","TYPE_URLSTRICT":"Dieser Wert sollte eine gültige URL enthalten.","TYPE_NUMBER":"Dieser Wert sollte eine gültige Nummer enthalten.","TYPE_DIGITS":"Dieser Wert sollte Ziffern enthalten.","TYPE_DATEISO":"Dieser Wert sollte ein gültiges Datum sein (YYYY-MM-DD)","TYPE_ALPHANUM":"Dieser Wert sollte alphanumersich sein.","TYPE_PHONE":"Dieser Wert sollte eine gültige Telefonnummer enthalten.","NOTNULL":"Dieser Wert darf nicht leer sein.","NOT_BLANK":"Dieser Wert darf nicht leer bleiben.","REQUIRED":"Diese Angabe ist erforderlich","REGEXP":"Dieser Wert scheint ungültig zu sein.","MIN":"Dieser Wert sollte größer oder gleich %s sein.","MAX":"Dieser Wert sollte niedriger oder gleich %s sein.","RANGE":"Der Wert sollte zwischen %s und %s liegen.","MIN_LENGTH":"Diese Angabe ist zu kurz. Sie sollte mindestens %s Zeichen haben oder mehr.","MAX_LENGTH":"Diese Angabe ist zu lang. Sie sollte %s Zeichen haben oder weniger.","RANGE_LENGTH":"Die Länge des Wertes ist ungültig. Sie sollte zwischen %s und %s Zeichen liegen.","MIN_CHECK":"Sie müssen mindestens %s auswählen.","MAX_CHECK":"Wählen Sie %s oder weniger.","RANGE_CHECK":"Wählen Sie zwischen %s und %s","EQUAL_TO":"Dieser Wert sollte der gleiche sein.","LINEWIDTH":"Eine oder mehrere Zeilen sind vielleicht zu lang. Versuchen Sie unter %s Zeichen zu bleiben.","PIKADAY":"Ungültiges Datumsformat. Bitte nutze DD MMM YYYY (etwa 23 März 1984)"},"PICKERDATE":{"FORMAT":"DD. MMM YYYY","IS_RTL":"falsch","FIRST_DAY_OF_WEEK":"1","PREV_MONTH":"Vorheriger Monat","NEXT_MONTH":"Nächster Monat","MONTHS":{"JAN":"Januar","FEB":"Februar","MAR":"März","APR":"April","MAY":"Mai","JUN":"Juni","JUL":"Juli","AUG":"August","SEP":"September","OCT":"Oktober","NOV":"November","DEC":"Dezember"},"WEEK_DAYS":{"SUN":"Sonntag","MON":"Montag","TUE":"Dienstag","WED":"Mittwoch","THU":"Donnerstag","FRI":"Freitag","SAT":"Samstag"},"WEEK_DAYS_SHORT":{"SUN":"So","MON":"Mo","TUE":"Di","WED":"Mi","THU":"Do","FRI":"Fr","SAT":"Sa"}},"SEE_USER_PROFILE":"Profil von {{username }} ansehen","USER_STORY":"User-Story","TASK":"Aufgabe","ISSUE":"Ticket","EPIC":"Epic","TAGS":{"PLACEHOLDER":"Gib einen Tag ein","DELETE":"Schlagwort löschen","ADD":"Schlagwort hinzufügen"},"DESCRIPTION":{"EMPTY":"Bitte geben Sie eine Beschreibung ein...","NO_DESCRIPTION":"Noch keine Beschreibung"},"FIELDS":{"SUBJECT":"Thema","NAME":"Name","URL":"URL","DESCRIPTION":"Beschreibung","VALUE":"Wert","SLUG":"Slug","COLOR":"Farbe","IS_CLOSED":"ist geschlossen?","STATUS":"Status","TYPE":"Typen","SEVERITY":"Gewichtung","PRIORITY":"Priorität","ASSIGNED_TO":"Zugewiesen an","ASSIGNED_USERS":"Zugewiesene Benutzer","POINTS":"Punkte","IS_BLOCKED":"wird blockiert","REF":"Ref","VOTES":"Stimmen","SPRINT":"Sprint","DUE_DATE":"Fälligkeitsdatum","DUE_DATE_REASON":"Grund des Fälligkeitsdatum"},"ROLES":{"ALL":"Alle"},"ASSIGNED_TO":{"NOT_ASSIGNED":"Nicht zugeordnet","ASSIGN":"Zuweisen","DELETE_ASSIGNMENT":"Zuordnung löschen","REMOVE_ASSIGNED":"Zugewiesene entfernen","TOO_MANY":"...zu viele Benutzer. Filtern Sie!","CONFIRM_UNASSIGNED":"Möchten dies wirklich ohne eine Zuordnung verlassen?","TITLE_ACTION_EDIT_ASSIGNMENT":"Zuordnungen bearbeiten","SELF":"An mich zuweisen"},"DUE_DATE":{"TITLE_ACTION_SET_DUE_DATE":"Fälligkeitsdatum setzen","DUE_SOON":"bald fällig","PAST_DUE":"nach Fälligkeitsdatum","NO_LONGER_APPLICABLE":"nicht länger anwendbar"},"ASSIGNED_USERS":{"ADD":"Zugewiesenen Benutzer wählen","ADD_ASSIGNED":"Zugewiesenen hinzufügen","TITLE_LIGHTBOX_DELETE_ASSIGNED":"Zugewiesenen löschen..."},"STATUS":{"CLOSED":"Geschlossen","OPEN":"Geöffnet"},"WATCHERS":{"WATCHERS":"Beobachter","ADD":"Beobachter hinzufügen","TITLE_ADD":"Füge ein neues Projektmitglied der Beobachterliste hinzu","DELETE":"Beobachter löschen","TITLE_LIGHTBOX_DELETE_WARTCHER":"Beobachter löschen..."},"WATCH_BUTTON":{"WATCH":"Beobachten","WATCHING":"Beobachtet","UNWATCH":"Nicht beobachten","WATCHERS":"Beobachter","BUTTON_TITLE":"Beobachte/Beobachte dieses Objekt (nicht mehr)","COUNTER_TITLE":"{total, plural, one{ein Beobachter} other{# Beobachter}}"},"VOTE_BUTTON":{"BUTTON_TITLE":"Upvote/Downvote diesen Eintrag","COUNTER_TITLE":"{total, plural, one{eine Stimme} other{# Stimmen}}"},"CUSTOM_ATTRIBUTES":{"CUSTOM_FIELDS":"Benutzerdefinierte Felder","SAVE":"Benutzerdefiniertes Feld speichern","EDIT":"Benutzerdefiniertes Feld bearbeiten","DELETE":"benutzerdefiniertes Attribut löschen","CONFIRM_DELETE":"Alle Werte in benutzerdefinierten Feldern werden gelöscht.\n Sind Sie sicher, dass Sie fortfahren wollen?"},"FILTERS":{"INPUT_PLACEHOLDER":"Betreff oder Verweis","TITLE_ACTION_FILTER_BUTTON":"suche","TITLE":"Filter","TITLE_ACTION_SEARCH":"Suche","ACTION_SAVE_CUSTOM_FILTER":"Als Benutzerfilter speichern","PLACEHOLDER_FILTER_NAME":"Benennen Sie den Filter und drücken Sie die Eingabetaste","APPLIED_FILTERS_NUM":"Filter wurden angewandt","CATEGORIES":{"TYPE":"Arten","STATUS":"Status","SEVERITY":"Gewichtung","PRIORITIES":"Prioritäten","TAGS":"Schlagwörter","ASSIGNED_TO":"Zugeordnet zu","ROLE":"Rolle","CREATED_BY":"Erstellt durch","CUSTOM_FILTERS":"Benutzerfilter","EPIC":"Epic"}},"WYSIWYG":{"CODE_SNIPPET":"Codeschnipsel","DB_CLICK":"Doppelklick zum Bearbeiten","SELECT_LANGUAGE_PLACEHOLDER":"Sprache wählen","SELECT_LANGUAGE_REMOVE_FORMATING":"Lösche Formatierung","OUTDATED":"Eine andere Person hat, während deiner Bearbeitung, Änderungen vorgenommen. Überprüfe die neue Version in der Aktivitätstabelle, bevor du deine Änderungen speicherst","MARKDOWN_HELP":"Markdown syntax Hilfe"},"PERMISIONS_CATEGORIES":{"EPICS":{"NAME":"Epics","VIEW_EPICS":"Epics anzeigen","ADD_EPICS":"Epics hinzufügen","MODIFY_EPICS":"Epics verändern","COMMENT_EPICS":"Epics kommentieren","DELETE_EPICS":"Epics löschen"},"SPRINTS":{"NAME":"Sprints","VIEW_SPRINTS":"Sprints ansehen","ADD_SPRINTS":"Sprints hinzufügen","MODIFY_SPRINTS":"Sprints modifizieren","DELETE_SPRINTS":"Gelöschte Sprints"},"USER_STORIES":{"NAME":"User-Stories","VIEW_USER_STORIES":"User-Stories ansehen","ADD_USER_STORIES":"User-Stories hinzufügen","MODIFY_USER_STORIES":"User-Stories modifizieren","COMMENT_USER_STORIES":"User-Stories kommentieren","DELETE_USER_STORIES":"User-Stories löschen"},"TASKS":{"NAME":"Aufgaben","VIEW_TASKS":"Aufgaben ansehen","ADD_TASKS":"Aufgaben hinzufügen","MODIFY_TASKS":"Aufgaben ändern","COMMENT_TASKS":"Aufgaben kommentieren","DELETE_TASKS":"Aufgaben löschen"},"ISSUES":{"NAME":"Tickets","VIEW_ISSUES":"Tickets ansehen","ADD_ISSUES":"Tickets hinzufügen","MODIFY_ISSUES":"Tickets ändern","COMMENT_ISSUES":"Tickets kommentieren","DELETE_ISSUES":"Tickets löschen"},"WIKI":{"NAME":"Wiki","VIEW_WIKI_PAGES":"Wiki Seiten ansehen","ADD_WIKI_PAGES":"Wiki Seiten hinzufügen","MODIFY_WIKI_PAGES":"Wiki Seiten ändern","DELETE_WIKI_PAGES":"Wiki Seiten löschen","VIEW_WIKI_LINKS":"Wiki Links ansehen","ADD_WIKI_LINKS":"Wiki Links hinzufügen","DELETE_WIKI_LINKS":"Wiki Links löschen"}}},"LOGIN":{"PAGE_TITLE":"Login - Taiga","PAGE_DESCRIPTION":"Melden Sie sich bei Taiga an, einer Projekt-Management Plattform für Neugründer und agile Entwickler und Designer, die ein unkompliziertes und ansprechendes Tool möchten, das die Arbeit wirklich angenehm macht."},"AUTH":{"INVITED_YOU":"hat Sie zum Projekt eingeladen","NOT_REGISTERED_YET":"Noch nicht registiert?","REGISTER":"Registrieren","CREATE_ACCOUNT":"Ein kostenloses Benutzerkonto anlegen"},"LOGIN_COMMON":{"HEADER":"Ich bin bereits bei Taiga registriert","PLACEHOLDER_AUTH_NAME":"Benutzername oder E-Mail-Adresse","LINK_FORGOT_PASSWORD":"Haben Sie es vergessen?","TITLE_LINK_FORGOT_PASSWORD":"Haben Sie Ihr Passwort vergessen?","ACTION_ENTER":"Eingabe","ACTION_SIGN_IN":"Login","PLACEHOLDER_AUTH_PASSWORD":"Passwort","ALT_LOGIN":"Oder einloggen mit"},"LOGIN_FORM":{"ERROR_AUTH_INCORRECT":"Laut unserem Helferlein ist Dein Benutzername/Deine E-Mail-Adresse oder Dein Passwort nicht korrekt. (Bitte achte auf die Groß- und Kleinschreibung.)","SUCCESS":"Herzlich willkommen bei Taiga, unsere Helferlein freuen sich."},"REGISTER":{"PAGE_TITLE":"Registrieren - Taiga","PAGE_DESCRIPTION":"Erstelle Dein Benutzerkonto in Taiga, einer Projekt-Management Plattform für Neugründer und agile Entwickler und Designer, die ein unkompliziertes und ansprechendes Tool möchten, das die Arbeit wirklich angenehm macht."},"REGISTER_FORM":{"TITLE":"Ein neues Taiga Benutzerkonto registrieren (kostenlos)","PLACEHOLDER_NAME":"Wählen Sie einen Benutzernamen (Groß- und Kleinschreibung beachten)","PLACEHOLDER_FULL_NAME":"Wähle Deinen Anzeigenamen","PLACEHOLDER_EMAIL":"Deine E-Mail","PLACEHOLDER_PASSWORD":"Setzen Sie ein Passwort (Groß- und Kleinschreibung beachten)","ACTION_SIGN_UP":"Anmelden","TITLE_LINK_LOGIN":"Anmelden","LINK_LOGIN":"Sind Sie bereits registriert? Loggen Sie sich ein"},"FORGOT_PASSWORD":{"PAGE_TITLE":"Passwort vergessen - Taiga","PAGE_DESCRIPTION":"Gib Dein Benutzernamen oder Deine E-Mail Adresse ein, um ein neues Passwort zu erhalten, und wieder auf Taiga zuzugreifen."},"FORGOT_PASSWORD_FORM":{"TITLE":"Huch, hast Du Dein Passwort vergessen?","SUBTITLE":"Gib Deinen Benutzernamen oder Deine E-Mail-Adresse ein, um einen neues zu erhalten.","PLACEHOLDER_FIELD":"Benutzername oder E-Mail-Adresse","ACTION_RESET_PASSWORD":"Passwort zurücksetzen","LINK_CANCEL":"Nein, bring mich zurück. Ich denke, ich erinnere mich daran.","SUCCESS_TITLE":"Prüfen Sie bitte Ihre Emails!","SUCCESS_TEXT":"Wir haben Ihnen eine Email mit den Anweisungen zum ändern Ihres Passworts geschickt","ERROR":"Laut unseren Helferlein sind Sie bislang noch nicht registriert."},"CHANGE_PASSWORD":{"PAGE_TITLE":"Ändere Dein Passwort - Taiga","SECTION_NAME":"Passwort ändern","FIELD_CURRENT_PASSWORD":"Aktuelles Passwort","PLACEHOLDER_CURRENT_PASSWORD":"Dein aktuelles Passwort (oder leer, wenn Du noch kein Passwort hast)","FIELD_NEW_PASSWORD":"Neues Passwort","PLACEHOLDER_NEW_PASSWORD":"Geben Sie ein neues Passwort ein","FIELD_RETYPE_PASSWORD":"Neues Passwort wiederholen","PLACEHOLDER_RETYPE_PASSWORD":"Wiederholen Sie das neue Passwort","ERROR_PASSWORD_MATCH":"Die Passwörter stimmen nicht überein"},"CHANGE_PASSWORD_RECOVERY_FORM":{"TITLE":"Erstellen Sie einen neues Passwort","SUBTITLE":"Und hey, es empfiehlt sich, mehr eisenreiche Nahrung zu sich zu nehmen - die ist gut für's Gehirn :P","PLACEHOLDER_NEW_PASSWORD":"Neues Passwort","PLACEHOLDER_RE_TYPE_NEW_PASSWORD":"Wiederholen Sie die Eingabe des neuen Passworts","ACTION_RESET_PASSWORD":"Passwort zurücksetzen","ERROR":"Unsere Helferelein haben Probleme deine Anfrage zum Zurücksetzen des Passworts zu finden. Probiere es einfach nochmal.","SUCCESS":"Unsere Helferlein haben das neue Passwort gespeichert.
    Hier gehts zum login."},"INVITATION":{"PAGE_TITLE":"Einladungs Annahme - Taiga","PAGE_DESCRIPTION":"Nehmen Sie die Einladung an und treten Sie einem Projekt in Taiga bei, einer Projekt-Management Plattform für Neugründer und agile Entwickler und Designer, die ein unkompliziertes und ansprechendes Tool möchten, das die Arbeit wirklich angenehm macht."},"INVITATION_LOGIN_FORM":{"NOT_FOUND":"Unsere Helferlein können deine Einladung nicht finden.","SUCCESS":"Sie sind diesem Projekt erfolgreich beigetreten. Herzlich willkommen bei {{project_name}}"},"HOME":{"PAGE_TITLE":"Home - Taiga","PAGE_DESCRIPTION":"Die Taiga Homepage mit Ihren wichtigsten Projekten und all Ihren zugeordneten und beobachteten User-Stories, Aufgaben und Tickets.","EMPTY_WORKING_ON":"Es sieht hier noch leer aus, oder? Beginne mit Taiga zu arbeiten und du wirst hier Storys, Tasks und Tickets an denen gearbeitet wird sehen.","EMPTY_WATCHING":"Folge User Stories, Tasks, Tickets in deinem Projekt und erhalte Benachrichtigungen, wenn sich etwas ändert. :)","EMPTY_PROJECT_LIST":"Sie haben noch keine Projekte","WORKING_ON_SECTION":"Zuletzt bearbeitet","WATCHING_SECTION":"Beobachtet","DASHBOARD":"Projekt Dashboard"},"EPICS":{"TITLE":"EPICS","SECTION_NAME":"Epics","EPIC":"EPIC","PAGE_TITLE":"Epics - {{projectName}}","PAGE_DESCRIPTION":"Die Liste der Epics dieses Projekts {{projectName}}: {{projectDescription}}","DASHBOARD":{"ADD":"+ EPIC HINZUFÜGEN","UNASSIGNED":"Nicht zugeordnet"},"EMPTY":{"TITLE":"Es sind noch keine Epics vorhanden","EXPLANATION":"Epics sind Elemente, die User-Stories umfassen.
    Sie stehen dabei an oberster Stelle in der Hierarchie und können dazu verwendet werden, User-Stories zu gruppieren.","HELP":"Erfahren Sie mehr über Epics"},"TABLE":{"VOTES":"Stimmen","NAME":"Name","PROJECT":"Projekt","SPRINT":"Sprint","ASSIGNED_TO":"Zugewiesen","STATUS":"Status","PROGRESS":"Fortschritt","VIEW_OPTIONS":"Zeige Optionen"},"CREATE":{"TITLE":"Neues Epic","PLACEHOLDER_DESCRIPTION":"Bitte beschreiben Sie dieses Epic zum leichteren Verständnis","TEAM_REQUIREMENT":"Team-Anforderung","CLIENT_REQUIREMENT":"Kunden-Anforderung","BLOCKED":"Blockiert","BLOCKED_NOTE_PLACEHOLDER":"Warum ist dieses Epic geblockt?","CREATE_EPIC":"Epic erzeugen"}},"PROJECTS":{"PAGE_TITLE":"Meine Projekte - Taiga","PAGE_DESCRIPTION":"Eine Liste mit all Deinen Projekten. Du kannst sie ordnen oder ein Neues anlegen.","MY_PROJECTS":"Meine Projekte"},"ATTACHMENT":{"SECTION_NAME":"Anhänge","TITLE":"{{ fileName }} hochgeladen am {{ date }}","LIST_VIEW_MODE":"List view mode","GALLERY_VIEW_MODE":"Gallery view mode","DESCRIPTION":"Geben Sie eine kurze Beschreibung ein","DEPRECATED":"verworfen","DEPRECATED_FILE":"Verwerfen?","ADD":"Neuen Anhang hinzufügen. {{maxFileSizeMsg}}","DROP":"Ziehe Anhänge hierher!","SHOW_DEPRECATED":"+ verworfene Anhänge zeigen","HIDE_DEPRECATED":"- verworfene Anhänge verbergen","COUNT_DEPRECATED":"({{ counter }} verworfen)","MAX_UPLOAD_SIZE":"Die maximale Dateigröße beträgt {{maxFileSize}}","DATE":"DD. MMM YYYY [um] hh:mm","ERROR_UPLOAD_ATTACHMENT":"Das Hochladen war uns nicht möglich '{{fileName}}'. {{errorMessage}}","TITLE_LIGHTBOX_DELETE_ATTACHMENT":"Anhang löschen...","MSG_LIGHTBOX_DELETE_ATTACHMENT":"der Anhang '{{fileName}}'","ERROR_DELETE_ATTACHMENT":"Es war uns nicht möglich, zu löschen: {{errorMessage}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) ist zu schwierig für unsere Helferlein, versuchen Sie es bitte mit einer kleineren Datei als ({{maxFileSize}})"},"PAGINATION":{"PREVIOUS":"Zurück","NEXT":"Weiter"},"ADMIN":{"COMMON":{"TITLE_ACTION_EDIT_VALUE":"Wert bearbeiten","TITLE_ACTION_DELETE_VALUE":"Wert löschen","TITLE_ACTION_DELETE_TAG":"Schlagwort löschen"},"HELP":"Wenn Sie Hilfe benötigen, besuchen Sie unsere Support-Seite!","PROJECT_DEFAULT_VALUES":{"TITLE":"Vorgabewerte","SUBTITLE":"Standardwerte für alle ausgewählten Eingaben setzen."},"MEMBERSHIPS":{"TITLE":"Mitglieder verwalten","PAGE_TITLE":"Mitgliedschaften - {{projectName}}","ADD_BUTTON":"+ Neues Mitglied","ADD_BUTTON_TITLE":"Neues Mitglied hinzufügen","LIMIT_USERS_WARNING_MESSAGE_FOR_ADMIN":"Leider hat dieses Projekt sein Limit von ({{members}}) Mitgliedern bereits erreicht","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"Dieses Projekt hat seine Grenze von ({{members}}) erlaubten Mitgliedern erreicht. Wenn Sie diese Grenze erhöhen möchten, kontaktieren Sie den Administrator."},"PROJECT_EXPORT":{"TITLE":"Exportieren","SUBTITLE":"Exportieren Sie Ihr Projekt, um ein Backup durchzuführen, oder ein neues, darauf basierendes, zu erstellen.","EXPORT_BUTTON":"Exportieren","EXPORT_BUTTON_TITLE":"Exportieren Sie Ihr Projekt","LOADING_TITLE":"Wir erzeugen die Exportdatei","DUMP_READY":"Ihre Export-Datei ist fertig!","LOADING_MESSAGE":"Bitte lassen Sie diese Seite geöffnet!","ASYNC_MESSAGE":"Wir werden nach Fertigstellung eine E-Mail senden.","SYNC_MESSAGE":"Wenn der Download nicht automatisch startet, klicken Sie hier.","ERROR":"Unsere Helferlein haben Probleme, Ihre Export-Datei zu erzeugen. Bitte versuchen Sie es erneut.","ERROR_BUSY":"Entschuldigung, unsere Helferlein sind zur Zeit sehr beschäftigt. Bitte versuchen Sie es in ein paar Minuten erneut."},"MODULES":{"TITLE":"Module","EPICS":"Epics","EPICS_DESCRIPTION":"Visualisieren und verwalten Sie den strategischsten Teil Ihres Projektes","BACKLOG":"Backlog","BACKLOG_DESCRIPTION":"Verwalten Sie Ihre User-Stories, um einen organisierten Überblick der anstehenden und priorisierten Aufgaben zu erhalten.","NUMBER_SPRINTS":"Erwartete Anzahl an Sprints","NUMBER_SPRINTS_HELP":"0 für eine unbestimmte Anzahl","NUMBER_US_POINTS":"Erwartete Gesamt-Story-Punkte","NUMBER_US_POINTS_HELP":"0 für eine unbestimmte Anzahl","KANBAN":"Kanban","KANBAN_DESCRIPTION":"Organisieren Sie Ihr Projekt auf übersichtliche Art.","ISSUES":"Tickets","ISSUES_DESCRIPTION":"Verfolgen Sie Fehler, Fragen und Verbesserungen, die mit Ihrem Projekt verbunden sind. Vermissen Sie nichts!","WIKI":"Wiki","WIKI_DESCRIPTION":"Fügen Sie Inhalte hinzu, ändern oder löschen Sie sie in Zusammenarbeit mit anderen. Dies ist der richtige Ort für Ihre Projektdokumentation.","MEETUP":"Zusammentreffen","MEETUP_DESCRIPTION":"Wähle Sie Ihr Videokonferenzsystem.","SELECT_VIDEOCONFERENCE":"Wählen Sie ein Videokonferenzsystem","SALT_CHAT_ROOM":"Fügen Sie ein Präfix für den Chatraum-Namen hinzu","JITSI_CHAT_ROOM":"Jitsi","APPEARIN_CHAT_ROOM":"Appear.in","TALKY_CHAT_ROOM":"Talky.io","CUSTOM_CHAT_ROOM":"Benutzerdefiniert","URL_CHAT_ROOM":"URL Ihres Chatrooms"},"PROJECT_PROFILE":{"PAGE_TITLE":"{{sectionName}} - Projekt Profil - {{projectName}}","PROJECT_DETAILS":"Projekt Details","PROJECT_NAME":"Projektname","TAGS":"Schlagwörter","DESCRIPTION":"Beschreibung","RECRUITING":"Auf der Suche nach Mitgliedern?","RECRUITING_MESSAGE":"Wen suchst du denn?","RECRUITING_PLACEHOLDER":"Define the profiles you are looking for","FEEDBACK":"Feedback von Taiga-Nutzern erhalten?","PUBLIC_PROJECT":"Öffentliches Projekt","PRIVATE_PROJECT":"Privates Projekt","PRIVATE_OR_PUBLIC":"Was ist der Unterschied zwischen öffentlichen und privaten Projekten?","DELETE":"Dieses Projekt löschen","CHANGE_LOGO":"Logo ändern","ACTION_USE_DEFAULT_LOGO":"Nutze Standardbild","MAX_PRIVATE_PROJECTS":"Sie haben die maximale Anzahl privater Projekte erreicht, die in Ihrem derzeitigen Plan erlaubt sind","MAX_PRIVATE_PROJECTS_MEMBERS":"Die maximale Anzahl von Mitgliedern für privater Projekte sind erreicht","MAX_PUBLIC_PROJECTS":"Leider haben Sie die maximale Anzahl öffentlicher Projekte erreicht, die in Ihrem derzeitigen Plan erlaubt sind","MAX_PUBLIC_PROJECTS_MEMBERS":"Die maximale Anzahl von Mitgliedern für öffentliche Projekte sind erreicht","PROJECT_OWNER":"Projekteigentümer","REQUEST_OWNERSHIP":"Besitz beantragen","REQUEST_OWNERSHIP_CONFIRMATION_TITLE":"Möchtest du der neue Projektleiter werden?","REQUEST_OWNERSHIP_DESC":"Anfrage vom derzeitigen Projektleiter {{name}}, die Leitung für dieses Projekt zu übernehmen.","REQUEST_OWNERSHIP_BUTTON":"Anfrage","REQUEST_OWNERSHIP_SUCCESS":"Wir werden den Projektleiter benachrichtigen","CHANGE_OWNER":"Ändere Besitzer","CHANGE_OWNER_SUCCESS_TITLE":"Ok, deine Anfrage wurde versendet!","CHANGE_OWNER_SUCCESS_DESC":"Wir informieren Sie via Email, ob sie als neuer Projektleiter akzeptiert wurden oder ob die Anfrage zurückgewiesen wurde."},"REPORTS":{"TITLE":"Berichte","SUBTITLE":"Exportieren Sie Ihre Projektdaten in CSV Format und erstellen Sie Ihre eigenen Berichte.","DESCRIPTION":"Laden Sie eine CSV-Datei herunter oder kopieren Sie die generierte URL und öffnen Sie sie in Ihrem Lieblingstexteditor oder Tabellenkalkulationsprogramm um Ihre eigenen Projektdaten Berichte zu erstellen. So können Sie Ihre Daten einfach visualisieren und analysieren.","HELP":"Wie kann ich dies in meiner eigenen Tabellenkalkulation nutzen?","REGENERATE_TITLE":"Die URL ändern","REGENERATE_SUBTITLE":"Sie sind im Begriff, die CSV data access URL zu ändern. Die vorherige URL wird deaktiviert. Sind Sie sicher?"},"CSV":{"SECTION_TITLE_EPIC":"Epics Berichte","SECTION_TITLE_US":"User-Stories Berichte","SECTION_TITLE_TASK":"Aufgabenberichte","SECTION_TITLE_ISSUE":"Ticket Berichte","DOWNLOAD":"CSV herunterladen","URL_FIELD_PLACEHOLDER":"Bitte erstellen Sie die CSV URL neu","TITLE_REGENERATE_URL":"Erstellen Sie die CSV URL neu","ACTION_GENERATE_URL":"URL erzeugen","ACTION_REGENERATE":"Neu erstellen"},"CUSTOM_FIELDS":{"TITLE":"Benutzerfelder","SUBTITLE":"Spezifizieren Sie die Benutzerfelder für Ihre User-Stories, Aufgaben und Tickets.","EPIC_DESCRIPTION":"Benutzerdefinierte Felder der Epics","EPIC_ADD":"Benutzerdefiniertes Feld bei Epics hinzufügen","US_DESCRIPTION":"Benutzerdefinierte Felder der User-Story","US_ADD":"Benutzerdefiniertes Feld bei User-Stories hinzufügen","TASK_DESCRIPTION":"Aufgaben benutzerdefinierte Felder","TASK_ADD":"Fügen Sie ein benutzerdefiniertes Feld bei Aufgaben hinzu","ISSUE_DESCRIPTION":"Tickets benutzerdefinierte Felder","ISSUE_ADD":"Fügen Sie den Tickets ein benutzerdefiniertes Feld hinzu","FIELD_TYPE_TEXT":"Text","FIELD_TYPE_RICHTEXT":"Rich Text","FIELD_TYPE_MULTI":"Mehrzeilig","FIELD_TYPE_DATE":"Datum","FIELD_TYPE_URL":"Url"},"PROJECT_VALUES":{"PAGE_TITLE":"{{sectionName}} - Projekt Werte - {{projectName}}","REPLACEMENT":"Alle Einträge mit diesem Wert werden geändert zu","ERROR_DELETE_ALL":"Sie dürfen nicht alle Werte löschen!"},"PROJECT_VALUES_POINTS":{"TITLE":"Punkte","SUBTITLE":"Bitte schätzen Sie die Punktzahl für Ihre User-Stories","US_TITLE":"User-Story Punkte","ACTION_ADD":"Neuen Punkt hinzufügen"},"PROJECT_VALUES_PRIORITIES":{"TITLE":"Prioritäten","SUBTITLE":"Legen Sie die Prioritäten Ihrer Tickets fest","ISSUE_TITLE":"Ticket Prioritäten","ACTION_ADD":"Neue Priorität hinzufügen"},"PROJECT_VALUES_SEVERITIES":{"TITLE":"Schweregrade","SUBTITLE":"Legen Sie die Gewichtung Ihrer Tickets fest","ISSUE_TITLE":"Ticket Gewichtung","ACTION_ADD":"Neue Gewichtung hinzufügen"},"PROJECT_VALUES_STATUS":{"TITLE":"Status","SUBTITLE":"Spezifizieren Sie die Status, die Ihre User-Stories, Aufgaben und Tickets durchlaufen werden.","EPIC_TITLE":"Epic Status","US_TITLE":"User-Story Status","TASK_TITLE":"Aufgaben-Status","ISSUE_TITLE":"Ticket-Status"},"PROJECT_VALUES_TYPES":{"TITLE":"Typen","SUBTITLE":"Spezifizieren Sie, welche Arten Ihre Tickets haben können","ISSUE_TITLE":"Ticketarten","ACTION_ADD":"Neu hinzufügen {{objName}}"},"PROJECT_VALUES_TAGS":{"TITLE":"Schlagwörter","SUBTITLE":"Farben der Tags anzeigen und verändern","EMPTY":"Zur Zeit sind keine Tags vorhanden","EMPTY_SEARCH":"Es sieht so aus, als konnte zu Ihren Suchkriterien nichts passendes gefunden werden.","ACTION_ADD":"Schlagwort hinzufügen","NEW_TAG":"Neuer Tag","MIXING_HELP_TEXT":"Wähle die Tags aus, die zu zusammenführen willst","MIXING_MERGE":"Tags zusammenführen","SELECTED":"Ausgewählt"},"ROLES":{"PAGE_TITLE":"Rollen - {{projectName}}","WARNING_NO_ROLE":"Beachten Sie, keine Rolle in Ihrem Projekt wird in der Lage sein, die Punktevergabe für User-Stories einzuschätzen.","HELP_ROLE_ENABLED":"Wenn Sie dies freischalten, werden Mitglieder, denen diese Rolle zugewiesen ist, in der Lage sein, die Punktevergabe für User-Stories vorzunehmen.","DISABLE_COMPUTABLE_ALERT_TITLE":"Bist du sicher, dass in dieser Rolle Estimatepoints deaktivieren möchtest?","DISABLE_COMPUTABLE_ALERT_SUBTITLE":"Wenn du die Estimatepoints für die Rolle {{roleName}} deaktivierst, werden alle bisherigen gelöscht","COUNT_MEMBERS":"{{ role.members_count }} Mitglieder mit dieser Rolle","TITLE_DELETE_ROLE":"Rolle löschen","REPLACEMENT_ROLE":"Alle Benutzer mit dieser Rolle werden verschoben nach","WARNING_DELETE_ROLE":"Achtung! Alle Rollenverteilungen werden entfernt.","ERROR_DELETE_ALL":"Sie können nicht alle Werte löschen","EXTERNAL_USER":"Externer Benutzer","NOTE_EXTERNAL_USERS":"Beachte:Mit Externen Benutzern meinen wir anonyme Benutzer, die nicht zur Taiga Plattform gehören, einschließlich Suchmaschinen. Bitte benutze diese Rolle mit Vorsicht."},"THIRD_PARTIES":{"SECRET_KEY":"Geheimschlüssel","PAYLOAD_URL":"Payload URL","VALID_IPS":"Gültige Quell-IPs (getrennt von ,)"},"BITBUCKET":{"SECTION_NAME":"Bitbucket","PAGE_TITLE":"Bitbucket - {{projectName}}","INFO_VERIFYING_IP":"Bitbucket Anfragen sind nicht signiert, daher ist der beste Weg die Quelle anhand der IP zu prüfen. Wenn das Feld leer bleibt, wird keine Prüfung der IP vorgenommen."},"GITLAB":{"SECTION_NAME":"Gitlab","PAGE_TITLE":"Gitlab - {{projectName}}","INFO_VERIFYING_IP":"Gitlab rAnfragen sind nicht signiert, daher ist der beste Weg die Quelle anhand der IP zu prüfen. Wenn das Feld leer bleibt, wird keine Prüfung der IP vorgenommen."},"GITHUB":{"SECTION_NAME":"GitHub","PAGE_TITLE":"GitHub - {{projectName}}"},"GOGS":{"SECTION_NAME":"Gogs","PAGE_TITLE":"Gogs - {{projectName}}"},"WEBHOOKS":{"PAGE_TITLE":"Webhooks - {{projectName}}","SECTION_NAME":"Webhooks","ADD_NEW":"Fügen Sie ein neues Webhook hinzu","TYPE_NAME":"Servicename...","TYPE_PAYLOAD_URL":"Geben Sie die Service Payload URL ein","TYPE_SERVICE_SECRET":"Sicherheitsschlüssel...","SAVE":"Webhook sichern","CANCEL":"Webhook beenden","SHOW_HISTORY":"(Chronik anzeigen)","TEST":"Webhook Test","EDIT":"Webhook bearbeiten","DELETE":"Webhook löschen","REQUEST":"Anfrage","RESEND_REQUEST":"Anfrage erneut senden","HEADERS":"Überschriften","PAYLOAD":"Ladung","RESPONSE":"Rückmeldung","DATE":"DD. MMM YYYY [um] hh:mm:ss","ACTION_HIDE_HISTORY":"(Chronik verbergen)","ACTION_HIDE_HISTORY_TITLE":"Chronik Details verbergen","ACTION_SHOW_HISTORY":"(Chronik anzeigen)","ACTION_SHOW_HISTORY_TITLE":"Chronik Details anzeigen","WEBHOOK_NAME":"Webhook '{{name}}'"},"CUSTOM_ATTRIBUTES":{"PAGE_TITLE":"{{sectionName}} - Kunden Attribute - {{projectName}}","ADD":"Benutzerdefiniertes Feld hinzufügen","EDIT":"Benutzerdefiniertes Feld bearbeiten","DELETE":"Benutzerdefiniertes Feld löschen","SAVE_TITLE":"Benutzerdefiniertes Feld speichern","CANCEL_TITLE":"Erstellung abbrechen","SET_FIELD_NAME":"Legen Sie den Namen Ihres benutzerdefinierten Feldes fest","SET_FIELD_DESCRIPTION":"Legen Sie Ihre Beschreibung für das benutzerdefinierte Feld fest","FIELD_TYPE_DEFAULT":"-- Bitte auswählen --","ACTION_UPDATE":"Benutzerdefiniertes Feld aktualisieren","ACTION_CANCEL_EDITION":"Bearbeitung abbrechen"},"MEMBERSHIP":{"COLUMN_MEMBER":"Mitglied","COLUMN_ADMIN":"Admin","COLUMN_ROLE":"Rolle","COLUMN_STATUS":"Status","STATUS_ACTIVE":"Aktiv","STATUS_PENDING":"Noch nicht erledigt","DELETE_MEMBER":"Mitglied löschen","RESEND":"Neu senden","SUCCESS_SEND_INVITATION":"Wir haben die Einladung erneut versandt an '{{email}}'.","SUCCESS_DELETE":"Gelöscht {{message}}.","ERROR_DELETE":"Das Löschen ist fehlgeschlagen {{message}}.","DEFAULT_DELETE_MESSAGE":"die Einladung an {{email}}"},"DEFAULT_VALUES":{"LABEL_EPIC_STATUS":"Standardwert für Epic Status","LABEL_US_STATUS":"Standardwert für Userstory Status","LABEL_POINTS":"Vorgegebener Wert für Punkteauswahl","LABEL_TASK_STATUS":"Vorgegebene Auswahl für den Aufgaben-Status","LABEL_ISSUE_TYPE":"Vorgegebener Wert für Ticketartauswahl","LABEL_ISSUE_STATUS":"Vorgegebene Auswahl für den Ticket-Status","LABEL_PRIORITY":"Vorgegebener Wert für Prioritätsauswahl","LABEL_SEVERITY":"Vorgegebener Wert für Gewichtungsauswahl"},"STATUS":{"PLACEHOLDER_WRITE_STATUS_NAME":"Benennen Sie den neuen Status"},"TYPES":{"PLACEHOLDER_WRITE_NAME":"Geben Sie dem neuen Element einen Namen"},"US_STATUS":{"ACTION_ADD_STATUS":"Neuen Status hinzufügen","IS_ARCHIVED_COLUMN":"Archiviert","IS_CLOSED_COLUMN":"Geschlossen","WIP_LIMIT_COLUMN":"WIP Limit","PLACEHOLDER_WRITE_NAME":"Benennen Sie den neuen Status"},"MENU":{"PROJECT":"Projekt","ATTRIBUTES":"Attribute","MEMBERS":"Mitglieder","PERMISSIONS":"Berechtigungen","INTEGRATIONS":"Integrationen"},"SUBMENU_PROJECT_VALUES":{"STATUS":"Status","POINTS":"Punkte","PRIORITIES":"Prioritäten","SEVERITIES":"Schweregrade","TYPES":"Typen","CUSTOM_FIELDS":"Benutzerdefinierte Felder","TAGS":"Schlagwörter"},"SUBMENU_ROLES":{"TITLE":"Rollen","ACTION_NEW_ROLE":"+ Neue Rolle","TITLE_ACTION_NEW_ROLE":"Neue Rolle hinzufügen"},"PROJECT_TRANSFER":{"DO_YOU_ACCEPT_PROJECT_OWNERNSHIP":"Möchten Sie der neue Projektleiter werden?","PRIVATE":"Privat","ACCEPTED_PROJECT_OWNERNSHIP":"Herzlichen Glückwunsch. Sie sind der neue Projektleiter.","REJECTED_PROJECT_OWNERNSHIP":"Ok, wir kontaktieren den aktuellen Projektleiter","ACCEPT":"Akzeptieren","REJECT":"Zurückweisen","PROPOSE_OWNERSHIP":"{{owner}}, der derzeitige Leiter des Projekts {{project}} hat Sie gefragt, ob Sie der neue Projektleiter werden möchten.","ADD_COMMENT":"Möchten Sie einen Kommentar für den Projektleiter hinzufügen?","UNLIMITED_PROJECTS":"Unbegrenzt","OWNER_MESSAGE":{"PRIVATE":"Bitte denken Sie daran, dass Sie bis zu {{maxProjects}} private Projekte besitzen können. Dezeit besitzen Sie {{currentProjects}} private Projekte","PUBLIC":"Bitte denken Sie daran, dass Sie bis zu {{maxProjects}} öffentliche Projekte besitzen können. Dezeit besitzen Sie {{currentProjects}} öffentliche Projekte"},"CANT_BE_OWNED":"Zur Zeit können Sie kein Projektleiter für diesen Projekt-Typ werden werden. Wenn Sie Projektleiter für dieses Projekt werden möchten, kontaktieren Sie bitte den Administrator, damit er Ihre Benutzerkonto-Einstellungen anpassen kann, um Projektleiter werden zu können."}},"USER":{"PROFILE":{"PAGE_TITLE":"{{userFullName}} (@{{userUsername}})","EDIT":"Profil ändern","CLOSED_US":"Geschlossene User-Story","PROJECTS":"Projekte","PROJECTS_EMPTY":"{{username}} besitzt noch keine Projekte","CONTACTS":"Kontakte","CONTACTS_EMPTY":"{{username}} hat noch keine Kontakte","CURRENT_USER_CONTACTS_EMPTY":"Sie haben noch keine Kontakte","CURRENT_USER_CONTACTS_EMPTY_EXPLAIN":"Die Leute, mit denen Sie auf Taiga zusammenarbeiten, werden automatisch zu Ihren Kontakten","TABS":{"ACTIVITY_TAB":"Zeitlinie","ACTIVITY_TAB_TITLE":"Alle Aktivitäten dieses Benutzers anzeigen","PROJECTS_TAB":"Projekte","PROJECTS_TAB_TITLE":"Liste alle Projekte auf, bei denen der Benutzer Mitglied ist","LIKES_TAB":"Likes","LIKES_TAB_TITLE":"Zeige alle Likes von diesem Benutzer","VOTES_TAB":"Stimmen","VOTES_TAB_TITLE":"Zeige alle Votes von diesem Nutzer","WATCHED_TAB":"Beobachtet","WATCHED_TAB_TITLE":"Zeige alle von diesem Nutzer beobachteten Items an","CONTACTS_TAB":"Kontakte","CONTACTS_TAB_TITLE":"Alle Kontakte dieses Buntzers anzeigen"}},"PROFILE_SIDEBAR":{"TITLE":"Dein Profil","DESCRIPTION":"Da andere Mitglieder sehen, dass sie ebenfalls an einem Projekt arbeiten wäre es schön, wenn Sie ein paar Informationen zu Ihrer Person angeben.","ADD_INFO":"Biographie bearbeiten"},"PROFILE_FAVS":{"FILTER_INPUT_PLACEHOLDER":"Geben sie etwas ein...","FILTER_TYPE_ALL":"Alle","FILTER_TYPE_ALL_TITLE":"Alle anzeigen","FILTER_TYPE_PROJECTS":"Projekte","FILTER_TYPE_PROJECTS_TITLE":"Nur Projekte anzeigen","FILTER_TYPE_EPICS":"Epics","FILTER_TYPE_EPICS_TITLE":"Nur Epics anzeigen","FILTER_TYPE_USER_STORIES":"Stories","FILTER_TYPE_USER_STORIES_TITLE":"Nur User-Stories anzeigen","FILTER_TYPE_TASKS":"Aufgaben","FILTER_TYPE_TASKS_TITLE":"Zeige nur Tasks","FILTER_TYPE_ISSUES":"Tickets","FILTER_TYPE_ISSUES_TITLE":"Nur Fehler anzeigen","EMPTY_TITLE":"Es sieht so aus, als wäre hier nichts."}},"PROJECT":{"PAGE_TITLE":"{{projectName}}","HELP":"Sortieren Sie Ihre Projekte nach Wichtigkeit.
    Die ersten 10 Projekte erscheinen prominent in der Projektliste der Navigationsleiste.","PRIVATE":"Privates Projekt","LOOKING_FOR_PEOPLE":"Dieses Projekt sucht nach Mitarbeitern","FANS_COUNTER_TITLE":"{total, plural, one{ein Fan} other{# Fans}}","WATCHERS_COUNTER_TITLE":"{total, plural, one{ein Beobachter} other{# Beobachter}}","MEMBERS_COUNTER_TITLE":"{total, plural, one{one member} other{# members}}","BLOCKED_PROJECT":{"BLOCKED":"Blockiertes Projekt","THIS_PROJECT_IS_BLOCKED":"Dieses Projekt ist vorrübergehend blockiert","TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF":"Um dein Projekt zu entsperren kontaktiere bitte einen Administrator."},"SECTION":{"SEARCH":"Suche","TIMELINE":"Zeitlinie","BACKLOG":"Backlog","KANBAN":"Kanban","ISSUES":"Tickets","WIKI":"Wiki","TEAM":"Team","MEETUP":"Zusammentreffen","ADMIN":"Administrator"},"NAVIGATION":{"ACTION_CREATE_PROJECT":"Projekt anlegen","MANAGE_PROJECTS":"Projekte verwalten","TITLE_CREATE_PROJECT":"Projekt anlegen","HELP_TITLE":"Taiga Support Seite","HELP":"Hilfe","HOMEPAGE":"Homepage","FEEDBACK_TITLE":"Feedback senden","FEEDBACK":"Feedback","NOTIFICATIONS_TITLE":"Benachrichtigungseinstellungen bearbeiten","NOTIFICATIONS":"Benachrichtigungen","VIEW_PROFILE_TITLE":"Profil ansehen","VIEW_PROFILE":"Profil ansehen","EDIT_PROFILE_TITLE":"Bearbeiten Sie Ihr Profil","EDIT_PROFILE":"Profil bearbeiten","CHANGE_PASSWORD_TITLE":"Passwort ändern","CHANGE_PASSWORD":"Passwort ändern","DASHBOARD_TITLE":"Dashboard","DISCOVER_TITLE":"Entdecke aktuelle Projekte","DISCOVER":"Entdecken"},"LIKE_BUTTON":{"LIKE":"Gefällt mir","LIKED":"Gefällt mir","UNLIKE":"Gefällt mir nicht mehr","BUTTON_TITLE":"Like oder Unlike dieses Projekt","COUNTER_TITLE":"{total, plural, one{ein Fan} other{# Fans}}"},"WATCH_BUTTON":{"BUTTON_TITLE":"Beobachte dieses Projekt und setze Benachrichtigungsregeln","WATCH":"Beobachten","WATCHING":"Beobachtet","COUNTER_TITLE":"{total, plural, one{ein Beobachter} other{# Beobachter}}","OPTIONS":{"NOTIFY_ALL":"Alle Benachrichtigungen empfangen","NOTIFY_ALL_TITLE":"Alle Benachrichtigungen für dieses Projekt anzeigen","NOTIFY_INVOLVED":"Nur Beteiligte","NOTIFY_INVOLVED_TITLE":"Erhalte Benachrichtigungen wenn du involviert bist","UNWATCH":"Nicht beobachten","UNWATCH_TITLE":"Nicht beobachten"}},"CONTACT_BUTTON":{"CONTACT_TITLE":"Kontaktiere das Projekt-Team","CONTACT_BUTTON":"Kontaktiere das Projekt"},"CREATE":{"TITLE":"Projekt erstellen","CHOOSE_TEMPLATE":"Welches Template passt am besten zu Ihrem Projekt?","TEMPLATE_SCRUM":"Scrum","TEMPLATE_SCRUM_DESC":"Priorisiere und löse deine Aufgaben in kurzen Zeitintervallen","TEMPLATE_SCRUM_LONGDESC":"Scrum is an iterative and incremental agile software development methodology for managing product development.\nThe product backlog is what will ultimately be delivered, ordered into the sequence in which it should be delivered. Product Backlogs are broken into manageable, executable chunks named sprints. Every certain amount of time the team initiates a new sprint and commits to deliver a certain number of user stories from the backlog, in accordance with their skills, abilities and resources. The project advances as the backlog becomes depleted.","TEMPLATE_KANBAN":"Kanban","TEMPLATE_KANBAN_DESC":"Halte einen konstanten Workflow bei unabhängigen Aufgaben","TEMPLATE_KANBAN_LONGDESC":"The Kanban methodology is used to divide project development (any sort of project) into stages.\nA kanban card is like an index card or post-it note that details every task (or user story) in a project that needs to be completed. The Kanban board is used to move each card from one state of completion to the next and in so doing, helps track progress.","DUPLICATE":"Projekt duplizieren","DUPLICATE_DESC":"Starte sauber und behalte Deine Konfiguration","IMPORT":"Projekt importieren","IMPORT_DESC":"Importiere Dein Projekt von verschiedenen Plattformen zu Taiga","INVITE":"Lade jemanden in dieses Projekt ein","SOLO_PROJECT":"Du bist alleine in diesem Projekt","INVITE_LATER":"(Später kannst du mehr Mitglieder einladen)","BACK":"Zurück","MAX_PRIVATE_PROJECTS":"Unfortunately, You've reached the maximum number of private projects.\nIf you would like to increase the current limit please contact the administrator.","MAX_PUBLIC_PROJECTS":"Unfortunately, You've reached the maximum number of public projects.\nIf you would like to increase the current limit please contact the administrator.","PUBLIC_PROJECT":"Öffentliches Projekt","PRIVATE_PROJECT":"Privates Projekt"},"COMMON":{"DETAILS":"Projekt Details","PROJECT_TITLE":"Projektname","PROJECT_DESCRIPTION":"Projekt-Beschreibung"},"DUPLICATE":{"TITLE":"Projekt duplizieren","DESCRIPTION":"Starte sauber und behalte Deine Konfiguration","SELECT_PLACEHOLDER":"Wähle ein bestehendes Projekt zum Duplizieren aus"},"IMPORT":{"TITLE":"Projekt importieren","DESCRIPTION":"Importiere Dein Projekt von verschiedenen Plattformen zu Taiga","ASYNC_IN_PROGRESS_TITLE":"Unsere Helferlein importieren Ihr Projekt","ASYNC_IN_PROGRESS_MESSAGE":"Dieser Vorgang könnte ein paar Minuten benötigen
    Nach Fertigstellung benachrichtigen wir Sie per E-Mail.","UPLOAD_IN_PROGRESS_MESSAGE":"Hochgeladen {{uploadedSize}} von {{totalSize}}","ERROR":"Unsere Helferlein haben Probleme beim Importieren Ihrer Daten. Bitte versuchen Sie es erneut.","ERROR_TOO_MANY_REQUEST":"Entschuldigung, unsere Helferlein sind zur Zeit sehr beschäftigt. Bitte versuchen Sie es in ein paar Minuten erneut.","ERROR_MESSAGE":"Unsere Helferlein haben Probleme beim Importieren Ihrer Datei: {{error_message}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) ist zu schwierig für unsere Helferlein, versuchen Sie es bitte mit einer kleineren Datei als ({{maxFileSize}})","SYNC_SUCCESS":"Ihr Projekt wurde erfolgreich importiert","IMPORT":"Importieren","WHO_IS":"Ihre Aufgaben werden zugewiesen an ...","WRITE_EMAIL":"Oder wenn du willst, schreibe die Email, welcher der User in Taiga benützt","SEARCH_CONTACT":"Oder such in deinen Kontakten, wenn du willst","WRITE_EMAIL_LABEL":"Schreibe eine Email, das dieser User Taiga benützt","ACCEEDE":"Acceede","PROJECT_MEMBERS":"Projektmitglieder","PROCESS_DESCRIPTION":"Sage uns, wem aus Taiga du die Aufgaben aus {{platform}} zuweisen möchtest","MATCH":"Ist {{user_external}} die selbe Person als {{user_internal}}?","CHOOSE":"Wähle User","LINKS":"Links mit {{platform}}","LINKS_DESCRIPTION":"Möchtest du den Link von jedem Item mit der originalen {{platform}} Informationen behalten?","WARNING_MAIL_USER":"Wenn der User keinen Taiga Account besitzt, können ihm keine Aufgaben zugewiesen werden","ASSIGN":"Zuweisen","PROJECT_SELECTOR":{"NO_RESULTS":"Es sieht so aus, als konnte zu Ihren Suchkriterien nichts passendes gefunden werden.","ACTION_SEARCH":"suche","ACTION_BACK":"Zurück"},"PROJECT_RESTRICTIONS":{"PROJECT_MEMBERS_DESC_PRIVATE":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per private project. If you would like to increase that limit please contact the administrator.","PROJECT_MEMBERS_DESC_PUBLIC":"Das Projekt, dass Sie importieren möchten, hat {{members}} Mitglieder. Leider erlaubt ihr derzeitiger Plan nicht mehr als {{max_memberships}} Mitglieder pro öffentlichen Projekt. Wenn Sie diese Grenze erhöhen möchten, kontaktieren Sie bitte den Administrator.","ACCOUNT_ALLOW_MEMBERS":"Dieser Account erlaubt nur {{members}} Mitglieder","PRIVATE_PROJECTS_SPACE":{"TITLE":"Leider erlaubt Ihr derzeitiger Plan keine weiteren privaten Projekte anzulegen.","DESC":"Das Projekt, das Sie versuchen zu importieren, ist privat. Leider erlaubt Ihr derzeitiger Plan keine weiteren privaten Projekte hinzuzufügen."},"PUBLIC_PROJECTS_SPACE":{"TITLE":"Leider erlaubt Ihr derzeitiger Plan keine weiteren öffentlichen Projekte anzulegen.","DESC":"Das Projekt, das Sie versuchen zu importieren, ist öffentlich. Leider erlaubt Ihr derzeitiger Plan keine weiteren öffentlichen Projekte hinzuzufügen."},"PRIVATE_PROJECTS_MEMBERS":{"TITLE":"Ihr derzeitiger Plan erlaubt maximal {{max_memberships}} Mitglieder pro privatem Projekt"},"PUBLIC_PROJECTS_MEMBERS":{"TITLE":"Ihr derzeitiger Plan erlaubt maximal {{max_memberships}} Mitglieder pro öffentlichem Projekt"},"PRIVATE_PROJECTS_SPACE_MEMBERS":{"TITLE":"Leider erlaubt Ihr derzeitiger Plan keine weiteren privaten Projekte anzulegen oder eine Erhöhung von mehr als {{max_memberships}} Mitglieder pro privatem Projekt","DESC":"Das Projekt, dass Sie importieren möchten, ist privat und hat {{members}} Mitglieder."},"PUBLIC_PROJECTS_SPACE_MEMBERS":{"TITLE":"Leider erlaubt Ihr derzeitiger Plan keine weiteren öffentlichen Projekte anzulegen oder eine Erhöhung von mehr als {{max_memberships}} Mitglieder pro öffentlichem Projekt","DESC":"Das Projekt, dass Sie importieren möchten, ist öffentlich und hat mehr als {{members}} Mitglieder."}},"IN_PROGRESS":{"TITLE":"Projekt importieren","DESCRIPTION":"Dieser Vorgang kann etwas dauern. Bitte schliessen Sie das Fenster nicht!"},"WARNING":{"TITLE":"Einige Tasks werden noch nicht zugewiesen","DESCRIPTION":"Es gibt immer noch nicht identifizierte Personen. Die Objekte, die diesen Personen zugewiesen sind, werden in Taiga nicht ohne Zuweisung erstellt. Überprüfe alle Kontakte, um Informationsverlust zu vermeiden","CHECK":"Überprüfe Kontakte"},"TAIGA":{"SELECTOR":"Importiere dein Taiga Projekt"},"TRELLO":{"SELECTOR":"Importiere Trello Projekt in Taiga","CHOOSE_PROJECT":"Wähle Board welches importiert werden soll","NO_PROJECTS":"Bist du sicher, dass du in Trello Boards besitzt "},"GITHUB":{"SELECTOR":"Importiere Github Projekt Issues","CHOOSE_PROJECT":"Finde das Projekt, welches du importieren möchtest","NO_PROJECTS":"Es scheint, als hättest du keinen Projekte in Github","HOW_DO_YOU_WANT_TO_IMPORT":"Wie willst du deine Probleme in Taiga importieren?","KANBAN_PROJECT":"Als Userstories in einem Kanban Projekt","KANBAN_PROJECT_DESCRIPTION":"Danach kannst du Scrum mit dem Backlog aktivieren","SCRUM_PROJECT":"Als Userstory in einem Scrum Projekt","SCRUM_PROJECT_DESCRIPTION":"Danach ist der Kanban Modus aktivierbar","ISSUES_PROJECT":"Als Ticket","ISSUES_PROJECT_DESCRIPTION":"Diese Tickets sind im Kanban oder Scrum Modus nicht verfügbar. Wenn neue Userstories angelegt werden, ist der Kanban oder Scrum Modus verfügbar "},"ASANA":{"SELECTOR":"Importiere dein Asana Projekt und entscheide, wie du es verwalten willst","CHOOSE_PROJECT":"Wähle das Projekt, welches importiert werden soll","NO_PROJECTS":"Es scheint, als hättest du keine Projekte in Asana","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","CREATE_AS_SCRUM_DESCRIPTION":"Die Aufgaben und Teilaufgaben von deinem Projekt werden als Taiga Userstories und Taiga Aufgaben erzeugt","CREATE_AS_KANBAN_DESCRIPTION":"Die Aufgaben und Teilaufgaben von deinem Projekt werden als Taiga Userstories und Taiga Aufgaben erzeugt"},"JIRA":{"SELECTOR":"Importiere dein Jira Projekt und entscheide, wie du es verwalten willst","HOW_TO_CONFIGURE":"(Konfigurationshilfe)","CHOOSE_PROJECT":"Wähle Projekt oder Board welches importiert werden soll","NO_PROJECTS":"Es scheint, dass keine Projekte oder Boards in Jira bestehen","URL":"Deine Jira URL","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","ISSUES_PROJECT":"Tickets","CREATE_AS_SCRUM_DESCRIPTION":"Die Tickets und Sub-Tickets von deinem Projekt werden als Taiga Userstories und Taiga Aufgaben erstellt","CREATE_AS_KANBAN_DESCRIPTION":"Die Tickets und Sub-Tickets von deinem Projekt werden als Taiga Userstories und Taiga Aufgaben erstellt","CREATE_AS_ISSUES_DESCRIPTION":"Was möchtest du mit den Sub-Tickets aus dem Jira Projekt tun? (Taiga erlaubt keine Sub-Tickets) ","CREATE_NEW_ISSUES":" Konvertiere Sub-Tickets zu neuen Taiga Tickets","NOT_CREATE_NEW_ISSUES":"Importiere keine Sub-Tickets"}}},"LIGHTBOX":{"DELETE_ACCOUNT":{"CONFIRM":"Sind Sie sicher, dass Sie Ihr Taiga Benutzerkonto löschen wollen?","CANCEL":"Zurück zu den Einstellungen","ACCEPT":"Benutzerkonto löschen","BLOCK_PROJECT":"Beachten Sie, dass alle Projekte die Sie besitzen, gesperrt werden, nachdem Sie Ihr Konto gelöscht haben. Wenn Sie möchten, dass Ihre Projekte nicht gesperrt werden, ernennen Sie ein anderes Mitglied zum Projektleiter für jedes Projekt, bevor Sie Ihr Konto löschen."},"DELETE_PROJECT":{"TITLE":"Projekt löschen","QUESTION":"Sind Sie sicher, dass Sie das Projekt löschen möchten?","SUBTITLE":"Sämtliche Projektdaten (User-Stories, Aufgaben, Tickets, Sprints und Wiki Seiten) werden verloren gehen! :-(","CONFIRM":"Ja, ich bin mir sicher"},"ASSIGNED_TO":{"SELECT":"Zuweisung auswählen","SEARCH":"Nach Benutzern suchen"},"ADD_MEMBER":{"TITLE":"Neues Mitglied","PLACEHOLDER":"Nach Nutzern suchen oder per E-Mail einladen","ADD_EMAIL":"E-Mail hinzufügen","REMOVE":"Entfernen","INVITE":"Einladen","CHOOSE_ROLE":"Rolle auswählen","PLACEHOLDER_INVITATION_TEXT":"(Optional) Fügen Sie einen persönlichen Text zur Einladung hinzu. Erzählen Sie Ihren neuen Mitgliedern etwas Schönes. ;-)","HELP_TEXT":"Wenn Benutzer schon bei Taiga registriert sind, werden diese automatisch hinzugefügt. Ansonsten erhalten sie eine Einladung."},"CREATE_ISSUE":{"TITLE":"Ticket hinzufügen"},"FEEDBACK":{"TITLE":"Erzählen Sie uns etwas...","COMMENT":"...einen Fehler, Anregungen, etwas Tolles... oder Ihren schlimmsten Alptraum mit Taiga.","ACTION_SEND":"Feedback senden"},"SEARCH":{"TITLE":"Suche","PLACEHOLDER_SEARCH":"Wonach suchen Sie?"},"ADD_EDIT_SPRINT":{"TITLE":"Neuer Sprint","PLACEHOLDER_SPRINT_NAME":"Sprint Bezeichnung","PLACEHOLDER_SPRINT_START":"Geschätzter Beginn","PLACEHOLDER_SPRINT_END":"Geschätztes Ende","ACTION_DELETE_SPRINT":"Möchten Sie diesen Sprint löschen?","TITLE_ACTION_DELETE_SPRINT":"Sprint löschen","LAST_SPRINT_NAME":"letzter Sprint ist {{lastSprint}} ;-) "},"CREATE_EDIT_TASK":{"TITLE":"Neue Aufgabe","PLACEHOLDER_SUBJECT":"Aufgaben Betreff","PLACEHOLDER_STATUS":"Aufgaben-Status","OPTION_UNASSIGNED":"Nicht zugeordnet","PLACEHOLDER_SHORT_DESCRIPTION":"Geben Sie eine kurze Beschreibung ein","ACTION_EDIT":"Aufgabe bearbeiten","CONFIRM_CLOSE":"Du hast deine Änderungen noch nicht gespeichert.\nBist du sicher, dass du dieses Formular schließen möchtest?"},"CREATE_EDIT_US":{"TITLE":"Neue User-Story","PLACEHOLDER_DESCRIPTION":"Fügen Sie bitte einen Beschreibungstext hinzu, um anderen diese User-Story näher zu erläutern","NEW_US":"Neue User-Story","EDIT_US":"User-Story bearbeiten","CONFIRM_CLOSE":"Du hast deine Änderungen noch nicht gespeichert.\nBist du sicher, dass du dieses Formular schließen möchtest?"},"DELETE_DUE_DATE":{"TITLE":"Fälligkeitsdatum löschen","SUBTITLE":"Bist du sicher, dass du dieses Fälligkeitsdatum löschen willst?"},"DELETE_SPRINT":{"TITLE":"Sprint löschen"},"CREATE_MEMBER":{"PLACEHOLDER_INVITATION_TEXT":"(Optional) Fügen Sie einen persönlichen Text zur Einladung hinzu. Erzählen Sie Ihren neuen Mitgliedern etwas Schönes. ;-)","PLACEHOLDER_TYPE_EMAIL":"Geben Sie eine E-Mail ein","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"Dieses Projekt erreicht bald die maximale Anzahl von {{maxMembers}} Mitgliedern. Wenn Sie diese Grenze erhöhen möchten, kontaktieren Sie bitte den Administrator.","LIMIT_USERS_WARNING_MESSAGE":"Dieses Projekt erreicht bald die maximale Anzahl von {{maxMembers}} Mitgliedern."},"LEAVE_PROJECT_WARNING":{"TITLE":"Das Projekt kann nicht ohne einen Projektleiter existieren.","CURRENT_USER_OWNER":{"DESC":"Du bist der aktuelle Besitzer dieses Projektes. Bitte übertrage den Besitzerstatus an jemand anderes bevor du das Projekt verlässt.","BUTTON":"Projektleiter wechseln"},"OTHER_USER_OWNER":{"DESC":"Leider können Sie das Mitglied nicht löschen, da es der derzeitige Projektleiter ist. Bitte ordnen Sie dem Projekt zuerst einen neuen Projektleiter zu.","BUTTON":"Antrag Projektleiter-Wechsel "}},"CHANGE_OWNER":{"TITLE":"Wen möchtest du zum neuen Projektleiter ernennen?","ADD_COMMENT":"Kommentar hinzufügen","BUTTON":"Fragen Sie dieses Projektmitglied, um Projektleiter zu werden"},"CONTACT_PROJECT":{"TITLE":"Sende eine E-Mail an","WARNING":"Die E-Mail wird von den Projekt-Administratoren empfangen","PLACEHOLDER":"Schreibe Deine Nachricht","SEND":"Senden"},"SET_DUE_DATE":{"TITLE":"Fälligkeitsdatum setzen","PLACEHOLDER_DUE_DATE":"Fälligkeitsdatum wählen","REASON_FOR_DUE_DATE":"Grund des Fälligkeitsdatums","PLACEHOLDER_REASON_FOR_DUE_DATE":"Wieso benötigt diese US ein Fälligkeitsdatum?","SUGGESTIONS":{"IN_ONE_WEEK":"In einer Woche","IN_TWO_WEEKS":"In zwei Wochen","IN_ONE_MONTH":"In einem Monat","IN_THREE_MONTHS":"In drei Monaten"},"TITLE_ACTION_DELETE_DUE_DATE":"Fälligkeitsdatum löschen"}},"EPIC":{"PAGE_TITLE":"{{epicSubject}} - Epic {{epicRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{epicStatus }}. Beschreibung: {{epicDescription}}","SECTION_NAME":"Epic","TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY":"Verknüpfung zur zugehören User-Story lösen","MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY":"Dies wird die Verknüpfung zur zugehörigen User-Story '{{subject}}' löschen","ERROR_UNLINK_RELATED_USERSTORY":"Die Verknüpfung konnte nicht gelöscht werden: {{errorMessage}}","CREATE_RELATED_USERSTORIES":"Erstelle eine Verbindung mit","NEW_USERSTORY":"Neue User-Story","EXISTING_USERSTORY":"Bestehende User-Story","CHOOSE_PROJECT_FOR_CREATION":"Welches Projekt?","SUBJECT":"Thema","SUBJECT_BULK_MODE":"Thema (Mehrfacheingaben möglich)","CHOOSE_PROJECT_FROM":"Welches Projekt?","CHOOSE_USERSTORY":"Beschreibe die Userstory","NO_USERSTORIES":"Dieses Projekt hat zurzeit keine User Stories. Bitte wähle ein anderes Projekt.","NO_USERSTORIES_FOUND":"Es sieht so aus, als konnte zu Ihren Suchkriterien nichts passendes gefunden werden.","FILTER_USERSTORIES":"User-Stories filter","LIGHTBOX_TITLE_BLOKING_EPIC":"Blocke Epic","ACTION_DELETE":"Epic löschen"},"US":{"PAGE_TITLE":"{{userStorySubject}} - User-Story {{userStoryRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{userStoryStatus }}. Abgeschlossen {{userStoryProgressPercentage}}% ({{userStoryClosedTasks}} von {{userStoryTotalTasks}} Aufgaben geschlossen). Punkte: {{userStoryPoints}}. Beschreibung: {{userStoryDescription}}","SECTION_NAME":"User-Story","LINK_TASKBOARD":"Taskboard","TITLE_LINK_TASKBOARD":"Zu Taskboard wechseln","TOTAL_POINTS":"Gesamtpunkte","ADD":"+ Neue User-Story anlegen","ADD_BULK":"Mehrere neue User-Stories hinzufügen","PROMOTED":"Diese User-Story entstand aus Ticket:","TITLE_LINK_GO_TO_ISSUE":"Zum Ticket wechseln","TITLE_DELETE_ACTION":"User-Story löschen","LIGHTBOX_TITLE_BLOKING_US":"Blockiert uns","NOT_ESTIMATED":"Nicht eingeschätzt","OWNER_US":"Userstory gehört","TRIBE":{"PUBLISH":"Als Gig in Taiga Tribe veröffentlichen","PUBLISH_INFO":"Weitere Infos","PUBLISH_TITLE":"Mehr Infos zum Veröffentlichen in Taiga Tribe","PUBLISHED_AS_GIG":"Story veröffentlicht als Gig in Taiga Tribe","EDIT_LINK":"Link bearbeiten","CLOSE":"Schließen","SYNCHRONIZE_LINK":"mit Taiga Tribe synchronisieren","PUBLISH_MORE_INFO_TITLE":"Brauchen Sie jemanden für diese Aufgabe?","PUBLISH_MORE_INFO_TEXT":"

    If you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

    TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

    "},"FIELDS":{"TEAM_REQUIREMENT":"Team Anforderung","CLIENT_REQUIREMENT":"Kundenanforderung"}},"COMMENTS":{"DELETED_INFO":"Kommentar gelöscht von {{user}}","COMMENTS_COUNT":"{{comments}} Kommentare","OLDER_FIRST":"Ältere zuerst","RECENT_FIRST":"Letzte zuerst","COMMENT":"Kommentieren","EDITED_COMMENT":"Bearbeitet:","SHOW_HISTORY":"Verlauf anzeigen","TYPE_NEW_COMMENT":"Geben Sie hier einen neuen Kommentar ein","SHOW_DELETED":"Gelöschten Kommentar anzeigen","HIDE_DELETED":"Gelöschten Kommentar ausblenden","DELETE":"Kommentar löschen","RESTORE":"Kommentar wiederherstellen","HISTORY":{"TITLE":"Aktivität"}},"ACTIVITY":{"TITLE":"Aktivität","ACTIVITIES_COUNT":"{{activities}} Aktivitäten","TAGS_ADDED":"Tags hinzugefügt:","TAGS_REMOVED":"Tags entfernt:","US_POINTS":"{{role}} points","NEW_ATTACHMENT":"neuer Anhang:","DELETED_ATTACHMENT":"gelöschter Anhang:","UPDATED_ATTACHMENT":"Anhang aktualisiert ({{filename}}):","CREATED_CUSTOM_ATTRIBUTE":"benutzerdefiniertes Attribut erstellt","UPDATED_CUSTOM_ATTRIBUTE":"benutzerdefiniertes Attribut aktualisiert","BECAME_DEPRECATED":"wurde verworfen","BECAME_UNDEPRECATED":"ist wieder aktuell","TEAM_REQUIREMENT":"Team Anforderung","CLIENT_REQUIREMENT":"Kundenanforderung","BLOCKED":"Blockiert","VALUES":{"NOT_SET":"nicht gesetzt","UNASSIGNED":"nicht zugeordnet"},"FIELDS":{"SUBJECT":"Thema","DESCRIPTION":"Beschreibung","PRIORITY":"Priorität","SEVERITY":"Gewichtung","STATUS":"Status","TYPE":"Typen","ASSIGNED_TO":"zugewiesen an","ASSIGNED_USERS":"Zugewiesener Benutzer","DUE_DATE":"Fälligkeitsdatum","MILESTONE":"Sprint","COLOR":"Farbe"}},"BACKLOG":{"PAGE_TITLE":"Backlog - {{projectName}}","PAGE_DESCRIPTION":"Das Backlog-Panel mit User-Stories und Sprints des Projekts. {{projectName}}: {{projectDescription}}","SECTION_NAME":"Backlog","CUSTOMIZE_GRAPH":"Personalisiere deinen Backloggraph","CUSTOMIZE_GRAPH_TEXT":"Um schöne Graphen, die Dir bei der Entwicklung Deines Projekts helfen, zu sehen, musst du Estimatepoints und Sprints einstellen","CUSTOMIZE_GRAPH_ADMIN":"Administrator","CUSTOMIZE_GRAPH_TITLE":"Stelle Points und Sprints über das Adminpanel ein","MOVE_US_TO_CURRENT_SPRINT":"Zum aktuellen Sprint wechseln","MOVE_US_TO_LATEST_SPRINT":"Zum aktuellen Sprint wechseln.","EMPTY":"Das Backlog ist leer!","CREATE_NEW_US":"Eine neue User-Story anlegen","CREATE_NEW_US_EMPTY_HELP":"Sie sollten eine User-Story anlegen","EXCESS_OF_POINTS":"Punkte Überschuss","PENDING_POINTS":"Unerledigte Punkte","CLOSED_POINTS":"geschlossen","COMPACT_SPRINT":"Kompakt Sprint","GO_TO_TASKBOARD":"Gehen Sie zum Taskboard von {{::name}}","EDIT_SPRINT":"Sprint bearbeiten","TOTAL_POINTS":"insgesamt","STATUS_NAME":"Status Bezeichnung","SORTABLE_FILTER_ERROR":"Es ist kein Drag & Drop über dem Backlog möglich, wenn Filter geöffnet sind.","DOOMLINE":"Projekt Umfang [Doomline]","CHART":{"XAXIS_LABEL":"Sprints","YAXIS_LABEL":"Punkte","OPTIMAL":"Optimale unerledigte Punkte für Sprint \"{{sprintName}}\" sollten sein {{value}}","REAL":"Tatsächliche Anzahl unerledigter Punkte für Sprint \"{{sprintName}}\" ist {{value}}","INCREMENT_TEAM":"Erhöhte Punktezahl von Teamanfragen für Sprint \"{{sprintName}}\" ist {{value}}","INCREMENT_CLIENT":"Erhöhte Punkteanzahl von Kundenanfragen für Sprint \"{{sprintName}}\" ist {{value}}"},"TAGS":{"TOGGLE":"Sichtbarkeit des Schlagwortes umschalten","SHOW":"Schlagwörter anzeigen","HIDE":"Schlagwörter ausblenden"},"FORECASTING":{"TITLE":"Velocity Vorhersage","BACKLOG":"Backlog anzeigen","NEW_SPRINT":"Candidate User Stories for your next sprint based on your velocity. Click to create a new sprint.","CURRENT_SPRINT":"Candidate User Stories for your sprint based on your velocity. Click to add to current sprint."},"TABLE":{"COLUMN_US":"User-Stories","TITLE_COLUMN_POINTS":"Ansicht mittels Rolle auswählen"},"SPRINT_SUMMARY":{"TOTAL_POINTS":"gesamte
    Punkte","COMPLETED_POINTS":"vollständige
    Punkte","OPEN_TASKS":"offene
    Aufgaben","CLOSED_TASKS":"geschlossene
    Aufgaben","IOCAINE_DOSES":"Iocaine
    Dosen","SHOW_STATISTICS_TITLE":"Statistik anzeigen","TOGGLE_BAKLOG_GRAPH":"Zeige/Verstecke Burndowngraph","POINTS_PER_ROLE":"Points pro Rolle"},"SUMMARY":{"PROJECT_POINTS":"Projekt
    Punkte","DEFINED_POINTS":"definierte
    Punkte","CLOSED_POINTS":"geschlossene
    Punkte","POINTS_PER_SPRINT":"Punkte /
    Sprint"},"FILTERS":{"TOGGLE":"Filter sichtbar schalten","HIDE":"Filter verbergen","SHOW":"Filter anzeigen"},"SPRINTS":{"TITLE":"SPRINTS","DATE":"DD. MMM YYYY","LINK_TASKBOARD":"Sprint Taskboard","TITLE_LINK_TASKBOARD":"Gehe zu Taskboard von \"{{name}}\"","EMPTY":"Derzeit sind keine Sprints vorhanden","WARNING_EMPTY_SPRINT_ANONYMOUS":"Dieser Sprint enthält keiner User Stories","WARNING_EMPTY_SPRINT":"Ziehe Stories aus deinem Backlog hierher, um einen neuen Sprint zu starten","TITLE_ACTION_NEW_SPRINT":"Neuen Sprint hinzufügen","TEXT_ACTION_NEW_SPRINT":"Du möchtest einen neuen Sprint in Deinem Projekt erstellen","ACTION_SHOW_CLOSED_SPRINTS":"Geschlossene Sprints anzeigen","ACTION_HIDE_CLOSED_SPRINTS":"Geschlossene Sprints ausblenden"}},"ERROR":{"TEXT1":"Es gibt ein Problem und unsere Helferlein arbeiten schon daran!","NOT_FOUND":"Nicht gefunden","NOT_FOUND_TEXT":"Fehler 404. Die angeforderte Seite existiert nicht mehr. Möglicherweise finden Sie das Gesuchte, wenn Sie zur TAIGA Homepage zurückkehren.","PERMISSION_DENIED":"Berechtigung verweigert","PERMISSION_DENIED_TEXT":"Sie haben nicht die Berechtigung um auf diese Seite zuzugreifen","VERSION_ERROR":"Jemand anderes hat dies schon geändert und unsere Helferlein können Ihre Änderungen deshalb nicht übernehmen. Bitte laden Sie die Seite neu und machen Sie die Änderungen erneut (die aktuelle Eingabe geht dabei verloren)."},"TASKBOARD":{"PAGE_TITLE":"{{sprintName}} - Sprint Taskboard - {{projectName}}","PAGE_DESCRIPTION":"Sprint {{sprintName}} (von {{startDate}} zu {{endDate}}) von {{projectName}}. Abgeschlossen {{completedPercentage}}% ({{completedPoints}} von {{totalPoints}} points). {{openTasks}} offene Aufgaben von {{totalTasks}}.","SECTION_NAME":"Taskboard","TITLE_ACTION_ADD":"Neue Aufgabe hinzufügen","TITLE_ACTION_ADD_BULK":"Mehrere Aufgaben hinzufügen","TITLE_ACTION_ASSIGN":"Aufgabe zuweisen","PLACEHOLDER_CARD_TITLE":"Das könnte ein Task sein","PLACEHOLDER_CARD_TEXT":"Teile Stories in Tasks auf um sie einzeln zu verfolgen","TABLE":{"COLUMN":"User-Story","TITLE_ACTION_FOLD":"Spalte einklappen","TITLE_ACTION_UNFOLD":"Spalte aufklappen","TITLE_ACTION_FOLD_ROW":"Reihe einklappen","TITLE_ACTION_UNFOLD_ROW":"Reihe aufklappen","FIELD_POINTS":"Punkte","ROW_UNASSIGED_TASKS_TITLE":"Nicht zugeordnete Aufgaben"},"CHARTS":{"XAXIS_LABEL":"Tage","YAXIS_LABEL":"Punkte","OPTIMAL":"Optimale unerledigte Punkte für Tag {{formattedDate}} sollten sein {{roundedValue}}","REAL":"Tatsächliche Anzahl unerledigter Punkte für Tag {{formattedDate}} ist {{roundedValue}}","DATE":"DD. MMMM YYYY"}},"TASK":{"PAGE_TITLE":"{{taskSubject}} - Aufgabe {{taskRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{taskStatus }}. Beschreibung: {{taskDescription}}","SECTION_NAME":"Aufgabe","LINK_TASKBOARD":"Taskboard","TITLE_LINK_TASKBOARD":"Zu Taskboard wechseln","PLACEHOLDER_SUBJECT":"Betreff...","TITLE_SELECT_STATUS":"Status Bezeichnung","OWNER_US":"Diese Aufgabe gehört zu","TITLE_LINK_GO_OWNER":"Zur User-Story wechseln","TITLE_DELETE_ACTION":"Aufgabe löschen","LIGHTBOX_TITLE_BLOKING_TASK":"Blockierende Aufgabe","FIELDS":{"IS_IOCAINE":"Ist Iocaine"},"TITLE_ACTION_IOCAINE":"Fühlen Sie sich von einer Aufgabe etwas erdrückt? Stellen Sie sicher, dass andere davon erfahren, indem Sie auf Locaine klicken, wenn Sie eine Aufgabe ändern. Es ist möglich, gegen dieses (fiktive) tödliche Gift immun zu werden, indem man kleine Mengen über einen Zeitraum hinweg einnimmt. Genauso, wie es möglich ist, besser in dem zu werden, was man tut, indem man gelegentlich zusätzliche Herausforderungen annimmt!"},"NOTIFICATION":{"OK":"Alles in Ordnung","WARNING":"Huch, es gibt ein Problem...","WARNING_TEXT":"Unsere Helferlein bedauern, Ihre Änderungen wurden nicht gespeichert!","SAVED":"Die Helferlein haben Ihre Änderungen gespeichert!","CLOSE":"Benachrichtigung schließen","MAIL":"Benachrichtigungen per Mail","DESKTOP":"Desktopbenachrichtigung mittels Browserbenachtichtigung","ASK_DELETE":"Möchten Sie wirklich löschen?"},"CANCEL_ACCOUNT":{"TITLE":"Ihr Benutzerkonto löschen","SUBTITLE":"Wir bedauern, dass Sie die Taiga verlassen. Wir hoffen, Sie hatten einen angenehmen Aufenthalt. :)","PLACEHOLDER_INPUT_TOKEN":"Benutzerkonto Token ungültig machen","ACTION_LEAVING":"Ja, ich gehe!","SUCCESS":"Unsere Helferlein haben Ihr Benutzerkonto entfernt."},"CHANGE_EMAIL_FORM":{"TITLE":"Ändern Sie Ihre E-Mail","SUBTITLE":"Noch ein Klick und Ihre E-Mail wird aktualisiert!","PLACEHOLDER_INPUT_TOKEN":"E-Mail-Token ändern","ACTION_CHANGE_EMAIL":"E-Mail ändern","SUCCESS":"Unsere Helferlein haben Ihre E-Mail-Adresse aktualisiert"},"ISSUES":{"PAGE_TITLE":"Tickets - {{projectName}}","PAGE_DESCRIPTION":"Das Ticket-Listen Panel des Projekts {{projectName}}: {{projectDescription}}","SECTION_NAME":"Ticket","ACTION_NEW_ISSUE":"+ NEUES TICKET","ACTION_PROMOTE_TO_US":"Zur User-Story aufwerten","PROMOTED":"Dieses Ticket wurde aufgewertet zu User-Story:","EXTERNAL_REFERENCE":"Dieses Ticket wurde erstellt durch","GO_TO_EXTERNAL_REFERENCE":"Zur Quelle wechseln","ACTION_DELETE":"Ticket löschen","LIGHTBOX_TITLE_BLOKING_ISSUE":"Blockierendes Ticket","FIELDS":{"PRIORITY":"Priorität","SEVERITY":"Gewichtung","TYPE":"Arten"},"CONFIRM_PROMOTE":{"TITLE":"Dieses Problem zur User-Story aufwerten","MESSAGE":"Sind Sie sicher, dass Sie aus diesem Ticket eine neue User-Story erstellen möchten?"},"TABLE":{"COLUMNS":{"TYPE":"Arten","SEVERITY":"Gewichtung","PRIORITY":"Priorität","SUBJECT":"Thema","VOTES":"Stimmen","STATUS":"Status","CREATED":"Erstellt","ASSIGNED_TO":"Zugeordnet"},"TITLE_ACTION_CHANGE_STATUS":"Status wechseln","TITLE_ACTION_ASSIGNED_TO":"Zugeordnet zu","BLOCKED":"Blockiert","EMPTY":{"TITLE":"Es gibt keine Probleme zu berichten :-)","SUBTITLE":"Haben Sie ein Problem gefunden?"}}},"ISSUE":{"PAGE_TITLE":"{{issueSubject}} - Ticket {{issueRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{issueStatus }}. Typ: {{issueType}}, Priorität: {{issuePriority}}. Gewichtung: {{issueSeverity}}. Beschreibung: {{issueDescription}}"},"KANBAN":{"PAGE_TITLE":"Kanban - {{projectName}}","PAGE_DESCRIPTION":"Das Kanban Panel, mit User-Stories des Projekts {{projectName}}: {{projectDescription}}","SECTION_NAME":"Kanban","TITLE_ACTION_FOLD":"Seite einklappen","TITLE_ACTION_UNFOLD":"Spalte aufklappen","TITLE_ACTION_ADD_US":"Neue User-Story hinzufügen","TITLE_ACTION_ADD_BULK":"Neue Menge hinzufügen","ACTION_SHOW_ARCHIVED":"Archivierte anzeigen","ACTION_HIDE_ARCHIVED":"Archivierte verbergen","HIDDEN_USER_STORIES":"Die User-Stories in diesem Status werden automatisch verborgen","PLACEHOLDER_CARD_TITLE":"Dies sind deine User Stories","PLACEHOLDER_CARD_TEXT":"Stories können Unteraufgaben für weitere Anforderungen haben"},"SEARCH":{"PAGE_TITLE":"Suche - {{projectName}}","PAGE_DESCRIPTION":"Suchen Sie User-Stories, Tickets, Aufgaben oder Wiki Seiten im Projekt {{projectName}}: {{projectDescription}}","FILTER_EPICS":"Epics","FILTER_USER_STORIES":"User-Stories","FILTER_ISSUES":"Tickets","FILTER_TASKS":"Aufgaben","FILTER_WIKI":"Wiki Seiten","PLACEHOLDER_SEARCH":"Suchen in...","TITLE_ACTION_SEARCH":"suchen","EMPTY_TITLE":"Es sieht so aus, als könnte unter Ihren Suchkriterien nichts gefunden werden.","EMPTY_DESCRIPTION":"Vielleicht versuchen Sie es mit einem der oberen Reiter, oder Sie suchen erneut"},"TEAM":{"PAGE_TITLE":"Team - {{projectName}}","PAGE_DESCRIPTION":"Das Team Panel, um alle Mitglieder des Projekts anzuzeigen {{projectName}}: {{projectDescription}}","SECTION_NAME":"Team","PLACEHOLDER_INPUT_SEARCH":"Unter Anzeigenamen suchen...","COLUMN_MR_WOLF":"Herr Wolf","EXPLANATION_COLUMN_MR_WOLF":"Geschlossene Tickets","COLUMN_IOCAINE":"Locaine Trinker","EXPLANATION_COLUMN_IOCAINE":"Locaine Dosen eingenommen","COLUMN_CERVANTES":"Cervantes","EXPLANATION_COLUMN_CERVANTES":"Wiki Seiten geändert","COLUMN_BUG_HUNTER":"Bug-Jäger","EXPLANATION_COLUMN_BUG_HUNTER":"Gemeldete Tickets","COLUMN_NIGHT_SHIFT":"Nachtschicht","EXPLANATION_COLUMN_NIGHT_SHIFT":"Aufgaben geschlossen","COLUMN_TOTAL_POWER":"Gesamtleistung","EXPLANATION_COLUMN_TOTAL_POWER":"Punktesumme","SECTION_TITLE_TEAM":"Team >","SECTION_FILTER_ALL":"Alle","CONFIRM_LEAVE_PROJECT":"Sind Sie sicher, dass Sie das Projekt verlassen möchten?","ACTION_LEAVE_PROJECT":"Das Projekt verlassen"},"USER_SETTINGS":{"AVATAR_MAX_SIZE":"[Max. Größe: {{maxFileSize}}]","MENU":{"SECTION_TITLE":"Benutzereinstellungen","USER_PROFILE":"Benutzerprofil","CHANGE_PASSWORD":"Passwort ändern","EMAIL_NOTIFICATIONS":"E-Mail Benachrichtigungen","DESKTOP_NOTIFICATIONS":"Desktopbenachrichtigungen"},"NOTIFICATIONS":{"LIVE_SECTION_NAME":"Desktopbenachrichtigungen","SECTION_NAME":"E-Mail-Benachrichtigungen","COLUMN_PROJECT":"Projekt","COLUMN_RECEIVE_ALL":"Alle erhalten","COLUMN_ONLY_INVOLVED":"Nur Einbezogene","COLUMN_NO_NOTIFICATIONS":"Keine Benachrichtigungen","OPTION_ALL":"Alle","OPTION_INVOLVED":"Beteiligt","OPTION_NONE":"Keine"}},"USER_PROFILE":{"ACTION_USE_GRAVATAR":"Standardbild verwenden","ACTION_DELETE_ACCOUNT":"Ihr Taiga Benutzerkonto löschen","ACTION_DOWNLOAD_PROFILE":"Taiga Profil herunterladen","CHANGE_EMAIL_SUCCESS":"Sehen Sie in Ihren Posteingang!
    Wir haben eine E-Mail an Ihr Konto gesendet
    mit der Anleitung, wie Sie Ihre neue Adresse anlegen","CHANGE_PHOTO":"Foto ändern","FIELD":{"USERNAME":"Benutzername","EMAIL":"E-Mail","FULL_NAME":"Anzeigename","PLACEHOLDER_FULL_NAME":"Geben Sie Ihren Anzeigenamen an (z.B. Vorname Nachname)","BIO":"Bio (max. 210 Zeichen)","PLACEHOLDER_BIO":"Erzählen Sie etwas über sich","LANGUAGE":"Sprache","LANGUAGE_DEFAULT":"-- benutzen Sie eine vorgegebene Sprache --","THEME":"Theme","THEME_DEFAULT":"-- Standard-Theme benutzen --"}},"WIKI":{"PAGE_TITLE":"{{wikiPageName}} - Wiki - {{projectName}}","PAGE_DESCRIPTION":"Letzte Bearbeitung am {{lastModifiedDate}} ({{totalEditions}} Gesamtzahl der Bearbeitungen) Inhalt: {{ wikiPageContent }}","DATETIME":"DD MMM YYYY HH:mm","REMOVE":"Diese Wiki Seite entfernen","DELETE_LIGHTBOX_TITLE":"Wiki Seite löschen","DELETE_LINK_TITLE":"Entferne Wiki Link","NAVIGATION":{"HOME":"Hauptseite","SECTION_NAME":"BOOKMARKS","ACTION_ADD_LINK":"Bookmark hinzufügen","ALL_PAGES":"Alle Wiki-Seiten"},"SUMMARY":{"TIMES_EDITED":"mal
    bearbeitet","LAST_EDIT":"letzte
    Bearbeitung","LAST_MODIFICATION":"letzte Änderung"},"SECTION_PAGES_LIST":"Alle Seiten","PAGES_LIST_COLUMNS":{"TITLE":"Titel","EDITIONS":"Ausgaben","CREATED":"Erstellt","MODIFIED":"Geändert","CREATOR":"Ersteller","LAST_MODIFIER":"Letzter Bearbeiter"}},"HINTS":{"SECTION_NAME":"Hinweis","LINK":"Mehr dazu auf unserer Support Seite","LINK_TITLE":"Besuchen Sie unsere Support Seite","HINT1_TITLE":"Wussten Sie, dass Sie Projekte importieren und exportieren?","HINT1_TEXT":"Dies erlaubt Ihnen, alle Ihre Daten zu extrahieren und sie von einer Taiga zur nächsten zu transportieren","HINT2_TITLE":"Wussten Sie, dass Sie benutzerdefinierte Felder erstellen können?","HINT2_TEXT":"Teams können nun benutzerdefinierte Felder anlegen, um Werte einzugeben, die für Ihren Workflow wichtig sind.","HINT3_TITLE":"Sortiere Deine Projekte, um Dir vor allem die anzuzeigen, die relevant für Dich sind.","HINT3_TEXT":"Die 10 Projekt sind in der Zugriffsleiste am oberen Bildschirmrand aufgelistet.","HINT4_TITLE":"Did you forget what were you working on?","HINT4_TEXT":"Machen Sie sich keine Sorgen, im Dashboard finden Sie Aufgaben, Tickets und User-Stories in der Reihenfolge in der Sie diese bearbeitet haben."},"TIMELINE":{"UPLOAD_ATTACHMENT":"{{username}} fügte {{obj_name}} einen neuen Anhang zu","US_CREATED":"{{username}} erstellte die neue User-Story {{obj_name}} in {{project_name}}","ISSUE_CREATED":"{{username}} erstellte das neue Ticket {{obj_name}} in {{project_name}}","TASK_CREATED":"{{username}} erstellte die neue Aufgabe {{obj_name}} in {{project_name}}","TASK_CREATED_WITH_US":"{{username}} erstellte die neue Aufgabe {{obj_name}} in {{project_name}}, die zur User-Story {{us_name}} gehört","WIKI_CREATED":"{{username}} erstellte die neue Wiki Seite {{obj_name}} in {{project_name}}","MILESTONE_CREATED":"{{username}} erstellte den neuen Sprint {{obj_name}} in {{project_name}}","EPIC_CREATED":"{{username}} hat einen neuen Epic {{obj_name}} in {{project_name}} erstellt","EPIC_RELATED_USERSTORY_CREATED":"{{username}} hat die Userstory {{related_us_name}} mit der Epic {{epic_name}} im Projekt {{project_name}} verbunden","NEW_PROJECT":"{{username}} erstellte das Projekt {{project_name}}","MILESTONE_UPDATED":"{{username}} aktualisierte den Sprint {{obj_name}}","US_UPDATED":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der User-Story {{obj_name}}","US_UPDATED_WITH_NEW_VALUE":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der User-Story {{obj_name}} zu {{new_value}}","US_UPDATED_POINTS":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Story {{obj_name}} zu {{new_value}}","ISSUE_UPDATED":"{{username}} aktualisierte das Attribut \"{{field_name}}\" des Tickets {{obj_name}}","ISSUE_UPDATED_WITH_NEW_VALUE":"{{username}} aktualisierte das Attribut \"{{field_name}}\" des Tickets {{obj_name}} zu {{new_value}}","TASK_UPDATED":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Aufgabe {{obj_name}} zu {{new_value}}","TASK_UPDATED_WITH_NEW_VALUE":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Aufgabe {{obj_name}} zu {{new_value}}","TASK_UPDATED_WITH_US":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Aufgabe {{obj_name}} von User-Story {{us_name}}","TASK_UPDATED_WITH_US_NEW_VALUE":"{{username}} aktualisierte das Attribut \"{{field_name}}\" der Aufgabe {{obj_name}} die zu der User-Story gehört {{us_name}} zu {{new_value}}","WIKI_UPDATED":"{{username}} aktualisierte die WIKI Seite {{obj_name}}","EPIC_UPDATED":"Attribut \"{{field_name}}\" des Epics {{obj_name}} wurde von {{username}} aktualisiert","EPIC_UPDATED_WITH_NEW_VALUE":"Attribut \"{{field_name}}\" des Epics {{obj_name}} wurde von {{username}} zu aktualisiert","EPIC_UPDATED_WITH_NEW_COLOR":"Feld \"{{field_name}}\" des Epics {{obj_name}} wurde von {{username}} zu aktualisiert","NEW_COMMENT_US":"{{username}} schrieb einen Kommentar in der User-Story {{obj_name}}","NEW_COMMENT_ISSUE":"{{username}} schrieb einen Kommentar im Ticket {{obj_name}}","NEW_COMMENT_TASK":"{{username}} schrieb einen Kommentar in der Aufgabe {{obj_name}}","NEW_COMMENT_EPIC":"{{username}} hat das Epic {{obj_name}} kommentiert","NEW_MEMBER":"{{project_name}} hat ein neues Mitglied","US_ADDED_MILESTONE":"{{username}} fügte dem Sprint {{sprint_name}} die User-Story {{obj_name}} hinzu","US_MOVED":"{{username}} wurde in die Story {{obj_name}} verschoben","US_REMOVED_FROM_MILESTONE":"{{username}} fügte dem Backlog die User-Story {{obj_name}} hinzu","BLOCKED":"{{username}} vermerkte die Blockierung von {{obj_name}}","UNBLOCKED":"{{username}} hob die Blockierung von {{obj_name}} auf","NEW_USER":"{{username}} ist Taiga beigetreten"},"LEGAL":{"TERMS_OF_SERVICE_AND_PRIVACY_POLICY_AD":"Beim Erstellen eines neuen Accounts, stimmst du unserenNutzungsbedingungenundDatenschutzbestimmungenzu.","GDPR_ANNOUNCEMENT_TITLE":"Datenschutz-Grundverordnung (DSGVO)","GDPR_ANNOUNCEMENT_DESCRIPTION":"Das hast du kommen sehen, oder? Aktualisierungen zu unseren Nutzungsbedingungen","GDPR_ANNOUNCEMENT_INFOLINK":"Bitte lies unsere Ankündigung "},"EXTERNAL_APP":{"PAGE_TITLE":"Eine externe Anwendung benötigt eine Genehmigung","PAGE_DESCRIPTION":"Eine externe Anwendung benötigt eine Genehmigung","AUTHORIZATION_REQUEST":"{{application}} erlauben ihren Taiga Account zu benutzen?","LOGIN_WITH_ANOTHER_USER":"Mit einem anderen Benutzer einloggen.","AUTHORIZE_APP":"Anwendung autorisieren","CANCEL":"Abbrechen"},"JOYRIDE":{"NAV":{"NEXT":"Weiter","BACK":"Zurück","SKIP":"Überspringen","DONE":"Erledigt"},"DASHBOARD":{"STEP1":{"TITLE":"Ihr Projekt","TEXT":"Willkommen! Hier wirst du deine Projekte sehen."},"STEP2":{"TITLE":"Zuletzt bearbeitet","TEXT":"Hier wirst du deine User Stories, Tasks und Issues sehen, an denen du arbeitest."},"STEP3":{"TITLE":"Beobachtet","TEXT1":"And right here you will find the ones in your projects that you want to know about.","TEXT2":"Du arbeitest schon mit Taiga ;)"},"STEP4":{"TITLE":"Los geht’s","TEXT1":"Du kannst anfangen, indem du dein erstes Taiga-Projekt startest","TEXT2":"Viel Glück!"}},"BACKLOG":{"STEP1":{"TITLE":"Projektzusammenfassung","TEXT1":"Hier wirst du den Status deines Projektes sehen.","TEXT2":"Du kannst dein Projekt im Adminpanel verwalten."},"STEP2":{"TITLE":"Produkt Backlog","TEXT":"Das Backlog zeigt dir alle Anforderungen (User Stories) für das Projekt an. Hier kannst du auch deine Sprints planen."},"STEP3":{"TITLE":"Sprints","TEXT":"Sprints sind kurze Zeiträume (üblicherweise 2 Wochen) in welchem eine bestimmte Arbeit erledigt und geliefert wird."},"STEP4":{"TITLE":"User-Stories","TEXT":"Dies sind die Anforderungen. Du kannst sie dem Backlog hinzufügen und sie zu einem Sprint hinzufügen."}},"KANBAN":{"STEP1":{"TITLE":"Personalisiere deinen Workflow","TEXT":"Stelle die Spalten für deinen Workflow im Adminpanel ein."},"STEP2":{"TITLE":"User-Stories und Tasks","TEXT":"User Stories sind die Anforderungen an dein Projekt. Du kannst sie zwischen den verschiedenen Spalten hin- und herziehen."},"STEP3":{"TITLE":"User-Stories hinzufügen","TEXT1":"Du möchtest wahrscheinlich eine einzelne User Story (Story Icon) oder mehrere (Mehrfach Icon) hinzufügen.","TEXT2":"Viel Glück!"}}},"DISCOVER":{"PAGE_TITLE":"Entdecke Projekte - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","DISCOVER_TITLE":"Entdecke Projekte","DISCOVER_SUBTITLE":"{projects, plural, one{Ein öffentliches Projekt verfügbar} other{# öffentliche Projekte verfügbar}}","MOST_ACTIVE":"Most active","MOST_ACTIVE_EMPTY":"There are no ACTIVE projects yet","MOST_LIKED":"Most liked","MOST_LIKED_EMPTY":"There are no LIKED projects yet","VIEW_MORE":"Zeige mehr","FEATURED":"Empfohlene Projekte","EMPTY":"Es existieren keine Projekte mit den angegebenen Kriterien
    Versuche es nochmal!","FILTERS":{"ALL":"Alle","KANBAN":"Kanban","SCRUM":"Scrum","PEOPLE":"Auf der Suche nach Mitgliedern?","WEEK":"Letzte Woche","MONTH":"Letzter Monat","YEAR":"Letztes Jahr","ALL_TIME":"All time","CLEAR":"Filter zurücksetzen"},"SEARCH":{"PAGE_TITLE":"Suche - Entdecke Projekte - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","INPUT_PLACEHOLDER":"Geben sie etwas ein...","ACTION_TITLE":"Suche","RESULTS":"Suchergebnisse"}}} \ No newline at end of file diff --git a/dist/v-1528953702317/locales/taiga/locale-en.json b/dist/v-1528953702317/locales/taiga/locale-en.json new file mode 100644 index 0000000..cfdc574 --- /dev/null +++ b/dist/v-1528953702317/locales/taiga/locale-en.json @@ -0,0 +1 @@ +{"COMMON":{"YES":"Yes","NO":"No","OR":"or","LOADING":"Loading...","DATE":"DD MMM YYYY","DATETIME":"DD MMM YYYY HH:mm","SAVE":"Save","CANCEL":"Cancel","ACCEPT":"Accept","DELETE":"Delete","UNLINK":"Unlink","CREATE":"Create","ADD":"Add","COPY_TO_CLIPBOARD":"Copy to clipboard: Ctrl+C","EDIT":"Edit","DRAG":"Drag","TAG_LINE":"Your agile, free, and open source project management tool","TAG_LINE_2":"LOVE YOUR PROJECT","BLOCK":"Block","BLOCK_TITLE":"Block this item for example if it has a dependency that can not be satisfied","BLOCKED":"Blocked","UNBLOCK":"Unblock","UNBLOCK_TITLE":"Unblock this item","BLOCKED_NOTE":"Why is this blocked?","BLOCKED_REASON":"Please explain the reason","CREATED_BY":"Created by {{fullDisplayName}}","CLOSE":"close","GO_HOME":"Take me home","PLUGINS":"Plugins","ONE_ITEM_LINE":"One item per line...","NEW_BULK":"New bulk insert","RELATED_TASKS":"Related tasks","PREVIOUS":"Previous","NEXT":"Next","LOGOUT":"Logout","EXTERNAL_USER":"an external user","GENERIC_ERROR":"One of our Oompa Loompas says {{error}}.","IOCAINE_TEXT":"This member is feeling a bit overwhelmed by this task. Will become immune to the iocaine poison over time with your help. For now, may need a hug.","CLIENT_REQUIREMENT":"Client requirement is new requirement that was not previously expected and it is required to be part of the project","TEAM_REQUIREMENT":"Team requirement is a requirement that must exist in the project but should have no cost for the client","OWNER":"Project Owner","CAPSLOCK_WARNING":"Be careful! You are using capital letters in an input field that is case sensitive.","CONFIRM_CLOSE_EDIT_MODE_TITLE":"Are you sure you want to close the edit mode?","CONFIRM_CLOSE_EDIT_MODE_MESSAGE":"Remember that if you close the edit mode without saving all the changes will be lost","RELATED_USERSTORIES":"Related user stories","CARD":{"ASSIGN_TO":"Assign To","EDIT":"Edit card","DELETE":"Delete card"},"FORM_ERRORS":{"DEFAULT_MESSAGE":"This value seems to be invalid.","TYPE_EMAIL":"This value should be a valid email.","TYPE_URL":"This value should be a valid url.","TYPE_URLSTRICT":"This value should be a valid url.","TYPE_NUMBER":"This value should be a valid number.","TYPE_DIGITS":"This value should be digits.","TYPE_DATEISO":"This value should be a valid date (YYYY-MM-DD).","TYPE_ALPHANUM":"This value should be alphanumeric.","TYPE_PHONE":"This value should be a valid phone number.","NOTNULL":"This value should not be null.","NOT_BLANK":"This value should not be blank.","REQUIRED":"This value is required.","REGEXP":"This value seems to be invalid.","MIN":"This value should be greater than or equal to %s.","MAX":"This value should be lower than or equal to %s.","RANGE":"This value should be between %s and %s.","MIN_LENGTH":"This value is too short. It should have %s characters or more.","MAX_LENGTH":"This value is too long. It should have %s characters or less.","RANGE_LENGTH":"This value length is invalid. It should be between %s and %s characters long.","MIN_CHECK":"You must select at least %s choices.","MAX_CHECK":"You must select %s choices or less.","RANGE_CHECK":"You must select between %s and %s choices.","EQUAL_TO":"This value should be the same.","LINEWIDTH":"One or more lines is perhaps too long. Try to keep under %s characters.","PIKADAY":"Invalid date format, please use DD MMM YYYY (like 23 Mar 1984)"},"PICKERDATE":{"FORMAT":"DD MMM YYYY","FIRST_DAY_OF_WEEK":"1","PREV_MONTH":"Previous Month","NEXT_MONTH":"Next Month","MONTHS":{"JAN":"January","FEB":"February","MAR":"March","APR":"April","MAY":"May","JUN":"June","JUL":"July","AUG":"August","SEP":"September","OCT":"October","NOV":"November","DEC":"December"},"WEEK_DAYS":{"SUN":"Sunday","MON":"Monday","TUE":"Tuesday","WED":"Wednesday","THU":"Thursday","FRI":"Friday","SAT":"Saturday"},"WEEK_DAYS_SHORT":{"SUN":"Sun","MON":"Mon","TUE":"Tue","WED":"Wed","THU":"Thu","FRI":"Fri","SAT":"Sat"}},"SEE_USER_PROFILE":"See {{username }} profile","USER_STORY":"User story","TASK":"Task","ISSUE":"Issue","EPIC":"Epic","TAGS":{"PLACEHOLDER":"Enter tag","DELETE":"Delete tag","ADD":"Add tag"},"DESCRIPTION":{"EMPTY":"Empty space is so boring... go on be descriptive...","NO_DESCRIPTION":"No description yet"},"FIELDS":{"SUBJECT":"Subject","NAME":"Name","URL":"URL","DESCRIPTION":"Description","VALUE":"Value","SLUG":"Slug","COLOR":"Color","IS_CLOSED":"Is closed?","STATUS":"Status","TYPE":"Type","SEVERITY":"Severity","PRIORITY":"Priority","ASSIGNED_TO":"Assigned to","ASSIGNED_USERS":"Assigned users","POINTS":"Points","IS_BLOCKED":"is blocked","REF":"Ref","VOTES":"Votes","SPRINT":"Sprint","DUE_DATE":"Due date","DUE_DATE_REASON":"Due date reason"},"ROLES":{"ALL":"All"},"ASSIGNED_TO":{"NOT_ASSIGNED":"Not assigned","ASSIGN":"Assign","DELETE_ASSIGNMENT":"Delete assignment","REMOVE_ASSIGNED":"Remove assigned","TOO_MANY":"...too many users, keep filtering","CONFIRM_UNASSIGNED":"Are you sure you want to leave it unassigned?","TITLE_ACTION_EDIT_ASSIGNMENT":"Edit assignment","SELF":"Assign to me"},"DUE_DATE":{"TITLE_ACTION_SET_DUE_DATE":"Set due date","DUE_SOON":"due soon","PAST_DUE":"past due date","NO_LONGER_APPLICABLE":"no longer applicable"},"ASSIGNED_USERS":{"ADD":"Select assigned user","ADD_ASSIGNED":"Add assigned","TITLE_LIGHTBOX_DELETE_ASSIGNED":"Delete assigned..."},"STATUS":{"CLOSED":"Closed","OPEN":"Open"},"WATCHERS":{"WATCHERS":"Watchers","ADD":"Add watchers","TITLE_ADD":"Add a project member to the watchers list","DELETE":"Delete watcher","TITLE_LIGHTBOX_DELETE_WARTCHER":"Delete watcher..."},"WATCH_BUTTON":{"WATCH":"Watch","WATCHING":"Watching","UNWATCH":"Unwatch","WATCHERS":"Watchers","BUTTON_TITLE":"Watch/Unwatch this item","COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}"},"VOTE_BUTTON":{"BUTTON_TITLE":"Upvote/Downvote this item","COUNTER_TITLE":"{total, plural, one{one vote} other{# votes}}"},"CUSTOM_ATTRIBUTES":{"CUSTOM_FIELDS":"Custom Fields","SAVE":"Save Custom Field","EDIT":"Edit Custom Field","DELETE":"Delete custom attribute","CONFIRM_DELETE":"Remeber that all values in this custom field will be deleted.\n Are you sure you want to continue?"},"FILTERS":{"INPUT_PLACEHOLDER":"Subject or reference","TITLE_ACTION_FILTER_BUTTON":"search","TITLE":"Filters","TITLE_ACTION_SEARCH":"Search","ACTION_SAVE_CUSTOM_FILTER":"save as custom filter","PLACEHOLDER_FILTER_NAME":"Write the filter name and press enter","APPLIED_FILTERS_NUM":"filters applied","CATEGORIES":{"TYPE":"Type","STATUS":"Status","SEVERITY":"Severity","PRIORITIES":"Priorities","TAGS":"Tags","ASSIGNED_TO":"Assigned to","ROLE":"Role","CREATED_BY":"Created by","CUSTOM_FILTERS":"Custom filters","EPIC":"Epic"}},"WYSIWYG":{"CODE_SNIPPET":"Code Snippet","DB_CLICK":"double click to edit","SELECT_LANGUAGE_PLACEHOLDER":"Select Language","SELECT_LANGUAGE_REMOVE_FORMATING":"Remove formatting","OUTDATED":"Another person has made changes while you were editing. Check the new version on the activity tab before you save your changes.","MARKDOWN_HELP":"Markdown syntax help"},"PERMISIONS_CATEGORIES":{"EPICS":{"NAME":"Epics","VIEW_EPICS":"View epics","ADD_EPICS":"Add epics","MODIFY_EPICS":"Modify epics","COMMENT_EPICS":"Comment epics","DELETE_EPICS":"Delete epics"},"SPRINTS":{"NAME":"Sprints","VIEW_SPRINTS":"View sprints","ADD_SPRINTS":"Add sprints","MODIFY_SPRINTS":"Modify sprints","DELETE_SPRINTS":"Delete sprints"},"USER_STORIES":{"NAME":"User Stories","VIEW_USER_STORIES":"View user stories","ADD_USER_STORIES":"Add user stories","MODIFY_USER_STORIES":"Modify user stories","COMMENT_USER_STORIES":"Comment user stories","DELETE_USER_STORIES":"Delete user stories"},"TASKS":{"NAME":"Tasks","VIEW_TASKS":"View tasks","ADD_TASKS":"Add tasks","MODIFY_TASKS":"Modify tasks","COMMENT_TASKS":"Comment tasks","DELETE_TASKS":"Delete tasks"},"ISSUES":{"NAME":"Issues","VIEW_ISSUES":"View issues","ADD_ISSUES":"Add issues","MODIFY_ISSUES":"Modify issues","COMMENT_ISSUES":"Comment issues","DELETE_ISSUES":"Delete issues"},"WIKI":{"NAME":"Wiki","VIEW_WIKI_PAGES":"View wiki pages","ADD_WIKI_PAGES":"Add wiki pages","MODIFY_WIKI_PAGES":"Modify wiki pages","DELETE_WIKI_PAGES":"Delete wiki pages","VIEW_WIKI_LINKS":"View wiki links","ADD_WIKI_LINKS":"Add wiki links","DELETE_WIKI_LINKS":"Delete wiki links"}}},"LOGIN":{"PAGE_TITLE":"Login - Taiga","PAGE_DESCRIPTION":"Logging in to Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"AUTH":{"INVITED_YOU":"has invited you to join the project","NOT_REGISTERED_YET":"Not registered yet?","REGISTER":"Register","CREATE_ACCOUNT":"create your free account here"},"LOGIN_COMMON":{"HEADER":"I already have a Taiga login","PLACEHOLDER_AUTH_NAME":"Username or email (case sensitive)","LINK_FORGOT_PASSWORD":"Forgot it?","TITLE_LINK_FORGOT_PASSWORD":"Did you forget your password?","ACTION_ENTER":"Enter","ACTION_SIGN_IN":"Login","PLACEHOLDER_AUTH_PASSWORD":"Password (case sensitive)","ALT_LOGIN":"Or login with"},"LOGIN_FORM":{"ERROR_AUTH_INCORRECT":"According to our Oompa Loompas, your username/email or password are incorrect.","SUCCESS":"Our Oompa Loompas are happy, welcome to Taiga."},"REGISTER":{"PAGE_TITLE":"Register - Taiga","PAGE_DESCRIPTION":"Create your account in Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"REGISTER_FORM":{"TITLE":"Register a new Taiga account (free)","PLACEHOLDER_NAME":"Pick a username (case sensitive)","PLACEHOLDER_FULL_NAME":"Pick your full name","PLACEHOLDER_EMAIL":"Your email","PLACEHOLDER_PASSWORD":"Set a password (case sensitive)","ACTION_SIGN_UP":"Sign up","TITLE_LINK_LOGIN":"Log in","LINK_LOGIN":"Are you already registered? Log in"},"FORGOT_PASSWORD":{"PAGE_TITLE":"Forgot password - Taiga","PAGE_DESCRIPTION":"Enter your username or email to get a new password and you can access to Taiga again."},"FORGOT_PASSWORD_FORM":{"TITLE":"Oops, did you forget your password?","SUBTITLE":"Enter your username or email to get a new one","PLACEHOLDER_FIELD":"Username or email","ACTION_RESET_PASSWORD":"Reset Password","LINK_CANCEL":"Nah, take me back. I think I remember it.","SUCCESS_TITLE":"Check your inbox!","SUCCESS_TEXT":"We sent you an email with the instructions to set a new password","ERROR":"According to our Oompa Loompas, your are not registered yet."},"CHANGE_PASSWORD":{"PAGE_TITLE":"Change you password - Taiga","SECTION_NAME":"Change password","FIELD_CURRENT_PASSWORD":"Current password","PLACEHOLDER_CURRENT_PASSWORD":"Your current password (or empty if you have no password yet)","FIELD_NEW_PASSWORD":"New password","PLACEHOLDER_NEW_PASSWORD":"Type a new password","FIELD_RETYPE_PASSWORD":"Retype new password","PLACEHOLDER_RETYPE_PASSWORD":"Retype the new password","ERROR_PASSWORD_MATCH":"The passwords doesn't match"},"CHANGE_PASSWORD_RECOVERY_FORM":{"TITLE":"Create a new Taiga pass","SUBTITLE":"And hey, you may want to eat some more iron-rich food, it's good for your brain :P","PLACEHOLDER_NEW_PASSWORD":"New password","PLACEHOLDER_RE_TYPE_NEW_PASSWORD":"Re-type new password","ACTION_RESET_PASSWORD":"Reset Password","ERROR":"Our Oompa Loompas can't find your request to recover your password. Try to ask for it again.","SUCCESS":"Our Oompa Loompas saved your new password.
    Try to sign in with it."},"INVITATION":{"PAGE_TITLE":"Invitation acceptance - Taiga","PAGE_DESCRIPTION":"Accept the invitation to join a project in Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"INVITATION_LOGIN_FORM":{"NOT_FOUND":"Our Oompa Loompas can't find your invitation.","SUCCESS":"You've successfully joined this project, Welcome to {{project_name}}"},"HOME":{"PAGE_TITLE":"Home - Taiga","PAGE_DESCRIPTION":"The Taiga home page with your main projects and all your assigned and watched user stories, tasks and issues","EMPTY_WORKING_ON":"It feels empty, doesn't it? Start working with Taiga and you'll see here the stories, tasks and issues you are working on.","EMPTY_WATCHING":"Follow User Stories, Tasks, Issues in your projects and be notified about its changes :)","EMPTY_PROJECT_LIST":"You don't have any projects yet","WORKING_ON_SECTION":"Working on","WATCHING_SECTION":"Watching","DASHBOARD":"Projects Dashboard"},"EPICS":{"TITLE":"EPICS","SECTION_NAME":"Epics","EPIC":"EPIC","PAGE_TITLE":"Epics - {{projectName}}","PAGE_DESCRIPTION":"The epics list of the project {{projectName}}: {{projectDescription}}","DASHBOARD":{"ADD":"+ ADD EPIC","UNASSIGNED":"Unassigned"},"EMPTY":{"TITLE":"It looks like there aren't any epics yet","EXPLANATION":"Epics are items at a higher level that encompass user stories.
    Epics are at the top of the hierarchy and can be used to group user stories together.","HELP":"Learn more about epics"},"TABLE":{"VOTES":"Votes","NAME":"Name","PROJECT":"Project","SPRINT":"Sprint","ASSIGNED_TO":"Assigned","STATUS":"Status","PROGRESS":"Progress","VIEW_OPTIONS":"View options"},"CREATE":{"TITLE":"New Epic","PLACEHOLDER_DESCRIPTION":"Please add descriptive text to help others better understand this epic","TEAM_REQUIREMENT":"Team requirement","CLIENT_REQUIREMENT":"Client requirement","BLOCKED":"Blocked","BLOCKED_NOTE_PLACEHOLDER":"Why is this epic blocked?","CREATE_EPIC":"Create epic"}},"PROJECTS":{"PAGE_TITLE":"My projects - Taiga","PAGE_DESCRIPTION":"A list with all your projects, you can reorder or create a new one.","MY_PROJECTS":"My projects"},"ATTACHMENT":{"SECTION_NAME":"attachments","TITLE":"{{ fileName }} uploaded on {{ date }}","LIST_VIEW_MODE":"List view mode","GALLERY_VIEW_MODE":"Gallery view mode","DESCRIPTION":"Type a short description","DEPRECATED":"(deprecated)","DEPRECATED_FILE":"Deprecated?","ADD":"Add new attachment. {{maxFileSizeMsg}}","DROP":"Drop attachments here!","SHOW_DEPRECATED":"+ show deprecated attachments","HIDE_DEPRECATED":"- hide deprecated attachments","COUNT_DEPRECATED":"({{ counter }} deprecated)","MAX_UPLOAD_SIZE":"Maximum upload size is {{maxFileSize}}","DATE":"DD MMM YYYY [at] hh:mm","ERROR_UPLOAD_ATTACHMENT":"We have not been able to upload '{{fileName}}'. {{errorMessage}}","TITLE_LIGHTBOX_DELETE_ATTACHMENT":"Delete attachment...","MSG_LIGHTBOX_DELETE_ATTACHMENT":"the attachment '{{fileName}}'","ERROR_DELETE_ATTACHMENT":"We have not been able to delete: {{errorMessage}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) is too heavy for our Oompa Loompas, try it with a smaller than ({{maxFileSize}})"},"PAGINATION":{"PREVIOUS":"Prev","NEXT":"Next"},"ADMIN":{"COMMON":{"TITLE_ACTION_EDIT_VALUE":"Edit value","TITLE_ACTION_DELETE_VALUE":"Delete value","TITLE_ACTION_DELETE_TAG":"Delete tag"},"HELP":"Do you need help? Check out our support page!","PROJECT_DEFAULT_VALUES":{"TITLE":"Default Values","SUBTITLE":"Set default values for all selector inputs."},"MEMBERSHIPS":{"TITLE":"Manage members","PAGE_TITLE":"Memberships - {{projectName}}","ADD_BUTTON":"+ New member","ADD_BUTTON_TITLE":"Add new member","LIMIT_USERS_WARNING_MESSAGE_FOR_ADMIN":"Unfortunately, this project has reached its limit of ({{members}}) allowed members.","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"This project has reached its limit of ({{members}}) allowed members. If you would like to increase that limit please contact the administrator."},"PROJECT_EXPORT":{"TITLE":"Export","SUBTITLE":"Export your project to save a backup or to create a new one based on this.","EXPORT_BUTTON":"Export","EXPORT_BUTTON_TITLE":"Export your project","LOADING_TITLE":"We are generating your dump file","DUMP_READY":"Your dump file is ready!","LOADING_MESSAGE":"Please don't close this page.","ASYNC_MESSAGE":"We will send you an email when ready.","SYNC_MESSAGE":"If the download doesn't start automatically click here.","ERROR":"Our Oompa Loompas have some problems generating your dump. Please try it again.","ERROR_BUSY":"Sorry, our Oompa Loompas are very busy right now. Please try again in a few minutes."},"MODULES":{"TITLE":"Modules","EPICS":"Epics","EPICS_DESCRIPTION":"Visualize and manage the most strategic part of your project","BACKLOG":"Backlog","BACKLOG_DESCRIPTION":"Manage your user stories to maintain an organized view of upcoming and prioritized work.","NUMBER_SPRINTS":"Expected number of sprints","NUMBER_SPRINTS_HELP":"0 for an undetermined number","NUMBER_US_POINTS":"Expected total of story points","NUMBER_US_POINTS_HELP":"0 for an undetermined number","KANBAN":"Kanban","KANBAN_DESCRIPTION":"Organize your project in a lean way with this board.","ISSUES":"Issues","ISSUES_DESCRIPTION":"Track the bugs, questions and enhancements related to your project. Don't miss anything!","WIKI":"Wiki","WIKI_DESCRIPTION":"Add, modify, or delete content in collaboration with others. This is the right place for your project documentation.","MEETUP":"Meet Up","MEETUP_DESCRIPTION":"Choose your videoconference system.","SELECT_VIDEOCONFERENCE":"Select a videoconference system","SALT_CHAT_ROOM":"Add a prefix to the chatroom name","JITSI_CHAT_ROOM":"Jitsi","APPEARIN_CHAT_ROOM":"AppearIn","TALKY_CHAT_ROOM":"Talky","CUSTOM_CHAT_ROOM":"Custom","URL_CHAT_ROOM":"URL of your chat room"},"PROJECT_PROFILE":{"PAGE_TITLE":"{{sectionName}} - Project profile - {{projectName}}","PROJECT_DETAILS":"Project details","PROJECT_NAME":"Project name","TAGS":"Tags","DESCRIPTION":"Description","RECRUITING":"Is this project looking for people?","RECRUITING_MESSAGE":"Who are you looking for?","RECRUITING_PLACEHOLDER":"Define the profiles you are looking for","FEEDBACK":"Receive feedback from Taiga users?","PUBLIC_PROJECT":"Public project","PRIVATE_PROJECT":"Private project","PRIVATE_OR_PUBLIC":"What's the difference between public and private projects?","DELETE":"Delete this project","CHANGE_LOGO":"Change logo","ACTION_USE_DEFAULT_LOGO":"Use default image","MAX_PRIVATE_PROJECTS":"You've reached the maximum number of private projects allowed by your current plan","MAX_PRIVATE_PROJECTS_MEMBERS":"The maximum number of members for private projects has been exceeded","MAX_PUBLIC_PROJECTS":"Unfortunately, you've reached the maximum number of public projects allowed by your current plan","MAX_PUBLIC_PROJECTS_MEMBERS":"The project exceeds your maximum number of members for public projects","PROJECT_OWNER":"Project owner","REQUEST_OWNERSHIP":"Request ownership","REQUEST_OWNERSHIP_CONFIRMATION_TITLE":"Do you want to become the new project owner?","REQUEST_OWNERSHIP_DESC":"Request that current project owner {{name}} transfer ownership of this project to you.","REQUEST_OWNERSHIP_BUTTON":"Request","REQUEST_OWNERSHIP_SUCCESS":"We'll notify the project owner","CHANGE_OWNER":"Change owner","CHANGE_OWNER_SUCCESS_TITLE":"Ok, your request has been sent!","CHANGE_OWNER_SUCCESS_DESC":"We will notify you by email if the project ownership request is accepted or declined"},"REPORTS":{"TITLE":"Reports","SUBTITLE":"Export your project data in CSV format and make your own reports.","DESCRIPTION":"Download a CSV file or copy the generated URL and open it in your favourite text editor or spreadsheet to make your own project data reports. You will be able to visualize and analyze all your data easily.","HELP":"How to use this on my own spreadsheet?","REGENERATE_TITLE":"Change URL","REGENERATE_SUBTITLE":"You going to change the CSV data access url. The previous url will be disabled. Are you sure?"},"CSV":{"SECTION_TITLE_EPIC":"epics reports","SECTION_TITLE_US":"user stories reports","SECTION_TITLE_TASK":"tasks reports","SECTION_TITLE_ISSUE":"issues reports","DOWNLOAD":"Download CSV","URL_FIELD_PLACEHOLDER":"Please regenerate CSV url","TITLE_REGENERATE_URL":"Regenerate CSV url","ACTION_GENERATE_URL":"Generate Url","ACTION_REGENERATE":"Regenerate"},"CUSTOM_FIELDS":{"TITLE":"Custom Fields","SUBTITLE":"Specify the custom fields for your user stories, tasks and issues","EPIC_DESCRIPTION":"Epics custom fields","EPIC_ADD":"Add a custom field in epics","US_DESCRIPTION":"User stories custom fields","US_ADD":"Add a custom field in user stories","TASK_DESCRIPTION":"Tasks custom fields","TASK_ADD":"Add a custom field in tasks","ISSUE_DESCRIPTION":"Issues custom fields","ISSUE_ADD":"Add a custom field in issues","FIELD_TYPE_TEXT":"Text","FIELD_TYPE_RICHTEXT":"Rich text","FIELD_TYPE_MULTI":"Multi-line","FIELD_TYPE_DATE":"Date","FIELD_TYPE_URL":"Url"},"PROJECT_VALUES":{"PAGE_TITLE":"{{sectionName}} - Project values - {{projectName}}","REPLACEMENT":"All items with this value will be changed to","ERROR_DELETE_ALL":"You can't delete all values."},"PROJECT_VALUES_POINTS":{"TITLE":"Points","SUBTITLE":"Specify the points your user stories could be estimated to","US_TITLE":"US points","ACTION_ADD":"Add new point"},"PROJECT_VALUES_PRIORITIES":{"TITLE":"Priorities","SUBTITLE":"Specify the priorities your issues will have","ISSUE_TITLE":"Issue priorities","ACTION_ADD":"Add new priority"},"PROJECT_VALUES_SEVERITIES":{"TITLE":"Severities","SUBTITLE":"Specify the severities your issues will have","ISSUE_TITLE":"Issue severities","ACTION_ADD":"Add new severity"},"PROJECT_VALUES_STATUS":{"TITLE":"Statuses","SUBTITLE":"Specify the statuses your user stories, tasks and issues will go through","EPIC_TITLE":"Epic Statuses","US_TITLE":"User Story Statuses","TASK_TITLE":"Task Statuses","ISSUE_TITLE":"Issue Statuses"},"PROJECT_VALUES_TYPES":{"TITLE":"Types","SUBTITLE":"Specify the types your issues could be","ISSUE_TITLE":"Issues types","ACTION_ADD":"Add new {{objName}}"},"PROJECT_VALUES_TAGS":{"TITLE":"Tags","SUBTITLE":"View and edit the color of your tags","EMPTY":"Currently there are no tags","EMPTY_SEARCH":"It looks like nothing was found with your search criteria","ACTION_ADD":"Add tag","NEW_TAG":"New tag","MIXING_HELP_TEXT":"Select the tags that you want to merge","MIXING_MERGE":"Merge Tags","SELECTED":"Selected"},"ROLES":{"PAGE_TITLE":"Roles - {{projectName}}","WARNING_NO_ROLE":"Be careful, no role in your project will be able to estimate the point value for user stories","HELP_ROLE_ENABLED":"When enabled, members assigned to this role will be able to estimate the point value for user stories","DISABLE_COMPUTABLE_ALERT_TITLE":"Are you sure you want to disable this role estimations?","DISABLE_COMPUTABLE_ALERT_SUBTITLE":"If you disable estimation permissions for role {{roleName}} all previous estimations made by this role will be removed","COUNT_MEMBERS":"{{ role.members_count }} members with this role","TITLE_DELETE_ROLE":"Delete Role","REPLACEMENT_ROLE":"All the users with this role will be moved to","WARNING_DELETE_ROLE":"Be careful! All role estimations will be removed","ERROR_DELETE_ALL":"You can't delete all values","EXTERNAL_USER":"External user","NOTE_EXTERNAL_USERS":"Note: by External User we mean any anonymous user not belonging to the Taiga platform, including search engines. Please use this role with care."},"THIRD_PARTIES":{"SECRET_KEY":"Secret key","PAYLOAD_URL":"Payload URL","VALID_IPS":"Valid origin IPs (separated by ,)"},"BITBUCKET":{"SECTION_NAME":"Bitbucket","PAGE_TITLE":"Bitbucket - {{projectName}}","INFO_VERIFYING_IP":"Bitbucket requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."},"GITLAB":{"SECTION_NAME":"Gitlab","PAGE_TITLE":"Gitlab - {{projectName}}","INFO_VERIFYING_IP":"Gitlab requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."},"GITHUB":{"SECTION_NAME":"GitHub","PAGE_TITLE":"GitHub - {{projectName}}"},"GOGS":{"SECTION_NAME":"Gogs","PAGE_TITLE":"Gogs - {{projectName}}"},"WEBHOOKS":{"PAGE_TITLE":"Webhooks - {{projectName}}","SECTION_NAME":"Webhooks","ADD_NEW":"Add a New Webhook","TYPE_NAME":"Type the service name","TYPE_PAYLOAD_URL":"Type the service payload url","TYPE_SERVICE_SECRET":"Type the service secret key","SAVE":"Save Webhook","CANCEL":"Cancel Webhook","SHOW_HISTORY":"(Show history)","TEST":"Test Webhook","EDIT":"Edit Webhook","DELETE":"Delete Webhook","REQUEST":"Request","RESEND_REQUEST":"Resend request","HEADERS":"Headers","PAYLOAD":"Payload","RESPONSE":"Response","DATE":"DD MMM YYYY [at] hh:mm:ss","ACTION_HIDE_HISTORY":"(Hide history)","ACTION_HIDE_HISTORY_TITLE":"Hide history details","ACTION_SHOW_HISTORY":"(Show history)","ACTION_SHOW_HISTORY_TITLE":"Show history details","WEBHOOK_NAME":"Webhook '{{name}}'"},"CUSTOM_ATTRIBUTES":{"PAGE_TITLE":"{{sectionName}} - Custom Attributes - {{projectName}}","ADD":"Add custom field","EDIT":"Edit Custom Field","DELETE":"Delete Custom Field","SAVE_TITLE":"Save Custom Field","CANCEL_TITLE":"Cancel creation","SET_FIELD_NAME":"Set your custom field name","SET_FIELD_DESCRIPTION":"Set your custom field description","FIELD_TYPE_DEFAULT":"-- select one --","ACTION_UPDATE":"Update Custom Field","ACTION_CANCEL_EDITION":"Cancel edition"},"MEMBERSHIP":{"COLUMN_MEMBER":"Member","COLUMN_ADMIN":"Admin","COLUMN_ROLE":"Role","COLUMN_STATUS":"Status","STATUS_ACTIVE":"Active","STATUS_PENDING":"Pending","DELETE_MEMBER":"Delete member","RESEND":"Resend","SUCCESS_SEND_INVITATION":"We've sent the invitation again to '{{email}}'.","SUCCESS_DELETE":"We've deleted {{message}}.","ERROR_DELETE":"We have not been able to delete {{message}}.","DEFAULT_DELETE_MESSAGE":"the invitation to {{email}}"},"DEFAULT_VALUES":{"LABEL_EPIC_STATUS":"Default value for epic status selector","LABEL_US_STATUS":"Default value for user story status selector","LABEL_POINTS":"Default value for points selector","LABEL_TASK_STATUS":"Default value for task status selector","LABEL_ISSUE_TYPE":"Default value for issue type selector","LABEL_ISSUE_STATUS":"Default value for issue status selector","LABEL_PRIORITY":"Default value for priority selector","LABEL_SEVERITY":"Default value for severity selector"},"STATUS":{"PLACEHOLDER_WRITE_STATUS_NAME":"Write a name for the new status"},"TYPES":{"PLACEHOLDER_WRITE_NAME":"Write a name for the new element"},"US_STATUS":{"ACTION_ADD_STATUS":"Add new status","IS_ARCHIVED_COLUMN":"Archived","IS_CLOSED_COLUMN":"Closed","WIP_LIMIT_COLUMN":"WIP Limit","PLACEHOLDER_WRITE_NAME":"Write a name for the new status"},"MENU":{"PROJECT":"Project","ATTRIBUTES":"Attributes","MEMBERS":"Members","PERMISSIONS":"Permissions","INTEGRATIONS":"Integrations"},"SUBMENU_PROJECT_VALUES":{"STATUS":"Status","POINTS":"Points","PRIORITIES":"Priorities","SEVERITIES":"Severities","TYPES":"Types","CUSTOM_FIELDS":"Custom fields","TAGS":"Tags"},"SUBMENU_ROLES":{"TITLE":"Roles","ACTION_NEW_ROLE":"+ New role","TITLE_ACTION_NEW_ROLE":"Add new role"},"PROJECT_TRANSFER":{"DO_YOU_ACCEPT_PROJECT_OWNERNSHIP":"Would you like to become the new project owner?","PRIVATE":"Private","ACCEPTED_PROJECT_OWNERNSHIP":"Congratulations! You're now the new project owner.","REJECTED_PROJECT_OWNERNSHIP":"OK. We'll contact the current project owner","ACCEPT":"Accept","REJECT":"Reject","PROPOSE_OWNERSHIP":"{{owner}}, the current owner of the project {{project}} has asked that you become the new project owner.","ADD_COMMENT":"Would you like to add a comment for the project owner?","UNLIMITED_PROJECTS":"Unlimited","OWNER_MESSAGE":{"PRIVATE":"Please remember that you can own up to {{maxProjects}} private projects. You currently own {{currentProjects}} private projects","PUBLIC":"Please remember that you can own up to {{maxProjects}} public projects. You currently own {{currentProjects}} public projects"},"CANT_BE_OWNED":"At the moment you cannot become an owner of a project of this type. If you would like to become the owner of this project, please contact the administrator so they change your account settings to enable project ownership."}},"USER":{"PROFILE":{"PAGE_TITLE":"{{userFullName}} (@{{userUsername}})","EDIT":"Edit profile","CLOSED_US":"Closed US","PROJECTS":"Projects","PROJECTS_EMPTY":"{{username}} doesn't' have projects yet","CONTACTS":"Contacts","CONTACTS_EMPTY":"{{username}} doesn't have contacts yet","CURRENT_USER_CONTACTS_EMPTY":"You don't have contacts yet","CURRENT_USER_CONTACTS_EMPTY_EXPLAIN":"The people with whom you work at Taiga will be your contacts automatically","TABS":{"ACTIVITY_TAB":"Timeline","ACTIVITY_TAB_TITLE":"Show all the activity of this user","PROJECTS_TAB":"Projects","PROJECTS_TAB_TITLE":"List of all projects in which the user is a member","LIKES_TAB":"Likes","LIKES_TAB_TITLE":"List all likes made by this user","VOTES_TAB":"Votes","VOTES_TAB_TITLE":"List all votes made by this user","WATCHED_TAB":"Watched","WATCHED_TAB_TITLE":"List all item watched by this user","CONTACTS_TAB":"Contacts","CONTACTS_TAB_TITLE":"List all contacts made by this user"}},"PROFILE_SIDEBAR":{"TITLE":"Your profile","DESCRIPTION":"People can see everything you do and what you are working on. Add a nice bio to give an enhanced version of your information.","ADD_INFO":"Edit bio"},"PROFILE_FAVS":{"FILTER_INPUT_PLACEHOLDER":"Type something...","FILTER_TYPE_ALL":"All","FILTER_TYPE_ALL_TITLE":"Show all","FILTER_TYPE_PROJECTS":"Projects","FILTER_TYPE_PROJECTS_TITLE":"Show only projects","FILTER_TYPE_EPICS":"Epics","FILTER_TYPE_EPICS_TITLE":"Show only epics","FILTER_TYPE_USER_STORIES":"Stories","FILTER_TYPE_USER_STORIES_TITLE":"Show only user stories","FILTER_TYPE_TASKS":"Tasks","FILTER_TYPE_TASKS_TITLE":"Show only tasks","FILTER_TYPE_ISSUES":"Issues","FILTER_TYPE_ISSUES_TITLE":"Show only issues","EMPTY_TITLE":"It looks like there's nothing to show here."}},"PROJECT":{"PAGE_TITLE":"{{projectName}}","HELP":"Reorder your projects to set in the top the most used ones.
    The top 10 projects will appear in the top navigation bar project list","PRIVATE":"Private project","LOOKING_FOR_PEOPLE":"This project is looking for people","FANS_COUNTER_TITLE":"{total, plural, one{one fan} other{# fans}}","WATCHERS_COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}","MEMBERS_COUNTER_TITLE":"{total, plural, one{one member} other{# members}}","BLOCKED_PROJECT":{"BLOCKED":"Blocked project","THIS_PROJECT_IS_BLOCKED":"This project is temporarily blocked","TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF":"In order to unblock your projects, contact the administrator."},"SECTION":{"SEARCH":"Search","TIMELINE":"Timeline","BACKLOG":"Backlog","KANBAN":"Kanban","ISSUES":"Issues","WIKI":"Wiki","TEAM":"Team","MEETUP":"Meet Up","ADMIN":"Admin"},"NAVIGATION":{"ACTION_CREATE_PROJECT":"Create project","MANAGE_PROJECTS":"Manage projects","TITLE_CREATE_PROJECT":"Create project","HELP_TITLE":"Taiga Support Page","HELP":"Help","HOMEPAGE":"Homepage","FEEDBACK_TITLE":"Send feedback","FEEDBACK":"Feedback","NOTIFICATIONS_TITLE":"Edit your notification settings","NOTIFICATIONS":"Notifications","VIEW_PROFILE_TITLE":"View Profile","VIEW_PROFILE":"View Profile","EDIT_PROFILE_TITLE":"Edit your profile","EDIT_PROFILE":"Edit Profile","CHANGE_PASSWORD_TITLE":"Change password","CHANGE_PASSWORD":"Change password","DASHBOARD_TITLE":"Dashboard","DISCOVER_TITLE":"Discover trending projects","DISCOVER":"Discover"},"LIKE_BUTTON":{"LIKE":"Like","LIKED":"Liked","UNLIKE":"Unlike","BUTTON_TITLE":"Like or unlike this project","COUNTER_TITLE":"{total, plural, one{one fan} other{# fans}}"},"WATCH_BUTTON":{"BUTTON_TITLE":"Watch this project and set notification policy","WATCH":"Watch","WATCHING":"Watching","COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}","OPTIONS":{"NOTIFY_ALL":"Receive all notifications","NOTIFY_ALL_TITLE":"Receive all notifications for this project","NOTIFY_INVOLVED":"Only involved","NOTIFY_INVOLVED_TITLE":"Recive notificacions only when you are involved","UNWATCH":"Unwatch","UNWATCH_TITLE":"Unwatch this project"}},"CONTACT_BUTTON":{"CONTACT_TITLE":"Contact the project team","CONTACT_BUTTON":"Contact the project"},"CREATE":{"TITLE":"Create Project","CHOOSE_TEMPLATE":"Which template fits your project better?","TEMPLATE_SCRUM":"Scrum","TEMPLATE_SCRUM_DESC":"Prioritize and solve your tasks in short time cycles.","TEMPLATE_SCRUM_LONGDESC":"Scrum is an iterative and incremental agile software development methodology for managing product development.\nThe product backlog is what will ultimately be delivered, ordered into the sequence in which it should be delivered. Product Backlogs are broken into manageable, executable chunks named sprints. Every certain amount of time the team initiates a new sprint and commits to deliver a certain number of user stories from the backlog, in accordance with their skills, abilities and resources. The project advances as the backlog becomes depleted.","TEMPLATE_KANBAN":"Kanban","TEMPLATE_KANBAN_DESC":"Keep a constant workflow on independent tasks","TEMPLATE_KANBAN_LONGDESC":"The Kanban methodology is used to divide project development (any sort of project) into stages.\nA kanban card is like an index card or post-it note that details every task (or user story) in a project that needs to be completed. The Kanban board is used to move each card from one state of completion to the next and in so doing, helps track progress.","DUPLICATE":"Duplicate project","DUPLICATE_DESC":"Start clean and keep your configuration","IMPORT":"Import project","IMPORT_DESC":"Import your project from multiple platforms into Taiga","INVITE":"Invite to the project","SOLO_PROJECT":"You'll be alone in this project","INVITE_LATER":"(You'll be able to invite more members later)","BACK":"Back","MAX_PRIVATE_PROJECTS":"Unfortunately, You've reached the maximum number of private projects.\nIf you would like to increase the current limit please contact the administrator.","MAX_PUBLIC_PROJECTS":"Unfortunately, You've reached the maximum number of public projects.\nIf you would like to increase the current limit please contact the administrator.","PUBLIC_PROJECT":"Public Project","PRIVATE_PROJECT":"Private Project"},"COMMON":{"DETAILS":"New project details","PROJECT_TITLE":"Project Name","PROJECT_DESCRIPTION":"Project Description"},"DUPLICATE":{"TITLE":"Duplicate Project","DESCRIPTION":"Start clean and keep your configuration","SELECT_PLACEHOLDER":"Choose an existing project to duplicate"},"IMPORT":{"TITLE":"Import Project","DESCRIPTION":"Import your project from multiple platforms into Taiga","ASYNC_IN_PROGRESS_TITLE":"Our Oompa Loompas are importing your project","ASYNC_IN_PROGRESS_MESSAGE":"This process could take a few minutes
    We will send you an email when ready","UPLOAD_IN_PROGRESS_MESSAGE":"Uploaded {{uploadedSize}} of {{totalSize}}","ERROR":"Our Oompa Loompas have some problems importing your dump data. Please try again.","ERROR_TOO_MANY_REQUEST":"Sorry, our Oompa Loompas are very busy right now. Please try again in a few minutes.","ERROR_MESSAGE":"Our Oompa Loompas have some problems importing your dump data: {{error_message}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) is too heavy for our Oompa Loompas, try it with a smaller than ({{maxFileSize}})","SYNC_SUCCESS":"Your project has been imported successfuly","IMPORT":"Import","WHO_IS":"Their tasks will be assigned to ...","WRITE_EMAIL":"Or if you want, write the email that this user uses in Taiga","SEARCH_CONTACT":"Or if you want, search in your contacts","WRITE_EMAIL_LABEL":"Write the email that this user uses in Taiga","ACCEEDE":"Acceede","PROJECT_MEMBERS":"Project Members","PROCESS_DESCRIPTION":"Tell us who from Taiga you want to assign the tasks of {{platform}}","MATCH":"Is {{user_external}} the same person as {{user_internal}}?","CHOOSE":"Select user","LINKS":"Links with {{platform}}","LINKS_DESCRIPTION":"Do you want to keep the link of each item with the original {{platform}} card?","WARNING_MAIL_USER":"Note that if the user does not have a Taiga account we will not be able to assign the tasks to him.","ASSIGN":"Assign","PROJECT_SELECTOR":{"NO_RESULTS":"It looks like nothing was found with your search criteria","ACTION_SEARCH":"search","ACTION_BACK":"Back"},"PROJECT_RESTRICTIONS":{"PROJECT_MEMBERS_DESC_PRIVATE":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per private project. If you would like to increase that limit please contact the administrator.","PROJECT_MEMBERS_DESC_PUBLIC":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per public project. If you would like to increase that limit please contact the administrator.","ACCOUNT_ALLOW_MEMBERS":"Your account only allows {{members}} members","PRIVATE_PROJECTS_SPACE":{"TITLE":"Unfortunately, your current plan does not allow for additional private projects","DESC":"The project you are trying to import is private. Unfortunately, your current plan does not allow for additional private projects."},"PUBLIC_PROJECTS_SPACE":{"TITLE":"Unfortunately, your current plan does not allow for additional public projects","DESC":"The project you are trying to import is public. Unfortunately, your current plan does not allow additional public projects."},"PRIVATE_PROJECTS_MEMBERS":{"TITLE":"Your current plan allows for a maximum of {{max_memberships}} members per private project"},"PUBLIC_PROJECTS_MEMBERS":{"TITLE":"Your current plan allows for a maximum of {{max_memberships}} members per public project."},"PRIVATE_PROJECTS_SPACE_MEMBERS":{"TITLE":"Unfortunately your current plan doesn't allow additional private projects or an increase of more than {{max_memberships}} members per private project","DESC":"The project that you are trying to import is private and has {{members}} members."},"PUBLIC_PROJECTS_SPACE_MEMBERS":{"TITLE":"Unfortunately your current plan doesn't allow additional public projects or an increase of more than {{max_memberships}} members per public project","DESC":"The project that you are trying to import is public and has more than {{members}} members."}},"IN_PROGRESS":{"TITLE":"Importing Project","DESCRIPTION":"This process can take a while, please keep the window open."},"WARNING":{"TITLE":"Some taks will be unassigned","DESCRIPTION":"There are still unidentified people. The cards assigned to these people will remain unassigned. Check all the contacts to not lose that information.","CHECK":"Check contacts"},"TAIGA":{"SELECTOR":"Import your Taiga project"},"TRELLO":{"SELECTOR":"Import your Trello boards into Taiga","CHOOSE_PROJECT":"Choose board that you want to import","NO_PROJECTS":"It seems you have no boards in Trello"},"GITHUB":{"SELECTOR":"Import your GitHub project issues","CHOOSE_PROJECT":"Find the project you want to import","NO_PROJECTS":"It seems you have no porjects in GitHub","HOW_DO_YOU_WANT_TO_IMPORT":"How do you want to import your issues into Taiga?","KANBAN_PROJECT":"As user stories in a kanban project","KANBAN_PROJECT_DESCRIPTION":"After that you can enable scrum with backlog.","SCRUM_PROJECT":"As user stories in a scrum project","SCRUM_PROJECT_DESCRIPTION":"After that you can enable kanban mode.","ISSUES_PROJECT":"As issues","ISSUES_PROJECT_DESCRIPTION":"You will not be able to use your issues in kanban or scrum mode. You will be able to enable kanban or scrum for new user stories"},"ASANA":{"SELECTOR":"Import your Asana project and choose how to manage it","CHOOSE_PROJECT":"Choose project that you want to import","NO_PROJECTS":"It seems you have no porjects in Asana","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","CREATE_AS_SCRUM_DESCRIPTION":"The tasks and sub-tasks of your project will be created as Taiga user stories and tasks.","CREATE_AS_KANBAN_DESCRIPTION":"The tasks and sub-tasks of your project will be created as Taiga user stories and tasks."},"JIRA":{"SELECTOR":"Import your Jira project and choose how to manage it","HOW_TO_CONFIGURE":"(configuration help)","CHOOSE_PROJECT":"Choose project or board that you want to import","NO_PROJECTS":"It seems you have no porjects or boards in Jira","URL":"Your Jira URL","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","ISSUES_PROJECT":"Issues","CREATE_AS_SCRUM_DESCRIPTION":"The issues and sub-issues of your project will be created as Taiga user stories and tasks.","CREATE_AS_KANBAN_DESCRIPTION":"The issues and sub-issues of your project will be created as Taiga user stories and tasks.","CREATE_AS_ISSUES_DESCRIPTION":"What do you want to do with sub-issues from the Jira project? (Taiga doesn't allow sub-issues)","CREATE_NEW_ISSUES":"Convert sub-issues to new Taiga issues","NOT_CREATE_NEW_ISSUES":"Do not import sub-issues"}}},"LIGHTBOX":{"DELETE_ACCOUNT":{"CONFIRM":"Are you sure you want to delete your Taiga account?","CANCEL":"Back to settings","ACCEPT":"Delete account","BLOCK_PROJECT":"Note that all the projects you own projects will be blocked after you delete your account. If you do not want a project blocked, transfer ownership to another member of each project prior to deleting your account. "},"DELETE_PROJECT":{"TITLE":"Delete project","QUESTION":"Are you sure you want to delete this project?","SUBTITLE":"All project data (user stories, tasks, issues, sprints and wiki pages) will be lost! :-(","CONFIRM":"Yes, I'm really sure"},"ASSIGNED_TO":{"SELECT":"Select assigned to","SEARCH":"Search for users"},"ADD_MEMBER":{"TITLE":"New Member","PLACEHOLDER":"Filter users or write an email to invite","ADD_EMAIL":"Add email","REMOVE":"Remove","INVITE":"Invite","CHOOSE_ROLE":"Choose a role","PLACEHOLDER_INVITATION_TEXT":"(Optional) Add a personalized text to the invitation. Tell something lovely to your new members ;-)","HELP_TEXT":"If users are already registered on Taiga, they will be added automatically. Otherwise they will receive an invitation."},"CREATE_ISSUE":{"TITLE":"Add Issue"},"FEEDBACK":{"TITLE":"Tell us something...","COMMENT":"...a bug, some suggestions, something cool... or even your worst nightmare with Taiga","ACTION_SEND":"Send feedback"},"SEARCH":{"TITLE":"Search","PLACEHOLDER_SEARCH":"What are you looking for?"},"ADD_EDIT_SPRINT":{"TITLE":"New sprint","PLACEHOLDER_SPRINT_NAME":"sprint name","PLACEHOLDER_SPRINT_START":"Estimated Start","PLACEHOLDER_SPRINT_END":"Estimated End","ACTION_DELETE_SPRINT":"Do you want to delete this sprint?","TITLE_ACTION_DELETE_SPRINT":"delete sprint","LAST_SPRINT_NAME":"last sprint is {{lastSprint}} ;-) "},"CREATE_EDIT_TASK":{"TITLE":"New task","PLACEHOLDER_SUBJECT":"A task subject","PLACEHOLDER_STATUS":"Task status","OPTION_UNASSIGNED":"Unassigned","PLACEHOLDER_SHORT_DESCRIPTION":"Type a short description","ACTION_EDIT":"Edit task","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"CREATE_EDIT_US":{"TITLE":"New US","PLACEHOLDER_DESCRIPTION":"Please add descriptive text to help others better understand this US","NEW_US":"New user story","EDIT_US":"Edit user story","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"DELETE_DUE_DATE":{"TITLE":"Delete due date","SUBTITLE":"Are you sure you want to delete this due date?"},"DELETE_SPRINT":{"TITLE":"Delete sprint"},"CREATE_MEMBER":{"PLACEHOLDER_INVITATION_TEXT":"(Optional) Add a personalized text to the invitation. Tell something lovely to your new members ;-)","PLACEHOLDER_TYPE_EMAIL":"Type an Email","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"You are about to reach the maximum number of members allowed for this project, {{maxMembers}} members. If you would like to increase the current limit, please contact the administrator.","LIMIT_USERS_WARNING_MESSAGE":"You are about to reach the maximum number of members allowed for this project, {{maxMembers}} members."},"LEAVE_PROJECT_WARNING":{"TITLE":"Unfortunately, this project can't be left without an owner","CURRENT_USER_OWNER":{"DESC":"You are the current owner of this project. Before leaving, please transfer ownership to someone else.","BUTTON":"Change the project owner"},"OTHER_USER_OWNER":{"DESC":"Unfortunately, you can't delete a member who is also the current project owner. First, please assign a new project owner.","BUTTON":"Request project owner change"}},"CHANGE_OWNER":{"TITLE":"Who do you want to be the new project owner?","ADD_COMMENT":"Add comment","BUTTON":"Ask this project member to become the new project owner"},"CONTACT_PROJECT":{"TITLE":"Send an email to","WARNING":"The email will be received by the project admins","PLACEHOLDER":"Write your message","SEND":"Send"},"SET_DUE_DATE":{"TITLE":"Set due date","PLACEHOLDER_DUE_DATE":"Select date","REASON_FOR_DUE_DATE":"Reason for the due date","PLACEHOLDER_REASON_FOR_DUE_DATE":"Why does this US need a due date?","SUGGESTIONS":{"IN_ONE_WEEK":"In one week","IN_TWO_WEEKS":"In two weeks","IN_ONE_MONTH":"In one month","IN_THREE_MONTHS":"In three months"},"TITLE_ACTION_DELETE_DUE_DATE":"Delete due date"}},"EPIC":{"PAGE_TITLE":"{{epicSubject}} - Epic {{epicRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{epicStatus }}. Description: {{epicDescription}}","SECTION_NAME":"Epic","TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY":"Unlink related userstory","MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY":"It will delete the link to the related userstory '{{subject}}'","ERROR_UNLINK_RELATED_USERSTORY":"We have not been able to unlink: {{errorMessage}}","CREATE_RELATED_USERSTORIES":"Create a relationship with","NEW_USERSTORY":"New user story","EXISTING_USERSTORY":"Existing user story","CHOOSE_PROJECT_FOR_CREATION":"What's the project?","SUBJECT":"Subject","SUBJECT_BULK_MODE":"Subject (bulk insert)","CHOOSE_PROJECT_FROM":"What's the project?","CHOOSE_USERSTORY":"What's the user story?","NO_USERSTORIES":"This project has no User Stories yet. Please select another project.","NO_USERSTORIES_FOUND":"It looks like nothing was found with your search criteria","FILTER_USERSTORIES":"Filter user stories","LIGHTBOX_TITLE_BLOKING_EPIC":"Blocking epic","ACTION_DELETE":"Delete epic"},"US":{"PAGE_TITLE":"{{userStorySubject}} - User Story {{userStoryRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{userStoryStatus }}. Completed {{userStoryProgressPercentage}}% ({{userStoryClosedTasks}} of {{userStoryTotalTasks}} tasks closed). Points: {{userStoryPoints}}. Description: {{userStoryDescription}}","SECTION_NAME":"User story","LINK_TASKBOARD":"Taskboard","TITLE_LINK_TASKBOARD":"Go to the taskboard","TOTAL_POINTS":"total points","ADD":"+ Add a new User Story","ADD_BULK":"Add some new User Stories in bulk","PROMOTED":"This US has been promoted from Issue:","TITLE_LINK_GO_TO_ISSUE":"Go to issue","TITLE_DELETE_ACTION":"Delete User Story","LIGHTBOX_TITLE_BLOKING_US":"Blocking us","NOT_ESTIMATED":"Not estimated","OWNER_US":"This User Story belongs to","TRIBE":{"PUBLISH":"Publish as Gig in Taiga Tribe","PUBLISH_INFO":"More info","PUBLISH_TITLE":"More info on publishing in Taiga Tribe","PUBLISHED_AS_GIG":"Story published as Gig in Taiga Tribe","EDIT_LINK":"Edit link","CLOSE":"Close","SYNCHRONIZE_LINK":"synchronize with Taiga Tribe","PUBLISH_MORE_INFO_TITLE":"Do you need somebody for this task?","PUBLISH_MORE_INFO_TEXT":"

    If you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

    TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

    "},"FIELDS":{"TEAM_REQUIREMENT":"Team Requirement","CLIENT_REQUIREMENT":"Client Requirement"}},"COMMENTS":{"DELETED_INFO":"Comment deleted by {{user}}","COMMENTS_COUNT":"{{comments}} Comments","OLDER_FIRST":"Older first","RECENT_FIRST":"Recent first","COMMENT":"Comment","EDITED_COMMENT":"Edited:","SHOW_HISTORY":"View historic","TYPE_NEW_COMMENT":"Type a new comment here","SHOW_DELETED":"Show deleted comment","HIDE_DELETED":"Hide deleted comment","DELETE":"Delete comment","RESTORE":"Restore comment","HISTORY":{"TITLE":"Activity"}},"ACTIVITY":{"TITLE":"Activity","ACTIVITIES_COUNT":"{{activities}} Activities","TAGS_ADDED":"tags added:","TAGS_REMOVED":"tags removed:","US_POINTS":"{{role}} points","NEW_ATTACHMENT":"new attachment:","DELETED_ATTACHMENT":"deleted attachment:","UPDATED_ATTACHMENT":"updated attachment ({{filename}}):","CREATED_CUSTOM_ATTRIBUTE":"created custom attribute","UPDATED_CUSTOM_ATTRIBUTE":"updated custom attribute","BECAME_DEPRECATED":"became deprecated","BECAME_UNDEPRECATED":"became undeprecated","TEAM_REQUIREMENT":"Team Requirement","CLIENT_REQUIREMENT":"Client Requirement","BLOCKED":"Blocked","VALUES":{"NOT_SET":"not set","UNASSIGNED":"unassigned"},"FIELDS":{"SUBJECT":"subject","DESCRIPTION":"description","PRIORITY":"priority","SEVERITY":"severity","STATUS":"status","TYPE":"type","ASSIGNED_TO":"assigned to","ASSIGNED_USERS":"assigned users","DUE_DATE":"due date","MILESTONE":"sprint","COLOR":"color"}},"BACKLOG":{"PAGE_TITLE":"Backlog - {{projectName}}","PAGE_DESCRIPTION":"The backlog panel, with user stories and sprints of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Backlog","CUSTOMIZE_GRAPH":"Customize your backlog graph","CUSTOMIZE_GRAPH_TEXT":"To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the","CUSTOMIZE_GRAPH_ADMIN":"Admin","CUSTOMIZE_GRAPH_TITLE":"Set up the points and sprints through the Admin","MOVE_US_TO_CURRENT_SPRINT":"Move to Current Sprint","MOVE_US_TO_LATEST_SPRINT":"Move to latest Sprint","EMPTY":"The backlog is empty!","CREATE_NEW_US":"Create a new US","CREATE_NEW_US_EMPTY_HELP":"You may want to create a new user story","EXCESS_OF_POINTS":"Excess of points","PENDING_POINTS":"Pending Points","CLOSED_POINTS":"closed","COMPACT_SPRINT":"Compact Sprint","GO_TO_TASKBOARD":"Go to the taskboard of {{::name}}","EDIT_SPRINT":"Edit Sprint","TOTAL_POINTS":"total","STATUS_NAME":"Status Name","SORTABLE_FILTER_ERROR":"You can't drop on backlog when filters are open","DOOMLINE":"Project Scope [Doomline]","CHART":{"XAXIS_LABEL":"Sprints","YAXIS_LABEL":"Points","OPTIMAL":"Optimal pending points for sprint \"{{sprintName}}\" should be {{value}}","REAL":"Real pending points for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_TEAM":"Incremented points by team requirements for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_CLIENT":"Incremented points by client requirements for sprint \"{{sprintName}}\" is {{value}}"},"TAGS":{"TOGGLE":"Toggle tags visibility","SHOW":"Show tags","HIDE":"Hide tags"},"FORECASTING":{"TITLE":"Velocity forecasting","BACKLOG":"Display backlog","NEW_SPRINT":"Candidate User Stories for your next sprint based on your velocity. Click to create a new sprint.","CURRENT_SPRINT":"Candidate User Stories for your sprint based on your velocity. Click to add to current sprint."},"TABLE":{"COLUMN_US":"User Stories","TITLE_COLUMN_POINTS":"Select view per Role"},"SPRINT_SUMMARY":{"TOTAL_POINTS":"total
    points","COMPLETED_POINTS":"completed
    points","OPEN_TASKS":"open
    tasks","CLOSED_TASKS":"closed
    tasks","IOCAINE_DOSES":"iocaine
    doses","SHOW_STATISTICS_TITLE":"Show statistics","TOGGLE_BAKLOG_GRAPH":"Show/Hide burndown graph","POINTS_PER_ROLE":"Points per role"},"SUMMARY":{"PROJECT_POINTS":"project
    points","DEFINED_POINTS":"defined
    points","CLOSED_POINTS":"closed
    points","POINTS_PER_SPRINT":"points /
    sprint"},"FILTERS":{"TOGGLE":"Toggle filters visibility","HIDE":"Hide Filters","SHOW":"Show Filters"},"SPRINTS":{"TITLE":"SPRINTS","DATE":"DD MMM YYYY","LINK_TASKBOARD":"Sprint Taskboard","TITLE_LINK_TASKBOARD":"Go to Taskboard of \"{{name}}\"","EMPTY":"There are no sprints yet","WARNING_EMPTY_SPRINT_ANONYMOUS":"This sprint has no User Stories","WARNING_EMPTY_SPRINT":"Drop here Stories from your backlog to start a new sprint","TITLE_ACTION_NEW_SPRINT":"Add new sprint","TEXT_ACTION_NEW_SPRINT":"You may want to create a new sprint in your project","ACTION_SHOW_CLOSED_SPRINTS":"Show closed sprints","ACTION_HIDE_CLOSED_SPRINTS":"Hide closed sprints"}},"ERROR":{"TEXT1":"Something happened and our Oompa Loompas are working on it.","NOT_FOUND":"Not found","NOT_FOUND_TEXT":"Error 404. The page you are looking for no longer exists. Perhaps you can return back to TAIGA homepage and see if you can find what you are looking for.","PERMISSION_DENIED":"Permission denied","PERMISSION_DENIED_TEXT":"You don't have permission to access this page.","VERSION_ERROR":"Someone inside Taiga has changed this before and our Oompa Loompas cannot apply your changes. Please reload and apply your changes again (they will be lost)."},"TASKBOARD":{"PAGE_TITLE":"{{sprintName}} - Sprint taskboard - {{projectName}}","PAGE_DESCRIPTION":"Sprint {{sprintName}} (from {{startDate}} to {{endDate}}) of {{projectName}}. Completed {{completedPercentage}}% ({{completedPoints}} of {{totalPoints}} points). {{openTasks}} opened tasks of {{totalTasks}}.","SECTION_NAME":"Taskboard","TITLE_ACTION_ADD":"Add a new Task","TITLE_ACTION_ADD_BULK":"Add some new Tasks in bulk","TITLE_ACTION_ASSIGN":"Assign task","PLACEHOLDER_CARD_TITLE":"This could be a task","PLACEHOLDER_CARD_TEXT":"Split Stories into tasks to track them separately","TABLE":{"COLUMN":"User story","TITLE_ACTION_FOLD":"Fold column","TITLE_ACTION_UNFOLD":"Unfold column","TITLE_ACTION_FOLD_ROW":"Fold Row","TITLE_ACTION_UNFOLD_ROW":"Unfold Row","FIELD_POINTS":"points","ROW_UNASSIGED_TASKS_TITLE":"Unassigned tasks"},"CHARTS":{"XAXIS_LABEL":"Days","YAXIS_LABEL":"Points","OPTIMAL":"Optimal pending points for day {{formattedDate}} should be {{roundedValue}}","REAL":"Real pending points for day {{formattedDate}} is {{roundedValue}}","DATE":"DD MMMM YYYY"}},"TASK":{"PAGE_TITLE":"{{taskSubject}} - Task {{taskRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{taskStatus }}. Description: {{taskDescription}}","SECTION_NAME":"Task","LINK_TASKBOARD":"Taskboard","TITLE_LINK_TASKBOARD":"Go to the taskboard","PLACEHOLDER_SUBJECT":"Type the new task subject","TITLE_SELECT_STATUS":"Status Name","OWNER_US":"This task belongs to","TITLE_LINK_GO_OWNER":"Go to user story","TITLE_DELETE_ACTION":"Delete Task","LIGHTBOX_TITLE_BLOKING_TASK":"Blocking task","FIELDS":{"IS_IOCAINE":"Is iocaine"},"TITLE_ACTION_IOCAINE":"Feeling a bit overwhelmed by a task? Make sure others know about it by clicking on Iocaine when editing a task. It's possible to become immune to this (fictional) deadly poison by consuming small amounts over time just as it's possible to get better at what you do by occasionally taking on extra challenges!"},"NOTIFICATION":{"OK":"Everything is ok","WARNING":"Oops, something happened...","WARNING_TEXT":"Our Oompa Loompas are sad, your changes were not saved!","SAVED":"Our Oompa Loompas saved all your changes!","CLOSE":"Close notification","MAIL":"Notifications By Mail","DESKTOP":"Desktop notifications using browser alerts","ASK_DELETE":"Are you sure you want to delete?"},"CANCEL_ACCOUNT":{"TITLE":"Cancel your account","SUBTITLE":"We're sorry you are leaving the taiga, we hope you enjoyed your stay :)","PLACEHOLDER_INPUT_TOKEN":"cancel account token","ACTION_LEAVING":"Yes, I'm leaving!","SUCCESS":"Our Oompa Loompas removed your account"},"CHANGE_EMAIL_FORM":{"TITLE":"Change your email","SUBTITLE":"One click more and your email will be updated!","PLACEHOLDER_INPUT_TOKEN":"change email token","ACTION_CHANGE_EMAIL":"Change email","SUCCESS":"Our Oompa Loompas updated your email"},"ISSUES":{"PAGE_TITLE":"Issues - {{projectName}}","PAGE_DESCRIPTION":"The issues list panel of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Issue","ACTION_NEW_ISSUE":"+ NEW ISSUE","ACTION_PROMOTE_TO_US":"Promote to User Story","PROMOTED":"This issue has been promoted to US:","EXTERNAL_REFERENCE":"This issue has been created from","GO_TO_EXTERNAL_REFERENCE":"Go to origin","ACTION_DELETE":"Delete issue","LIGHTBOX_TITLE_BLOKING_ISSUE":"Blocking issue","FIELDS":{"PRIORITY":"Priority","SEVERITY":"Severity","TYPE":"Type"},"CONFIRM_PROMOTE":{"TITLE":"Promote this issue to a new user story","MESSAGE":"Are you sure you want to create a new US from this Issue?"},"TABLE":{"COLUMNS":{"TYPE":"Type","SEVERITY":"Severity","PRIORITY":"Priority","SUBJECT":"Subject","VOTES":"Votes","STATUS":"Status","CREATED":"Created","ASSIGNED_TO":"Assigned to"},"TITLE_ACTION_CHANGE_STATUS":"Change status","TITLE_ACTION_ASSIGNED_TO":"Assigned to","BLOCKED":"Blocked","EMPTY":{"TITLE":"There are no issues to report :-)","SUBTITLE":"Did you find an issue?"}}},"ISSUE":{"PAGE_TITLE":"{{issueSubject}} - Issue {{issueRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{issueStatus }}. Type: {{issueType}}, Priority: {{issuePriority}}. Severity: {{issueSeverity}}. Description: {{issueDescription}}"},"KANBAN":{"PAGE_TITLE":"Kanban - {{projectName}}","PAGE_DESCRIPTION":"The kanban panel, with user stories of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Kanban","TITLE_ACTION_FOLD":"Fold column","TITLE_ACTION_UNFOLD":"Unfold column","TITLE_ACTION_ADD_US":"Add New User Story","TITLE_ACTION_ADD_BULK":"Add New bulk","ACTION_SHOW_ARCHIVED":"Show archived","ACTION_HIDE_ARCHIVED":"Hide archived","HIDDEN_USER_STORIES":"The user stories in this status are hidden by default","PLACEHOLDER_CARD_TITLE":"These are your User Stories","PLACEHOLDER_CARD_TEXT":"Stories might also have subtasks to separate requirements"},"SEARCH":{"PAGE_TITLE":"Search - {{projectName}}","PAGE_DESCRIPTION":"Search anything, user stories, issues, tasks or wiki pages, in the project {{projectName}}: {{projectDescription}}","FILTER_EPICS":"Epics","FILTER_USER_STORIES":"User Stories","FILTER_ISSUES":"Issues","FILTER_TASKS":"Tasks","FILTER_WIKI":"Wiki Pages","PLACEHOLDER_SEARCH":"Search in...","TITLE_ACTION_SEARCH":"search","EMPTY_TITLE":"It looks like nothing was found with your search criteria.","EMPTY_DESCRIPTION":"Maybe try one of the tabs above or search again"},"TEAM":{"PAGE_TITLE":"Team - {{projectName}}","PAGE_DESCRIPTION":"The team panel to show all the members of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Team","PLACEHOLDER_INPUT_SEARCH":"Search by full name...","COLUMN_MR_WOLF":"Mr. Wolf","EXPLANATION_COLUMN_MR_WOLF":"Closed issues","COLUMN_IOCAINE":"Iocaine Drinker","EXPLANATION_COLUMN_IOCAINE":"Iocaine doses ingested","COLUMN_CERVANTES":"Cervantes","EXPLANATION_COLUMN_CERVANTES":"Wiki pages edited","COLUMN_BUG_HUNTER":"Bug Hunter","EXPLANATION_COLUMN_BUG_HUNTER":"Issues reported","COLUMN_NIGHT_SHIFT":"Night Shift","EXPLANATION_COLUMN_NIGHT_SHIFT":"Tasks closed","COLUMN_TOTAL_POWER":"Total Power","EXPLANATION_COLUMN_TOTAL_POWER":"Total Points","SECTION_TITLE_TEAM":"Team >","SECTION_FILTER_ALL":"All","CONFIRM_LEAVE_PROJECT":"Are you sure you want to leave the project?","ACTION_LEAVE_PROJECT":"Leave this project"},"USER_SETTINGS":{"AVATAR_MAX_SIZE":"[Max. size: {{maxFileSize}}]","MENU":{"SECTION_TITLE":"User Settings","USER_PROFILE":"User profile","CHANGE_PASSWORD":"Change password","EMAIL_NOTIFICATIONS":"Email notifications","DESKTOP_NOTIFICATIONS":"Desktop notifications"},"NOTIFICATIONS":{"LIVE_SECTION_NAME":"Desktop Notifications","SECTION_NAME":"Email Notifications","COLUMN_PROJECT":"Project","COLUMN_RECEIVE_ALL":"Receive All","COLUMN_ONLY_INVOLVED":"Only Involved","COLUMN_NO_NOTIFICATIONS":"No notifications","OPTION_ALL":"All","OPTION_INVOLVED":"Involved","OPTION_NONE":"None"}},"USER_PROFILE":{"ACTION_USE_GRAVATAR":"Use default image","ACTION_DELETE_ACCOUNT":"Delete Taiga account","ACTION_DOWNLOAD_PROFILE":"Download Taiga profile","CHANGE_EMAIL_SUCCESS":"Check your inbox!
    We have sent a mail to your account
    with the instructions to set your new address","CHANGE_PHOTO":"Change photo","FIELD":{"USERNAME":"Username","EMAIL":"Email","FULL_NAME":"Full name","PLACEHOLDER_FULL_NAME":"Set your full name (ex. Íñigo Montoya)","BIO":"Bio (max. 210 chars)","PLACEHOLDER_BIO":"Tell us something about you","LANGUAGE":"Language","LANGUAGE_DEFAULT":"-- use default language --","THEME":"Theme","THEME_DEFAULT":"-- use default theme --"}},"WIKI":{"PAGE_TITLE":"{{wikiPageName}} - Wiki - {{projectName}}","PAGE_DESCRIPTION":"Last edition on {{lastModifiedDate}} ({{totalEditions}} editions in total) Content: {{ wikiPageContent }}","DATETIME":"DD MMM YYYY HH:mm","REMOVE":"Remove this wiki page","DELETE_LIGHTBOX_TITLE":"Delete Wiki Page","DELETE_LINK_TITLE":"Delete Wiki link","NAVIGATION":{"HOME":"Main Page","SECTION_NAME":"BOOKMARKS","ACTION_ADD_LINK":"Add bookmark","ALL_PAGES":"All wiki pages"},"SUMMARY":{"TIMES_EDITED":"times
    edited","LAST_EDIT":"last
    edit","LAST_MODIFICATION":"last modification"},"SECTION_PAGES_LIST":"All pages","PAGES_LIST_COLUMNS":{"TITLE":"Title","EDITIONS":"Editions","CREATED":"Created","MODIFIED":"Modified","CREATOR":"Creator","LAST_MODIFIER":"Last modifier"}},"HINTS":{"SECTION_NAME":"Hint","LINK":"If you want to know how to use it visit our support page","LINK_TITLE":"Visit our support page","HINT1_TITLE":"Did you know you can import and export projects?","HINT1_TEXT":"This allow you to extract all your data from one Taiga and move it to another one.","HINT2_TITLE":"Did you know you can create custom fields?","HINT2_TEXT":"Teams can now create custom fields as a flexible means to enter specific data useful for their particular workflow.","HINT3_TITLE":"Reorder your projects to feature those most relevant to you.","HINT3_TEXT":"The 10 projects are listed in the direct access bar at the top.","HINT4_TITLE":"Did you forget what were you working on?","HINT4_TEXT":"Don't worry, on your dashboard you'll find your open tasks, issues, and user stories in the order you worked on them."},"TIMELINE":{"UPLOAD_ATTACHMENT":"{{username}} has uploaded a new attachment in {{obj_name}}","US_CREATED":"{{username}} has created a new US {{obj_name}} in {{project_name}}","ISSUE_CREATED":"{{username}} has created a new issue {{obj_name}} in {{project_name}}","TASK_CREATED":"{{username}} has created a new task {{obj_name}} in {{project_name}}","TASK_CREATED_WITH_US":"{{username}} has created a new task {{obj_name}} in {{project_name}} which belongs to the US {{us_name}}","WIKI_CREATED":"{{username}} has created a new wiki page {{obj_name}} in {{project_name}}","MILESTONE_CREATED":"{{username}} has created a new sprint {{obj_name}} in {{project_name}}","EPIC_CREATED":"{{username}} has created a new epic {{obj_name}} in {{project_name}}","EPIC_RELATED_USERSTORY_CREATED":"{{username}} has related the userstory {{related_us_name}} to the epic {{epic_name}} in {{project_name}}","NEW_PROJECT":"{{username}} created the project {{project_name}}","MILESTONE_UPDATED":"{{username}} has updated the sprint {{obj_name}}","US_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the US {{obj_name}}","US_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the US {{obj_name}} to {{new_value}}","US_UPDATED_POINTS":"{{username}} has updated '{{role_name}}' points of the US {{obj_name}} to {{new_value}}","ISSUE_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the issue {{obj_name}}","ISSUE_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the issue {{obj_name}} to {{new_value}}","TASK_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} to {{new_value}}","TASK_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} to {{new_value}}","TASK_UPDATED_WITH_US":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} which belongs to the US {{us_name}}","TASK_UPDATED_WITH_US_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} which belongs to the US {{us_name}} to {{new_value}}","WIKI_UPDATED":"{{username}} has updated the wiki page {{obj_name}}","EPIC_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the epic {{obj_name}}","EPIC_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the epic {{obj_name}} to {{new_value}}","EPIC_UPDATED_WITH_NEW_COLOR":"{{username}} has updated the \"{{field_name}}\" of the epic {{obj_name}} to ","NEW_COMMENT_US":"{{username}} has commented in the US {{obj_name}}","NEW_COMMENT_ISSUE":"{{username}} has commented in the issue {{obj_name}}","NEW_COMMENT_TASK":"{{username}} has commented in the task {{obj_name}}","NEW_COMMENT_EPIC":"{{username}} has commented in the epic {{obj_name}}","NEW_MEMBER":"{{project_name}} has a new member","US_ADDED_MILESTONE":"{{username}} has added the US {{obj_name}} to {{sprint_name}}","US_MOVED":"{{username}} has moved the US {{obj_name}}","US_REMOVED_FROM_MILESTONE":"{{username}} has added the US {{obj_name}} to the backlog","BLOCKED":"{{username}} has blocked {{obj_name}}","UNBLOCKED":"{{username}} has unblocked {{obj_name}}","NEW_USER":"{{username}} has joined Taiga"},"LEGAL":{"TERMS_OF_SERVICE_AND_PRIVACY_POLICY_AD":"When creating a new account, you agree to our terms of service and privacy policy.","GDPR_ANNOUNCEMENT_TITLE":"General Data Protection Regulation (GDPR)","GDPR_ANNOUNCEMENT_DESCRIPTION":"You saw this comming, right? Updates to our Terms of Service","GDPR_ANNOUNCEMENT_INFOLINK":"Please read our announcement here"},"EXTERNAL_APP":{"PAGE_TITLE":"An external app requires authentication","PAGE_DESCRIPTION":"An external app requires authentication","AUTHORIZATION_REQUEST":"Authorize {{application}} to use your Taiga account?","LOGIN_WITH_ANOTHER_USER":"Login with another user","AUTHORIZE_APP":"Authorize app","CANCEL":"Cancel"},"JOYRIDE":{"NAV":{"NEXT":"Next","BACK":"Back","SKIP":"Skip","DONE":"Done"},"DASHBOARD":{"STEP1":{"TITLE":"Your project","TEXT":"Welcome! Here you will find the projects you are involved on."},"STEP2":{"TITLE":"Working on","TEXT":"Here you will find the User Stories, Tasks and Issues in which you are working on."},"STEP3":{"TITLE":"Watching","TEXT1":"And right here you will find the ones in your projects that you want to know about.","TEXT2":"You are already working with Taiga ;)"},"STEP4":{"TITLE":"Let’s start","TEXT1":"You can start by creating your first Taiga project.","TEXT2":"Good luck!"}},"BACKLOG":{"STEP1":{"TITLE":"Project summary","TEXT1":"Here you will see the state of your project.","TEXT2":"You can change every kind of project settings through the admin."},"STEP2":{"TITLE":"Product backlog","TEXT":"The backlog is the list of requirements (User Stories) for the project. Here is where you will plan your sprints."},"STEP3":{"TITLE":"Sprints","TEXT":"Sprints are short periods of time (usually 2 weeks) during which specific work has to be completed and delivered."},"STEP4":{"TITLE":"User Stories","TEXT":"Those are the requirements at high level. You can add them to the backlog and drag them to the sprint in which it should be delivered."}},"KANBAN":{"STEP1":{"TITLE":"Customize your workflow","TEXT":"Set up the columns you need to map your workflow statuses through the admin."},"STEP2":{"TITLE":"User Stories & Tasks","TEXT":"User Stories are the requirements at high level. You can drag them to different columns."},"STEP3":{"TITLE":"Adding User Stories","TEXT1":"You may want to add a single User Story (add US icon) or a group of them (bulk icon)","TEXT2":"Good luck!"}}},"DISCOVER":{"PAGE_TITLE":"Discover projects - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","DISCOVER_TITLE":"Discover projects","DISCOVER_SUBTITLE":"{projects, plural, one{One public project to discover} other{# public projects to discover}}","MOST_ACTIVE":"Most active","MOST_ACTIVE_EMPTY":"There are no ACTIVE projects yet","MOST_LIKED":"Most liked","MOST_LIKED_EMPTY":"There are no LIKED projects yet","VIEW_MORE":"View more","FEATURED":"Featured Projects","EMPTY":"There are no projects to show with this search criteria.
    Try again!","FILTERS":{"ALL":"All","KANBAN":"Kanban","SCRUM":"Scrum","PEOPLE":"Looking for people","WEEK":"Last week","MONTH":"Last month","YEAR":"Last year","ALL_TIME":"All time","CLEAR":"Clear filters"},"SEARCH":{"PAGE_TITLE":"Search - Discover projects - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","INPUT_PLACEHOLDER":"Type something...","ACTION_TITLE":"Search","RESULTS":"Search results"}}} \ No newline at end of file diff --git a/dist/v-1527758585938/locales/taiga/locale-es.json b/dist/v-1528953702317/locales/taiga/locale-es.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-es.json rename to dist/v-1528953702317/locales/taiga/locale-es.json diff --git a/dist/v-1527758585938/locales/taiga/locale-fa.json b/dist/v-1528953702317/locales/taiga/locale-fa.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-fa.json rename to dist/v-1528953702317/locales/taiga/locale-fa.json diff --git a/dist/v-1528953702317/locales/taiga/locale-fi.json b/dist/v-1528953702317/locales/taiga/locale-fi.json new file mode 100644 index 0000000..3dbb56c --- /dev/null +++ b/dist/v-1528953702317/locales/taiga/locale-fi.json @@ -0,0 +1 @@ +{"COMMON":{"YES":"Kyllä","NO":"Ei","OR":"tai","LOADING":"Ladataan...","DATE":"DD.MM.YY","DATETIME":"DD.MM.YY - HH:mm","SAVE":"Tallenna","CANCEL":"Peru","ACCEPT":"Hyväksy","DELETE":"Poista","UNLINK":"Poista linkki","CREATE":"Luo uusi","ADD":"Lisää","COPY_TO_CLIPBOARD":"Kopio leikekirjalle: Ctrl+C","EDIT":"Muokkaa","DRAG":"Vedä","TAG_LINE":"Ketterä, ilmainne avoimen koodin projektinhallintaohjelmisto","TAG_LINE_2":"Rakasta projektiasi","BLOCK":"Estä","BLOCK_TITLE":"Block this item for example if it has a dependency that can not be satisfied","BLOCKED":"Suljettu","UNBLOCK":"Salli","UNBLOCK_TITLE":"Poista este","BLOCKED_NOTE":"Miksi tämä on estetty?","BLOCKED_REASON":"Ole hyvä ja anna syy","CREATED_BY":"Luonut {{fullDisplayName}}","CLOSE":"sulje","GO_HOME":"Vie minut kotiin","PLUGINS":"Pluginit","ONE_ITEM_LINE":"Yksi riviä kohti...","NEW_BULK":"Lisää monta","RELATED_TASKS":"Liittyvät tehtävät","PREVIOUS":"Edellinen","NEXT":"Seuraava","LOGOUT":"Kirjaudu ulos","EXTERNAL_USER":"ulkoinen käyttäjä","GENERIC_ERROR":"Oompa Loompas havaitsivat virheen {{error}}.","IOCAINE_TEXT":"This member is feeling a bit overwhelmed by this task. Will become immune to the iocaine poison over time with your help. For now, may need a hug.","CLIENT_REQUIREMENT":"Client requirement is new requirement that was not previously expected and it is required to be part of the project","TEAM_REQUIREMENT":"Team requirement is a requirement that must exist in the project but should have no cost for the client","OWNER":"Projektin omistaja","CAPSLOCK_WARNING":"Be careful! You are using capital letters in an input field that is case sensitive.","CONFIRM_CLOSE_EDIT_MODE_TITLE":"Haluatko varmasti sulkea muokkaustilan?","CONFIRM_CLOSE_EDIT_MODE_MESSAGE":"Remember that if you close the edit mode without saving all the changes will be lost","RELATED_USERSTORIES":"Liittyvät käyttäjätarinat","CARD":{"ASSIGN_TO":"Valitse tekijä","EDIT":"Muokkaa korttia","DELETE":"Delete card"},"FORM_ERRORS":{"DEFAULT_MESSAGE":"Tämä arvo vaikuttaa virheelliseltä.","TYPE_EMAIL":"Tämän pitäisi olla toimiva sähköpostiosoite.","TYPE_URL":"Tämän pitäisi olla toimiva web-osoite.","TYPE_URLSTRICT":"Tämän pitäisi olla toimiva web-osoite.","TYPE_NUMBER":"Arvon pitäisi olla numeerinen.","TYPE_DIGITS":"Arvon pitäisi olla numeroita.","TYPE_DATEISO":"Arvon pitäisi olla muotoa (vvvv-kk-pp).","TYPE_ALPHANUM":"Arvon pitäisi olla alfanumeerinen.","TYPE_PHONE":"Arvon pitäisi olla toimiva puhelinnumero.","NOTNULL":"Arvo ei saa olla tyhjä.","NOT_BLANK":"Arvon ei pitäisi olla tyhjä.","REQUIRED":"Arvo vaaditaan.","REGEXP":"Tämä arvo vaikuttaa virheelliseltä.","MIN":"Arvon pitää olla vähintään %s.","MAX":"Arvon pitää olla korkeintaan %s.","RANGE":"Arvon pitää olla välissä %s - %s.","MIN_LENGTH":"Arvo on liian lyhyt. Tarvitaan vähintään %s merkkiä.","MAX_LENGTH":"Arvo on liian pitkä. Pituus saa olla korkeintaan %s merkkiä.","RANGE_LENGTH":"Arvo on väärän mittainen. Sen pituus pitäisi olla väliltä %s - %s.","MIN_CHECK":"Sinun täytyy valita vähintään %s valintaa.","MAX_CHECK":"Valitse korkeintaan %s vaihtoehtoa.","RANGE_CHECK":"Valitse %s - %s vaihteohtoa.","EQUAL_TO":"Arvojen pitäisi olla samat.","LINEWIDTH":"One or more lines is perhaps too long. Try to keep under %s characters.","PIKADAY":"Invalid date format, please use DD MMM YYYY (like 23 Mar 1984)"},"PICKERDATE":{"FORMAT":"DD.MM.YY","IS_RTL":"epätosi","FIRST_DAY_OF_WEEK":"1","PREV_MONTH":"Edellinen kuukausi","NEXT_MONTH":"Seuraava kuukausi","MONTHS":{"JAN":"Tammikuu","FEB":"Helmikuu","MAR":"Maaliskuu","APR":"Huhtikuu","MAY":"Toukokuu","JUN":"Kesäkuu","JUL":"Heinäkuu","AUG":"Elokuu","SEP":"Syyskuu","OCT":"Lokakuu","NOV":"Marraskuu","DEC":"Joulukuu"},"WEEK_DAYS":{"SUN":"Sunnuntai","MON":"Maanantai","TUE":"Tiistai","WED":"Keskiviikko","THU":"Torstai","FRI":"Perjantai","SAT":"Lauantai"},"WEEK_DAYS_SHORT":{"SUN":"Sun","MON":"Maa","TUE":"Tii","WED":"Kes","THU":"Tor","FRI":"Per","SAT":"Lau"}},"SEE_USER_PROFILE":"Näytä {{username }} profiili","USER_STORY":"Käyttäjätarina","TASK":"Tehtävä","ISSUE":"Issue","EPIC":"Eepos","TAGS":{"PLACEHOLDER":"Syötä tagi","DELETE":"Poista avainsana","ADD":"Lisää avainsana"},"DESCRIPTION":{"EMPTY":"Tyhjä tila on tylsää...kerro jotain...","NO_DESCRIPTION":"Ei vielä kuvausta lisätty"},"FIELDS":{"SUBJECT":"Aihe","NAME":"Nimi","URL":"URL","DESCRIPTION":"Kuvaus","VALUE":"Arvo","SLUG":"Hukka","COLOR":"Väri","IS_CLOSED":"Suljettu","STATUS":"Tila","TYPE":"Tyyppi","SEVERITY":"Vakavuus","PRIORITY":"Tärkeys","ASSIGNED_TO":"Tekijä","ASSIGNED_USERS":"Assigned users","POINTS":"Pisteet","IS_BLOCKED":"on estetty","REF":"Ref","VOTES":"Ääniä","SPRINT":"Kierros","DUE_DATE":"Due date","DUE_DATE_REASON":"Due date reason"},"ROLES":{"ALL":"Kaikki"},"ASSIGNED_TO":{"NOT_ASSIGNED":"Tekijää ei valittu","ASSIGN":"Valitse tekijä","DELETE_ASSIGNMENT":"Poista tekijä","REMOVE_ASSIGNED":"Poista tekijä","TOO_MANY":"...liikaa käyttäjiä, lisää suodattimia","CONFIRM_UNASSIGNED":"Haluatko varmasti jättää tämän ilman tekijää?","TITLE_ACTION_EDIT_ASSIGNMENT":"Muokkaa tekijää","SELF":"Ota tehtävä itsellesi"},"DUE_DATE":{"TITLE_ACTION_SET_DUE_DATE":"Set due date","DUE_SOON":"due soon","PAST_DUE":"past due date","NO_LONGER_APPLICABLE":"no longer applicable"},"ASSIGNED_USERS":{"ADD":"Select assigned user","ADD_ASSIGNED":"Add assigned","TITLE_LIGHTBOX_DELETE_ASSIGNED":"Delete assigned..."},"STATUS":{"CLOSED":"Suljettu","OPEN":"Avoin"},"WATCHERS":{"WATCHERS":"Seuraajat","ADD":"Lisää seuraajia","TITLE_ADD":"Add a project member to the watchers list","DELETE":"Poista vahti","TITLE_LIGHTBOX_DELETE_WARTCHER":"Poista vahti..."},"WATCH_BUTTON":{"WATCH":"Seuraa","WATCHING":"Seuraa","UNWATCH":"Lopeta seuraaminen","WATCHERS":"Seuraajat","BUTTON_TITLE":"Seuraa/Lopeta seuraaminen","COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}"},"VOTE_BUTTON":{"BUTTON_TITLE":"Upvote/Downvote this item","COUNTER_TITLE":"{total, plural, one{one vote} other{# votes}}"},"CUSTOM_ATTRIBUTES":{"CUSTOM_FIELDS":"Omat kentät","SAVE":"Tallenna oma kenttä","EDIT":"Muokkaa omaa kenttää","DELETE":"Poista oma attribuutti","CONFIRM_DELETE":"Remeber that all values in this custom field will be deleted.\n Are you sure you want to continue?"},"FILTERS":{"INPUT_PLACEHOLDER":"Aihe tai viittaus","TITLE_ACTION_FILTER_BUTTON":"hae","TITLE":"Suodattimet","TITLE_ACTION_SEARCH":"Hae","ACTION_SAVE_CUSTOM_FILTER":"tallenna omaksi suodattimeksi","PLACEHOLDER_FILTER_NAME":"Anna suodattimen nimi ja paina enter","APPLIED_FILTERS_NUM":"Suodattimet asetettu","CATEGORIES":{"TYPE":"Tyyppi","STATUS":"Tila","SEVERITY":"Vakavuus","PRIORITIES":"Kiireellisyydet","TAGS":"Avainsanat","ASSIGNED_TO":"Tekijä","ROLE":"Rooli","CREATED_BY":"Luoja","CUSTOM_FILTERS":"Omat suodattimet","EPIC":"Eepos"}},"WYSIWYG":{"CODE_SNIPPET":"Code Snippet","DB_CLICK":"tuplaklikkaa muokataksesi","SELECT_LANGUAGE_PLACEHOLDER":"Valitse kieli","SELECT_LANGUAGE_REMOVE_FORMATING":"Poista muotoilu","OUTDATED":"Another person has made changes while you were editing. Check the new version on the activity tab before you save your changes.","MARKDOWN_HELP":"Merkintätavan ohjeet"},"PERMISIONS_CATEGORIES":{"EPICS":{"NAME":"Eepokset","VIEW_EPICS":"Näytä eepokset","ADD_EPICS":"Lisää eepos","MODIFY_EPICS":"Modify epics","COMMENT_EPICS":"Comment epics","DELETE_EPICS":"Poista eepos"},"SPRINTS":{"NAME":"Kierrokset","VIEW_SPRINTS":"Katso kierroksia","ADD_SPRINTS":"Lisää kierroksia","MODIFY_SPRINTS":"Muokkaa kieroksia","DELETE_SPRINTS":"Poista kierroksia"},"USER_STORIES":{"NAME":"Käyttäjätarinat","VIEW_USER_STORIES":"Katso käyttäjätarinoita","ADD_USER_STORIES":"Lisää käyttäjätarinoita","MODIFY_USER_STORIES":"Muokkaa käyttäjätarinoita","COMMENT_USER_STORIES":"Comment user stories","DELETE_USER_STORIES":"Poista käyttäjätarinoita"},"TASKS":{"NAME":"Tehtävät","VIEW_TASKS":"Katsot tehtäviä","ADD_TASKS":"Lisää tehtäviä","MODIFY_TASKS":"Muokkaa tehtäviä","COMMENT_TASKS":"Comment tasks","DELETE_TASKS":"Poista tehtäviä"},"ISSUES":{"NAME":"Pyynnöt","VIEW_ISSUES":"Katso pyyntöjä","ADD_ISSUES":"Lisää pyyntöjä","MODIFY_ISSUES":"Muokkaa pyyntöjä","COMMENT_ISSUES":"Comment issues","DELETE_ISSUES":"Poista pyyntöjä"},"WIKI":{"NAME":"Wiki","VIEW_WIKI_PAGES":"Katso wiki-sivuja","ADD_WIKI_PAGES":"Lisää wiki-sivuja","MODIFY_WIKI_PAGES":"Muokkaa wiki-sivuja","DELETE_WIKI_PAGES":"Poista wiki-sivuja","VIEW_WIKI_LINKS":"Katso wiki-linkkejä","ADD_WIKI_LINKS":"Lisää wiki-linkkejä","DELETE_WIKI_LINKS":"Poista wiki-linkkejä"}}},"LOGIN":{"PAGE_TITLE":"Kirjaudu - Taiga","PAGE_DESCRIPTION":"Logging in to Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"AUTH":{"INVITED_YOU":"on kutsunut sinut projektiin","NOT_REGISTERED_YET":"Etkö ole vielä rekisteröitynyt?","REGISTER":"Rekisteröidy","CREATE_ACCOUNT":"luo ilmainen tunnuksesi täällä"},"LOGIN_COMMON":{"HEADER":"Minulla on jo Taiga tunnus","PLACEHOLDER_AUTH_NAME":"Käyttäjänimi tai sähköposti (kirjainkoko merkitsevä)","LINK_FORGOT_PASSWORD":"Unohditko?","TITLE_LINK_FORGOT_PASSWORD":"Unohditko salasanasi?","ACTION_ENTER":"Sisään","ACTION_SIGN_IN":"Kirjaudu","PLACEHOLDER_AUTH_PASSWORD":"Salasana (kirjainkoko merkitsevä)","ALT_LOGIN":"Tai kirjaudu käyttäen"},"LOGIN_FORM":{"ERROR_AUTH_INCORRECT":"Käyttäjänimesi tai sähköpostisi tai salasanasi on väärä.","SUCCESS":"Oompa Loompat ovat onnellisia, tervetuloa Taigaan."},"REGISTER":{"PAGE_TITLE":"Rekisteröidy - Taiga","PAGE_DESCRIPTION":"Create your account in Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"REGISTER_FORM":{"TITLE":"Rekisteröi uusi Taiga tunnus (ilmainen)","PLACEHOLDER_NAME":"Anna käyttäjänimi (kirjainkoko on merkitsevä)","PLACEHOLDER_FULL_NAME":"Anna koko nimesi","PLACEHOLDER_EMAIL":"Sähköpostisi","PLACEHOLDER_PASSWORD":"Anna salasana (kirjainkoko merkitsevä)","ACTION_SIGN_UP":"Kirjaudu sisään","TITLE_LINK_LOGIN":"Kirjaudu sisään","LINK_LOGIN":"Oletko jo rekisteröitynyt? Kirjaudu sisään"},"FORGOT_PASSWORD":{"PAGE_TITLE":"Unohditko salasanasi - Taiga","PAGE_DESCRIPTION":"Enter your username or email to get a new password and you can access to Taiga again."},"FORGOT_PASSWORD_FORM":{"TITLE":"Hups, unohditko salasanasi?","SUBTITLE":"Anna käyttäjänimesi tai sähköpostisi saadaksesi uuden","PLACEHOLDER_FIELD":"Käyttäjänimi tai sähköposti","ACTION_RESET_PASSWORD":"Uusi salsanasi","LINK_CANCEL":"Vie minut takaisin, muistan sen.","SUCCESS_TITLE":"Tarkista inbox!","SUCCESS_TEXT":"Lähetimme sinulle sähköpostin, jossa ohjeet uuden salasanan asettamiseksi.","ERROR":"Oompa Loompas sanovat että käyttäjänimesi tai sähköpostisi tai salasanasi on väärä."},"CHANGE_PASSWORD":{"PAGE_TITLE":"Vaihda salasanasi - Taiga","SECTION_NAME":"Muuta salasanaa","FIELD_CURRENT_PASSWORD":"Nykyinen salasana","PLACEHOLDER_CURRENT_PASSWORD":"Nykyinen salasanasi (tai on tyhjä jos sinulla ei vielä ole)","FIELD_NEW_PASSWORD":"Uusi salasana","PLACEHOLDER_NEW_PASSWORD":"Anna uusi salasana","FIELD_RETYPE_PASSWORD":"Anna salasana uudelleen","PLACEHOLDER_RETYPE_PASSWORD":"Anna salasana uudelleen","ERROR_PASSWORD_MATCH":"Salasanat eivät täsmää"},"CHANGE_PASSWORD_RECOVERY_FORM":{"TITLE":"Luo uusi pääsy Taigaan","SUBTITLE":"Rautapitoinen ruoka on hyväksi aivoille :P","PLACEHOLDER_NEW_PASSWORD":"Uusi salasana","PLACEHOLDER_RE_TYPE_NEW_PASSWORD":"Anna salasana uudelleen","ACTION_RESET_PASSWORD":"Uusi salsanasi","ERROR":"Our Oompa Loompas can't find your request to recover your password. Try to ask for it again.","SUCCESS":"Oompa Loompas tallensi uuden salasanasi.
    Yritä kirjautua sisään sillä."},"INVITATION":{"PAGE_TITLE":"Kutsun hyväksyminen - Taiga","PAGE_DESCRIPTION":"Accept the invitation to join a project in Taiga, a project management platform for startups and agile developers & designers who want a simple, beautiful tool that makes work truly enjoyable."},"INVITATION_LOGIN_FORM":{"NOT_FOUND":"Kutsuasi ei löydy.","SUCCESS":"Olet onnistuneesti liittynyt projektiin {{project_name}}. Tervetuloa!"},"HOME":{"PAGE_TITLE":"Etusivu - Taiga","PAGE_DESCRIPTION":"The Taiga home page with your main projects and all your assigned and watched user stories, tasks and issues","EMPTY_WORKING_ON":"Näyttää tyhjätlä, eikövain? Aloita työskentely ja näet tässä sinua koskevat käyttäjätarinat, tehtävät ja tukipyynnöt.","EMPTY_WATCHING":"Follow User Stories, Tasks, Issues in your projects and be notified about its changes :)","EMPTY_PROJECT_LIST":"Sinulla ei ole vielä projekteja","WORKING_ON_SECTION":"Käynnissä olevat","WATCHING_SECTION":"Seurqnnassa","DASHBOARD":"Projektit Dashboard"},"EPICS":{"TITLE":"Eepokset","SECTION_NAME":"Eepokset","EPIC":"Eepokset","PAGE_TITLE":"Eepokset - {{projectName}}","PAGE_DESCRIPTION":"Eepokset {{projectName}}: {{projectDescription}}","DASHBOARD":{"ADD":"+ Lisää Eepos","UNASSIGNED":"Tekijä puuttuu"},"EMPTY":{"TITLE":"Ei vielä lisättyjä eepoksia","EXPLANATION":"Epics are items at a higher level that encompass user stories.
    Epics are at the top of the hierarchy and can be used to group user stories together.","HELP":"Lue lisää eepoksista"},"TABLE":{"VOTES":"Ääniä","NAME":"Nimi","PROJECT":"Projekti","SPRINT":"Kierros","ASSIGNED_TO":"Tekijä valittu","STATUS":"Tila","PROGRESS":"Edistyminen","VIEW_OPTIONS":"Näytä asetukset"},"CREATE":{"TITLE":"Uusi Eepos","PLACEHOLDER_DESCRIPTION":"Please add descriptive text to help others better understand this epic","TEAM_REQUIREMENT":"Team requirement","CLIENT_REQUIREMENT":"Asiakasvaatimus","BLOCKED":"Suljettu","BLOCKED_NOTE_PLACEHOLDER":"Miksi tämä eepos on estetty?","CREATE_EPIC":"Luo eepos"}},"PROJECTS":{"PAGE_TITLE":"Minun projektit - Taiga","PAGE_DESCRIPTION":"Listaus kaikista projekteistasi, voit järjestää niitä tai luoda uuden.","MY_PROJECTS":"Minun projektit"},"ATTACHMENT":{"SECTION_NAME":"liitteet","TITLE":"{{ fileName }} ladattu {{ date }}\n","LIST_VIEW_MODE":"Listanäkymä","GALLERY_VIEW_MODE":"Gallerianäkymä","DESCRIPTION":"Kirjoita lyhyt kuvaus","DEPRECATED":"(poistettu)","DEPRECATED_FILE":"Vanhentunut?","ADD":"Lisää liitetiedosto {{maxFileSizeMsg}}","DROP":"Raahaa liitetiedostot tähän!","SHOW_DEPRECATED":"+ näytä vanhentuneet liitteet","HIDE_DEPRECATED":"- piilota vanhentuneet liitteet","COUNT_DEPRECATED":"({{ counter }} vanhentunutta)","MAX_UPLOAD_SIZE":"Maksimi tiedoston koko {{maxFileSize}}","DATE":"DD.MM.YY - hh:mm","ERROR_UPLOAD_ATTACHMENT":"Emme onnistuneet lataamaan tiedostoa '{{fileName}}'. {{errorMessage}}","TITLE_LIGHTBOX_DELETE_ATTACHMENT":"Poista liite...","MSG_LIGHTBOX_DELETE_ATTACHMENT":"liite '{{fileName}}'","ERROR_DELETE_ATTACHMENT":"Emme pystyneet poistamaan: {{errorMessage}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) on liian iso Oompa Loompaseille, kokeile pienemmällä kuin ({{maxFileSize}})"},"PAGINATION":{"PREVIOUS":"Edellinen","NEXT":"Seuraava"},"ADMIN":{"COMMON":{"TITLE_ACTION_EDIT_VALUE":"Muokkaa arvoa","TITLE_ACTION_DELETE_VALUE":"Poista arvo","TITLE_ACTION_DELETE_TAG":"Poista avainsana"},"HELP":"Tarvitsetko apua? Katso tukisivuilta.","PROJECT_DEFAULT_VALUES":{"TITLE":"Oletusarvot","SUBTITLE":"Aseta oletukset kaikille syötteille."},"MEMBERSHIPS":{"TITLE":"Hallinnoi jäseniä","PAGE_TITLE":"Jäsenet - {{projectName}}","ADD_BUTTON":"+ Uusi jäsen","ADD_BUTTON_TITLE":"Lisää jäsen","LIMIT_USERS_WARNING_MESSAGE_FOR_ADMIN":"Unfortunately, this project has reached its limit of ({{members}}) allowed members.","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"This project has reached its limit of ({{members}}) allowed members. If you would like to increase that limit please contact the administrator."},"PROJECT_EXPORT":{"TITLE":"Vie","SUBTITLE":"Vie projekti varmuuskopioksi tai luo uusi tämän pohjalta.","EXPORT_BUTTON":"Vie","EXPORT_BUTTON_TITLE":"Vie projekti","LOADING_TITLE":"Varmistustiedostoa muodostetaan","DUMP_READY":"Tiedostosi on valmis","LOADING_MESSAGE":"Älä sulje tätä sivua.","ASYNC_MESSAGE":"Lähetämme sähköpostia, kun on valmista.","SYNC_MESSAGE":"Jos lataus ei ala automaattisesti klikkaa tästä.","ERROR":"Oompa Loompas eivät onnistuneet tekemään tiedostoasi. Yritä uudelleen.","ERROR_BUSY":"Valitettavasti Oompa Loompas ovat kiireisiä juuri. Yritä kohta uudestaan."},"MODULES":{"TITLE":"Modulit","EPICS":"Eepokset","EPICS_DESCRIPTION":"Visualize and manage the most strategic part of your project","BACKLOG":"Odottavat","BACKLOG_DESCRIPTION":"Hallinnoi käyttäjätarinoita: järjestele ja priorisoi työtä.","NUMBER_SPRINTS":"Arvio sprinttien lukumäärästä","NUMBER_SPRINTS_HELP":"0 for an undetermined number","NUMBER_US_POINTS":"Arvioitu pisteiden kokonaismäärä","NUMBER_US_POINTS_HELP":"0 for an undetermined number","KANBAN":"Kanban","KANBAN_DESCRIPTION":"Järjestä projektisi tehokkaasti tällä taululla.","ISSUES":"Pyynnöt","ISSUES_DESCRIPTION":"Seuraa projektisi virheitä, kysymyksiä ja parannusehdotuksia. Älä jätä mitään huomiotta!","WIKI":"Wiki","WIKI_DESCRIPTION":"Lisää, muokkaa tai poista sisältöä yhteistyössä muiden kanssa. Tämä on oikea paikka projektin dokumentaatiolle.","MEETUP":"Tapaa","MEETUP_DESCRIPTION":"Valitse videoneuvottelusovellus","SELECT_VIDEOCONFERENCE":"Valitse videoconferenssi-järjestelmä","SALT_CHAT_ROOM":"Lisää vakio-osa keskusteluhuoneen nimeen","JITSI_CHAT_ROOM":"Jitsi","APPEARIN_CHAT_ROOM":"AppearIn","TALKY_CHAT_ROOM":"Talky","CUSTOM_CHAT_ROOM":"Custom","URL_CHAT_ROOM":"Videoneuvottelun URL-osoite"},"PROJECT_PROFILE":{"PAGE_TITLE":"{{sectionName}} - Projektin profiili - {{projectName}}","PROJECT_DETAILS":"Projektin tiedot","PROJECT_NAME":"Projektin nimi","TAGS":"Avainsanat","DESCRIPTION":"Kuvaus","RECRUITING":"Etsitäänkö tähän projektiin tekijöitä?","RECRUITING_MESSAGE":"Ketä etsit?","RECRUITING_PLACEHOLDER":"Määritä etsittävät profiilit","FEEDBACK":"Receive feedback from Taiga users?","PUBLIC_PROJECT":"Julkinen projekti","PRIVATE_PROJECT":"Yksityinen projekti","PRIVATE_OR_PUBLIC":"Mitä eroa on julkisella ja yksityisellä projektilla?","DELETE":"Poista tämä projekti","CHANGE_LOGO":"Vaihda logo","ACTION_USE_DEFAULT_LOGO":"Käytä oletuskuvaa","MAX_PRIVATE_PROJECTS":"You've reached the maximum number of private projects allowed by your current plan","MAX_PRIVATE_PROJECTS_MEMBERS":"The maximum number of members for private projects has been exceeded","MAX_PUBLIC_PROJECTS":"Unfortunately, you've reached the maximum number of public projects allowed by your current plan","MAX_PUBLIC_PROJECTS_MEMBERS":"The project exceeds your maximum number of members for public projects","PROJECT_OWNER":"Projektin omistaja","REQUEST_OWNERSHIP":"Pyydä omistusoikeutta","REQUEST_OWNERSHIP_CONFIRMATION_TITLE":"Do you want to become the new project owner?","REQUEST_OWNERSHIP_DESC":"Request that current project owner {{name}} transfer ownership of this project to you.","REQUEST_OWNERSHIP_BUTTON":"Pyyntö","REQUEST_OWNERSHIP_SUCCESS":"Ilmoitamme projektin omistajalle","CHANGE_OWNER":"Vaihda omistajaa","CHANGE_OWNER_SUCCESS_TITLE":"Ok, pyyntösi lähetetty!","CHANGE_OWNER_SUCCESS_DESC":"We will notify you by email if the project ownership request is accepted or declined"},"REPORTS":{"TITLE":"Raportit","SUBTITLE":"Vie projektisi CSV-tiedostoon","DESCRIPTION":"Download a CSV file or copy the generated URL and open it in your favourite text editor or spreadsheet to make your own project data reports. You will be able to visualize and analyze all your data easily.","HELP":"Kuinka tätä käytetään omassa taulukossani?","REGENERATE_TITLE":"Vaihda URL","REGENERATE_SUBTITLE":"Jos muutata CSV-datan URLia, edellien lakkaa toimimasta. Oletko varma?"},"CSV":{"SECTION_TITLE_EPIC":"epics reports","SECTION_TITLE_US":"käyttäjätarinoiden raportit","SECTION_TITLE_TASK":"tehtävien raportit","SECTION_TITLE_ISSUE":"pyyntöjen raportit","DOWNLOAD":"Lataa CSV-tiedosto","URL_FIELD_PLACEHOLDER":"Tee uusi CSV-url","TITLE_REGENERATE_URL":"Tee uusi CSV-url","ACTION_GENERATE_URL":"Luo URL","ACTION_REGENERATE":"Tee uusi"},"CUSTOM_FIELDS":{"TITLE":"Omat kentät","SUBTITLE":"Määritele omia kenttiä käyttäjätarinoihin, tehtäviin ja pyytöihin","EPIC_DESCRIPTION":"Eeposten vapaavalintaiset kentät","EPIC_ADD":"Lisää vapaavalintainen kenttä eepoksiin","US_DESCRIPTION":"Käyttäjätarinoiden omat kentät","US_ADD":"Lisää käyttäjätarinoihin oma kenttä","TASK_DESCRIPTION":"Tehtävien omat kentät","TASK_ADD":"Lisää omia kenttiä tehtäviin","ISSUE_DESCRIPTION":"Pyyntöjen omat kentät","ISSUE_ADD":"Lisää oma kenttä pyynnöille","FIELD_TYPE_TEXT":"Teksti","FIELD_TYPE_RICHTEXT":"Muotoiltu teksti","FIELD_TYPE_MULTI":"Monirivinen","FIELD_TYPE_DATE":"PVM","FIELD_TYPE_URL":"Url"},"PROJECT_VALUES":{"PAGE_TITLE":"{{sectionName}} - Project values - {{projectName}}","REPLACEMENT":"Kaikkii riveihin joissa on tämä arvo muutetaan ","ERROR_DELETE_ALL":"Et voi poistaa kaikkia arvoja."},"PROJECT_VALUES_POINTS":{"TITLE":"Pisteet","SUBTITLE":"Määrittele pisteet joihin käyttäjätarinat voidaan arvioida","US_TITLE":"Tarinapisteet","ACTION_ADD":"Lisää uusi piste"},"PROJECT_VALUES_PRIORITIES":{"TITLE":"Prioriteetit","SUBTITLE":"Määrittele tärkeydet pyynnöille","ISSUE_TITLE":"Issue prioriteetit","ACTION_ADD":"Lisää uusi tärkeys"},"PROJECT_VALUES_SEVERITIES":{"TITLE":"Vakavuudet","SUBTITLE":"Määrittele pyyntöjen vakavuudet","ISSUE_TITLE":"Issue severities","ACTION_ADD":"Lisää uusi vakavuus"},"PROJECT_VALUES_STATUS":{"TITLE":"Tilat","SUBTITLE":"Määrittele tilat joiden kautta käyttäjätarinasi, tehtäväsi ja pyyntösi kulkevat","EPIC_TITLE":"Epic Statuses","US_TITLE":"User Story Statuses","TASK_TITLE":"Tehtävien tilat","ISSUE_TITLE":"Pyyntöjen tilat"},"PROJECT_VALUES_TYPES":{"TITLE":"Tyypit","SUBTITLE":"Määrittele pyyntöjen tyypit","ISSUE_TITLE":"Pyyntöjen tyypit","ACTION_ADD":"Lisää uusi {{objName}}"},"PROJECT_VALUES_TAGS":{"TITLE":"Avainsanat","SUBTITLE":"Näytä ja muokkaa tagien värejä","EMPTY":"Ei tageja","EMPTY_SEARCH":"Ei hakutuloksia","ACTION_ADD":"Lisää avainsana","NEW_TAG":"Uusi tagi","MIXING_HELP_TEXT":"Valitse yhdistettävät tagit","MIXING_MERGE":"Yhdistä tagit","SELECTED":"Valittu"},"ROLES":{"PAGE_TITLE":"Roolit - {{projectName}}","WARNING_NO_ROLE":"Ole varovainen, yksikään rooli projektissasi ei voi arvioida käyttäjätarinoidesi kokoa","HELP_ROLE_ENABLED":"Tämän roolin omaavat jäsenet voivat arvioida käyttäjätarinoiden kokoja","DISABLE_COMPUTABLE_ALERT_TITLE":"Are you sure you want to disable this role estimations?","DISABLE_COMPUTABLE_ALERT_SUBTITLE":"If you disable estimation permissions for role {{roleName}} all previous estimations made by this role will be removed","COUNT_MEMBERS":"{{ role.members_count }} jäsentä joilla tämä rooli","TITLE_DELETE_ROLE":"Poista rooli","REPLACEMENT_ROLE":"Kaikki käyttäjä joilla on tämä rooli siirretään","WARNING_DELETE_ROLE":"Be careful! All role estimations will be removed","ERROR_DELETE_ALL":"Voit poistaa kaikki arvot","EXTERNAL_USER":"Ulkoinen käyttäjä","NOTE_EXTERNAL_USERS":"Note: by External User we mean any anonymous user not belonging to the Taiga platform, including search engines. Please use this role with care."},"THIRD_PARTIES":{"SECRET_KEY":"Salainen avain","PAYLOAD_URL":"Yhteyden URL-osoite","VALID_IPS":"Vaadittavat lähdeIPt (pilkuilla eroteltuna)"},"BITBUCKET":{"SECTION_NAME":"Bitbucket","PAGE_TITLE":"Bitbucket - {{projectName}}","INFO_VERIFYING_IP":"Bitbucket pyynnöt eivät ole allekirjoitettuja joten tarkista IP. Jos IP on tyhjä, ei sitä tarkisteta."},"GITLAB":{"SECTION_NAME":"Gitlab","PAGE_TITLE":"Gitlab - {{projectName}}","INFO_VERIFYING_IP":"Gitlab pyynnöt eivät ole allekirjoitettuja joten tarkista IP. Jos IP on tyhjä, ei sitä tarkisteta."},"GITHUB":{"SECTION_NAME":"GitHub","PAGE_TITLE":"GitHub - {{projectName}}"},"GOGS":{"SECTION_NAME":"Gogs","PAGE_TITLE":"Gogs - {{projectName}}"},"WEBHOOKS":{"PAGE_TITLE":"Webhooks - {{projectName}}","SECTION_NAME":"Webhookit","ADD_NEW":"Lisää webhook","TYPE_NAME":"Anna palvelun nimi","TYPE_PAYLOAD_URL":"Anna palvelun yhteysosoite (URL)","TYPE_SERVICE_SECRET":"Anna palvelun yksityinen avain","SAVE":"Tallenna Webhook","CANCEL":"Peruuta Webhook","SHOW_HISTORY":"(Näytä historia)","TEST":"Testaa webhook","EDIT":"Muokkaa webhookkia","DELETE":"Poista Webhook","REQUEST":"Pyyntö","RESEND_REQUEST":"Lähetä pyyntö uudestaan","HEADERS":"Ylätunnisteet","PAYLOAD":"Hyötykuorma","RESPONSE":"Vastaus","DATE":"DD.MM.YY - hh:mm:ss","ACTION_HIDE_HISTORY":"(Piilota historia)","ACTION_HIDE_HISTORY_TITLE":"Piilota historian yksityiskohdat","ACTION_SHOW_HISTORY":"(Näytä historia)","ACTION_SHOW_HISTORY_TITLE":"Näytä historian yksityiskohdat","WEBHOOK_NAME":"Webhook '{{name}}'"},"CUSTOM_ATTRIBUTES":{"PAGE_TITLE":"{{sectionName}} - Custom Attributes - {{projectName}}","ADD":"Anna oma kenttä","EDIT":"Muokkaa omaa kenttää","DELETE":"Poista oma kenttä","SAVE_TITLE":"Tallenna oma kenttä","CANCEL_TITLE":"Peru luonti","SET_FIELD_NAME":"Anna oman kentän nimi","SET_FIELD_DESCRIPTION":"Anna oman kenttäsi kuvaus","FIELD_TYPE_DEFAULT":"-- valitse yksi --","ACTION_UPDATE":"Päivitä oma kenttä","ACTION_CANCEL_EDITION":"Peru versio"},"MEMBERSHIP":{"COLUMN_MEMBER":"Jäsen","COLUMN_ADMIN":"Hallinnoi","COLUMN_ROLE":"Rooli","COLUMN_STATUS":"Tila","STATUS_ACTIVE":"Aktiivinen","STATUS_PENDING":"Odottaa","DELETE_MEMBER":"Poista jäsen","RESEND":"Lähetä uudelleen","SUCCESS_SEND_INVITATION":"Olemme lähettäneet kutsun uudelleen osoitteeseen '{{email}}'.","SUCCESS_DELETE":"Olemme poistaneet viestin {{message}}.","ERROR_DELETE":"Emme pystyneet poistamaan viestiä {{message}}.","DEFAULT_DELETE_MESSAGE":"kutsu sähköpostiin {{email}}"},"DEFAULT_VALUES":{"LABEL_EPIC_STATUS":"Default value for epic status selector","LABEL_US_STATUS":"Default value for user story status selector","LABEL_POINTS":"Oletukset pisteiden valintaan","LABEL_TASK_STATUS":"Oletukset tehtävien tilaksi","LABEL_ISSUE_TYPE":"Oletukset pyyntöjen tyypeiksi","LABEL_ISSUE_STATUS":"Oletukset pyyntöjen statuksiksi","LABEL_PRIORITY":"Oletus arvo tärkeyden valiintaan","LABEL_SEVERITY":"Oletukset vakavuudeksi"},"STATUS":{"PLACEHOLDER_WRITE_STATUS_NAME":"Anna uuden tilan nimi"},"TYPES":{"PLACEHOLDER_WRITE_NAME":"Anna uuden elementin nimi"},"US_STATUS":{"ACTION_ADD_STATUS":"Lisää uusi tila","IS_ARCHIVED_COLUMN":"Arkistoitu","IS_CLOSED_COLUMN":"Suljettu","WIP_LIMIT_COLUMN":"WIP raja","PLACEHOLDER_WRITE_NAME":"Anna uuden tilan nimi"},"MENU":{"PROJECT":"Projekti","ATTRIBUTES":"Attribuutit","MEMBERS":"Jäsenet","PERMISSIONS":"Oikeudet","INTEGRATIONS":"Intergraatiot"},"SUBMENU_PROJECT_VALUES":{"STATUS":"Tila","POINTS":"Pisteet","PRIORITIES":"Tärkeydet","SEVERITIES":"Vakavuudet","TYPES":"Tyypit","CUSTOM_FIELDS":"Omat kentät","TAGS":"Avainsanat"},"SUBMENU_ROLES":{"TITLE":"Roolit","ACTION_NEW_ROLE":"+ Uusi rooli","TITLE_ACTION_NEW_ROLE":"Lisää uusi rooli"},"PROJECT_TRANSFER":{"DO_YOU_ACCEPT_PROJECT_OWNERNSHIP":"Haluaisitko uudeksi projektin omistajaksi?","PRIVATE":"Yksityinen","ACCEPTED_PROJECT_OWNERNSHIP":"Onnittelu! Olet nyt projektin omistaja.","REJECTED_PROJECT_OWNERNSHIP":"OK. Ilmoitamme projektin omistajalle.","ACCEPT":"Hyväksy","REJECT":"Hylkää","PROPOSE_OWNERSHIP":"{{owner}}, the current owner of the project {{project}} has asked that you become the new project owner.","ADD_COMMENT":"Would you like to add a comment for the project owner?","UNLIMITED_PROJECTS":"Rajoittamaton","OWNER_MESSAGE":{"PRIVATE":"Please remember that you can own up to {{maxProjects}} private projects. You currently own {{currentProjects}} private projects","PUBLIC":"Please remember that you can own up to {{maxProjects}} public projects. You currently own {{currentProjects}} public projects"},"CANT_BE_OWNED":"At the moment you cannot become an owner of a project of this type. If you would like to become the owner of this project, please contact the administrator so they change your account settings to enable project ownership."}},"USER":{"PROFILE":{"PAGE_TITLE":"{{userFullName}} (@{{userUsername}})","EDIT":"Muokkaa profiilia","CLOSED_US":"Suljettu US","PROJECTS":"Projektit","PROJECTS_EMPTY":"{{username}} ei vielä omia projekteja","CONTACTS":"Yhteystiedot","CONTACTS_EMPTY":"{{username}} doesn't have contacts yet","CURRENT_USER_CONTACTS_EMPTY":"You don't have contacts yet","CURRENT_USER_CONTACTS_EMPTY_EXPLAIN":"The people with whom you work at Taiga will be your contacts automatically","TABS":{"ACTIVITY_TAB":"Aikajana","ACTIVITY_TAB_TITLE":"Näytä tämä käyttäjän tapahtumat","PROJECTS_TAB":"Projektit","PROJECTS_TAB_TITLE":"Projektit joissa tämä käyttäjä on mukana","LIKES_TAB":"Tykkäykset","LIKES_TAB_TITLE":"Näytä tämän käyttäjän tykkäykset","VOTES_TAB":"Ääniä","VOTES_TAB_TITLE":"Näyttä kaikki tämän käyttäjän äänestykset","WATCHED_TAB":"Seurattu","WATCHED_TAB_TITLE":"Näytä kaikki tämän käyttäjän seuraamat kohteet","CONTACTS_TAB":"Yhteystiedot","CONTACTS_TAB_TITLE":"Listaa tämän käyttäjän tekemät kontaktit"}},"PROFILE_SIDEBAR":{"TITLE":"Oma profiili","DESCRIPTION":"People can see everything you do and what you are working on. Add a nice bio to give an enhanced version of your information.","ADD_INFO":"Muokkaa bio"},"PROFILE_FAVS":{"FILTER_INPUT_PLACEHOLDER":"Kirjoita tähän...","FILTER_TYPE_ALL":"Kaikki","FILTER_TYPE_ALL_TITLE":"Näytä kaikki","FILTER_TYPE_PROJECTS":"Projektit","FILTER_TYPE_PROJECTS_TITLE":"Näytä vain projektit","FILTER_TYPE_EPICS":"Eepokset","FILTER_TYPE_EPICS_TITLE":"Näytä vain eepokset","FILTER_TYPE_USER_STORIES":"Tarinat","FILTER_TYPE_USER_STORIES_TITLE":"Näytä vain käyttäjätarinat","FILTER_TYPE_TASKS":"Tehtävät","FILTER_TYPE_TASKS_TITLE":"Näytä vain tehtävät","FILTER_TYPE_ISSUES":"Pyynnöt","FILTER_TYPE_ISSUES_TITLE":"Show only issues","EMPTY_TITLE":"It looks like there's nothing to show here."}},"PROJECT":{"PAGE_TITLE":"{{projectName}}","HELP":"Reorder your projects to set in the top the most used ones.
    The top 10 projects will appear in the top navigation bar project list","PRIVATE":"Yksityinen projekti","LOOKING_FOR_PEOPLE":"Tähän projektiin etsitään tekijöitä","FANS_COUNTER_TITLE":"{total, plural, one{one fan} other{# fans}}","WATCHERS_COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}","MEMBERS_COUNTER_TITLE":"{total, plural, one{one member} other{# members}}","BLOCKED_PROJECT":{"BLOCKED":"Estetty projekti","THIS_PROJECT_IS_BLOCKED":"Projekti estetty väliaikaisesti","TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF":"In order to unblock your projects, contact the administrator."},"SECTION":{"SEARCH":"Hae","TIMELINE":"Aikajana","BACKLOG":"Odottavat","KANBAN":"Kanban","ISSUES":"Pyynnöt","WIKI":"Wiki","TEAM":"Tiimi","MEETUP":"Tapaa","ADMIN":"Hallinnoi"},"NAVIGATION":{"ACTION_CREATE_PROJECT":"Luo projekti","MANAGE_PROJECTS":"Hallitse projekteja","TITLE_CREATE_PROJECT":"Luo projekti","HELP_TITLE":"Taiga Tukisivusto","HELP":"Ohjeet","HOMEPAGE":"Etusivu","FEEDBACK_TITLE":"Lähetä palautetta","FEEDBACK":"Palaute","NOTIFICATIONS_TITLE":"Muokkaa ilmoitusasetuksiasi","NOTIFICATIONS":"Ilmoitukset","VIEW_PROFILE_TITLE":"Näytä profiili","VIEW_PROFILE":"Näytä profiili","EDIT_PROFILE_TITLE":"Muokkaa profiiliasi","EDIT_PROFILE":"Muokkaa profiilia","CHANGE_PASSWORD_TITLE":"Muuta salasanaa","CHANGE_PASSWORD":"Muuta salasanaa","DASHBOARD_TITLE":"Dashboard","DISCOVER_TITLE":"Discover trending projects","DISCOVER":"Discover"},"LIKE_BUTTON":{"LIKE":"Tykkää","LIKED":"Tykätty","UNLIKE":"Poista tykkäys","BUTTON_TITLE":"Like or unlike this project","COUNTER_TITLE":"{total, plural, one{one fan} other{# fans}}"},"WATCH_BUTTON":{"BUTTON_TITLE":"Seuraa tätä projektia ja aseta ilmoitukset","WATCH":"Seuraa","WATCHING":"Seuraa","COUNTER_TITLE":"{total, plural, one{one watcher} other{# watchers}}","OPTIONS":{"NOTIFY_ALL":"Tilaa kaikki ilmoitukset","NOTIFY_ALL_TITLE":"Vastaanota kaikki tämän projektin ilmoitukset","NOTIFY_INVOLVED":"Only involved","NOTIFY_INVOLVED_TITLE":"Vastaanota ilmoituksia vain kun osallistut","UNWATCH":"Lopeta seuraaminen","UNWATCH_TITLE":"Lopeta seuraaminen"}},"CONTACT_BUTTON":{"CONTACT_TITLE":"Contact the project team","CONTACT_BUTTON":"Contact the project"},"CREATE":{"TITLE":"Luo projekti","CHOOSE_TEMPLATE":"Which template fits your project better?","TEMPLATE_SCRUM":"Scrum","TEMPLATE_SCRUM_DESC":"Prioritize and solve your tasks in short time cycles.","TEMPLATE_SCRUM_LONGDESC":"Scrum is an iterative and incremental agile software development methodology for managing product development.\nThe product backlog is what will ultimately be delivered, ordered into the sequence in which it should be delivered. Product Backlogs are broken into manageable, executable chunks named sprints. Every certain amount of time the team initiates a new sprint and commits to deliver a certain number of user stories from the backlog, in accordance with their skills, abilities and resources. The project advances as the backlog becomes depleted.","TEMPLATE_KANBAN":"Kanban","TEMPLATE_KANBAN_DESC":"Keep a constant workflow on independent tasks","TEMPLATE_KANBAN_LONGDESC":"The Kanban methodology is used to divide project development (any sort of project) into stages.\nA kanban card is like an index card or post-it note that details every task (or user story) in a project that needs to be completed. The Kanban board is used to move each card from one state of completion to the next and in so doing, helps track progress.","DUPLICATE":"Kopioi projekti","DUPLICATE_DESC":"Start clean and keep your configuration","IMPORT":"Luo projekti tiedostosta","IMPORT_DESC":"Tuo projekti muista järjestelmistä Taigaan","INVITE":"Kutsu projektiin","SOLO_PROJECT":"You'll be alone in this project","INVITE_LATER":"(You'll be able to invite more members later)","BACK":"Palvelin","MAX_PRIVATE_PROJECTS":"Unfortunately, You've reached the maximum number of private projects.\nIf you would like to increase the current limit please contact the administrator.","MAX_PUBLIC_PROJECTS":"Unfortunately, You've reached the maximum number of public projects.\nIf you would like to increase the current limit please contact the administrator.","PUBLIC_PROJECT":"Julkinen projekti","PRIVATE_PROJECT":"Yksityinen projekti"},"COMMON":{"DETAILS":"New project details","PROJECT_TITLE":"Projektin nimi","PROJECT_DESCRIPTION":"Projektikuvaus"},"DUPLICATE":{"TITLE":"Kopioi projekti","DESCRIPTION":"Start clean and keep your configuration","SELECT_PLACEHOLDER":"Valitse kopioitava projekti"},"IMPORT":{"TITLE":"Tuo projekti","DESCRIPTION":"Tuo projekti muista järjestelmistä Taigaan","ASYNC_IN_PROGRESS_TITLE":" Oompa Loompas tuovat projektia","ASYNC_IN_PROGRESS_MESSAGE":"Tämä voi kestää muutaman minuutin
    Lähetämme sähköpostin on valmista","UPLOAD_IN_PROGRESS_MESSAGE":"LAdattu {{uploadedSize}} / {{totalSize}}","ERROR":"Oompa Loompas eivät onnistuneet tuomaan tiedostoasi. Yritä uudestaan.","ERROR_TOO_MANY_REQUEST":"Valitettavasti Oompa Loompas ovat kiireisiä juuri. Yritä kohta uudestaan.","ERROR_MESSAGE":"Oompa Loompas eivät pysty lukemaan tiedostoasi: {{error_message}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) on liian iso Oompa Loompaseille, kokeile pienemmällä kuin ({{maxFileSize}})","SYNC_SUCCESS":"Projektisi on tuotu sisään onnistuneesti","IMPORT":"Tuo","WHO_IS":"Their tasks will be assigned to ...","WRITE_EMAIL":"Or if you want, write the email that this user uses in Taiga","SEARCH_CONTACT":"Or if you want, search in your contacts","WRITE_EMAIL_LABEL":"Write the email that this user uses in Taiga","ACCEEDE":"Acceede","PROJECT_MEMBERS":"Projektin jäsenet","PROCESS_DESCRIPTION":"Tell us who from Taiga you want to assign the tasks of {{platform}}","MATCH":"Onko {{user_external}} sama henkilö kuin {{user_internal}}?","CHOOSE":"Valitse käyttäjä","LINKS":"Links with {{platform}}","LINKS_DESCRIPTION":"Do you want to keep the link of each item with the original {{platform}} card?","WARNING_MAIL_USER":"Note that if the user does not have a Taiga account we will not be able to assign the tasks to him.","ASSIGN":"Valitse tekijä","PROJECT_SELECTOR":{"NO_RESULTS":"Ei hakutuloksia","ACTION_SEARCH":"hae","ACTION_BACK":"Palvelin"},"PROJECT_RESTRICTIONS":{"PROJECT_MEMBERS_DESC_PRIVATE":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per private project. If you would like to increase that limit please contact the administrator.","PROJECT_MEMBERS_DESC_PUBLIC":"The project you are trying to import has {{members}} members including you, unfortunately, your current plan allows for a maximum of {{max_memberships}} members per public project. If you would like to increase that limit please contact the administrator.","ACCOUNT_ALLOW_MEMBERS":"Tilisi sallii vain {{members}} jäsenet","PRIVATE_PROJECTS_SPACE":{"TITLE":"Unfortunately, your current plan does not allow for additional private projects","DESC":"The project you are trying to import is private. Unfortunately, your current plan does not allow for additional private projects."},"PUBLIC_PROJECTS_SPACE":{"TITLE":"Unfortunately, your current plan does not allow for additional public projects","DESC":"The project you are trying to import is public. Unfortunately, your current plan does not allow additional public projects."},"PRIVATE_PROJECTS_MEMBERS":{"TITLE":"Your current plan allows for a maximum of {{max_memberships}} members per private project"},"PUBLIC_PROJECTS_MEMBERS":{"TITLE":"Your current plan allows for a maximum of {{max_memberships}} members per public project."},"PRIVATE_PROJECTS_SPACE_MEMBERS":{"TITLE":"Unfortunately your current plan doesn't allow additional private projects or an increase of more than {{max_memberships}} members per private project","DESC":"The project that you are trying to import is private and has {{members}} members."},"PUBLIC_PROJECTS_SPACE_MEMBERS":{"TITLE":"Unfortunately your current plan doesn't allow additional public projects or an increase of more than {{max_memberships}} members per public project","DESC":"The project that you are trying to import is public and has more than {{members}} members."}},"IN_PROGRESS":{"TITLE":"Luetaan sisään projektia","DESCRIPTION":"Tämä voi kestää hetken, pidä ikkuna auki."},"WARNING":{"TITLE":"Some taks will be unassigned","DESCRIPTION":"There are still unidentified people. The cards assigned to these people will remain unassigned. Check all the contacts to not lose that information.","CHECK":"Check contacts"},"TAIGA":{"SELECTOR":"Import your Taiga project"},"TRELLO":{"SELECTOR":"Tuo Trello taulut Taigaan","CHOOSE_PROJECT":"Choose board that you want to import","NO_PROJECTS":"It seems you have no boards in Trello"},"GITHUB":{"SELECTOR":"Tuo GitHub issuet","CHOOSE_PROJECT":"Find the project you want to import","NO_PROJECTS":"It seems you have no porjects in GitHub","HOW_DO_YOU_WANT_TO_IMPORT":"How do you want to import your issues into Taiga?","KANBAN_PROJECT":"As user stories in a kanban project","KANBAN_PROJECT_DESCRIPTION":"After that you can enable scrum with backlog.","SCRUM_PROJECT":"As user stories in a scrum project","SCRUM_PROJECT_DESCRIPTION":"After that you can enable kanban mode.","ISSUES_PROJECT":"As issues","ISSUES_PROJECT_DESCRIPTION":"You will not be able to use your issues in kanban or scrum mode. You will be able to enable kanban or scrum for new user stories"},"ASANA":{"SELECTOR":"Import your Asana project and choose how to manage it","CHOOSE_PROJECT":"Choose project that you want to import","NO_PROJECTS":"It seems you have no porjects in Asana","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","CREATE_AS_SCRUM_DESCRIPTION":"The tasks and sub-tasks of your project will be created as Taiga user stories and tasks.","CREATE_AS_KANBAN_DESCRIPTION":"The tasks and sub-tasks of your project will be created as Taiga user stories and tasks."},"JIRA":{"SELECTOR":"Import your Jira project and choose how to manage it","HOW_TO_CONFIGURE":"(configuration help)","CHOOSE_PROJECT":"Choose project or board that you want to import","NO_PROJECTS":"It seems you have no porjects or boards in Jira","URL":"Your Jira URL","KANBAN_PROJECT":"Kanban","SCRUM_PROJECT":"Scrum","ISSUES_PROJECT":"Pyynnöt","CREATE_AS_SCRUM_DESCRIPTION":"The issues and sub-issues of your project will be created as Taiga user stories and tasks.","CREATE_AS_KANBAN_DESCRIPTION":"The issues and sub-issues of your project will be created as Taiga user stories and tasks.","CREATE_AS_ISSUES_DESCRIPTION":"What do you want to do with sub-issues from the Jira project? (Taiga doesn't allow sub-issues)","CREATE_NEW_ISSUES":"Convert sub-issues to new Taiga issues","NOT_CREATE_NEW_ISSUES":"Do not import sub-issues"}}},"LIGHTBOX":{"DELETE_ACCOUNT":{"CONFIRM":"Haluatko varmasti poistaa Taiga-tunnuksesi?","CANCEL":"Takaisin asetuksiin","ACCEPT":"Poista tili","BLOCK_PROJECT":"Note that all the projects you own projects will be blocked after you delete your account. If you do not want a project blocked, transfer ownership to another member of each project prior to deleting your account."},"DELETE_PROJECT":{"TITLE":"Poista projekti","QUESTION":"Haluatko varmasti poistaa tämän projektin?","SUBTITLE":"Projektin kaikki tiedot poistetaan :-(","CONFIRM":"Kyllä, tiedän mitä teen"},"ASSIGNED_TO":{"SELECT":"Valitse tekijä","SEARCH":"Hae käyttäjiä"},"ADD_MEMBER":{"TITLE":"Uusi jäsen","PLACEHOLDER":"Filter users or write an email to invite","ADD_EMAIL":"Lisää sähköposti","REMOVE":"Poista","INVITE":"Kutsu","CHOOSE_ROLE":"Valitse rooli","PLACEHOLDER_INVITATION_TEXT":"(Vapaaehtoinen) Lisää oma kuvaus kutsuusi uusille jäsenille ;-)","HELP_TEXT":"Taigan käyttäjät lisätään automaattisesti, muille lähetetään kutsu."},"CREATE_ISSUE":{"TITLE":"Lisää pyyntö"},"FEEDBACK":{"TITLE":"Kerro jotain...","COMMENT":"...virhe, ehdotuksia, tai huonoin kokemuksesi Taigan kanssa","ACTION_SEND":"Lähetä palautetta"},"SEARCH":{"TITLE":"Hae","PLACEHOLDER_SEARCH":"Mitä etsit?"},"ADD_EDIT_SPRINT":{"TITLE":"Uusi kierros","PLACEHOLDER_SPRINT_NAME":"kierroksen nimi","PLACEHOLDER_SPRINT_START":"Arvioitu alku","PLACEHOLDER_SPRINT_END":"Arvioitu loppu","ACTION_DELETE_SPRINT":"Haluatko poistaa tämän kierroksen?","TITLE_ACTION_DELETE_SPRINT":"poista kierros","LAST_SPRINT_NAME":"viimeinen kierros on {{lastSprint}} ;-) "},"CREATE_EDIT_TASK":{"TITLE":"Uusi tehtävä","PLACEHOLDER_SUBJECT":"Tehtävän aihe","PLACEHOLDER_STATUS":"Tehtävän tila","OPTION_UNASSIGNED":"Ilman tekijää","PLACEHOLDER_SHORT_DESCRIPTION":"Kirjoita lyhyt kuvaus","ACTION_EDIT":"Muokkaa tehtävää","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"CREATE_EDIT_US":{"TITLE":"Uusi Kt","PLACEHOLDER_DESCRIPTION":"Lisää kuvaus jotta muut ymmärtäisivät käyttäjätarinasi paremmin","NEW_US":"Uusi käyttäjätarina","EDIT_US":"Muokkaa käyttäjätarinaa","CONFIRM_CLOSE":"You have not saved changes.\nAre you sure you want to close the form?"},"DELETE_DUE_DATE":{"TITLE":"Delete due date","SUBTITLE":"Are you sure you want to delete this due date?"},"DELETE_SPRINT":{"TITLE":"Poista kierros"},"CREATE_MEMBER":{"PLACEHOLDER_INVITATION_TEXT":"(Vapaaehtoinen) Lisää oma kuvaus kutsuusi uusille jäsenille ;-)","PLACEHOLDER_TYPE_EMAIL":"Anna sähköposti","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"You are about to reach the maximum number of members allowed for this project, {{maxMembers}} members. If you would like to increase the current limit, please contact the administrator.","LIMIT_USERS_WARNING_MESSAGE":"You are about to reach the maximum number of members allowed for this project, {{maxMembers}} members."},"LEAVE_PROJECT_WARNING":{"TITLE":"Unfortunately, this project can't be left without an owner","CURRENT_USER_OWNER":{"DESC":"You are the current owner of this project. Before leaving, please transfer ownership to someone else.","BUTTON":"Vaihda projektin omistaja"},"OTHER_USER_OWNER":{"DESC":"Unfortunately, you can't delete a member who is also the current project owner. First, please assign a new project owner.","BUTTON":"Pyydä projektin omistajan muutosta"}},"CHANGE_OWNER":{"TITLE":"Who do you want to be the new project owner?","ADD_COMMENT":"Lisää kommentti","BUTTON":"Pyydä tätä jäsentä uudeksi projektin omistajaksi"},"CONTACT_PROJECT":{"TITLE":"Lähetä sähköposti","WARNING":"The email will be received by the project admins","PLACEHOLDER":"Kirjoita viesti","SEND":"Lähetä"},"SET_DUE_DATE":{"TITLE":"Set due date","PLACEHOLDER_DUE_DATE":"Select date","REASON_FOR_DUE_DATE":"Reason for the due date","PLACEHOLDER_REASON_FOR_DUE_DATE":"Why does this US need a due date?","SUGGESTIONS":{"IN_ONE_WEEK":"In one week","IN_TWO_WEEKS":"In two weeks","IN_ONE_MONTH":"In one month","IN_THREE_MONTHS":"In three months"},"TITLE_ACTION_DELETE_DUE_DATE":"Delete due date"}},"EPIC":{"PAGE_TITLE":"{{epicSubject}} - Eepos {{epicRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{epicStatus }}. Description: {{epicDescription}}","SECTION_NAME":"Eepos","TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY":"Unlink related userstory","MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY":"It will delete the link to the related userstory '{{subject}}'","ERROR_UNLINK_RELATED_USERSTORY":"We have not been able to unlink: {{errorMessage}}","CREATE_RELATED_USERSTORIES":"Linkitä","NEW_USERSTORY":"Uusi käyttäjätarina","EXISTING_USERSTORY":"Luodut käyttäjätarinat","CHOOSE_PROJECT_FOR_CREATION":"Mikä on projekti?","SUBJECT":"Aihe","SUBJECT_BULK_MODE":"Subject (bulk insert)","CHOOSE_PROJECT_FROM":"Mikä on projekti?","CHOOSE_USERSTORY":"Mikä on käyttäjätarina?","NO_USERSTORIES":"This project has no User Stories yet. Please select another project.","NO_USERSTORIES_FOUND":"Ei hakutuloksia","FILTER_USERSTORIES":"Suodata käyttäjätarinoita","LIGHTBOX_TITLE_BLOKING_EPIC":"Blocking epic","ACTION_DELETE":"Poista eepos"},"US":{"PAGE_TITLE":"{{userStorySubject}} - Käyttäjätarina {{userStoryRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{userStoryStatus }}. Completed {{userStoryProgressPercentage}}% ({{userStoryClosedTasks}} of {{userStoryTotalTasks}} tasks closed). Points: {{userStoryPoints}}. Description: {{userStoryDescription}}","SECTION_NAME":"Käyttäjätarina","LINK_TASKBOARD":"Tehtävätaulu","TITLE_LINK_TASKBOARD":"Siirry tehtävätauluun","TOTAL_POINTS":"pisteet yhteensä","ADD":"+ Lisää uusi käyttäjätarina","ADD_BULK":"Lisää monta käyttäjätarinaa","PROMOTED":"Tämä Kt on liitetty pyyntöön:","TITLE_LINK_GO_TO_ISSUE":"Siirry pyyntöön","TITLE_DELETE_ACTION":"Poista käyttäjätarina","LIGHTBOX_TITLE_BLOKING_US":"Meitä estää","NOT_ESTIMATED":"Ei arvioitu","OWNER_US":"This User Story belongs to","TRIBE":{"PUBLISH":"Publish as Gig in Taiga Tribe","PUBLISH_INFO":"Lisätietoa","PUBLISH_TITLE":"More info on publishing in Taiga Tribe","PUBLISHED_AS_GIG":"Story published as Gig in Taiga Tribe","EDIT_LINK":"Muokkaa linkkiä","CLOSE":"Sulje","SYNCHRONIZE_LINK":"synchronize with Taiga Tribe","PUBLISH_MORE_INFO_TITLE":"Tarvitsetko tekijän tälle tehtävälle?","PUBLISH_MORE_INFO_TEXT":"

    If you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

    TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

    "},"FIELDS":{"TEAM_REQUIREMENT":"Tiimin vaatimus","CLIENT_REQUIREMENT":"Asiakkaan vaatimus"}},"COMMENTS":{"DELETED_INFO":"Kommentti poistettu {{user}}","COMMENTS_COUNT":"{{comments}} Kommentit","OLDER_FIRST":"Vanhin ensin","RECENT_FIRST":"Viimeisin ensin","COMMENT":"Kommentti","EDITED_COMMENT":"Muokattu:","SHOW_HISTORY":"Näytä historia","TYPE_NEW_COMMENT":"Lisää uusi kommentti tässä","SHOW_DELETED":"Näytä poistettu kommentti","HIDE_DELETED":"Piilota poistettu kommentti","DELETE":"Poista kommentti","RESTORE":"Palauta kommentti","HISTORY":{"TITLE":"Aktiivisuus"}},"ACTIVITY":{"TITLE":"Aktiivisuus","ACTIVITIES_COUNT":"{{activities}} Aktiviteetit","TAGS_ADDED":"tagit lisätty","TAGS_REMOVED":"tagit poistettu:","US_POINTS":"{{role}} pisteet","NEW_ATTACHMENT":"uusi liitetiedosto:","DELETED_ATTACHMENT":"poistettu liitetiedosto:","UPDATED_ATTACHMENT":"päivitetty liitetiedosto ({{filename}}):","CREATED_CUSTOM_ATTRIBUTE":"created custom attribute","UPDATED_CUSTOM_ATTRIBUTE":"updated custom attribute","BECAME_DEPRECATED":"became deprecated","BECAME_UNDEPRECATED":"became undeprecated","TEAM_REQUIREMENT":"Tiimin vaatimus","CLIENT_REQUIREMENT":"Asiakkaan vaatimus","BLOCKED":"Suljettu","VALUES":{"NOT_SET":"not set","UNASSIGNED":"ilman tekijää"},"FIELDS":{"SUBJECT":"aihe","DESCRIPTION":"kuvaus","PRIORITY":"kiireellisyys","SEVERITY":"vakavuus","STATUS":"tila","TYPE":"tyyppi","ASSIGNED_TO":"tekijä on","ASSIGNED_USERS":"assigned users","DUE_DATE":"due date","MILESTONE":"kierros","COLOR":"väri"}},"BACKLOG":{"PAGE_TITLE":"Backlog - {{projectName}}","PAGE_DESCRIPTION":"The backlog panel, with user stories and sprints of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Odottavat","CUSTOMIZE_GRAPH":"Muokkaa backlog-graafia","CUSTOMIZE_GRAPH_TEXT":"To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the","CUSTOMIZE_GRAPH_ADMIN":"Hallinnoi","CUSTOMIZE_GRAPH_TITLE":"Set up the points and sprints through the Admin","MOVE_US_TO_CURRENT_SPRINT":"Siirrä nykyiseen kierrokseen","MOVE_US_TO_LATEST_SPRINT":"Move to latest Sprint","EMPTY":"The backlog is empty!","CREATE_NEW_US":"Luo uusi Kt","CREATE_NEW_US_EMPTY_HELP":"Voit haluta lisätä uuden käyttäjätarinan","EXCESS_OF_POINTS":"Pisteiden ylimäärä","PENDING_POINTS":"Odottavat pisteet","CLOSED_POINTS":"suljettu","COMPACT_SPRINT":"Kompakti kierros","GO_TO_TASKBOARD":"Siirry tehtävätauluun {{::name}}","EDIT_SPRINT":"Muokkaa kierrosta","TOTAL_POINTS":"yhteensä","STATUS_NAME":"Tilan nimi","SORTABLE_FILTER_ERROR":"Et voi viedä odottaviin, kun suodattimet ovat auki","DOOMLINE":"Projektin laajuus [Doomline]","CHART":{"XAXIS_LABEL":"Kierrokset","YAXIS_LABEL":"Pisteet","OPTIMAL":"Optimal pending points for sprint \"{{sprintName}}\" should be {{value}}","REAL":"Real pending points for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_TEAM":"Incremented points by team requirements for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_CLIENT":"Incremented points by client requirements for sprint \"{{sprintName}}\" is {{value}}"},"TAGS":{"TOGGLE":"Vaihda avainsanojen näkyvyyttä","SHOW":"Näytä avainsanat","HIDE":"Piilota avainsanat"},"FORECASTING":{"TITLE":"Velocity forecasting","BACKLOG":"Display backlog","NEW_SPRINT":"Candidate User Stories for your next sprint based on your velocity. Click to create a new sprint.","CURRENT_SPRINT":"Candidate User Stories for your sprint based on your velocity. Click to add to current sprint."},"TABLE":{"COLUMN_US":"Käyttäjätarinat","TITLE_COLUMN_POINTS":"Valitse näkymä roolille"},"SPRINT_SUMMARY":{"TOTAL_POINTS":"yhteensä
    pistettä","COMPLETED_POINTS":"valmiina
    pistettä","OPEN_TASKS":"avaa
    tehtävät","CLOSED_TASKS":"suljettu
    tehtävää","IOCAINE_DOSES":"myrkkye-
    annosta","SHOW_STATISTICS_TITLE":"Näytä tilastot","TOGGLE_BAKLOG_GRAPH":"Näytä/Piilota burndown-kaavio","POINTS_PER_ROLE":"Pisteitä per rooli"},"SUMMARY":{"PROJECT_POINTS":"projekti
    pistettä","DEFINED_POINTS":"määritellyt
    pisteet","CLOSED_POINTS":"suljettu
    pistettä","POINTS_PER_SPRINT":"pisettä/
    kierros"},"FILTERS":{"TOGGLE":"Vaihda suodattimien näkyvyyttä","HIDE":"Piilota suodattimet","SHOW":"Näytä suodattimet"},"SPRINTS":{"TITLE":"KIERROKSET","DATE":"DD.MM.YY","LINK_TASKBOARD":"Kierroksien tehtävätaulu","TITLE_LINK_TASKBOARD":"Siirry tehtävätauluun {{name}}","EMPTY":"Ei vielä sprinttejä","WARNING_EMPTY_SPRINT_ANONYMOUS":"Tässä sprintissä ei ole käyttäjätarinoita","WARNING_EMPTY_SPRINT":"Raahaa tähän käyttäjätarinoita aloittaaksesi uuden sprintin","TITLE_ACTION_NEW_SPRINT":"Lisää uusi sprintti","TEXT_ACTION_NEW_SPRINT":"Saatat haluta luoda uuden sprintin projektiisi","ACTION_SHOW_CLOSED_SPRINTS":"Näytä suljetut kierrokset","ACTION_HIDE_CLOSED_SPRINTS":"Piilota suljetut kierrokset"}},"ERROR":{"TEXT1":"Jotain tapahtui ja Oompa Loompas työskentelevät sen parissa.","NOT_FOUND":"Ei löytynyt","NOT_FOUND_TEXT":"Virhe 404. Sivua ei löydy. Palaa takaisin TAIGA etusivulle ja katso löydätkö haluamasi sieltä.","PERMISSION_DENIED":"Ei oikeutta","PERMISSION_DENIED_TEXT":"Pääsy estetty.","VERSION_ERROR":"Joku Taigassa on päivittänyt tätä ennen sinua. Muutoksiasi ei voida tallentaa. Lataa sivu uudestaan ja korjaa tilanne."},"TASKBOARD":{"PAGE_TITLE":"{{sprintName}} - Sprint tehtävätaulu - {{projectName}}","PAGE_DESCRIPTION":"Sprint {{sprintName}} (from {{startDate}} to {{endDate}}) of {{projectName}}. Completed {{completedPercentage}}% ({{completedPoints}} of {{totalPoints}} points). {{openTasks}} opened tasks of {{totalTasks}}.","SECTION_NAME":"Tehtävätaulu","TITLE_ACTION_ADD":"Lisää uusi tehtävä","TITLE_ACTION_ADD_BULK":"Lisää monta tehtävää","TITLE_ACTION_ASSIGN":"Valitse tekijä","PLACEHOLDER_CARD_TITLE":"This could be a task","PLACEHOLDER_CARD_TEXT":"Jaa tarinat tehtäviksi, että voit seurata niitä erikseen","TABLE":{"COLUMN":"Käyttäjätarina","TITLE_ACTION_FOLD":"Kavenna sarake","TITLE_ACTION_UNFOLD":"Laajenna sarake","TITLE_ACTION_FOLD_ROW":"Kavenna rivi","TITLE_ACTION_UNFOLD_ROW":"Laajenna rivi","FIELD_POINTS":"pisteet","ROW_UNASSIGED_TASKS_TITLE":"Poista tekijä"},"CHARTS":{"XAXIS_LABEL":"Päivät","YAXIS_LABEL":"Pisteet","OPTIMAL":"Optimaaliset odottavat pisteet {{formattedDate}} ovat {{roundedValue}}","REAL":"Todelliset odottavat pisteet {{formattedDate}} ovat {{roundedValue}}","DATE":"DD.MM.YY"}},"TASK":{"PAGE_TITLE":"{{taskSubject}} - Tehtävä {{taskRef}} - {{projectName}}","PAGE_DESCRIPTION":"Tilanne: {{taskStatus }}. Kuvaus: {{taskDescription}}","SECTION_NAME":"Tehtävä","LINK_TASKBOARD":"Tehtävätaulu","TITLE_LINK_TASKBOARD":"Siirry tehtävätauluun","PLACEHOLDER_SUBJECT":"Anna tehtävän aihe","TITLE_SELECT_STATUS":"Tilan nimi","OWNER_US":"Tehtävä kuuluu käyttäjälle ","TITLE_LINK_GO_OWNER":"Siirry käyttäjätarinaan","TITLE_DELETE_ACTION":"Poista tehtävä","LIGHTBOX_TITLE_BLOKING_TASK":"Estävä tehtävä","FIELDS":{"IS_IOCAINE":"Myrkyllinen"},"TITLE_ACTION_IOCAINE":"Rasittaako tehtävä? Kerro muillekin klikkaamalla myrkyn kuvaketta. Sattaa myös helpottaa jatkossa jos nautit vähitellen."},"NOTIFICATION":{"OK":"Kaikki on kunnossa","WARNING":"Oops, jotain tapahtui...","WARNING_TEXT":"Oompa Loompas eivät pystyneet tallentamaan muutoksiasi!","SAVED":"Oompa Loompas tallensivat kaikki muutoksesi!","CLOSE":"Sulje ilmoitus","MAIL":"Ilmoitukset sähköpostilla","DESKTOP":"Desktop notifications using browser alerts","ASK_DELETE":"Oletko varma että haluat poistaa tämän?"},"CANCEL_ACCOUNT":{"TITLE":"Peru tunnuksesi","SUBTITLE":"Olemme pahoillamme että jätät Taigan. Toivottavasti nautit oleskelusta :)","PLACEHOLDER_INPUT_TOKEN":"peru tunnus tokeni","ACTION_LEAVING":"Kyllä, olen lähdössä!","SUCCESS":" Oompa Loompas poistivat tunnuksesi"},"CHANGE_EMAIL_FORM":{"TITLE":"Muuta sähköpostisi","SUBTITLE":"Vielä yksi klikki ja sähköpostisi on päivitetty!","PLACEHOLDER_INPUT_TOKEN":"muuta sähköposti-tokenia","ACTION_CHANGE_EMAIL":"Muuta sähköpostisi","SUCCESS":"Oompa Loompas päivittivät sähköpostisi"},"ISSUES":{"PAGE_TITLE":"Issues - {{projectName}}","PAGE_DESCRIPTION":"The issues list panel of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Issue","ACTION_NEW_ISSUE":"+ UUSI PYYNTÖ","ACTION_PROMOTE_TO_US":"Liitä käyttäjätarinaan","PROMOTED":"Tämä pyyntö on liitetty Kthen:","EXTERNAL_REFERENCE":"Tämä pyyntö on luotu täältä:","GO_TO_EXTERNAL_REFERENCE":"Palaa alkuun","ACTION_DELETE":"Poista pyyntö","LIGHTBOX_TITLE_BLOKING_ISSUE":"Estävä pyyntö","FIELDS":{"PRIORITY":"Tärkeys","SEVERITY":"Vakavuus","TYPE":"Tyyppi"},"CONFIRM_PROMOTE":{"TITLE":"Liitä tämä pyyntö uuteen käyttäjätarinaan","MESSAGE":"Haluatko varmasti lisätä uuden käyttäjätarinan tästä pyynnöstä?"},"TABLE":{"COLUMNS":{"TYPE":"Tyyppi","SEVERITY":"Vakavuus","PRIORITY":"Tärkeys","SUBJECT":"Aihe","VOTES":"Ääniä","STATUS":"Tila","CREATED":"Luotu","ASSIGNED_TO":"Tekijä"},"TITLE_ACTION_CHANGE_STATUS":"Muuta tilaa","TITLE_ACTION_ASSIGNED_TO":"Tekijä","BLOCKED":"Suljettu","EMPTY":{"TITLE":"Ei raportoitavia pyyntöjä:-)","SUBTITLE":"Löysitkö ongelman?"}}},"ISSUE":{"PAGE_TITLE":"{{issueSubject}} - Issue {{issueRef}} - {{projectName}}","PAGE_DESCRIPTION":"Status: {{issueStatus }}. Type: {{issueType}}, Priority: {{issuePriority}}. Severity: {{issueSeverity}}. Description: {{issueDescription}}"},"KANBAN":{"PAGE_TITLE":"Kanban - {{projectName}}","PAGE_DESCRIPTION":"Kanban-taulu, projektin käyttäjätarinat {{projectName}}: {{projectDescription}}","SECTION_NAME":"Kanban","TITLE_ACTION_FOLD":"Kavenna sarake","TITLE_ACTION_UNFOLD":"Laajenna sarake","TITLE_ACTION_ADD_US":"Lisää uusi käyttäjätarina","TITLE_ACTION_ADD_BULK":"Lisää monta","ACTION_SHOW_ARCHIVED":"Näytä arkisto","ACTION_HIDE_ARCHIVED":"Piilota arkisto","HIDDEN_USER_STORIES":"Käyttäjätarinat tällä alueella ovat oletuksena piilotettuna","PLACEHOLDER_CARD_TITLE":"Nämä ovat käyttäjätarinasi","PLACEHOLDER_CARD_TEXT":"Stories might also have subtasks to separate requirements"},"SEARCH":{"PAGE_TITLE":"Etsi - {{projectName}}","PAGE_DESCRIPTION":"Etsi projektisisällöstä: tarinat, tehtävät, wiki... {{projectName}}: {{projectDescription}}","FILTER_EPICS":"Eepokset","FILTER_USER_STORIES":"Käyttäjätarinat","FILTER_ISSUES":"Pyynnöt","FILTER_TASKS":"Tehtävät","FILTER_WIKI":"Wiki-sivut","PLACEHOLDER_SEARCH":"Etsi täältä...","TITLE_ACTION_SEARCH":"hae","EMPTY_TITLE":"Mitään ei löytynyt.","EMPTY_DESCRIPTION":"Kokeile ylempiä välilehtiä ja hae uudestaan"},"TEAM":{"PAGE_TITLE":"Tiimi - {{projectName}}","PAGE_DESCRIPTION":"The team panel to show all the members of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"Tiimi","PLACEHOLDER_INPUT_SEARCH":"Etsi koko nimellä...","COLUMN_MR_WOLF":"Mr. Wolf","EXPLANATION_COLUMN_MR_WOLF":"Suljetut pyynnöt","COLUMN_IOCAINE":"Myrkyn syöjä","EXPLANATION_COLUMN_IOCAINE":"Kertyneet myrkyt","COLUMN_CERVANTES":"Cervantes","EXPLANATION_COLUMN_CERVANTES":"Wiki-sivuja muokattu","COLUMN_BUG_HUNTER":"Virheiden metsästäjä","EXPLANATION_COLUMN_BUG_HUNTER":"Pyyntöjä raportoitu","COLUMN_NIGHT_SHIFT":"Yövuoro","EXPLANATION_COLUMN_NIGHT_SHIFT":"Suljetut tehtävät","COLUMN_TOTAL_POWER":"Kokonaisvoima","EXPLANATION_COLUMN_TOTAL_POWER":"Kokonaispisteet","SECTION_TITLE_TEAM":"Tiimi >","SECTION_FILTER_ALL":"Kaikki","CONFIRM_LEAVE_PROJECT":"Oletko varma että haluat poistua projektista?","ACTION_LEAVE_PROJECT":"Poistu projektista"},"USER_SETTINGS":{"AVATAR_MAX_SIZE":"Maksimi koko {{maxFileSize}}","MENU":{"SECTION_TITLE":"Käyttäjän asetukset","USER_PROFILE":"Käyttäjän profiili","CHANGE_PASSWORD":"Muuta salasanaa","EMAIL_NOTIFICATIONS":"Sähköposti-ilmoitukset","DESKTOP_NOTIFICATIONS":"Desktop notifications"},"NOTIFICATIONS":{"LIVE_SECTION_NAME":"Desktop Notifications","SECTION_NAME":"Sähköposti-ilmoitukset","COLUMN_PROJECT":"Projekti","COLUMN_RECEIVE_ALL":"Vastaanota kaikki","COLUMN_ONLY_INVOLVED":"Ainoa osallinen","COLUMN_NO_NOTIFICATIONS":"Ei ilmoituksia","OPTION_ALL":"Kaikki","OPTION_INVOLVED":"Osallisena","OPTION_NONE":"Ei yhtään"}},"USER_PROFILE":{"ACTION_USE_GRAVATAR":"Käytä oletuskuvaa","ACTION_DELETE_ACCOUNT":"Poista Taiga-tunnus","ACTION_DOWNLOAD_PROFILE":"Download Taiga profile","CHANGE_EMAIL_SUCCESS":"Tarkista sähköpostisi!
    Lähetimme ohjeet
    {{email}}
    uuden osoitteen asettamiseen","CHANGE_PHOTO":"Muuta kuva","FIELD":{"USERNAME":"Käyttäjänimi","EMAIL":"Sähköposti","FULL_NAME":"Koko nimi","PLACEHOLDER_FULL_NAME":"Anna koko nimesi","BIO":"Bio (max. 210 merkkiä)","PLACEHOLDER_BIO":"Kerro jotain itsestäsi","LANGUAGE":"Kieli","LANGUAGE_DEFAULT":"-- käytä oletuskieltä --","THEME":"Teema","THEME_DEFAULT":"-- käytä vakioteemaa --"}},"WIKI":{"PAGE_TITLE":"{{wikiPageName}} - Wiki - {{projectName}}","PAGE_DESCRIPTION":"Last edition on {{lastModifiedDate}} ({{totalEditions}} editions in total) Content: {{ wikiPageContent }}","DATETIME":"DD.MM.YY - HH:mm","REMOVE":"Poista tämä wiki-sivu","DELETE_LIGHTBOX_TITLE":"Poista wiki-sivu","DELETE_LINK_TITLE":"Poista Wiki linkki","NAVIGATION":{"HOME":"Etusivu","SECTION_NAME":"Kirjanmerkit","ACTION_ADD_LINK":"Lisää kirjanmerkki","ALL_PAGES":"Kaikki wiki-sivut"},"SUMMARY":{"TIMES_EDITED":"kertaa
    muokattu","LAST_EDIT":"viimeinen
    muokkaus","LAST_MODIFICATION":"viimeinen muokkaus"},"SECTION_PAGES_LIST":"Kaikki sivut","PAGES_LIST_COLUMNS":{"TITLE":"Otsikko","EDITIONS":"Editions","CREATED":"Luotu","MODIFIED":"Muokattu","CREATOR":"Luoja","LAST_MODIFIER":"Viimeinen muokkaaja"}},"HINTS":{"SECTION_NAME":"Vihje","LINK":"If you want to know how to use it visit our support page","LINK_TITLE":"Vieraile tukisivustolla","HINT1_TITLE":"Did you know you can import and export projects?","HINT1_TEXT":"This allow you to extract all your data from one Taiga and move it to another one.","HINT2_TITLE":"Did you know you can create custom fields?","HINT2_TEXT":"Teams can now create custom fields as a flexible means to enter specific data useful for their particular workflow.","HINT3_TITLE":"Järjestä projektit itsellesi tärkeysjärjestykseen.","HINT3_TEXT":"The 10 projects are listed in the direct access bar at the top.","HINT4_TITLE":"Did you forget what were you working on?","HINT4_TEXT":"Don't worry, on your dashboard you'll find your open tasks, issues, and user stories in the order you worked on them."},"TIMELINE":{"UPLOAD_ATTACHMENT":"{{username}} lisäsi uuden liitetiedoston {{obj_name}}","US_CREATED":"{{username}} loi uuden käyttäjätarinan {{obj_name}} {{project_name}}","ISSUE_CREATED":"{{username}} has created a new issue {{obj_name}} in {{project_name}}","TASK_CREATED":"{{username}} loi uuden tehtävän {{obj_name}} -\n {{project_name}}","TASK_CREATED_WITH_US":"{{username}} has created a new task {{obj_name}} in {{project_name}} which belongs to the US {{us_name}}","WIKI_CREATED":"{{username}} has created a new wiki page {{obj_name}} in {{project_name}}","MILESTONE_CREATED":"{{username}} loi uuden sprintin {{obj_name}} - {{project_name}}","EPIC_CREATED":"{{username}} loi uuden eepoksen {{obj_name}} - {{project_name}}","EPIC_RELATED_USERSTORY_CREATED":"{{username}} has related the userstory {{related_us_name}} to the epic {{epic_name}} in {{project_name}}","NEW_PROJECT":"{{username}} loi projektin {{project_name}}","MILESTONE_UPDATED":"{{username}} muokkasi sprinttiä {{obj_name}}","US_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the US {{obj_name}}","US_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the US {{obj_name}} to {{new_value}}","US_UPDATED_POINTS":"{{username}} has updated '{{role_name}}' points of the US {{obj_name}} to {{new_value}}","ISSUE_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the issue {{obj_name}}","ISSUE_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the issue {{obj_name}} to {{new_value}}","TASK_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} to {{new_value}}","TASK_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} to {{new_value}}","TASK_UPDATED_WITH_US":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} which belongs to the US {{us_name}}","TASK_UPDATED_WITH_US_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the task {{obj_name}} which belongs to the US {{us_name}} to {{new_value}}","WIKI_UPDATED":"{{username}} päivitti wikiä {{obj_name}}","EPIC_UPDATED":"{{username}} has updated the attribute \"{{field_name}}\" of the epic {{obj_name}}","EPIC_UPDATED_WITH_NEW_VALUE":"{{username}} has updated the attribute \"{{field_name}}\" of the epic {{obj_name}} to {{new_value}}","EPIC_UPDATED_WITH_NEW_COLOR":"{{username}} has updated the \"{{field_name}}\" of the epic {{obj_name}} to ","NEW_COMMENT_US":"{{username}} kommentoi tarinaa {{obj_name}}","NEW_COMMENT_ISSUE":"{{username}} has commented in the issue {{obj_name}}","NEW_COMMENT_TASK":"{{username}} has commented in the task {{obj_name}}","NEW_COMMENT_EPIC":"{{username}} has commented in the epic {{obj_name}}","NEW_MEMBER":"{{project_name}} uusi jäsen lisätty","US_ADDED_MILESTONE":"{{username}} has added the US {{obj_name}} to {{sprint_name}}","US_MOVED":"{{username}} has moved the US {{obj_name}}","US_REMOVED_FROM_MILESTONE":"{{username}} has added the US {{obj_name}} to the backlog","BLOCKED":"{{username}} has blocked {{obj_name}}","UNBLOCKED":"{{username}} has unblocked {{obj_name}}","NEW_USER":"{{username}} has joined Taiga"},"LEGAL":{"TERMS_OF_SERVICE_AND_PRIVACY_POLICY_AD":"When creating a new account, you agree to our terms of service and privacy policy.","GDPR_ANNOUNCEMENT_TITLE":"General Data Protection Regulation (GDPR)","GDPR_ANNOUNCEMENT_DESCRIPTION":"You saw this comming, right? Updates to our Terms of Service","GDPR_ANNOUNCEMENT_INFOLINK":"Please read our announcement here"},"EXTERNAL_APP":{"PAGE_TITLE":"An external app requires authentication","PAGE_DESCRIPTION":"An external app requires authentication","AUTHORIZATION_REQUEST":"Authorize {{application}} to use your Taiga account?","LOGIN_WITH_ANOTHER_USER":"Kirjaudu toisena käyttäjänä","AUTHORIZE_APP":"Authorize app","CANCEL":"Peru"},"JOYRIDE":{"NAV":{"NEXT":"Seuraava","BACK":"Palvelin","SKIP":"Ohita","DONE":"Tehty"},"DASHBOARD":{"STEP1":{"TITLE":"Projektisi","TEXT":"Tervetuloa! Tässä näet projektit, joissa olet mukana."},"STEP2":{"TITLE":"Käynnissä olevat","TEXT":"Here you will find the User Stories, Tasks and Issues in which you are working on."},"STEP3":{"TITLE":"Seuraa","TEXT1":"And right here you will find the ones in your projects that you want to know about.","TEXT2":"You are already working with Taiga ;)"},"STEP4":{"TITLE":"Aloitetaan","TEXT1":"You can start by creating your first Taiga project.","TEXT2":"Onnea matkaan!"}},"BACKLOG":{"STEP1":{"TITLE":"Projektiyhteenveto","TEXT1":"Here you will see the state of your project.","TEXT2":"Voit muokata projektiin liityviä asetuksia admin-näkymässä."},"STEP2":{"TITLE":"Product backlog","TEXT":"The backlog is the list of requirements (User Stories) for the project. Here is where you will plan your sprints."},"STEP3":{"TITLE":"Kierrokset","TEXT":"Sprints are short periods of time (usually 2 weeks) during which specific work has to be completed and delivered."},"STEP4":{"TITLE":"Käyttäjätarinat","TEXT":"Those are the requirements at high level. You can add them to the backlog and drag them to the sprint in which it should be delivered."}},"KANBAN":{"STEP1":{"TITLE":"Customize your workflow","TEXT":"Set up the columns you need to map your workflow statuses through the admin."},"STEP2":{"TITLE":"Käyttäjätarinat & Tehtävät","TEXT":"User Stories are the requirements at high level. You can drag them to different columns."},"STEP3":{"TITLE":"Adding User Stories","TEXT1":"You may want to add a single User Story (add US icon) or a group of them (bulk icon)","TEXT2":"Onnea matkaan!"}}},"DISCOVER":{"PAGE_TITLE":"Discover projects - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","DISCOVER_TITLE":"Discover projects","DISCOVER_SUBTITLE":"{projects, plural, one{One public project to discover} other{# public projects to discover}}","MOST_ACTIVE":"Aktiivisin","MOST_ACTIVE_EMPTY":"Ei vielä AKTIIVISIA projekteja","MOST_LIKED":"Eniten tykätty","MOST_LIKED_EMPTY":"There are no LIKED projects yet","VIEW_MORE":"Näytä lisää","FEATURED":"Featured Projects","EMPTY":"There are no projects to show with this search criteria.
    Try again!","FILTERS":{"ALL":"Kaikki","KANBAN":"Kanban","SCRUM":"Scrum","PEOPLE":"Etsitään tekijöitä","WEEK":"Viime viikko","MONTH":"Viime kuu","YEAR":"Viime vuosi","ALL_TIME":"All time","CLEAR":"Tyhjennä suodattimet"},"SEARCH":{"PAGE_TITLE":"Search - Discover projects - Taiga","PAGE_DESCRIPTION":"Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.","INPUT_PLACEHOLDER":"Kirjoita tähän...","ACTION_TITLE":"Hae","RESULTS":"Hakutulokset"}}} \ No newline at end of file diff --git a/dist/v-1527758585938/locales/taiga/locale-fr.json b/dist/v-1528953702317/locales/taiga/locale-fr.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-fr.json rename to dist/v-1528953702317/locales/taiga/locale-fr.json diff --git a/dist/v-1527758585938/locales/taiga/locale-it.json b/dist/v-1528953702317/locales/taiga/locale-it.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-it.json rename to dist/v-1528953702317/locales/taiga/locale-it.json diff --git a/dist/v-1528953702317/locales/taiga/locale-ja.json b/dist/v-1528953702317/locales/taiga/locale-ja.json new file mode 100644 index 0000000..eedb748 --- /dev/null +++ b/dist/v-1528953702317/locales/taiga/locale-ja.json @@ -0,0 +1 @@ +{"COMMON":{"YES":"はい","NO":"いいえ","OR":"または","LOADING":"ロード中...","DATE":"YYYY年MM月DD日","DATETIME":"YYYY年MM月DD日 HH時mm分","SAVE":"保存","CANCEL":"キャンセル","ACCEPT":"はい","DELETE":"削除","UNLINK":"リンク解除","CREATE":"作成","ADD":"追加","COPY_TO_CLIPBOARD":"クリップボードにコピー: Ctrl+C","EDIT":"編集","DRAG":"ドラッグ","TAG_LINE":"あなたのアジャイルでフリーでオープンソースなマネジメントツールです","TAG_LINE_2":"LOVE YOUR PROJECT","BLOCK":"ブロック","BLOCK_TITLE":"Block this item for example if it has a dependency that can not be satisfied","BLOCKED":"ブロック中","UNBLOCK":"ブロック解除","UNBLOCK_TITLE":"ブロックを解除する","BLOCKED_NOTE":"なぜこれはブロックされているのか?","BLOCKED_REASON":"理由を説明してください","CREATED_BY":"{{fullDisplayName}} によって作成","CLOSE":"閉じる","GO_HOME":"ホームに戻る","PLUGINS":"プラグイン","ONE_ITEM_LINE":"1行に1アイテム","NEW_BULK":"一括登録","RELATED_TASKS":"関連タスク","PREVIOUS":"前","NEXT":"次へ","LOGOUT":"ログアウト","EXTERNAL_USER":"外部ユーザー","GENERIC_ERROR":"ウンパルンパのひとりが「{{error}}」と言っています。","IOCAINE_TEXT":"This member is feeling a bit overwhelmed by this task. Will become immune to the iocaine poison over time with your help. For now, may need a hug.","CLIENT_REQUIREMENT":"Client requirement is new requirement that was not previously expected and it is required to be part of the project","TEAM_REQUIREMENT":"Team requirement is a requirement that must exist in the project but should have no cost for the client","OWNER":"プロジェクトオーナー","CAPSLOCK_WARNING":"Be careful! You are using capital letters in an input field that is case sensitive.","CONFIRM_CLOSE_EDIT_MODE_TITLE":"本当にこの編集画面を閉じてもよろしいですか?","CONFIRM_CLOSE_EDIT_MODE_MESSAGE":"保存せずに編集画面を閉じた場合、すべての変更が失われます。","RELATED_USERSTORIES":"関連するユーザーストーリー","CARD":{"ASSIGN_TO":"割当","EDIT":"編集","DELETE":"カードを削除"},"FORM_ERRORS":{"DEFAULT_MESSAGE":"無効な値です","TYPE_EMAIL":"有効なメールアドレスでなければいけません。","TYPE_URL":"有効なURLでなければいけません","TYPE_URLSTRICT":"有効なURLでなければいけません","TYPE_NUMBER":"有効な数字でなければいけません","TYPE_DIGITS":"アラビア数字でなければいけません","TYPE_DATEISO":"YYYY-MM-DD の形式でなければいけません (例: 2038年01月23日)","TYPE_ALPHANUM":"半角英数字でなければなりません","TYPE_PHONE":"有効な電話番号でなければいけません","NOTNULL":"null以外でなければいけません","NOT_BLANK":"空欄にできません","REQUIRED":"必須です","REGEXP":"無効な値です","MIN":"この値は %s 以上でなければいけません","MAX":"この値は %s 以下でなければいけません","RANGE":"この値は %s と %s の間でなければいけません","MIN_LENGTH":"文字数が短すぎます。%s 文字以上にしてください。","MAX_LENGTH":"入力した値が長すぎます。%s 文字以下にしてください。","RANGE_LENGTH":"文字数が無効です。%s から %s 文字の間でなければいけません ","MIN_CHECK":"%s 以上選択してください。","MAX_CHECK":"選択できるのは %s までです","RANGE_CHECK":"選択できるのは %s から %s までです","EQUAL_TO":"この値は同じでなければいけません","LINEWIDTH":"行がおそらく長すぎます。%s文字以内におさえてください。","PIKADAY":"無効なデータフォーマットです。DD MMM YYYYの形式で入力してください。(例:23 Mar 1984)"},"PICKERDATE":{"FORMAT":"YYYY年MM月DD日","IS_RTL":"false","FIRST_DAY_OF_WEEK":"1","PREV_MONTH":"先月","NEXT_MONTH":"翌月","MONTHS":{"JAN":"1月","FEB":"2月","MAR":"3月","APR":"4月","MAY":"5月","JUN":"6月","JUL":"7月","AUG":"8月","SEP":"9月","OCT":"10月","NOV":"11月","DEC":"12月"},"WEEK_DAYS":{"SUN":"日曜","MON":"月曜","TUE":"火曜","WED":"水曜","THU":"木曜日","FRI":"金曜","SAT":"土曜"},"WEEK_DAYS_SHORT":{"SUN":"日","MON":"月","TUE":"火","WED":"水","THU":"木","FRI":"金","SAT":"土"}},"SEE_USER_PROFILE":"{{username }} のプロフィールを見る","USER_STORY":"User story","TASK":"タスク","ISSUE":"課題","EPIC":"エピック","TAGS":{"PLACEHOLDER":"タグを入力","DELETE":"タグを削除","ADD":"タグを追加"},"DESCRIPTION":{"EMPTY":"空欄だと退屈です…。説明を追加してください。","NO_DESCRIPTION":"説明はありません"},"FIELDS":{"SUBJECT":"題名","NAME":"名前","URL":"URL","DESCRIPTION":"説明","VALUE":"値","SLUG":"スラッグ","COLOR":"色","IS_CLOSED":"クローズ","STATUS":"ステータス","TYPE":"タイプ","SEVERITY":"深刻度","PRIORITY":"優先度","ASSIGNED_TO":"割当","ASSIGNED_USERS":"割当ユーザー","POINTS":"ポイント","IS_BLOCKED":"はブロックされています。","REF":"参照","VOTES":"投票","SPRINT":"スプリント","DUE_DATE":"締切日","DUE_DATE_REASON":"締切日理由"},"ROLES":{"ALL":"すべて"},"ASSIGNED_TO":{"NOT_ASSIGNED":"未割当","ASSIGN":"割当","DELETE_ASSIGNMENT":"割当を削除","REMOVE_ASSIGNED":"割当を解除","TOO_MANY":"…ユーザーが多すぎます。フィルタを継続してください。","CONFIRM_UNASSIGNED":"本当にこのアサインから外れてもよろしいですか?","TITLE_ACTION_EDIT_ASSIGNMENT":"割当を編集","SELF":"自分に割当"},"DUE_DATE":{"TITLE_ACTION_SET_DUE_DATE":"締切日を設定","DUE_SOON":"due soon","PAST_DUE":"past due date","NO_LONGER_APPLICABLE":"no longer applicable"},"ASSIGNED_USERS":{"ADD":"割当ユーザーを選択","ADD_ASSIGNED":"Add assigned","TITLE_LIGHTBOX_DELETE_ASSIGNED":"Delete assigned..."},"STATUS":{"CLOSED":"終了","OPEN":"オープン"},"WATCHERS":{"WATCHERS":"ウォッチャー","ADD":"ウォッチャー追加","TITLE_ADD":"プロジェクトメンバーをウォッチャーリストへ追加","DELETE":"ウォッチャーを削除","TITLE_LIGHTBOX_DELETE_WARTCHER":"ウォッチャーの削除..."},"WATCH_BUTTON":{"WATCH":"フォロー","WATCHING":"フォロー中","UNWATCH":"フォローをやめる","WATCHERS":"ウォッチャー","BUTTON_TITLE":"この項目のフォローを有効/無効にする","COUNTER_TITLE":"{total, plural, one{one watcher} other{# 人がフォロー中}}"},"VOTE_BUTTON":{"BUTTON_TITLE":"賛成/反対の投票を行う","COUNTER_TITLE":"{total, plural, one{one vote} other{# 人が賛成}}"},"CUSTOM_ATTRIBUTES":{"CUSTOM_FIELDS":"カスタムフィールド","SAVE":"カスタムフィールドを保存","EDIT":"カスタムフィールドを編集","DELETE":"カスタム属性を削除","CONFIRM_DELETE":"このカスタムフィールドのすべての値が削除されることになります。\n本当にこのまま続行してもよろしいですか?"},"FILTERS":{"INPUT_PLACEHOLDER":"Subject or reference","TITLE_ACTION_FILTER_BUTTON":"検索","TITLE":"フィルター","TITLE_ACTION_SEARCH":"検索","ACTION_SAVE_CUSTOM_FILTER":"カスタムフィルターとして保存する","PLACEHOLDER_FILTER_NAME":"フィルター名を入力しエンターキーを押してください。","APPLIED_FILTERS_NUM":"フィルター適用中","CATEGORIES":{"TYPE":"タイプ","STATUS":"ステータス","SEVERITY":"深刻度","PRIORITIES":"優先度","TAGS":"タグ","ASSIGNED_TO":"割当","ROLE":"役割","CREATED_BY":"作成者","CUSTOM_FILTERS":"カスタムフィルター","EPIC":"エピック"}},"WYSIWYG":{"CODE_SNIPPET":"Code Snippet","DB_CLICK":"ダブルクリックして編集","SELECT_LANGUAGE_PLACEHOLDER":"言語を選択","SELECT_LANGUAGE_REMOVE_FORMATING":"Remove formatting","OUTDATED":"Another person has made changes while you were editing. Check the new version on the activity tab before you save your changes.","MARKDOWN_HELP":"Markdown記法のヘルプ"},"PERMISIONS_CATEGORIES":{"EPICS":{"NAME":"エピック","VIEW_EPICS":"エピックの表示","ADD_EPICS":"エピックを追加","MODIFY_EPICS":"エピックの変更","COMMENT_EPICS":"複数のエピックにコメントする","DELETE_EPICS":"エピックの削除"},"SPRINTS":{"NAME":"スプリント","VIEW_SPRINTS":"スプリントの表示","ADD_SPRINTS":"スプリントを追加","MODIFY_SPRINTS":"スプリントの変更","DELETE_SPRINTS":"スプリントの削除"},"USER_STORIES":{"NAME":"ユーザーストーリー","VIEW_USER_STORIES":"ユーザーストーリーの表示","ADD_USER_STORIES":"ユーザーストーリーを追加","MODIFY_USER_STORIES":"ユーザーストーリーの変更","COMMENT_USER_STORIES":"複数のユーザーストーリーにコメントする","DELETE_USER_STORIES":"ユーザーストーリーの削除"},"TASKS":{"NAME":"タスク","VIEW_TASKS":"タスクの表示","ADD_TASKS":"タスクを追加","MODIFY_TASKS":"タスクの変更","COMMENT_TASKS":"複数のタスクにコメントする","DELETE_TASKS":"タスクの削除"},"ISSUES":{"NAME":"課題","VIEW_ISSUES":"課題の表示","ADD_ISSUES":"課題を追加","MODIFY_ISSUES":"課題の変更","COMMENT_ISSUES":"複数の課題にコメントする","DELETE_ISSUES":"課題の削除"},"WIKI":{"NAME":"Wiki","VIEW_WIKI_PAGES":"Wikiページの表示","ADD_WIKI_PAGES":"Wikiページを追加","MODIFY_WIKI_PAGES":"Wikiページの変更","DELETE_WIKI_PAGES":"Wikiページの削除","VIEW_WIKI_LINKS":"Wikiリンクの表示","ADD_WIKI_LINKS":"Wikiリンクを追加","DELETE_WIKI_LINKS":"Wikiリンクの削除"}}},"LOGIN":{"PAGE_TITLE":"ログイン - Taiga","PAGE_DESCRIPTION":"スタートアップ、デベロッパー、デザイナーのための、仕事を真から楽しくするシンプルで美しいプロジェクトマネージメントツール、Taigaにログインしましょう。"},"AUTH":{"INVITED_YOU":"があなたをプロジェクトに招待しています","NOT_REGISTERED_YET":"未登録ですか?","REGISTER":"登録","CREATE_ACCOUNT":"こちらから無料でアカウントを作成"},"LOGIN_COMMON":{"HEADER":"すでにログインしたことがあります","PLACEHOLDER_AUTH_NAME":"ユーザー名 または メールアドレス","LINK_FORGOT_PASSWORD":"忘れましたか?","TITLE_LINK_FORGOT_PASSWORD":"パスワードをお忘れですか?","ACTION_ENTER":"決定","ACTION_SIGN_IN":"ログイン","PLACEHOLDER_AUTH_PASSWORD":"パスワード","ALT_LOGIN":"または次でログイン"},"LOGIN_FORM":{"ERROR_AUTH_INCORRECT":"「あなたのユーザー名/メールアドレス または パスワードが間違っている」とウンパルンパたちが言っています。","SUCCESS":"ウンパルンパたちは嬉しいみたいですよ。Taigaへようこそ。"},"REGISTER":{"PAGE_TITLE":"登録 - Taiga","PAGE_DESCRIPTION":"スタートアップ、デベロッパー、デザイナーのための、仕事を真から楽しくするシンプルで美しいプロジェクトマネージメントツール、Taigaのアカウントを作成しましょう。"},"REGISTER_FORM":{"TITLE":"新しいTaigaアカウントを登録する (無料)","PLACEHOLDER_NAME":"ユーザー名を記入","PLACEHOLDER_FULL_NAME":"フルネームを記入","PLACEHOLDER_EMAIL":"メールアドレスを記入","PLACEHOLDER_PASSWORD":"パスワードを設定 (大文字・小文字を区別)","ACTION_SIGN_UP":"サインアップ","TITLE_LINK_LOGIN":"ログイン","LINK_LOGIN":"登録の準備は整いましたか? ログイン"},"FORGOT_PASSWORD":{"PAGE_TITLE":"パスワードを忘れました - Taiga","PAGE_DESCRIPTION":"ユーザー名 または メールアドレスを記入して新しいパスワードを取得しすれば、Taigaに再びアクセスできます。"},"FORGOT_PASSWORD_FORM":{"TITLE":"おっと、パスワードを忘れてしまいましたか?","SUBTITLE":"新しく始めるためにユーザー名 または メールアドレスを入力","PLACEHOLDER_FIELD":"ユーザー名 または メールアドレス","ACTION_RESET_PASSWORD":"パスワードをリセット","LINK_CANCEL":"いいえ、戻ります。私はそれを覚えていると思います。","SUCCESS_TITLE":"Inboxを確認してください","SUCCESS_TEXT":"新しいパスワードを設定するための指示を記載したメールを送信しました","ERROR":"「あなたのアカウントはまだ登録されていない」とウンパルンパたちが言っています。"},"CHANGE_PASSWORD":{"PAGE_TITLE":"パスワードの変更 - Taiga","SECTION_NAME":"パスワード変更","FIELD_CURRENT_PASSWORD":"現在のパスワード","PLACEHOLDER_CURRENT_PASSWORD":"現在のパスワード (パスワードが未設定の場合は空)","FIELD_NEW_PASSWORD":"新しいパスワード","PLACEHOLDER_NEW_PASSWORD":"新しいパスワードを入力","FIELD_RETYPE_PASSWORD":"新しいパスワードを再入力","PLACEHOLDER_RETYPE_PASSWORD":"新しいパスワードを再入力","ERROR_PASSWORD_MATCH":"パスワードが一致しません。"},"CHANGE_PASSWORD_RECOVERY_FORM":{"TITLE":"新しいTaigaのパスを作成","SUBTITLE":"そして、いくつかの鉄分豊富な食品を摂取しましょう!脳にとって良いことです :-P","PLACEHOLDER_NEW_PASSWORD":"新しいパスワード","PLACEHOLDER_RE_TYPE_NEW_PASSWORD":"新しいパスワードを再入力","ACTION_RESET_PASSWORD":"パスワードをリセット","ERROR":"ウンパルンパたちはあなたのパスワード復元依頼を見つけられないようです。もう一度お試しください。","SUCCESS":"ウンパルンパたちはあなたの新しいパスワードを保存しました。
    新しい方のパスワードでサインイン してみてください。"},"INVITATION":{"PAGE_TITLE":"招待を受諾する - Taiga","PAGE_DESCRIPTION":"スタートアップ、デベロッパー、デザイナーのための、仕事を真から楽しくするシンプルで美しいプロジェクトマネージメントツール、Taigaへの招待を受諾します。"},"INVITATION_LOGIN_FORM":{"NOT_FOUND":"「あなたの招待を確認できなかった」とウンパルンパたちが言っています。","SUCCESS":"プロジェクトへの参加に成功しました, {{project_name}}へようこそ"},"HOME":{"PAGE_TITLE":"ホーム - Taiga","PAGE_DESCRIPTION":"あなたのメインプロジェクト、担当あるいはフォローしているユーザーストーリー、タスク、課題が表示されるTaigaのホームページです。","EMPTY_WORKING_ON":"何も表示されていませんか? Taigaで作業を始めると、ここにあなたが取り組んでいるユーザーストーリー、タスク、課題が表示されます。","EMPTY_WATCHING":"ユーザーストーリー、タスク、課題をフォローして変更が発生した際に通知を受け取りましょう。:)","EMPTY_PROJECT_LIST":"参加中のプロジェクトがありません","WORKING_ON_SECTION":"取り組んでいる作業","WATCHING_SECTION":"フォロー中","DASHBOARD":"プロジェクトのダッシュボート"},"EPICS":{"TITLE":"エピック","SECTION_NAME":"エピック","EPIC":"エピック","PAGE_TITLE":"エピック - {{projectName}}","PAGE_DESCRIPTION":"エピックの一覧 {{projectName}}: {{projectDescription}}","DASHBOARD":{"ADD":"エピックを追加","UNASSIGNED":"未割当"},"EMPTY":{"TITLE":"まだエピックが無いようです","EXPLANATION":"エピックはユーザーストーリーを包含する、より上の階層のものです。
    階級のトップにあり、ユーザーストーリーをグループ化してまとめるのにも用いられます。","HELP":"エピックについて"},"TABLE":{"VOTES":"投票","NAME":"名前","PROJECT":"プロジェクト","SPRINT":"スプリント","ASSIGNED_TO":"割当済","STATUS":"ステータス","PROGRESS":"進捗","VIEW_OPTIONS":"オプションの表示"},"CREATE":{"TITLE":"新しいエピック","PLACEHOLDER_DESCRIPTION":"このエピックを他の人が理解できるように説明を加えて下さい","TEAM_REQUIREMENT":"チームからの要求","CLIENT_REQUIREMENT":"お客様からの要求","BLOCKED":"ブロック中","BLOCKED_NOTE_PLACEHOLDER":"なぜこのエピックはブロックされているのか?","CREATE_EPIC":"エピックを作成"}},"PROJECTS":{"PAGE_TITLE":"マイ プロジェクト - Taiga","PAGE_DESCRIPTION":"あなたの全てのプロジェクトのリストです。順序の入れ替えや新規作成ができます。","MY_PROJECTS":"マイ プロジェクト"},"ATTACHMENT":{"SECTION_NAME":"添付ファイル","TITLE":"{{ fileName }} が {{ date }} にアップロードされました","LIST_VIEW_MODE":"ライブビューモード","GALLERY_VIEW_MODE":"ギャラリービューモード","DESCRIPTION":"要約を入力","DEPRECATED":"(非推奨)","DEPRECATED_FILE":"推奨されませんか?","ADD":"新しい添付ファイルを追加する。 {{maxFileSizeMsg}}","DROP":"添付ファイルをここにドロップ!","SHOW_DEPRECATED":"+ 非推奨のアタッチメントを表示する","HIDE_DEPRECATED":"- 非推奨のアタッチメントを隠す","COUNT_DEPRECATED":"({{ counter }} deprecated)","MAX_UPLOAD_SIZE":"アップロード上限サイズは {{maxFileSize}} です","DATE":"YYYY年MM月DD日 hh時mm分","ERROR_UPLOAD_ATTACHMENT":"'{{fileName}}'のアップロードに失敗. {{errorMessage}}","TITLE_LIGHTBOX_DELETE_ATTACHMENT":"添付ファイルの削除...","MSG_LIGHTBOX_DELETE_ATTACHMENT":"添付ファイル '{{fileName}}'","ERROR_DELETE_ATTACHMENT":" 削除に失敗: {{errorMessage}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) はウンパルンパたちには重すぎます。({{maxFileSize}})より少ないもので試してください。"},"PAGINATION":{"PREVIOUS":"前へ","NEXT":"次へ"},"ADMIN":{"COMMON":{"TITLE_ACTION_EDIT_VALUE":"値を編集","TITLE_ACTION_DELETE_VALUE":"値を削除","TITLE_ACTION_DELETE_TAG":"タグを削除"},"HELP":"手助けが必要な場合はサポートページをチェックしてください。","PROJECT_DEFAULT_VALUES":{"TITLE":"初期値設定","SUBTITLE":"プルダウン項目の初期値を設定してください。"},"MEMBERSHIPS":{"TITLE":"メンバー管理","PAGE_TITLE":"メンバーシップ - {{projectName}}","ADD_BUTTON":"+ 新規メンバー","ADD_BUTTON_TITLE":"新規メンバーを追加","LIMIT_USERS_WARNING_MESSAGE_FOR_ADMIN":"このプロジェクトは許可されている最大メンバー数({{members}}名)に達しました。","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"このプロジェクトは許可されている最大メンバー数({{members}}名)に達しました。上限を増やしたい場合は管理者にお問い合わせください。"},"PROJECT_EXPORT":{"TITLE":"エクスポート","SUBTITLE":"エクスポートの実行によりプロジェクトのバックアップを作成することができます。
    また、バックアップをベースとして新しいプロジェクトを作成することも可能です。","EXPORT_BUTTON":"エクスポート","EXPORT_BUTTON_TITLE":"プロジェクトをエクスポート","LOADING_TITLE":"ダンプファイルを生成中","DUMP_READY":"ダンプファイルの用意が出来ました!","LOADING_MESSAGE":"このページを閉じないでください。","ASYNC_MESSAGE":"準備が出来たらメールで通知します。","SYNC_MESSAGE":"ダウンロードが自動で開始されない場合はこちらをクリックしてください。","ERROR":"ウンパルンパたちはダンプファイルの生成に手こずっているようです。もう一度お試しください。","ERROR_BUSY":"すみません、ウンパルンパたちはとても忙しいようです。しばらくしてからまたお試しください。"},"MODULES":{"TITLE":"モジュール","EPICS":"エピック","EPICS_DESCRIPTION":"あなたのプロジェクトの最も戦略的な部分を視覚化し、管理する","BACKLOG":"バックログ","BACKLOG_DESCRIPTION":"ユーザーストーリーが適切にメンテナンスされるよう管理し、優先順位に基づく作業を行うためのビュー","NUMBER_SPRINTS":"予測されるスプリント数","NUMBER_SPRINTS_HELP":"0に設定した場合、無制限となります","NUMBER_US_POINTS":"予測されるストーリーポイントの合計","NUMBER_US_POINTS_HELP":"0に設定した場合、無制限となります","KANBAN":"かんばん","KANBAN_DESCRIPTION":"このかんばんを利用して、無駄のない方法でプロジェクトを整理しましょう。","ISSUES":"課題","ISSUES_DESCRIPTION":"プロジェクトのバグ追跡、質問、機能改善に関する議論などが行えるようになります。","WIKI":"Wiki","WIKI_DESCRIPTION":"他のメンバーと協力してコンテンツを編集することができます。
    プロジェクトの情報を文書化するのにぴったりです。","MEETUP":"会議","MEETUP_DESCRIPTION":"あなたが利用しているビデオ会議システムを選択してください。","SELECT_VIDEOCONFERENCE":"ビデオ会議システムを選択","SALT_CHAT_ROOM":"チャットルーム名に接頭辞を追加","JITSI_CHAT_ROOM":"Jitsi","APPEARIN_CHAT_ROOM":"AppearIn","TALKY_CHAT_ROOM":"Talky","CUSTOM_CHAT_ROOM":"カスタム","URL_CHAT_ROOM":"チャットルームのURL"},"PROJECT_PROFILE":{"PAGE_TITLE":"{{sectionName}} - プロジェクトプロフィール - {{projectName}}","PROJECT_DETAILS":"プロジェクト詳細","PROJECT_NAME":"プロジェクト名","TAGS":"タグ","DESCRIPTION":"説明","RECRUITING":"プロジェクトメンバーを探していますか?","RECRUITING_MESSAGE":"どんな人を探していますか?","RECRUITING_PLACEHOLDER":"探している人のプロフィールを記載してください","FEEDBACK":"Taigaユーザーからのフィードバックを受け取りますか?","PUBLIC_PROJECT":"パブリック プロジェクト","PRIVATE_PROJECT":"非公開プロジェクト","PRIVATE_OR_PUBLIC":"パブリックプロジェクトとプライベートプロジェクトの違いは何ですか?","DELETE":"このプロジェクトを削除","CHANGE_LOGO":"ロゴを変更","ACTION_USE_DEFAULT_LOGO":"デフォルトのイメージを使用する","MAX_PRIVATE_PROJECTS":"あなたの現在のプランで許可されている非公開プロジェクトの上限数に達しました。","MAX_PRIVATE_PROJECTS_MEMBERS":"非公開プロジェクトの最大メンバー数を超えました。","MAX_PUBLIC_PROJECTS":"あなたの現在のプランで許可されている公開プロジェクトの上限数に達しました。","MAX_PUBLIC_PROJECTS_MEMBERS":"The project exceeds your maximum number of members for public projects","PROJECT_OWNER":"プロジェクトオーナー","REQUEST_OWNERSHIP":"オーナー権限を要求","REQUEST_OWNERSHIP_CONFIRMATION_TITLE":"新しいプロジェクトオーナーになりますか?","REQUEST_OWNERSHIP_DESC":"現在のプロジェクトオーナー {{name}} に、このプロジェクトのオーナー権限をあなたに移すよう要求","REQUEST_OWNERSHIP_BUTTON":"リクエスト","REQUEST_OWNERSHIP_SUCCESS":"プロジェクトオーナーに通知します","CHANGE_OWNER":"オーナーを変更","CHANGE_OWNER_SUCCESS_TITLE":"あなたのリクエストが送信されました!","CHANGE_OWNER_SUCCESS_DESC":"プロジェクトのオーナー権限要求が承認または拒否されことをメールでお知らせします"},"REPORTS":{"TITLE":"レポート","SUBTITLE":"オリジナルのレポートを作成するためにプロジェクトのデータをCSVで出力することができます。","DESCRIPTION":"CSVのダウンロードボタンまたは生成されたURLへアクセスしてファイルを入手し、お好みのテキストエディタや表計算ソフトで開いてください。データの可視化や分析を簡単に行うことが可能です。","HELP":"このファイルをどうやって表計算ソフトで活用すればいいですか?","REGENERATE_TITLE":"URLが変更されます","REGENERATE_SUBTITLE":"CSV出力用のURLを変更しようとしています。前回のURLは無効化されます。よろしいですか?"},"CSV":{"SECTION_TITLE_EPIC":"エピックレポート","SECTION_TITLE_US":"ユーザーストーリーを出力する","SECTION_TITLE_TASK":"タスクを出力する","SECTION_TITLE_ISSUE":"課題を出力する","DOWNLOAD":"CSVのダウンロード","URL_FIELD_PLACEHOLDER":"CSV出力用のURLを作成してください","TITLE_REGENERATE_URL":"CSV出力用のURLを作成","ACTION_GENERATE_URL":"URL を生成","ACTION_REGENERATE":"再作成"},"CUSTOM_FIELDS":{"TITLE":"カスタムフィールド","SUBTITLE":"ユーザーストーリー、タスク、課題のためのカスタムフィールドを明記してください。","EPIC_DESCRIPTION":"エピックカスタムフィールド","EPIC_ADD":"複数のエピックにカスタムフィールドを追加","US_DESCRIPTION":"ユーザーストーリーのカスタムフィールド","US_ADD":"ユーザーストーリーにカスタムフィールドを追加","TASK_DESCRIPTION":"タスクカスタムフィールド","TASK_ADD":"タスクにカスタムフィールドを追加","ISSUE_DESCRIPTION":"課題のカスタムフィールド","ISSUE_ADD":"課題にカスタムフィールドを追加","FIELD_TYPE_TEXT":"テキスト","FIELD_TYPE_RICHTEXT":"リッチテキスト","FIELD_TYPE_MULTI":"マルチライン","FIELD_TYPE_DATE":"日時","FIELD_TYPE_URL":"Url"},"PROJECT_VALUES":{"PAGE_TITLE":"{{sectionName}} - プロジェクト値 - {{projectName}}","REPLACEMENT":"この値を持つすべてのアイテムはこちらに変更されます:","ERROR_DELETE_ALL":"すべての値を削除することはできません。"},"PROJECT_VALUES_POINTS":{"TITLE":"ポイント","SUBTITLE":"予測されるユーザーストーリーのポイントを定義することができます。","US_TITLE":"ユーザーストーリーのポイント","ACTION_ADD":"新規ポイントを追加"},"PROJECT_VALUES_PRIORITIES":{"TITLE":"優先度","SUBTITLE":"課題の優先度を定義することができます。","ISSUE_TITLE":"課題の優先度","ACTION_ADD":"新しい優先度を追加"},"PROJECT_VALUES_SEVERITIES":{"TITLE":"深刻度","SUBTITLE":"課題の深刻度を定義することができます。","ISSUE_TITLE":"課題の深刻度","ACTION_ADD":"新しい深刻度を追加"},"PROJECT_VALUES_STATUS":{"TITLE":"ステータス","SUBTITLE":"ユーザーストーリー、タスク、課題のステータスを定義することができます。","EPIC_TITLE":"エピックステータス","US_TITLE":"ユーザーストーリーステータス","TASK_TITLE":"タスクのステータス","ISSUE_TITLE":"課題のステータス"},"PROJECT_VALUES_TYPES":{"TITLE":"タイプ","SUBTITLE":"課題のタイプを定義することができます。","ISSUE_TITLE":"課題のタイプ","ACTION_ADD":"新しい {{objName}} を追加"},"PROJECT_VALUES_TAGS":{"TITLE":"タグ","SUBTITLE":"タグの色を編集","EMPTY":"タグは現在ありません。","EMPTY_SEARCH":"検索条件に当てはまるものはありませんでした。","ACTION_ADD":"タグを追加","NEW_TAG":"新規タグ","MIXING_HELP_TEXT":"マージしたいタグを選択","MIXING_MERGE":"タグを結合","SELECTED":"選択中"},"ROLES":{"PAGE_TITLE":"役割 - {{projectName}}","WARNING_NO_ROLE":"Be careful, no role in your project will be able to estimate the point value for user stories","HELP_ROLE_ENABLED":"この設定を有効にするとメンバーがこの役割に割り当てられた際にユーザーストーリーのポイントに反映されます。","DISABLE_COMPUTABLE_ALERT_TITLE":"本当に役割見積もりを無効にしてもよろしいですか?","DISABLE_COMPUTABLE_ALERT_SUBTITLE":"If you disable estimation permissions for role {{roleName}} all previous estimations made by this role will be removed","COUNT_MEMBERS":"{{ role.members_count }} 名がこの役割を担当","TITLE_DELETE_ROLE":"役割を削除","REPLACEMENT_ROLE":"All the users with this role will be moved to","WARNING_DELETE_ROLE":"Be careful! All role estimations will be removed","ERROR_DELETE_ALL":"すべての値を削除することはできません","EXTERNAL_USER":"外部ユーザー","NOTE_EXTERNAL_USERS":"Note: by External User we mean any anonymous user not belonging to the Taiga platform, including search engines. Please use this role with care."},"THIRD_PARTIES":{"SECRET_KEY":"シークレットキー","PAYLOAD_URL":"Payload URL","VALID_IPS":"Valid origin IPs (separated by ,)"},"BITBUCKET":{"SECTION_NAME":"Bitbucket","PAGE_TITLE":"Bitbucket - {{projectName}}","INFO_VERIFYING_IP":"Bitbucket requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."},"GITLAB":{"SECTION_NAME":"Gitlab","PAGE_TITLE":"Gitlab - {{projectName}}","INFO_VERIFYING_IP":"Gitlab requests are not signed so the best way of verifying the origin is by IP. If the field is empty there will be no IP validation."},"GITHUB":{"SECTION_NAME":"Github","PAGE_TITLE":"GitHub - {{projectName}}"},"GOGS":{"SECTION_NAME":"Gogs","PAGE_TITLE":"Gogs - {{projectName}}"},"WEBHOOKS":{"PAGE_TITLE":"Webhooks - {{projectName}}","SECTION_NAME":"Webhooks","ADD_NEW":"新規Webhookを追加","TYPE_NAME":"サービス名を入力","TYPE_PAYLOAD_URL":"サービスペイロードのURLを入力","TYPE_SERVICE_SECRET":"サービスのシークレットキーを入力","SAVE":"Webhookを保存","CANCEL":"Webhookをキャンセル","SHOW_HISTORY":"(履歴を表示)","TEST":"Webhookをテスト","EDIT":"Webhookを編集","DELETE":"Webhookを削除","REQUEST":"リクエスト","RESEND_REQUEST":"リクエストを再送","HEADERS":"ヘッダー","PAYLOAD":"Payload","RESPONSE":"レスポンス","DATE":"YYYY年MM月DD日 hh時mm分ss秒","ACTION_HIDE_HISTORY":"(履歴を非表示)","ACTION_HIDE_HISTORY_TITLE":"履歴を非表示","ACTION_SHOW_HISTORY":"(履歴を表示)","ACTION_SHOW_HISTORY_TITLE":"履歴を表示","WEBHOOK_NAME":"Webhook '{{name}}'"},"CUSTOM_ATTRIBUTES":{"PAGE_TITLE":"{{sectionName}} - カスタム属性 - {{projectName}}","ADD":"カスタムフィールドを追加","EDIT":"カスタムフィールドを編集","DELETE":"カスタムフィールドを削除","SAVE_TITLE":"カスタムフィールドを保存","CANCEL_TITLE":"作成するのをやめる","SET_FIELD_NAME":"カスタムフィールド名を設定","SET_FIELD_DESCRIPTION":"カスタムフィールドの説明を設定","FIELD_TYPE_DEFAULT":"-- 1つ選択 --","ACTION_UPDATE":"カスタムフィールドを更新","ACTION_CANCEL_EDITION":"編集をキャンセル"},"MEMBERSHIP":{"COLUMN_MEMBER":"メンバー","COLUMN_ADMIN":"管理","COLUMN_ROLE":"役割","COLUMN_STATUS":"ステータス","STATUS_ACTIVE":"有効","STATUS_PENDING":"保留","DELETE_MEMBER":"メンバーを削除","RESEND":"再送信","SUCCESS_SEND_INVITATION":"招待メールを '{{email}}' へもう一度送りました。","SUCCESS_DELETE":"{{message}} を削除しました","ERROR_DELETE":"{{message}} を削除できませんでした","DEFAULT_DELETE_MESSAGE":"{{email}} への招待メール"},"DEFAULT_VALUES":{"LABEL_EPIC_STATUS":"エピックステータスの初期値","LABEL_US_STATUS":"ユーザーストーリーステータスの初期値","LABEL_POINTS":"ポイントの初期値","LABEL_TASK_STATUS":"タスクステータスの初期値","LABEL_ISSUE_TYPE":"課題タイプの初期値","LABEL_ISSUE_STATUS":"課題ステータスの初期値","LABEL_PRIORITY":"優先度の初期値","LABEL_SEVERITY":"深刻度の初期値"},"STATUS":{"PLACEHOLDER_WRITE_STATUS_NAME":"新しいステータス名を記入"},"TYPES":{"PLACEHOLDER_WRITE_NAME":"新しいエレメント名を記入"},"US_STATUS":{"ACTION_ADD_STATUS":"ステータスを追加","IS_ARCHIVED_COLUMN":"アーカイブ","IS_CLOSED_COLUMN":"終了","WIP_LIMIT_COLUMN":"WIP制限","PLACEHOLDER_WRITE_NAME":"新しいステータス名を記入"},"MENU":{"PROJECT":"プロジェクト","ATTRIBUTES":"属性","MEMBERS":"メンバー","PERMISSIONS":"権限","INTEGRATIONS":"インテグレーション"},"SUBMENU_PROJECT_VALUES":{"STATUS":"ステータス","POINTS":"ポイント","PRIORITIES":"優先度","SEVERITIES":"深刻度","TYPES":"タイプ","CUSTOM_FIELDS":"カスタムフィールド","TAGS":"タグ"},"SUBMENU_ROLES":{"TITLE":"役割","ACTION_NEW_ROLE":"+ 新規役割","TITLE_ACTION_NEW_ROLE":"新しい役割を追加"},"PROJECT_TRANSFER":{"DO_YOU_ACCEPT_PROJECT_OWNERNSHIP":"新しいプロジェクトオーナーとなりますか?","PRIVATE":"プライベート","ACCEPTED_PROJECT_OWNERNSHIP":"おめでとうございます! あなたが新しいプロジェクトオーナーです。","REJECTED_PROJECT_OWNERNSHIP":"承知致しました。現在のプロジェクトオーナーに連絡します","ACCEPT":"はい","REJECT":"却下","PROPOSE_OWNERSHIP":"プロジェクト {{project}} の現在のオーナー {{owner}} が、あなたに新しいプロジェクトオーナーになるよう要求しています。","ADD_COMMENT":"プロジェクトオーナーにコメントしますか?","UNLIMITED_PROJECTS":"無制限","OWNER_MESSAGE":{"PRIVATE":"あなたが持てる非公開プロジェクトは最大{{maxProjects}}個までです。現在{{currentProjects}}個持っています。","PUBLIC":"あなたが持てる公開プロジェクトは最大{{maxProjects}}個までです。現在{{currentProjects}}個持っています。"},"CANT_BE_OWNED":"現在あなたはこのタイプのプロジェクトのオーナーにはなれません。このプロジェクトのオーナーになりたい場合は管理者に問い合わせてオーナー権限を変更してもらってください。"}},"USER":{"PROFILE":{"PAGE_TITLE":"{{userFullName}} (@{{userUsername}})","EDIT":"プロフィールを編集","CLOSED_US":"完了したユーザーストーリー","PROJECTS":"プロジェクト","PROJECTS_EMPTY":"{{username}} はまだプロジェクトに参加していません","CONTACTS":"連絡先","CONTACTS_EMPTY":"{{username}} はまだ連絡先を持っていません","CURRENT_USER_CONTACTS_EMPTY":"あなたへのコンタクトはまだありません。","CURRENT_USER_CONTACTS_EMPTY_EXPLAIN":"Taigaで一緒に仕事をしたメンバーは自動的に連絡先へ追加されます","TABS":{"ACTIVITY_TAB":"タイムライン","ACTIVITY_TAB_TITLE":"このユーザのすべてのアクティビティーを表示する","PROJECTS_TAB":"プロジェクト","PROJECTS_TAB_TITLE":"ユーザーが参加しているプロジェクト","LIKES_TAB":"いいね","LIKES_TAB_TITLE":"このユーザーが「いいね」と評価したすべての内容を表示","VOTES_TAB":"投票","VOTES_TAB_TITLE":"このユーザーが「賛成」したすべての内容を表示","WATCHED_TAB":"フォロー","WATCHED_TAB_TITLE":"このユーザーが「フォロー」したすべての内容を表示","CONTACTS_TAB":"連絡先","CONTACTS_TAB_TITLE":"このユーザーが「コンタクト」したすべての内容を表示"}},"PROFILE_SIDEBAR":{"TITLE":"プロフィール","DESCRIPTION":"すべてのメンバーはあなたが完了させた作業、あなたが今取り組んでいる作業を確認することができます。自己紹介を追記してあなたについてもっと知ってもらいましょう!","ADD_INFO":"編集する"},"PROFILE_FAVS":{"FILTER_INPUT_PLACEHOLDER":"入力してください","FILTER_TYPE_ALL":"すべて","FILTER_TYPE_ALL_TITLE":"すべてを表示","FILTER_TYPE_PROJECTS":"プロジェクト","FILTER_TYPE_PROJECTS_TITLE":"プロジェクトのみ表示","FILTER_TYPE_EPICS":"エピック","FILTER_TYPE_EPICS_TITLE":"エピックのみ表示","FILTER_TYPE_USER_STORIES":"ストーリー","FILTER_TYPE_USER_STORIES_TITLE":"ユーザーストーリーを表示","FILTER_TYPE_TASKS":"タスク","FILTER_TYPE_TASKS_TITLE":"タスクのみ表示","FILTER_TYPE_ISSUES":"課題","FILTER_TYPE_ISSUES_TITLE":"課題のみ表示","EMPTY_TITLE":"表示するものがありません。"}},"PROJECT":{"PAGE_TITLE":"{{projectName}}","HELP":"最も良く使うプロジェクトがトップになるように順序を入れ替えてみましょう。
    トップ10のプロジェクトが上のナビゲーションバーのプロジェクトリストに現れます。","PRIVATE":"プライベート プロジェクト","LOOKING_FOR_PEOPLE":"プロジェクトはメンバーを探しています","FANS_COUNTER_TITLE":"{total, plural, one{one fan} other{# 人のファン}}","WATCHERS_COUNTER_TITLE":"{total, plural, one{one watcher} other{# 人がフォロー中}}","MEMBERS_COUNTER_TITLE":"{total, plural, one{one member} other{# 人のメンバー}}","BLOCKED_PROJECT":{"BLOCKED":"ブロックされたプロジェクト","THIS_PROJECT_IS_BLOCKED":"このプロジェクトは一時的にブロックされています。","TO_UNBLOCK_CONTACT_THE_ADMIN_STAFF":"プロジェクトのブロックを解除したい場合は管理者にお問い合わせください。"},"SECTION":{"SEARCH":"検索","TIMELINE":"タイムライン","BACKLOG":"バックログ","KANBAN":"かんばん","ISSUES":"課題","WIKI":"Wiki","TEAM":"チーム","MEETUP":"会議","ADMIN":"管理"},"NAVIGATION":{"ACTION_CREATE_PROJECT":"プロジェクトを作成","MANAGE_PROJECTS":"プロジェクト管理","TITLE_CREATE_PROJECT":"プロジェクトを作成","HELP_TITLE":"Taiga サポートページ","HELP":"ヘルプ","HOMEPAGE":"ホームページ","FEEDBACK_TITLE":"フィードバックを送る","FEEDBACK":"フィードバック","NOTIFICATIONS_TITLE":"通知設定を編集","NOTIFICATIONS":"通知","VIEW_PROFILE_TITLE":"プロフィールを表示","VIEW_PROFILE":"プロフィールを表示","EDIT_PROFILE_TITLE":"プロフィールを編集","EDIT_PROFILE":"プロフィールを編集","CHANGE_PASSWORD_TITLE":"パスワード変更","CHANGE_PASSWORD":"パスワード変更","DASHBOARD_TITLE":"ダッシュボード","DISCOVER_TITLE":"トレンドプロジェクトを探す","DISCOVER":"探す"},"LIKE_BUTTON":{"LIKE":"いいね","LIKED":"いいね","UNLIKE":"「いいね」を取り消す","BUTTON_TITLE":"Like or unlike this project","COUNTER_TITLE":"{total, plural, one{one fan} other{# 人のファン}}"},"WATCH_BUTTON":{"BUTTON_TITLE":"このプロジェクトをフォローして通知ポリシーを設定してください","WATCH":"フォロー","WATCHING":"フォロー中","COUNTER_TITLE":"{total, plural, one{one watcher} other{# 人がフォロー中}}","OPTIONS":{"NOTIFY_ALL":"すべての通知を受信する","NOTIFY_ALL_TITLE":"このプロジェクトのすべての通知を受信する","NOTIFY_INVOLVED":"関連するものだけ","NOTIFY_INVOLVED_TITLE":"あなたが携わっている時のみ通知を受信","UNWATCH":"フォローをやめる","UNWATCH_TITLE":"プロジェクトのフォローをやめる"}},"CONTACT_BUTTON":{"CONTACT_TITLE":"プロジェクトチームに連絡","CONTACT_BUTTON":"Contact the project"},"CREATE":{"TITLE":"プロジェクトを作成","CHOOSE_TEMPLATE":"どちらのテンプレートがあなたのプロジェクトにより適していますか?","TEMPLATE_SCRUM":"スクラム","TEMPLATE_SCRUM_DESC":"Prioritize and solve your tasks in short time cycles.","TEMPLATE_SCRUM_LONGDESC":"Scrum is an iterative and incremental agile software development methodology for managing product development.\nThe product backlog is what will ultimately be delivered, ordered into the sequence in which it should be delivered. Product Backlogs are broken into manageable, executable chunks named sprints. Every certain amount of time the team initiates a new sprint and commits to deliver a certain number of user stories from the backlog, in accordance with their skills, abilities and resources. The project advances as the backlog becomes depleted.","TEMPLATE_KANBAN":"かんばん","TEMPLATE_KANBAN_DESC":"Keep a constant workflow on independent tasks","TEMPLATE_KANBAN_LONGDESC":"かんばん方法論はプロジェクト開発(あらゆる種類のプロジェクト)を工程ごとに区切るのに使われます。\nかんばんカードはインデックスカードやポストイットのようなもので、プロジェクト内の全ての達成する必要のあるタスク(またはユーザーストーリー)がそれぞれのカードに詳細に書かれています。かんばんボードでは各カードを一つの工程が完了するたびに次の工程に動かし、進捗管理をしていきます。","DUPLICATE":"プロジェクトを複製","DUPLICATE_DESC":"Start clean and keep your configuration","IMPORT":"プロジェクトをインポート","IMPORT_DESC":"複数プラットフォームからのプロジェクトをTaigaにインポート","INVITE":"プロジェクトに招待","SOLO_PROJECT":"このプロジェクトで独りになります","INVITE_LATER":"(You'll be able to invite more members later)","BACK":"バックエンド","MAX_PRIVATE_PROJECTS":"残念ながら許可されている非公開プロジェクトの上限数に達しました。\nもし現在の上限を増やしたい場合は管理者にお問い合わせください。","MAX_PUBLIC_PROJECTS":"残念ながら許可されている公開プロジェクトの上限数に達しました。\nもし現在の上限を増やしたい場合は管理者にお問い合わせください。","PUBLIC_PROJECT":"パブリック プロジェクト","PRIVATE_PROJECT":"プライベート プロジェクト"},"COMMON":{"DETAILS":"新規プロジェクト詳細","PROJECT_TITLE":"プロジェクト名","PROJECT_DESCRIPTION":"プロジェクト概要"},"DUPLICATE":{"TITLE":"プロジェクトを複製","DESCRIPTION":"Start clean and keep your configuration","SELECT_PLACEHOLDER":"複製する既存プロジェクトを選択"},"IMPORT":{"TITLE":"プロジェクトをインポート","DESCRIPTION":"複数プラットフォームからのプロジェクトをTaigaにインポート","ASYNC_IN_PROGRESS_TITLE":"ウンパルンパたちがあなたのプロジェクトをインポートしています。","ASYNC_IN_PROGRESS_MESSAGE":"この処理には時間がかかります。
    準備が出来たらメールで通知します。","UPLOAD_IN_PROGRESS_MESSAGE":"{{totalSize}} 中 {{uploadedSize}} アップロード済み","ERROR":"ウンパルンパたちはダンプファイルのインポートに手こずっているようです。もう一度お試しください。","ERROR_TOO_MANY_REQUEST":"すみません、ウンパルンパたちはとても忙しいようです。しばらくしてからまたお試しください。","ERROR_MESSAGE":"ウンパルンパたちはダンプファイルのインポートに手こずっているようです。  \n{{error_message}}","ERROR_MAX_SIZE_EXCEEDED":"'{{fileName}}' ({{fileSize}}) はウンパルンパたちには重すぎます。({{maxFileSize}})より少ないもので試してください。","SYNC_SUCCESS":"プロジェクトのインポートに成功しました","IMPORT":"インポート","WHO_IS":"Their tasks will be assigned to ...","WRITE_EMAIL":"あるいは必要であれば、このユーザーがTaigaで使用しているメールアドレスを記入","SEARCH_CONTACT":"Or if you want, search in your contacts","WRITE_EMAIL_LABEL":"Taigaでこのユーザーが使用しているメールアドレスを記入","ACCEEDE":"Acceede","PROJECT_MEMBERS":"プロジェクトメンバー","PROCESS_DESCRIPTION":"{{platform}}のタスクを割り当てたいTaigaユーザーを教えてください。","MATCH":"Is {{user_external}} the same person as {{user_internal}}?","CHOOSE":"ユーザーを選択","LINKS":"Links with {{platform}}","LINKS_DESCRIPTION":"Do you want to keep the link of each item with the original {{platform}} card?","WARNING_MAIL_USER":"指定したユーザーがTaigaアカウントを持っていない場合、タスクを割り当てることはできません。","ASSIGN":"割当","PROJECT_SELECTOR":{"NO_RESULTS":"検索条件に当てはまるものはありませんでした。","ACTION_SEARCH":"検索","ACTION_BACK":"バックエンド"},"PROJECT_RESTRICTIONS":{"PROJECT_MEMBERS_DESC_PRIVATE":"インポートしようとしているプロジェクトのメンバー数はあなたを含めて{{members}}名ですが、あなたの現在のプランでは非公開プロジェクト1つにつき最大{{max_memberships}}名までしか許可されていません。 上限を増やしたい場合は管理者にお問い合わせください。","PROJECT_MEMBERS_DESC_PUBLIC":"インポートしようとしているプロジェクトのメンバー数はあなたを含めて{{members}}名ですが、あなたの現在のプランでは公開プロジェクト1つにつき最大{{max_memberships}}名までしか許可されていません。 上限を増やしたい場合は管理者にお問い合わせください。","ACCOUNT_ALLOW_MEMBERS":"Your account only allows {{members}} members","PRIVATE_PROJECTS_SPACE":{"TITLE":"現在のプランではこれ以上の非公開プロジェクトは許可されていません。","DESC":"インポートしようとしているプロジェクトは非公開プロジェクトです。現在のプランではこれ以上の非公開プロジェクトは許可されていません。"},"PUBLIC_PROJECTS_SPACE":{"TITLE":"現在のプランではこれ以上の公開プロジェクトは許可されていません。","DESC":"インポートしようとしているプロジェクトは公開プロジェクトです。現在のプランではこれ以上の公開プロジェクトは許可されていません。"},"PRIVATE_PROJECTS_MEMBERS":{"TITLE":"現在のプランでは非公開プロジェクトごとに最大{{max_memberships}}名のメンバーが許可されています。"},"PUBLIC_PROJECTS_MEMBERS":{"TITLE":"現在のプランでは公開プロジェクトごとに最大{{max_memberships}}名のメンバーが許可されています。"},"PRIVATE_PROJECTS_SPACE_MEMBERS":{"TITLE":"現在のプランではこれ以上の非公開プロジェクトの作成や、一つの非公開プロジェクトに{{max_memberships}}名を超えるメンバーを追加することはできません。","DESC":"インポートしようとしているのは非公開プロジェクトで{{members}}名のメンバーがいます。"},"PUBLIC_PROJECTS_SPACE_MEMBERS":{"TITLE":"現在のプランではこれ以上の公開プロジェクトの作成や、一つの公開プロジェクトに{{max_memberships}}名を超えるメンバーを追加することはできません。","DESC":"インポートしようとしているのは公開プロジェクトで{{members}}名以上のメンバーがいます。"}},"IN_PROGRESS":{"TITLE":"プロジェクトをインポート中","DESCRIPTION":"このプロセスには時間がかかります。ウィンドウを開いたままにしていてください。"},"WARNING":{"TITLE":"いくつかのタスクは未割当になります","DESCRIPTION":"There are still unidentified people. The cards assigned to these people will remain unassigned. Check all the contacts to not lose that information.","CHECK":"コンタクトを確認"},"TAIGA":{"SELECTOR":"Taigaプロジェクトをインポート"},"TRELLO":{"SELECTOR":"TrelloボードをTaigaにインポート","CHOOSE_PROJECT":"Choose board that you want to import","NO_PROJECTS":"It seems you have no boards in Trello"},"GITHUB":{"SELECTOR":"GitHubプロジェクト課題をインポート","CHOOSE_PROJECT":"インポートしたいプロジェクトを検索","NO_PROJECTS":"GitHubプロジェクトがないようです","HOW_DO_YOU_WANT_TO_IMPORT":"課題をどのようにTaigaにインポートしたいですか?","KANBAN_PROJECT":"As user stories in a kanban project","KANBAN_PROJECT_DESCRIPTION":"After that you can enable scrum with backlog.","SCRUM_PROJECT":"As user stories in a scrum project","SCRUM_PROJECT_DESCRIPTION":"After that you can enable kanban mode.","ISSUES_PROJECT":"課題として","ISSUES_PROJECT_DESCRIPTION":"課題をカンバンまたはスクラムモードで使うことはできません。新しいユーザーストーリーからカンバンまたはスクラムを有効にすることができます。"},"ASANA":{"SELECTOR":"Asanaプロジェクトをインポートし管理方法を選択","CHOOSE_PROJECT":"インポートしたいプロジェクトを選択","NO_PROJECTS":"Asanaにプロジェクトがないようです","KANBAN_PROJECT":"かんばん","SCRUM_PROJECT":"スクラム","CREATE_AS_SCRUM_DESCRIPTION":"あなたのプロジェクトのタスクとサブタスクはTaigaユーザーストーリーとタスクとして作成されます。","CREATE_AS_KANBAN_DESCRIPTION":"あなたのプロジェクトのタスクとサブタスクはTaigaユーザーストーリーとタスクとして作成されます。"},"JIRA":{"SELECTOR":"Jiraプロジェクトをインポートし管理方法を選択","HOW_TO_CONFIGURE":"(設定ヘルプ)","CHOOSE_PROJECT":"インポートしたいプロジェクトまたはボードを選択","NO_PROJECTS":"Jiraにプロジェクトやボードがないようです","URL":"Jira URL","KANBAN_PROJECT":"かんばん","SCRUM_PROJECT":"スクラム","ISSUES_PROJECT":"課題","CREATE_AS_SCRUM_DESCRIPTION":"あなたのプロジェクトの課題とサブ課題はTaigaユーザーストーリーとタスクとして作成されます。","CREATE_AS_KANBAN_DESCRIPTION":"あなたのプロジェクトの課題とサブ課題はTaigaユーザーストーリーとタスクとして作成されます。","CREATE_AS_ISSUES_DESCRIPTION":"Jiraプロジェクトからのサブ課題をどうしますか? (Taigaはサブ課題というものを許可しません)","CREATE_NEW_ISSUES":"サブ課題を新しいTaiga課題に変換する","NOT_CREATE_NEW_ISSUES":"サブ課題をインポートしないでください"}}},"LIGHTBOX":{"DELETE_ACCOUNT":{"CONFIRM":"本当にあなたのTaigaアカウントを削除してもよろしいですか?","CANCEL":"設定に戻る","ACCEPT":"アカウントを削除する","BLOCK_PROJECT":"あなたが所有しているプロジェクトは、あなたのアカウント削除後にブロックされることを覚えておいてください。あなたのアカウントが削除されてプロジェクトがブロックされる前にプロジェクトのオーナー権限を他のメンバーに譲渡してください。"},"DELETE_PROJECT":{"TITLE":"プロジェクトを削除","QUESTION":"本当にこのプロジェクトを削除していいですか?","SUBTITLE":"プロジェクトのすべてのデータ (ユーザーストーリー、タスク、課題、スプリント、Wikiページ) が失われます! :-(","CONFIRM":"はい、問題ありません"},"ASSIGNED_TO":{"SELECT":"割り当てる","SEARCH":"ユーザーを検索"},"ADD_MEMBER":{"TITLE":"新しいメンバー","PLACEHOLDER":"ユーザーをフィルターまたは招待メールを書く","ADD_EMAIL":"メールを追加","REMOVE":"削除","INVITE":"招待","CHOOSE_ROLE":"役割の選択","PLACEHOLDER_INVITATION_TEXT":"(任意) 招待する際のメッセージを追加できます。新メンバーに素敵な言葉を贈りましょう ;-)","HELP_TEXT":"ユーザーが既にTaigaに登録されている場合、自動的に追加されます。そうでない場合は招待状が送信されます。"},"CREATE_ISSUE":{"TITLE":"課題を追加"},"FEEDBACK":{"TITLE":"我々に教えてください...","COMMENT":"...バグ、提案、何かクールなことやTaigaを利用していて発生した悪夢など(英語で記載してください)","ACTION_SEND":"フィードバックを送る"},"SEARCH":{"TITLE":"検索","PLACEHOLDER_SEARCH":"何をお探しですか?"},"ADD_EDIT_SPRINT":{"TITLE":"新しいスプリント","PLACEHOLDER_SPRINT_NAME":"スプリント名","PLACEHOLDER_SPRINT_START":"見積もり開始","PLACEHOLDER_SPRINT_END":"見積もり終了","ACTION_DELETE_SPRINT":"このスプリントを削除しますか?","TITLE_ACTION_DELETE_SPRINT":"スプリントを削除","LAST_SPRINT_NAME":"最後のスプリントは {{lastSprint}}でした ;-) "},"CREATE_EDIT_TASK":{"TITLE":"新しいタスク","PLACEHOLDER_SUBJECT":"タスク名","PLACEHOLDER_STATUS":"タスクステータス","OPTION_UNASSIGNED":"未割当","PLACEHOLDER_SHORT_DESCRIPTION":"要約を入力","ACTION_EDIT":"タスクを編集","CONFIRM_CLOSE":"変更をまだ保存していません。\n本当にフォームを閉じてもよろしいですか?"},"CREATE_EDIT_US":{"TITLE":"新規 US","PLACEHOLDER_DESCRIPTION":"このユーザーストーリーを他の人が理解できるように説明を加えてください","NEW_US":"新しいユーザーストーリー","EDIT_US":"ユーザーストーリーを編集","CONFIRM_CLOSE":"変更をまだ保存していません。\n本当にフォームを閉じてもよろしいですか?"},"DELETE_DUE_DATE":{"TITLE":"締切日を削除","SUBTITLE":"本当にこの終了日を削除してもよろしいですか?"},"DELETE_SPRINT":{"TITLE":"スプリントを削除"},"CREATE_MEMBER":{"PLACEHOLDER_INVITATION_TEXT":"(任意) 招待する際のメッセージを追加できます。新メンバーに素敵な言葉を贈りましょう ;-)","PLACEHOLDER_TYPE_EMAIL":"メールアドレスを入力","LIMIT_USERS_WARNING_MESSAGE_FOR_OWNER":"このプロジェクトで許可されている最大メンバー数{{maxMembers}}名に達しようとしています。上限を増やしたい場合は管理者にお問い合わせください。","LIMIT_USERS_WARNING_MESSAGE":"このプロジェクトで許可されている最大メンバー数{{maxMembers}}名に達しようとしています。"},"LEAVE_PROJECT_WARNING":{"TITLE":"オーナーが不在となるため、プロジェクトを離脱することができません。","CURRENT_USER_OWNER":{"DESC":"現在、あなたはこのプロジェクトのオーナーです。プロジェクトを離脱する前にオーナー権限を他の誰かに譲渡してください。","BUTTON":"プロジェクトのオーナーを変更"},"OTHER_USER_OWNER":{"DESC":"現在のプロジェクトのオーナーになっているメンバーを削除することはできません。まず新しいプロジェクトオーナーを割り当ててください。","BUTTON":"プロジェクトオーナーの変更をリクエスト"}},"CHANGE_OWNER":{"TITLE":"誰を新しいプロジェクトオーナーにしたいですか?","ADD_COMMENT":"コメントを追加","BUTTON":"新しいプロジェクトオーナーとなるようこのメンバーに要求"},"CONTACT_PROJECT":{"TITLE":"メールを送る","WARNING":"プロジェクト管理者がメールを受信します","PLACEHOLDER":"メッセージを書いてください","SEND":"送信"},"SET_DUE_DATE":{"TITLE":"締切日を設定","PLACEHOLDER_DUE_DATE":"日付を選択","REASON_FOR_DUE_DATE":"締切日の設定理由","PLACEHOLDER_REASON_FOR_DUE_DATE":"なぜこのユーザーストーリーに締切日が必要なのでしょうか?","SUGGESTIONS":{"IN_ONE_WEEK":"1週間以内","IN_TWO_WEEKS":"In two weeks","IN_ONE_MONTH":"1ヶ月以内","IN_THREE_MONTHS":"3ヶ月以内"},"TITLE_ACTION_DELETE_DUE_DATE":"締切日を削除"}},"EPIC":{"PAGE_TITLE":"{{epicSubject}} - エピック {{epicRef}} - {{projectName}}","PAGE_DESCRIPTION":"ステータス: {{epicStatus }}. 説明: {{epicDescription}}","SECTION_NAME":"エピック","TITLE_LIGHTBOX_UNLINK_RELATED_USERSTORY":"関連するユーザーストーリーのリンクを削除","MSG_LIGHTBOX_UNLINK_RELATED_USERSTORY":"関連するユーザーストーリー '{{subject}}' とのリンクが削除されます。","ERROR_UNLINK_RELATED_USERSTORY":"リンクの削除に失敗: {{errorMessage}}","CREATE_RELATED_USERSTORIES":"関連付ける","NEW_USERSTORY":"新しいユーザーストーリー","EXISTING_USERSTORY":"既存のユーザーストーリー","CHOOSE_PROJECT_FOR_CREATION":"プロジェクトとは?","SUBJECT":"題名","SUBJECT_BULK_MODE":"題名 (一括登録)","CHOOSE_PROJECT_FROM":"プロジェクトとは?","CHOOSE_USERSTORY":"ユーザーストーリーとは?","NO_USERSTORIES":"このプロジェクトにはユーザーストーリーがまだありません。別のプロジェクトを選択してください。","NO_USERSTORIES_FOUND":"検索条件に当てはまるものはありませんでした。","FILTER_USERSTORIES":"ユーザーストーリーをフィルター","LIGHTBOX_TITLE_BLOKING_EPIC":"ブロックしているエピック","ACTION_DELETE":"エピックの削除"},"US":{"PAGE_TITLE":"{{userStorySubject}} - ユーザーストーリー {{userStoryRef}} - {{projectName}}","PAGE_DESCRIPTION":"ステータス: {{userStoryStatus }}. 進捗 {{userStoryProgressPercentage}}% ({{userStoryTotalTasks}}中{{userStoryClosedTasks}}タスク完了). ポイント: {{userStoryPoints}}. 説明: {{userStoryDescription}}","SECTION_NAME":"ユーザーストーリー","LINK_TASKBOARD":"タスクボード","TITLE_LINK_TASKBOARD":"タスクボードに移動","TOTAL_POINTS":"合計ポイント","ADD":"+ 新規ユーザーストーリーを追加する","ADD_BULK":"新規ユーザーストーリーを一括で追加する","PROMOTED":"このユーザーストーリーはこちらの課題から発展:","TITLE_LINK_GO_TO_ISSUE":"課題へ移動","TITLE_DELETE_ACTION":"ユーザーストーリーを削除","LIGHTBOX_TITLE_BLOKING_US":"Blocking us","NOT_ESTIMATED":"見積もりが行われていません","OWNER_US":"This User Story belongs to","TRIBE":{"PUBLISH":"Taiga Tribeでギグとして発行","PUBLISH_INFO":"詳細表示","PUBLISH_TITLE":"Taiga Tribeへの発行に関する情報","PUBLISHED_AS_GIG":"Taiga Tribeでギグとして発行されたストーリー","EDIT_LINK":"リンクを編集","CLOSE":"閉じる","SYNCHRONIZE_LINK":"Taiga Tribeと同期","PUBLISH_MORE_INFO_TITLE":"このタスクに誰か必要ですか?","PUBLISH_MORE_INFO_TEXT":"

    If you need help with a particular piece of work you can easily create gigs on Taiga Tribe and receive help from all over the world. You will be able to control and manage the gig enjoying a great community eager to contribute.

    TaigaTribe was born as a Taiga sibling. Both platforms can live separately but we believe that there is much power in using them combined so we are making sure the integration works like a charm.

    "},"FIELDS":{"TEAM_REQUIREMENT":"チームからの要求","CLIENT_REQUIREMENT":"お客様からの要求"}},"COMMENTS":{"DELETED_INFO":"{{user}}によってコメントは削除されました。","COMMENTS_COUNT":"{{comments}}コメント","OLDER_FIRST":"古い順","RECENT_FIRST":"新しい順","COMMENT":"コメント","EDITED_COMMENT":"編集済み:","SHOW_HISTORY":"View historic","TYPE_NEW_COMMENT":"新しいコメントをここに入力","SHOW_DELETED":"削除済コメントを表示","HIDE_DELETED":"削除済コメントを隠す","DELETE":"コメントを削除","RESTORE":"コメントを復元","HISTORY":{"TITLE":"アクティビティ"}},"ACTIVITY":{"TITLE":"アクティビティ","ACTIVITIES_COUNT":"{{activities}} アクティビティー","TAGS_ADDED":"追加したタグ:","TAGS_REMOVED":"削除したタグ:","US_POINTS":"{{role}} ポイント","NEW_ATTACHMENT":"新しい添付ファイル:","DELETED_ATTACHMENT":"削除された添付ファイル:","UPDATED_ATTACHMENT":"更新された添付ファイル ({{filename}}):","CREATED_CUSTOM_ATTRIBUTE":"カスタム属性を作成しました","UPDATED_CUSTOM_ATTRIBUTE":"カスタム属性を更新しました","BECAME_DEPRECATED":"became deprecated","BECAME_UNDEPRECATED":"became undeprecated","TEAM_REQUIREMENT":"チームからの要求","CLIENT_REQUIREMENT":"お客様からの要求","BLOCKED":"ブロック中","VALUES":{"NOT_SET":"not set","UNASSIGNED":"未割当"},"FIELDS":{"SUBJECT":"題名","DESCRIPTION":"説明","PRIORITY":"優先度","SEVERITY":"深刻度","STATUS":"ステータス","TYPE":"タイプ","ASSIGNED_TO":"割当","ASSIGNED_USERS":"割当ユーザー","DUE_DATE":"締切日","MILESTONE":"スプリント","COLOR":"色"}},"BACKLOG":{"PAGE_TITLE":"バックログ - {{projectName}}","PAGE_DESCRIPTION":"バックログパネルです。次のプロジェクトのユーザーストーリーとスプリントが記録されています:{{projectName}}: {{projectDescription}}","SECTION_NAME":"バックログ","CUSTOMIZE_GRAPH":"バックロググラフのカスタマイズ","CUSTOMIZE_GRAPH_TEXT":"To have a nice graph that helps you follow the evolution of the project you have to set up the points and sprints through the","CUSTOMIZE_GRAPH_ADMIN":"管理","CUSTOMIZE_GRAPH_TITLE":"管理ユーザーでポイントとスプリントを設定してください。","MOVE_US_TO_CURRENT_SPRINT":"現在のスプリントに移動","MOVE_US_TO_LATEST_SPRINT":"最新のスプリントに移動","EMPTY":"バックログが空です!","CREATE_NEW_US":"新規US作成","CREATE_NEW_US_EMPTY_HELP":"新しくユーザーストーリーを作成してください。","EXCESS_OF_POINTS":"ポイント超過","PENDING_POINTS":"保留ポイント","CLOSED_POINTS":"完了","COMPACT_SPRINT":"Compact Sprint","GO_TO_TASKBOARD":"タスクボード {{::name}} へ移動","EDIT_SPRINT":"スプリントを編集","TOTAL_POINTS":"合計","STATUS_NAME":"ステータス名","SORTABLE_FILTER_ERROR":"You can't drop on backlog when filters are open","DOOMLINE":"Project Scope [Doomline]","CHART":{"XAXIS_LABEL":"スプリント","YAXIS_LABEL":"ポイント","OPTIMAL":"Optimal pending points for sprint \"{{sprintName}}\" should be {{value}}","REAL":"スプリント \"{{sprintName}}\" の実際の保留ポイントは {{value}} です","INCREMENT_TEAM":"Incremented points by team requirements for sprint \"{{sprintName}}\" is {{value}}","INCREMENT_CLIENT":"Incremented points by client requirements for sprint \"{{sprintName}}\" is {{value}}"},"TAGS":{"TOGGLE":"タグ表示を固定","SHOW":"タグを表示","HIDE":"タグを非表示"},"FORECASTING":{"TITLE":"Velocity forecasting","BACKLOG":"バックログを表示","NEW_SPRINT":"あなたの作業速度をもとにした次のスプリントのユーザーストーリー候補。新しくスプリントを作成するにはクリックしてください。","CURRENT_SPRINT":"あなたの作業速度をもとにしたスプリント向けのユーザーストーリー候補。現在のスプリントに追加するにはクリックしてください。"},"TABLE":{"COLUMN_US":"User Stories","TITLE_COLUMN_POINTS":"役割ごとにビューを選択"},"SPRINT_SUMMARY":{"TOTAL_POINTS":"合計
    ポイント","COMPLETED_POINTS":"完了済み
    ポイント","OPEN_TASKS":"オープン
    タスク","CLOSED_TASKS":"完了済み
    タスク","IOCAINE_DOSES":"iocaine
    doses","SHOW_STATISTICS_TITLE":"統計を表示","TOGGLE_BAKLOG_GRAPH":"バーンダウングラフ 表示/非表示","POINTS_PER_ROLE":"役割ごとのポイント"},"SUMMARY":{"PROJECT_POINTS":"プロジェクト
    ポイント","DEFINED_POINTS":"定義された
    ポイント","CLOSED_POINTS":"closed
    points","POINTS_PER_SPRINT":"ポイント /
    スプリント"},"FILTERS":{"TOGGLE":"フィルター表示を固定","HIDE":"フィルターを非表示","SHOW":"フィルターを表示"},"SPRINTS":{"TITLE":"スプリント","DATE":"YYYY年MM月DD日","LINK_TASKBOARD":"スプリントタスクボード","TITLE_LINK_TASKBOARD":"タスクボード{{name}}へ移動","EMPTY":"まだスプリントはありません","WARNING_EMPTY_SPRINT_ANONYMOUS":"このスプリントにはユーザーストーリーがありません","WARNING_EMPTY_SPRINT":"新しいスプリントを始めるために、バックログからストーリーをここにドロップしてください。","TITLE_ACTION_NEW_SPRINT":"新しいスプリントを追加","TEXT_ACTION_NEW_SPRINT":"新しくスプリントをプロジェクトに作成してください。","ACTION_SHOW_CLOSED_SPRINTS":"終了したスプリントを表示","ACTION_HIDE_CLOSED_SPRINTS":"終了したスプリントを非表示"}},"ERROR":{"TEXT1":"何かよくないことが発生したようですがウンパルンパたちは問題なく作業しています。","NOT_FOUND":"見つかりません","NOT_FOUND_TEXT":"Error 404. 参照しようとしているページはすでに存在しません。TAIGAホームページに戻って探してみてください。","PERMISSION_DENIED":"権限がありません","PERMISSION_DENIED_TEXT":"このページへのアクセスが許可されていません。","VERSION_ERROR":"以前、Taigaの中の誰かが変更をしたためウンパルンパたちはあなたの変更を適用できません。リロードをしてもう一度適用してみてください。(現在の変更は失われます)"},"TASKBOARD":{"PAGE_TITLE":"{{sprintName}} - スプリントタスクボード - {{projectName}}","PAGE_DESCRIPTION":"スプリント {{sprintName}} ({{startDate}}から{{endDate}}まで) / {{projectName}}。{{completedPercentage}}% ({{totalPoints}}中{{completedPoints}}ポイント) 完了。{{totalTasks}}タスク中{{openTasks}}タスクが未完了。","SECTION_NAME":"タスクボード","TITLE_ACTION_ADD":"新規タスクを追加","TITLE_ACTION_ADD_BULK":"新規タスクを一括で追加する","TITLE_ACTION_ASSIGN":"タスクの割当","PLACEHOLDER_CARD_TITLE":"This could be a task","PLACEHOLDER_CARD_TEXT":"ストーリーを分割しタスクとして別管理","TABLE":{"COLUMN":"ユーザーストーリー","TITLE_ACTION_FOLD":"列をたたむ","TITLE_ACTION_UNFOLD":"列をひろげる","TITLE_ACTION_FOLD_ROW":"行をたたむ","TITLE_ACTION_UNFOLD_ROW":"行をひろげる","FIELD_POINTS":"ポイント","ROW_UNASSIGED_TASKS_TITLE":"未割当タスク"},"CHARTS":{"XAXIS_LABEL":"日","YAXIS_LABEL":"ポイント","OPTIMAL":"Optimal pending points for day {{formattedDate}} should be {{roundedValue}}","REAL":"{{formattedDate}} の実際の保留ポイントは {{roundedValue}} です","DATE":"YYYY年MM月DD日"}},"TASK":{"PAGE_TITLE":"{{taskSubject}} - タスク {{taskRef}} - {{projectName}}","PAGE_DESCRIPTION":"ステータス: {{taskStatus }}. 説明: {{taskDescription}}","SECTION_NAME":"タスク","LINK_TASKBOARD":"タスクボード","TITLE_LINK_TASKBOARD":"タスクボードに移動","PLACEHOLDER_SUBJECT":"新しいタスク名を入力","TITLE_SELECT_STATUS":"ステータス名","OWNER_US":"このタスクはこちらに属しています。","TITLE_LINK_GO_OWNER":"ユーザーストーリーに移動","TITLE_DELETE_ACTION":"タスクを削除","LIGHTBOX_TITLE_BLOKING_TASK":"ブロックしているタスク","FIELDS":{"IS_IOCAINE":"Is iocaine"},"TITLE_ACTION_IOCAINE":"Feeling a bit overwhelmed by a task? Make sure others know about it by clicking on Iocaine when editing a task. It's possible to become immune to this (fictional) deadly poison by consuming small amounts over time just as it's possible to get better at what you do by occasionally taking on extra challenges!"},"NOTIFICATION":{"OK":"すべてOKです","WARNING":"おっと、何か問題があったようです","WARNING_TEXT":"あなたの変更がセーブされなかったことにウンパルンパたちは悲しんでいます!","SAVED":"ウンパルンパたちがすべての変更を保存しました。","CLOSE":"通知を閉じる","MAIL":"メールでの通知","DESKTOP":"ブラウザアラートを使ったデスクトップ通知","ASK_DELETE":"本当に削除してもよろしいですか?"},"CANCEL_ACCOUNT":{"TITLE":"アカウントを解約する","SUBTITLE":"Taigaを脱会されてしまうのは残念です。楽しくご利用頂いていたことを祈ります。:)","PLACEHOLDER_INPUT_TOKEN":"アカウントトークンをキャンセル","ACTION_LEAVING":"はい、離脱します!","SUCCESS":"ウンパルンパたちがあなたのアカウントを削除しました。"},"CHANGE_EMAIL_FORM":{"TITLE":"メール変更","SUBTITLE":"あとはクリックだけであなたのメールアドレスが更新されます!","PLACEHOLDER_INPUT_TOKEN":"メールトークンを変更","ACTION_CHANGE_EMAIL":"メール変更","SUCCESS":"ウンパルンパたちがあなたのメールアドレスを更新しました"},"ISSUES":{"PAGE_TITLE":"課題 - {{projectName}}","PAGE_DESCRIPTION":"課題一覧パネル {{projectName}}: {{projectDescription}}","SECTION_NAME":"課題","ACTION_NEW_ISSUE":"+ 新規課題","ACTION_PROMOTE_TO_US":"ユーザーストーリーに変更する","PROMOTED":"この課題はこちらのユーザーストーリーへ発展:","EXTERNAL_REFERENCE":"課題の作成元: ","GO_TO_EXTERNAL_REFERENCE":"originへ移動","ACTION_DELETE":"課題を削除","LIGHTBOX_TITLE_BLOKING_ISSUE":"ブロックしている課題","FIELDS":{"PRIORITY":"優先度","SEVERITY":"深刻度","TYPE":"タイプ"},"CONFIRM_PROMOTE":{"TITLE":"この課題を新しいユーザーストーリーに変更","MESSAGE":"この課題から新しいユーザーストーリーを作成しますか?"},"TABLE":{"COLUMNS":{"TYPE":"タイプ","SEVERITY":"深刻度","PRIORITY":"優先度","SUBJECT":"題名","VOTES":"投票","STATUS":"ステータス","CREATED":"作成","ASSIGNED_TO":"割当"},"TITLE_ACTION_CHANGE_STATUS":"ステータスを変更","TITLE_ACTION_ASSIGNED_TO":"割当","BLOCKED":"ブロック中","EMPTY":{"TITLE":"レポートが必要な課題はありません :-)","SUBTITLE":"課題は見つかりましたか?"}}},"ISSUE":{"PAGE_TITLE":"{{issueSubject}} - 課題 {{issueRef}} - {{projectName}}","PAGE_DESCRIPTION":"ステータス: {{issueStatus }}. タイプ: {{issueType}}, 優先度: {{issuePriority}}. 深刻度: {{issueSeverity}}. 説明: {{issueDescription}}"},"KANBAN":{"PAGE_TITLE":"かんばん - {{projectName}}","PAGE_DESCRIPTION":"かんばんパネルです。次のプロジェクトのユーザーストーリーが記載されています:{{projectName}}: {{projectDescription}}","SECTION_NAME":"かんばん","TITLE_ACTION_FOLD":"列をたたむ","TITLE_ACTION_UNFOLD":"列をひろげる","TITLE_ACTION_ADD_US":"新規ユーザーストーリーを追加","TITLE_ACTION_ADD_BULK":"新規ユーザーストーリーを一括追加","ACTION_SHOW_ARCHIVED":"アーカイブ済を表示","ACTION_HIDE_ARCHIVED":"アーカイブ済を隠す","HIDDEN_USER_STORIES":"このステータスのユーザーストーリーはデフォルトで非表示となります","PLACEHOLDER_CARD_TITLE":"あなたのユーザーストーリーです","PLACEHOLDER_CARD_TEXT":"Stories might also have subtasks to separate requirements"},"SEARCH":{"PAGE_TITLE":"検索 - {{projectName}}","PAGE_DESCRIPTION":"ユーザーストーリー、課題、タスク、Wikiページ、その他何でもこのプロジェクト内を検索: {{projectName}}: {{projectDescription}}","FILTER_EPICS":"エピック","FILTER_USER_STORIES":"User Stories","FILTER_ISSUES":"課題","FILTER_TASKS":"タスク","FILTER_WIKI":"Wikiページ","PLACEHOLDER_SEARCH":"検索...","TITLE_ACTION_SEARCH":"検索","EMPTY_TITLE":"It looks like nothing was found with your search criteria.","EMPTY_DESCRIPTION":"Maybe try one of the tabs above or search again"},"TEAM":{"PAGE_TITLE":"チーム - {{projectName}}","PAGE_DESCRIPTION":"The team panel to show all the members of the project {{projectName}}: {{projectDescription}}","SECTION_NAME":"チーム","PLACEHOLDER_INPUT_SEARCH":"フルネームで検索する","COLUMN_MR_WOLF":"Mr. Wolf","EXPLANATION_COLUMN_MR_WOLF":"完了した課題","COLUMN_IOCAINE":"Iocaine Drinker","EXPLANATION_COLUMN_IOCAINE":"Iocaine doses ingested","COLUMN_CERVANTES":"Cervantes","EXPLANATION_COLUMN_CERVANTES":"Wiki ページを編集しました","COLUMN_BUG_HUNTER":"バグハンター","EXPLANATION_COLUMN_BUG_HUNTER":"報告されている課題","COLUMN_NIGHT_SHIFT":"ナイトシフト","EXPLANATION_COLUMN_NIGHT_SHIFT":"完了タスク","COLUMN_TOTAL_POWER":"Total Power","EXPLANATION_COLUMN_TOTAL_POWER":"合計ポイント","SECTION_TITLE_TEAM":"チーム >","SECTION_FILTER_ALL":"すべて","CONFIRM_LEAVE_PROJECT":"本当にこのプロジェクトから脱退していいですか?","ACTION_LEAVE_PROJECT":"このプロジェクトから離脱する"},"USER_SETTINGS":{"AVATAR_MAX_SIZE":"[最大サイズ: {{maxFileSize}}]","MENU":{"SECTION_TITLE":"ユーザー設定","USER_PROFILE":"ユーザープロフィール","CHANGE_PASSWORD":"パスワード変更","EMAIL_NOTIFICATIONS":"メール通知","DESKTOP_NOTIFICATIONS":"デスクトップ通知"},"NOTIFICATIONS":{"LIVE_SECTION_NAME":"Desktop Notifications","SECTION_NAME":"メール通知","COLUMN_PROJECT":"プロジェクト","COLUMN_RECEIVE_ALL":"すべて受信","COLUMN_ONLY_INVOLVED":"関連するものだけ","COLUMN_NO_NOTIFICATIONS":"通知なし","OPTION_ALL":"すべて","OPTION_INVOLVED":"Involved","OPTION_NONE":"なし"}},"USER_PROFILE":{"ACTION_USE_GRAVATAR":"デフォルトのイメージを使用する","ACTION_DELETE_ACCOUNT":"Taigaアカウントを削除","ACTION_DOWNLOAD_PROFILE":"Download Taiga profile","CHANGE_EMAIL_SUCCESS":"メールボックスを確認してください!
    新しいメールアドレスを設定するための手順を送信しました。","CHANGE_PHOTO":"写真を変更","FIELD":{"USERNAME":"ユーザー名","EMAIL":"メール","FULL_NAME":"フルネーム","PLACEHOLDER_FULL_NAME":"フルネームを入力 (例. Íñigo Montoya)","BIO":"自己紹介(最大で全角105文字まで)","PLACEHOLDER_BIO":"あなたについて教えてください","LANGUAGE":"言語","LANGUAGE_DEFAULT":"-- デフォルトの言語を使用 --","THEME":"テーマ","THEME_DEFAULT":"-- デフォルトのテーマを使用 --"}},"WIKI":{"PAGE_TITLE":"{{wikiPageName}} - Wiki - {{projectName}}","PAGE_DESCRIPTION":"{{lastModifiedDate}} に最後に編集がありました。(合計 {{totalEditions}} 件) 内容: {{ wikiPageContent }}","DATETIME":"YYYY年MM月DD日 HH時mm分","REMOVE":"このWikiページを削除","DELETE_LIGHTBOX_TITLE":"Wikiページを削除","DELETE_LINK_TITLE":"Wikiリンクを削除","NAVIGATION":{"HOME":"メインページ","SECTION_NAME":"ブックマーク","ACTION_ADD_LINK":"ブックマークを追加する","ALL_PAGES":"全Wikiページ"},"SUMMARY":{"TIMES_EDITED":"編集
    回数","LAST_EDIT":"最終
    編集","LAST_MODIFICATION":"最後の変更"},"SECTION_PAGES_LIST":"全ページ","PAGES_LIST_COLUMNS":{"TITLE":"タイトル","EDITIONS":"Editions","CREATED":"作成","MODIFIED":"変更済み","CREATOR":"作者","LAST_MODIFIER":"最後の変更者"}},"HINTS":{"SECTION_NAME":"ヒント","LINK":"利用方法を知りたい場合はサポートページを訪れてください","LINK_TITLE":"サポートページへ行く","HINT1_TITLE":"プロジェクトのインポートやエクスポートができるのをご存知でしたか?","HINT1_TEXT":"ひとつのTaigaアカウントの全てのデータを抽出し、別のアカウントへ移すことができます。","HINT2_TITLE":"カスタムフィールドが作れるのはご存知ですか?","HINT2_TEXT":"Teams can now create custom fields as a flexible means to enter specific data useful for their particular workflow.","HINT3_TITLE":"あなたに最も関連性のあるプロジェクトを見つけやすくするために順序を入れ替えてみましょう。","HINT3_TEXT":"最上部にあるダイレクトアクセスバーに10プロジェクトまで表示されます。","HINT4_TITLE":"Did you forget what were you working on?","HINT4_TEXT":"ご心配なさらないでください。ダッシュボードではあなたが取り組んだ順番にオープンなタスク、課題、ユーザーストーリーが表示されます。"},"TIMELINE":{"UPLOAD_ATTACHMENT":"{{username}} さんが新しい添付ファイル {{obj_name}} をアップロードしました","US_CREATED":"{{username}} さんが新しいユーザーストーリー {{obj_name}} を作成しました( {{project_name}} )","ISSUE_CREATED":"{{username}} さんが新しい課題 {{obj_name}} を作成しました( {{project_name}} )","TASK_CREATED":"{{username}} さんが新しいタスク {{obj_name}} を作成しました( {{project_name}} )","TASK_CREATED_WITH_US":"{{username}} さんが新しいタスク {{obj_name}} をユーザーストーリー {{us_name}} に作成しました( {{project_name}} )","WIKI_CREATED":"{{username}} さんが新しいwikiページ {{obj_name}} を作成しました( {{project_name}} )","MILESTONE_CREATED":"{{username}} さんがスプリント {{obj_name}} を作成しました( {{project_name}} )","EPIC_CREATED":"{{username}} さんが {{project_name}} で新しいエピック {{obj_name}} を作成しました","EPIC_RELATED_USERSTORY_CREATED":"{{username}} さんが {{project_name}} でユーザーストーリー {{related_us_name}} をエピック {{epic_name}} に関連付けました","NEW_PROJECT":"{{username}} がプロジェクト {{project_name}} を作成しました","MILESTONE_UPDATED":"{{username}} がスプリント {{obj_name}} を更新しました","US_UPDATED":"{{username}} さんがユーザーストーリー {{obj_name}} の属性 \"{{field_name}}\" を更新しました ","US_UPDATED_WITH_NEW_VALUE":"{{username}} さんがユーザーストーリー {{obj_name}} の属性 \"{{field_name}}\" を {{new_value}} に更新しました","US_UPDATED_POINTS":"{{username}} さんがユーザーストーリー {{obj_name}} における役割 '{{role_name}}' のポイントを {{new_value}} に更新しました","ISSUE_UPDATED":"{{username}} さんが課題 {{obj_name}} の属性 \"{{field_name}}\" を更新しました","ISSUE_UPDATED_WITH_NEW_VALUE":"{{username}} さんが課題 {{obj_name}} の属性 \"{{field_name}}\" を {{new_value}} に更新しました","TASK_UPDATED":"{{username}} が {{obj_name}} の {{field_name}} を {{new_value}} に更新しました","TASK_UPDATED_WITH_NEW_VALUE":"{{username}} が {{obj_name}} の {{field_name}} を {{new_value}} に更新しました","TASK_UPDATED_WITH_US":"{{username}} さんがユーザーストーリー {{us_name}} のタスク {{obj_name}} の属性 \"{{field_name}}\" を更新しました","TASK_UPDATED_WITH_US_NEW_VALUE":"{{username}} さんがユーザーストーリー {{us_name}} のタスク {{obj_name}} における属性 \"{{field_name}}\" を {{new_value}} に更新しました","WIKI_UPDATED":"{{username}} さんがWikiページ {{obj_name}} を更新しました","EPIC_UPDATED":"{{username}} さんがエピック {{obj_name}} の属性 \"{{field_name}}\" を更新しました","EPIC_UPDATED_WITH_NEW_VALUE":"{{username}} さんがエピック {{obj_name}} の属性 \"{{field_name}}\" を {{new_value}} に更新しました","EPIC_UPDATED_WITH_NEW_COLOR":"{{username}} さんが エピック {{obj_name}} の \"{{field_name}}\" を に更新しました","NEW_COMMENT_US":"{{username}} さんがユーザーストーリー {{obj_name}} にコメントしました","NEW_COMMENT_ISSUE":"{{username}} さんが課題 {{obj_name}} にコメントしました","NEW_COMMENT_TASK":"{{username}} さんがタスク {{obj_name}} にコメントしました","NEW_COMMENT_EPIC":"{{username}} さんがエピック {{obj_name}} にコメントしました","NEW_MEMBER":"{{project_name}} に新規メンバーが追加されました","US_ADDED_MILESTONE":"{{username}} さんがユーザーストーリー {{obj_name}} に {{sprint_name}} を追加しました","US_MOVED":"{{username}} さんがユーザーストーリー {{obj_name}} を移動しました","US_REMOVED_FROM_MILESTONE":"{{username}} さんがユーザーストーリー {{obj_name}} をバックログに追加しました","BLOCKED":"{{username}} さんが {{obj_name}} をブロックしました","UNBLOCKED":"{{username}} さんが {{obj_name}} のブロックを解除しました","NEW_USER":"{{username}} さんが Taiga に参加しました"},"LEGAL":{"TERMS_OF_SERVICE_AND_PRIVACY_POLICY_AD":"When creating a new account, you agree to our terms of service and privacy policy.","GDPR_ANNOUNCEMENT_TITLE":"General Data Protection Regulation (GDPR)","GDPR_ANNOUNCEMENT_DESCRIPTION":"You saw this comming, right? Updates to our Terms of Service","GDPR_ANNOUNCEMENT_INFOLINK":"Please read our announcement here"},"EXTERNAL_APP":{"PAGE_TITLE":"外部アプリでは認証が必要です","PAGE_DESCRIPTION":"外部アプリでは認証が必要です","AUTHORIZATION_REQUEST":"{{application}} にあなたのTaigaアカウントを使用することを許可しますか?","LOGIN_WITH_ANOTHER_USER":"別のユーザーでログイン","AUTHORIZE_APP":"アプリを許可","CANCEL":"キャンセル"},"JOYRIDE":{"NAV":{"NEXT":"次へ","BACK":"戻る","SKIP":"スキップ","DONE":"完了"},"DASHBOARD":{"STEP1":{"TITLE":"あなたのプロジェクト","TEXT":"Welcome! Here you will find the projects you are involved on."},"STEP2":{"TITLE":"取り組んでいる作業","TEXT":"あなたが取り組んでいるユーザーストーリー、タスク、課題です。"},"STEP3":{"TITLE":"フォロー中","TEXT1":"And right here you will find the ones in your projects that you want to know about.","TEXT2":"You are already working with Taiga ;)"},"STEP4":{"TITLE":"さあ始めましょう","TEXT1":"最初のTaigaプロジェクトを作成して始めてみましょう。","TEXT2":"グッドラック!"}},"BACKLOG":{"STEP1":{"TITLE":"プロジェクト概要","TEXT1":"ここではあなたのプロジェクトの進捗を見ることができます。","TEXT2":"管理でプロジェクトの全ての設定を変更できます。"},"STEP2":{"TITLE":"プロダクト バックログ","TEXT":"The backlog is the list of requirements (User Stories) for the project. Here is where you will plan your sprints."},"STEP3":{"TITLE":"スプリント","TEXT":"Sprints are short periods of time (usually 2 weeks) during which specific work has to be completed and delivered."},"STEP4":{"TITLE":"User Stories","TEXT":"Those are the requirements at high level. You can add them to the backlog and drag them to the sprint in which it should be delivered."}},"KANBAN":{"STEP1":{"TITLE":"ワークフローのカスタマイズ","TEXT":"Set up the columns you need to map your workflow statuses through the admin."},"STEP2":{"TITLE":"ユーザーストーリー&タスク","TEXT":"User Stories are the requirements at high level. You can drag them to different columns."},"STEP3":{"TITLE":"ユーザーストーリーを追加中","TEXT1":"You may want to add a single User Story (add US icon) or a group of them (bulk icon)","TEXT2":"グッドラック!"}}},"DISCOVER":{"PAGE_TITLE":"プロジェクトを探す - Taiga","PAGE_DESCRIPTION":"検索できるTaigaの公開プロジェクトディレクトリ。バックログ、タイムライン、課題、そしてチームを探してみてください。最も人気な、あるいは活気のあるプロジェクトも見つけられます。カンバンやスクラムでフィルターしてみるのも良いかもしれません。","DISCOVER_TITLE":"プロジェクトを探す","DISCOVER_SUBTITLE":"{projects, plural, one{One public project to discover} other{# 件のプロジェクトが見つかりました}}","MOST_ACTIVE":"最も活発なプロジェクト","MOST_ACTIVE_EMPTY":"アクティブなプロジェクトはまだありません。","MOST_LIKED":"最も好まれているプロジェクト","MOST_LIKED_EMPTY":"「いいね」されたプロジェクトはまだありません","VIEW_MORE":"もっと見る","FEATURED":"注目プロジェクト","EMPTY":"該当するプロジェクトがありませんでした。
    検索条件を変えて再度試してみてください!","FILTERS":{"ALL":"すべて","KANBAN":"かんばん","SCRUM":"スクラム","PEOPLE":"人","WEEK":"先週","MONTH":"先月","YEAR":"昨年","ALL_TIME":"すべて","CLEAR":"フィルターをクリア"},"SEARCH":{"PAGE_TITLE":"検索結果 - プロジェクトを探す - Taiga","PAGE_DESCRIPTION":"検索できるTaigaの公開プロジェクトディレクトリ。バックログ、タイムライン、課題、そしてチームを探してみてください。最も人気な、あるいは活気のあるプロジェクトも見つけられます。カンバンやスクラムでフィルターしてみるのも良いかもしれません。","INPUT_PLACEHOLDER":"入力してください","ACTION_TITLE":"検索","RESULTS":"検索結果"}}} \ No newline at end of file diff --git a/dist/v-1527758585938/locales/taiga/locale-ko.json b/dist/v-1528953702317/locales/taiga/locale-ko.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-ko.json rename to dist/v-1528953702317/locales/taiga/locale-ko.json diff --git a/dist/v-1527758585938/locales/taiga/locale-nb.json b/dist/v-1528953702317/locales/taiga/locale-nb.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-nb.json rename to dist/v-1528953702317/locales/taiga/locale-nb.json diff --git a/dist/v-1527758585938/locales/taiga/locale-nl.json b/dist/v-1528953702317/locales/taiga/locale-nl.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-nl.json rename to dist/v-1528953702317/locales/taiga/locale-nl.json diff --git a/dist/v-1527758585938/locales/taiga/locale-pl.json b/dist/v-1528953702317/locales/taiga/locale-pl.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-pl.json rename to dist/v-1528953702317/locales/taiga/locale-pl.json diff --git a/dist/v-1527758585938/locales/taiga/locale-pt-br.json b/dist/v-1528953702317/locales/taiga/locale-pt-br.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-pt-br.json rename to dist/v-1528953702317/locales/taiga/locale-pt-br.json diff --git a/dist/v-1527758585938/locales/taiga/locale-ru.json b/dist/v-1528953702317/locales/taiga/locale-ru.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-ru.json rename to dist/v-1528953702317/locales/taiga/locale-ru.json diff --git a/dist/v-1527758585938/locales/taiga/locale-sv.json b/dist/v-1528953702317/locales/taiga/locale-sv.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-sv.json rename to dist/v-1528953702317/locales/taiga/locale-sv.json diff --git a/dist/v-1527758585938/locales/taiga/locale-tr.json b/dist/v-1528953702317/locales/taiga/locale-tr.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-tr.json rename to dist/v-1528953702317/locales/taiga/locale-tr.json diff --git a/dist/v-1527758585938/locales/taiga/locale-zh-hans.json b/dist/v-1528953702317/locales/taiga/locale-zh-hans.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-zh-hans.json rename to dist/v-1528953702317/locales/taiga/locale-zh-hans.json diff --git a/dist/v-1527758585938/locales/taiga/locale-zh-hant.json b/dist/v-1528953702317/locales/taiga/locale-zh-hant.json similarity index 100% rename from dist/v-1527758585938/locales/taiga/locale-zh-hant.json rename to dist/v-1528953702317/locales/taiga/locale-zh-hant.json diff --git a/dist/v-1527758585938/prism/prism-abap.min.js b/dist/v-1528953702317/prism/prism-abap.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-abap.min.js rename to dist/v-1528953702317/prism/prism-abap.min.js diff --git a/dist/v-1527758585938/prism/prism-actionscript.min.js b/dist/v-1528953702317/prism/prism-actionscript.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-actionscript.min.js rename to dist/v-1528953702317/prism/prism-actionscript.min.js diff --git a/dist/v-1527758585938/prism/prism-ada.min.js b/dist/v-1528953702317/prism/prism-ada.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-ada.min.js rename to dist/v-1528953702317/prism/prism-ada.min.js diff --git a/dist/v-1527758585938/prism/prism-apacheconf.min.js b/dist/v-1528953702317/prism/prism-apacheconf.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-apacheconf.min.js rename to dist/v-1528953702317/prism/prism-apacheconf.min.js diff --git a/dist/v-1527758585938/prism/prism-apl.min.js b/dist/v-1528953702317/prism/prism-apl.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-apl.min.js rename to dist/v-1528953702317/prism/prism-apl.min.js diff --git a/dist/v-1527758585938/prism/prism-applescript.min.js b/dist/v-1528953702317/prism/prism-applescript.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-applescript.min.js rename to dist/v-1528953702317/prism/prism-applescript.min.js diff --git a/dist/v-1527758585938/prism/prism-arduino.min.js b/dist/v-1528953702317/prism/prism-arduino.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-arduino.min.js rename to dist/v-1528953702317/prism/prism-arduino.min.js diff --git a/dist/v-1527758585938/prism/prism-asciidoc.min.js b/dist/v-1528953702317/prism/prism-asciidoc.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-asciidoc.min.js rename to dist/v-1528953702317/prism/prism-asciidoc.min.js diff --git a/dist/v-1527758585938/prism/prism-asm6502.min.js b/dist/v-1528953702317/prism/prism-asm6502.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-asm6502.min.js rename to dist/v-1528953702317/prism/prism-asm6502.min.js diff --git a/dist/v-1527758585938/prism/prism-aspnet.min.js b/dist/v-1528953702317/prism/prism-aspnet.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-aspnet.min.js rename to dist/v-1528953702317/prism/prism-aspnet.min.js diff --git a/dist/v-1527758585938/prism/prism-autohotkey.min.js b/dist/v-1528953702317/prism/prism-autohotkey.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-autohotkey.min.js rename to dist/v-1528953702317/prism/prism-autohotkey.min.js diff --git a/dist/v-1527758585938/prism/prism-autoit.min.js b/dist/v-1528953702317/prism/prism-autoit.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-autoit.min.js rename to dist/v-1528953702317/prism/prism-autoit.min.js diff --git a/dist/v-1527758585938/prism/prism-bash.min.js b/dist/v-1528953702317/prism/prism-bash.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-bash.min.js rename to dist/v-1528953702317/prism/prism-bash.min.js diff --git a/dist/v-1527758585938/prism/prism-basic.min.js b/dist/v-1528953702317/prism/prism-basic.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-basic.min.js rename to dist/v-1528953702317/prism/prism-basic.min.js diff --git a/dist/v-1527758585938/prism/prism-batch.min.js b/dist/v-1528953702317/prism/prism-batch.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-batch.min.js rename to dist/v-1528953702317/prism/prism-batch.min.js diff --git a/dist/v-1527758585938/prism/prism-bison.min.js b/dist/v-1528953702317/prism/prism-bison.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-bison.min.js rename to dist/v-1528953702317/prism/prism-bison.min.js diff --git a/dist/v-1527758585938/prism/prism-brainfuck.min.js b/dist/v-1528953702317/prism/prism-brainfuck.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-brainfuck.min.js rename to dist/v-1528953702317/prism/prism-brainfuck.min.js diff --git a/dist/v-1527758585938/prism/prism-bro.min.js b/dist/v-1528953702317/prism/prism-bro.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-bro.min.js rename to dist/v-1528953702317/prism/prism-bro.min.js diff --git a/dist/v-1527758585938/prism/prism-c.min.js b/dist/v-1528953702317/prism/prism-c.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-c.min.js rename to dist/v-1528953702317/prism/prism-c.min.js diff --git a/dist/v-1527758585938/prism/prism-clike.min.js b/dist/v-1528953702317/prism/prism-clike.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-clike.min.js rename to dist/v-1528953702317/prism/prism-clike.min.js diff --git a/dist/v-1527758585938/prism/prism-coffeescript.min.js b/dist/v-1528953702317/prism/prism-coffeescript.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-coffeescript.min.js rename to dist/v-1528953702317/prism/prism-coffeescript.min.js diff --git a/dist/v-1527758585938/prism/prism-core.min.js b/dist/v-1528953702317/prism/prism-core.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-core.min.js rename to dist/v-1528953702317/prism/prism-core.min.js diff --git a/dist/v-1527758585938/prism/prism-cpp.min.js b/dist/v-1528953702317/prism/prism-cpp.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-cpp.min.js rename to dist/v-1528953702317/prism/prism-cpp.min.js diff --git a/dist/v-1527758585938/prism/prism-crystal.min.js b/dist/v-1528953702317/prism/prism-crystal.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-crystal.min.js rename to dist/v-1528953702317/prism/prism-crystal.min.js diff --git a/dist/v-1527758585938/prism/prism-csharp.min.js b/dist/v-1528953702317/prism/prism-csharp.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-csharp.min.js rename to dist/v-1528953702317/prism/prism-csharp.min.js diff --git a/dist/v-1527758585938/prism/prism-csp.min.js b/dist/v-1528953702317/prism/prism-csp.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-csp.min.js rename to dist/v-1528953702317/prism/prism-csp.min.js diff --git a/dist/v-1527758585938/prism/prism-css-extras.min.js b/dist/v-1528953702317/prism/prism-css-extras.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-css-extras.min.js rename to dist/v-1528953702317/prism/prism-css-extras.min.js diff --git a/dist/v-1527758585938/prism/prism-css.min.js b/dist/v-1528953702317/prism/prism-css.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-css.min.js rename to dist/v-1528953702317/prism/prism-css.min.js diff --git a/dist/v-1527758585938/prism/prism-d.min.js b/dist/v-1528953702317/prism/prism-d.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-d.min.js rename to dist/v-1528953702317/prism/prism-d.min.js diff --git a/dist/v-1527758585938/prism/prism-dart.min.js b/dist/v-1528953702317/prism/prism-dart.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-dart.min.js rename to dist/v-1528953702317/prism/prism-dart.min.js diff --git a/dist/v-1527758585938/prism/prism-diff.min.js b/dist/v-1528953702317/prism/prism-diff.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-diff.min.js rename to dist/v-1528953702317/prism/prism-diff.min.js diff --git a/dist/v-1527758585938/prism/prism-django.min.js b/dist/v-1528953702317/prism/prism-django.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-django.min.js rename to dist/v-1528953702317/prism/prism-django.min.js diff --git a/dist/v-1527758585938/prism/prism-docker.min.js b/dist/v-1528953702317/prism/prism-docker.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-docker.min.js rename to dist/v-1528953702317/prism/prism-docker.min.js diff --git a/dist/v-1527758585938/prism/prism-eiffel.min.js b/dist/v-1528953702317/prism/prism-eiffel.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-eiffel.min.js rename to dist/v-1528953702317/prism/prism-eiffel.min.js diff --git a/dist/v-1527758585938/prism/prism-elixir.min.js b/dist/v-1528953702317/prism/prism-elixir.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-elixir.min.js rename to dist/v-1528953702317/prism/prism-elixir.min.js diff --git a/dist/v-1527758585938/prism/prism-elm.min.js b/dist/v-1528953702317/prism/prism-elm.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-elm.min.js rename to dist/v-1528953702317/prism/prism-elm.min.js diff --git a/dist/v-1527758585938/prism/prism-erlang.min.js b/dist/v-1528953702317/prism/prism-erlang.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-erlang.min.js rename to dist/v-1528953702317/prism/prism-erlang.min.js diff --git a/dist/v-1527758585938/prism/prism-flow.min.js b/dist/v-1528953702317/prism/prism-flow.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-flow.min.js rename to dist/v-1528953702317/prism/prism-flow.min.js diff --git a/dist/v-1527758585938/prism/prism-fortran.min.js b/dist/v-1528953702317/prism/prism-fortran.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-fortran.min.js rename to dist/v-1528953702317/prism/prism-fortran.min.js diff --git a/dist/v-1527758585938/prism/prism-fsharp.min.js b/dist/v-1528953702317/prism/prism-fsharp.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-fsharp.min.js rename to dist/v-1528953702317/prism/prism-fsharp.min.js diff --git a/dist/v-1527758585938/prism/prism-gherkin.min.js b/dist/v-1528953702317/prism/prism-gherkin.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-gherkin.min.js rename to dist/v-1528953702317/prism/prism-gherkin.min.js diff --git a/dist/v-1527758585938/prism/prism-git.min.js b/dist/v-1528953702317/prism/prism-git.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-git.min.js rename to dist/v-1528953702317/prism/prism-git.min.js diff --git a/dist/v-1527758585938/prism/prism-glsl.min.js b/dist/v-1528953702317/prism/prism-glsl.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-glsl.min.js rename to dist/v-1528953702317/prism/prism-glsl.min.js diff --git a/dist/v-1527758585938/prism/prism-go.min.js b/dist/v-1528953702317/prism/prism-go.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-go.min.js rename to dist/v-1528953702317/prism/prism-go.min.js diff --git a/dist/v-1527758585938/prism/prism-graphql.min.js b/dist/v-1528953702317/prism/prism-graphql.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-graphql.min.js rename to dist/v-1528953702317/prism/prism-graphql.min.js diff --git a/dist/v-1527758585938/prism/prism-groovy.min.js b/dist/v-1528953702317/prism/prism-groovy.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-groovy.min.js rename to dist/v-1528953702317/prism/prism-groovy.min.js diff --git a/dist/v-1527758585938/prism/prism-haml.min.js b/dist/v-1528953702317/prism/prism-haml.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-haml.min.js rename to dist/v-1528953702317/prism/prism-haml.min.js diff --git a/dist/v-1527758585938/prism/prism-handlebars.min.js b/dist/v-1528953702317/prism/prism-handlebars.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-handlebars.min.js rename to dist/v-1528953702317/prism/prism-handlebars.min.js diff --git a/dist/v-1527758585938/prism/prism-haskell.min.js b/dist/v-1528953702317/prism/prism-haskell.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-haskell.min.js rename to dist/v-1528953702317/prism/prism-haskell.min.js diff --git a/dist/v-1527758585938/prism/prism-haxe.min.js b/dist/v-1528953702317/prism/prism-haxe.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-haxe.min.js rename to dist/v-1528953702317/prism/prism-haxe.min.js diff --git a/dist/v-1527758585938/prism/prism-hpkp.min.js b/dist/v-1528953702317/prism/prism-hpkp.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-hpkp.min.js rename to dist/v-1528953702317/prism/prism-hpkp.min.js diff --git a/dist/v-1527758585938/prism/prism-hsts.min.js b/dist/v-1528953702317/prism/prism-hsts.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-hsts.min.js rename to dist/v-1528953702317/prism/prism-hsts.min.js diff --git a/dist/v-1527758585938/prism/prism-http.min.js b/dist/v-1528953702317/prism/prism-http.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-http.min.js rename to dist/v-1528953702317/prism/prism-http.min.js diff --git a/dist/v-1527758585938/prism/prism-ichigojam.min.js b/dist/v-1528953702317/prism/prism-ichigojam.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-ichigojam.min.js rename to dist/v-1528953702317/prism/prism-ichigojam.min.js diff --git a/dist/v-1527758585938/prism/prism-icon.min.js b/dist/v-1528953702317/prism/prism-icon.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-icon.min.js rename to dist/v-1528953702317/prism/prism-icon.min.js diff --git a/dist/v-1527758585938/prism/prism-inform7.min.js b/dist/v-1528953702317/prism/prism-inform7.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-inform7.min.js rename to dist/v-1528953702317/prism/prism-inform7.min.js diff --git a/dist/v-1527758585938/prism/prism-ini.min.js b/dist/v-1528953702317/prism/prism-ini.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-ini.min.js rename to dist/v-1528953702317/prism/prism-ini.min.js diff --git a/dist/v-1527758585938/prism/prism-io.min.js b/dist/v-1528953702317/prism/prism-io.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-io.min.js rename to dist/v-1528953702317/prism/prism-io.min.js diff --git a/dist/v-1527758585938/prism/prism-j.min.js b/dist/v-1528953702317/prism/prism-j.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-j.min.js rename to dist/v-1528953702317/prism/prism-j.min.js diff --git a/dist/v-1527758585938/prism/prism-java.min.js b/dist/v-1528953702317/prism/prism-java.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-java.min.js rename to dist/v-1528953702317/prism/prism-java.min.js diff --git a/dist/v-1527758585938/prism/prism-javascript.min.js b/dist/v-1528953702317/prism/prism-javascript.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-javascript.min.js rename to dist/v-1528953702317/prism/prism-javascript.min.js diff --git a/dist/v-1527758585938/prism/prism-jolie.min.js b/dist/v-1528953702317/prism/prism-jolie.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-jolie.min.js rename to dist/v-1528953702317/prism/prism-jolie.min.js diff --git a/dist/v-1527758585938/prism/prism-json.min.js b/dist/v-1528953702317/prism/prism-json.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-json.min.js rename to dist/v-1528953702317/prism/prism-json.min.js diff --git a/dist/v-1527758585938/prism/prism-jsx.min.js b/dist/v-1528953702317/prism/prism-jsx.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-jsx.min.js rename to dist/v-1528953702317/prism/prism-jsx.min.js diff --git a/dist/v-1527758585938/prism/prism-julia.min.js b/dist/v-1528953702317/prism/prism-julia.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-julia.min.js rename to dist/v-1528953702317/prism/prism-julia.min.js diff --git a/dist/v-1527758585938/prism/prism-keyman.min.js b/dist/v-1528953702317/prism/prism-keyman.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-keyman.min.js rename to dist/v-1528953702317/prism/prism-keyman.min.js diff --git a/dist/v-1527758585938/prism/prism-kotlin.min.js b/dist/v-1528953702317/prism/prism-kotlin.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-kotlin.min.js rename to dist/v-1528953702317/prism/prism-kotlin.min.js diff --git a/dist/v-1527758585938/prism/prism-languages.json b/dist/v-1528953702317/prism/prism-languages.json similarity index 100% rename from dist/v-1527758585938/prism/prism-languages.json rename to dist/v-1528953702317/prism/prism-languages.json diff --git a/dist/v-1527758585938/prism/prism-latex.min.js b/dist/v-1528953702317/prism/prism-latex.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-latex.min.js rename to dist/v-1528953702317/prism/prism-latex.min.js diff --git a/dist/v-1527758585938/prism/prism-less.min.js b/dist/v-1528953702317/prism/prism-less.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-less.min.js rename to dist/v-1528953702317/prism/prism-less.min.js diff --git a/dist/v-1527758585938/prism/prism-livescript.min.js b/dist/v-1528953702317/prism/prism-livescript.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-livescript.min.js rename to dist/v-1528953702317/prism/prism-livescript.min.js diff --git a/dist/v-1527758585938/prism/prism-lolcode.min.js b/dist/v-1528953702317/prism/prism-lolcode.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-lolcode.min.js rename to dist/v-1528953702317/prism/prism-lolcode.min.js diff --git a/dist/v-1527758585938/prism/prism-lua.min.js b/dist/v-1528953702317/prism/prism-lua.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-lua.min.js rename to dist/v-1528953702317/prism/prism-lua.min.js diff --git a/dist/v-1527758585938/prism/prism-makefile.min.js b/dist/v-1528953702317/prism/prism-makefile.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-makefile.min.js rename to dist/v-1528953702317/prism/prism-makefile.min.js diff --git a/dist/v-1527758585938/prism/prism-markdown.min.js b/dist/v-1528953702317/prism/prism-markdown.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-markdown.min.js rename to dist/v-1528953702317/prism/prism-markdown.min.js diff --git a/dist/v-1527758585938/prism/prism-markup.min.js b/dist/v-1528953702317/prism/prism-markup.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-markup.min.js rename to dist/v-1528953702317/prism/prism-markup.min.js diff --git a/dist/v-1527758585938/prism/prism-matlab.min.js b/dist/v-1528953702317/prism/prism-matlab.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-matlab.min.js rename to dist/v-1528953702317/prism/prism-matlab.min.js diff --git a/dist/v-1527758585938/prism/prism-mel.min.js b/dist/v-1528953702317/prism/prism-mel.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-mel.min.js rename to dist/v-1528953702317/prism/prism-mel.min.js diff --git a/dist/v-1527758585938/prism/prism-mizar.min.js b/dist/v-1528953702317/prism/prism-mizar.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-mizar.min.js rename to dist/v-1528953702317/prism/prism-mizar.min.js diff --git a/dist/v-1527758585938/prism/prism-monkey.min.js b/dist/v-1528953702317/prism/prism-monkey.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-monkey.min.js rename to dist/v-1528953702317/prism/prism-monkey.min.js diff --git a/dist/v-1527758585938/prism/prism-n4js.min.js b/dist/v-1528953702317/prism/prism-n4js.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-n4js.min.js rename to dist/v-1528953702317/prism/prism-n4js.min.js diff --git a/dist/v-1527758585938/prism/prism-nasm.min.js b/dist/v-1528953702317/prism/prism-nasm.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-nasm.min.js rename to dist/v-1528953702317/prism/prism-nasm.min.js diff --git a/dist/v-1527758585938/prism/prism-nginx.min.js b/dist/v-1528953702317/prism/prism-nginx.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-nginx.min.js rename to dist/v-1528953702317/prism/prism-nginx.min.js diff --git a/dist/v-1527758585938/prism/prism-nim.min.js b/dist/v-1528953702317/prism/prism-nim.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-nim.min.js rename to dist/v-1528953702317/prism/prism-nim.min.js diff --git a/dist/v-1527758585938/prism/prism-nix.min.js b/dist/v-1528953702317/prism/prism-nix.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-nix.min.js rename to dist/v-1528953702317/prism/prism-nix.min.js diff --git a/dist/v-1527758585938/prism/prism-nsis.min.js b/dist/v-1528953702317/prism/prism-nsis.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-nsis.min.js rename to dist/v-1528953702317/prism/prism-nsis.min.js diff --git a/dist/v-1527758585938/prism/prism-objectivec.min.js b/dist/v-1528953702317/prism/prism-objectivec.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-objectivec.min.js rename to dist/v-1528953702317/prism/prism-objectivec.min.js diff --git a/dist/v-1527758585938/prism/prism-ocaml.min.js b/dist/v-1528953702317/prism/prism-ocaml.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-ocaml.min.js rename to dist/v-1528953702317/prism/prism-ocaml.min.js diff --git a/dist/v-1527758585938/prism/prism-opencl.min.js b/dist/v-1528953702317/prism/prism-opencl.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-opencl.min.js rename to dist/v-1528953702317/prism/prism-opencl.min.js diff --git a/dist/v-1527758585938/prism/prism-oz.min.js b/dist/v-1528953702317/prism/prism-oz.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-oz.min.js rename to dist/v-1528953702317/prism/prism-oz.min.js diff --git a/dist/v-1527758585938/prism/prism-parigp.min.js b/dist/v-1528953702317/prism/prism-parigp.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-parigp.min.js rename to dist/v-1528953702317/prism/prism-parigp.min.js diff --git a/dist/v-1527758585938/prism/prism-parser.min.js b/dist/v-1528953702317/prism/prism-parser.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-parser.min.js rename to dist/v-1528953702317/prism/prism-parser.min.js diff --git a/dist/v-1527758585938/prism/prism-pascal.min.js b/dist/v-1528953702317/prism/prism-pascal.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-pascal.min.js rename to dist/v-1528953702317/prism/prism-pascal.min.js diff --git a/dist/v-1527758585938/prism/prism-perl.min.js b/dist/v-1528953702317/prism/prism-perl.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-perl.min.js rename to dist/v-1528953702317/prism/prism-perl.min.js diff --git a/dist/v-1527758585938/prism/prism-php-extras.min.js b/dist/v-1528953702317/prism/prism-php-extras.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-php-extras.min.js rename to dist/v-1528953702317/prism/prism-php-extras.min.js diff --git a/dist/v-1527758585938/prism/prism-php.min.js b/dist/v-1528953702317/prism/prism-php.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-php.min.js rename to dist/v-1528953702317/prism/prism-php.min.js diff --git a/dist/v-1527758585938/prism/prism-powershell.min.js b/dist/v-1528953702317/prism/prism-powershell.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-powershell.min.js rename to dist/v-1528953702317/prism/prism-powershell.min.js diff --git a/dist/v-1527758585938/prism/prism-processing.min.js b/dist/v-1528953702317/prism/prism-processing.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-processing.min.js rename to dist/v-1528953702317/prism/prism-processing.min.js diff --git a/dist/v-1527758585938/prism/prism-prolog.min.js b/dist/v-1528953702317/prism/prism-prolog.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-prolog.min.js rename to dist/v-1528953702317/prism/prism-prolog.min.js diff --git a/dist/v-1527758585938/prism/prism-properties.min.js b/dist/v-1528953702317/prism/prism-properties.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-properties.min.js rename to dist/v-1528953702317/prism/prism-properties.min.js diff --git a/dist/v-1527758585938/prism/prism-protobuf.min.js b/dist/v-1528953702317/prism/prism-protobuf.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-protobuf.min.js rename to dist/v-1528953702317/prism/prism-protobuf.min.js diff --git a/dist/v-1527758585938/prism/prism-pug.min.js b/dist/v-1528953702317/prism/prism-pug.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-pug.min.js rename to dist/v-1528953702317/prism/prism-pug.min.js diff --git a/dist/v-1527758585938/prism/prism-puppet.min.js b/dist/v-1528953702317/prism/prism-puppet.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-puppet.min.js rename to dist/v-1528953702317/prism/prism-puppet.min.js diff --git a/dist/v-1527758585938/prism/prism-pure.min.js b/dist/v-1528953702317/prism/prism-pure.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-pure.min.js rename to dist/v-1528953702317/prism/prism-pure.min.js diff --git a/dist/v-1527758585938/prism/prism-python.min.js b/dist/v-1528953702317/prism/prism-python.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-python.min.js rename to dist/v-1528953702317/prism/prism-python.min.js diff --git a/dist/v-1527758585938/prism/prism-q.min.js b/dist/v-1528953702317/prism/prism-q.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-q.min.js rename to dist/v-1528953702317/prism/prism-q.min.js diff --git a/dist/v-1527758585938/prism/prism-qore.min.js b/dist/v-1528953702317/prism/prism-qore.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-qore.min.js rename to dist/v-1528953702317/prism/prism-qore.min.js diff --git a/dist/v-1527758585938/prism/prism-r.min.js b/dist/v-1528953702317/prism/prism-r.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-r.min.js rename to dist/v-1528953702317/prism/prism-r.min.js diff --git a/dist/v-1527758585938/prism/prism-reason.min.js b/dist/v-1528953702317/prism/prism-reason.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-reason.min.js rename to dist/v-1528953702317/prism/prism-reason.min.js diff --git a/dist/v-1527758585938/prism/prism-renpy.min.js b/dist/v-1528953702317/prism/prism-renpy.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-renpy.min.js rename to dist/v-1528953702317/prism/prism-renpy.min.js diff --git a/dist/v-1527758585938/prism/prism-rest.min.js b/dist/v-1528953702317/prism/prism-rest.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-rest.min.js rename to dist/v-1528953702317/prism/prism-rest.min.js diff --git a/dist/v-1527758585938/prism/prism-rip.min.js b/dist/v-1528953702317/prism/prism-rip.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-rip.min.js rename to dist/v-1528953702317/prism/prism-rip.min.js diff --git a/dist/v-1527758585938/prism/prism-roboconf.min.js b/dist/v-1528953702317/prism/prism-roboconf.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-roboconf.min.js rename to dist/v-1528953702317/prism/prism-roboconf.min.js diff --git a/dist/v-1527758585938/prism/prism-ruby.min.js b/dist/v-1528953702317/prism/prism-ruby.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-ruby.min.js rename to dist/v-1528953702317/prism/prism-ruby.min.js diff --git a/dist/v-1527758585938/prism/prism-rust.min.js b/dist/v-1528953702317/prism/prism-rust.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-rust.min.js rename to dist/v-1528953702317/prism/prism-rust.min.js diff --git a/dist/v-1527758585938/prism/prism-sas.min.js b/dist/v-1528953702317/prism/prism-sas.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-sas.min.js rename to dist/v-1528953702317/prism/prism-sas.min.js diff --git a/dist/v-1527758585938/prism/prism-sass.min.js b/dist/v-1528953702317/prism/prism-sass.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-sass.min.js rename to dist/v-1528953702317/prism/prism-sass.min.js diff --git a/dist/v-1527758585938/prism/prism-scala.min.js b/dist/v-1528953702317/prism/prism-scala.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-scala.min.js rename to dist/v-1528953702317/prism/prism-scala.min.js diff --git a/dist/v-1527758585938/prism/prism-scheme.min.js b/dist/v-1528953702317/prism/prism-scheme.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-scheme.min.js rename to dist/v-1528953702317/prism/prism-scheme.min.js diff --git a/dist/v-1527758585938/prism/prism-scss.min.js b/dist/v-1528953702317/prism/prism-scss.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-scss.min.js rename to dist/v-1528953702317/prism/prism-scss.min.js diff --git a/dist/v-1527758585938/prism/prism-smalltalk.min.js b/dist/v-1528953702317/prism/prism-smalltalk.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-smalltalk.min.js rename to dist/v-1528953702317/prism/prism-smalltalk.min.js diff --git a/dist/v-1527758585938/prism/prism-smarty.min.js b/dist/v-1528953702317/prism/prism-smarty.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-smarty.min.js rename to dist/v-1528953702317/prism/prism-smarty.min.js diff --git a/dist/v-1527758585938/prism/prism-sql.min.js b/dist/v-1528953702317/prism/prism-sql.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-sql.min.js rename to dist/v-1528953702317/prism/prism-sql.min.js diff --git a/dist/v-1527758585938/prism/prism-stylus.min.js b/dist/v-1528953702317/prism/prism-stylus.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-stylus.min.js rename to dist/v-1528953702317/prism/prism-stylus.min.js diff --git a/dist/v-1527758585938/prism/prism-swift.min.js b/dist/v-1528953702317/prism/prism-swift.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-swift.min.js rename to dist/v-1528953702317/prism/prism-swift.min.js diff --git a/dist/v-1527758585938/prism/prism-tcl.min.js b/dist/v-1528953702317/prism/prism-tcl.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-tcl.min.js rename to dist/v-1528953702317/prism/prism-tcl.min.js diff --git a/dist/v-1527758585938/prism/prism-textile.min.js b/dist/v-1528953702317/prism/prism-textile.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-textile.min.js rename to dist/v-1528953702317/prism/prism-textile.min.js diff --git a/dist/v-1527758585938/prism/prism-tsx.min.js b/dist/v-1528953702317/prism/prism-tsx.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-tsx.min.js rename to dist/v-1528953702317/prism/prism-tsx.min.js diff --git a/dist/v-1527758585938/prism/prism-twig.min.js b/dist/v-1528953702317/prism/prism-twig.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-twig.min.js rename to dist/v-1528953702317/prism/prism-twig.min.js diff --git a/dist/v-1527758585938/prism/prism-typescript.min.js b/dist/v-1528953702317/prism/prism-typescript.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-typescript.min.js rename to dist/v-1528953702317/prism/prism-typescript.min.js diff --git a/dist/v-1527758585938/prism/prism-vbnet.min.js b/dist/v-1528953702317/prism/prism-vbnet.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-vbnet.min.js rename to dist/v-1528953702317/prism/prism-vbnet.min.js diff --git a/dist/v-1527758585938/prism/prism-verilog.min.js b/dist/v-1528953702317/prism/prism-verilog.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-verilog.min.js rename to dist/v-1528953702317/prism/prism-verilog.min.js diff --git a/dist/v-1527758585938/prism/prism-vhdl.min.js b/dist/v-1528953702317/prism/prism-vhdl.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-vhdl.min.js rename to dist/v-1528953702317/prism/prism-vhdl.min.js diff --git a/dist/v-1527758585938/prism/prism-vim.min.js b/dist/v-1528953702317/prism/prism-vim.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-vim.min.js rename to dist/v-1528953702317/prism/prism-vim.min.js diff --git a/dist/v-1527758585938/prism/prism-wiki.min.js b/dist/v-1528953702317/prism/prism-wiki.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-wiki.min.js rename to dist/v-1528953702317/prism/prism-wiki.min.js diff --git a/dist/v-1527758585938/prism/prism-xeora.min.js b/dist/v-1528953702317/prism/prism-xeora.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-xeora.min.js rename to dist/v-1528953702317/prism/prism-xeora.min.js diff --git a/dist/v-1527758585938/prism/prism-xojo.min.js b/dist/v-1528953702317/prism/prism-xojo.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-xojo.min.js rename to dist/v-1528953702317/prism/prism-xojo.min.js diff --git a/dist/v-1527758585938/prism/prism-yaml.min.js b/dist/v-1528953702317/prism/prism-yaml.min.js similarity index 100% rename from dist/v-1527758585938/prism/prism-yaml.min.js rename to dist/v-1528953702317/prism/prism-yaml.min.js diff --git a/dist/v-1528953702317/styles/theme-high-contrast.css b/dist/v-1528953702317/styles/theme-high-contrast.css new file mode 100644 index 0000000..eac4a1c --- /dev/null +++ b/dist/v-1528953702317/styles/theme-high-contrast.css @@ -0,0 +1,4 @@ +@charset "UTF-8";.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;content:'';position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */.pika-single{display:block;position:relative;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.loader-active,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}.backlog-table-body .user-story-name span,h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#000}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal}h2{line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{min-width:240px;width:auto;z-index:999999}.pika-single .pika-title{color:#212121}.pika-single .is-selected .pika-button{background:#000;border-radius:0!important;box-shadow:inset 0 1px 3px #000}.pika-single .is-today .pika-button{color:#000}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#212121!important;border-radius:0!important;box-shadow:inset 0 1px 3px #212121!important}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#212121;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#212121;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#757575;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#000;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #757575;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #c1c1c1}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#212121;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#212121;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(110,110,110,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#000;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);position:absolute;width:100%}.admin-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#757575;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#757575}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(../images/bg.png) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;overflow-y:auto;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{margin-left:.5rem;padding-bottom:1rem}.auth .login-text a,.auth .register-text a{text-decoration:underline}.auth .login-text a:hover,.auth .register-text a:hover{color:#212121}.auth .register-terms{margin:.5rem 0 .75rem}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(0,0,0,.9);stroke:#212121;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(33,33,33,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;overflow:hidden;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #757575;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#212121;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#212121;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff;font-size:.9rem;margin-left:.5rem;padding-bottom:1rem;text-align:left}.invitation-main .register-text a{color:#000}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#000}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#c1c1c1}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .kanban-settings{float:right}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff}.error-main a{color:#212121}.rtl .navbar .nav-right{margin:0}.rtl .navbar .nav-right .user-avatar{padding-left:0;padding-right:2em;text-align:left}.rtl .navbar .nav-right img{margin-left:0;margin-right:.5rem}.rtl .admin-menu li a{padding:1rem 1rem 1rem 0}.rtl h1 span{margin-left:.5rem;margin-right:0}.rtl blockquote{border-left:0;border-right:5px solid #f5f5f5}.rtl .single-filter .name,.rtl .tag{border-width:0 3px 0 0}.rtl .single-filter .name,.subheader .tags-block .tag{border-color:transparent;border-style:solid}.rtl .tag{border-color:transparent;border-radius:5px 0 0 5px;margin:0 0 .5rem .5rem}.rtl .tag .icon-close{margin-left:0;margin-right:.25rem}.rtl .home-wrapper .working-on-container{margin-left:1rem;margin-right:0}.rtl .home-project .project-card-logo{margin-left:.5rem;margin-right:0}.rtl .home-project .project-card-statistics svg{margin-left:.25rem;margin-right:0}.rtl .contact-team-large .icon-mail{margin-left:.5rem;margin-right:0}.rtl .user-profile .project-details-image{margin-left:2rem;margin-right:0}.rtl .profile-timeline .activity-item .profile-contact-picture,.rtl .profile-timeline .activity-item .profile-member-picture,.rtl .single-project .project-logo{margin-left:1rem;margin-right:0}.rtl .profile-timeline .activity-item{padding:1rem 0 1rem .5rem}.rtl .profile-timeline .activity-item .activity-date{left:.5rem;right:auto}.rtl .profile-timeline .activity-item .activity-info{margin-left:130px;margin-right:0}.rtl .profile-timeline .activity-item blockquote{margin-left:0;margin-right:calc(35px + 1rem)}.rtl .profile-timeline .single-attachment .icon{margin-left:.5rem;margin-right:0}.rtl .project-data .involved-team li{margin-left:.13rem;margin-right:0}.rtl .project-details-form-data .actions .delete-account{text-align:left}.rtl .backlog-table-body .backlog-table-title .user-stories,.rtl .backlog-table-body .row .user-stories,.rtl .backlog-table-body .user-story-name a,.rtl .backlog-table-header .backlog-table-title .user-stories,.rtl .backlog-table-header .row .user-stories,.rtl .issues-table .assigned-field,.rtl .issues-table .created-field,.rtl .issues-table .issue-field,.rtl .issues-table .subject a,.rtl .sprints .sprint-table .column-us{text-align:right}.rtl .project-data .timeline{margin-left:1rem;margin-right:0}.rtl .track-icon{margin-left:.5rem;margin-right:0}.rtl .watch-options-arrow{margin-left:0;margin-right:auto}.rtl .ticket-estimation .ticket-role-points .icon-arrow-down{margin-left:0;margin-right:.25rem}.rtl .ticket-watch .ticket-watch-button,.rtl .ticket-watch svg{margin-left:.25rem;margin-right:0}.rtl .related-tasks-body .task-assignedto .icon{left:.5rem;right:0}.rtl .related-tasks-body .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .related-tasks-body .task-name{margin-left:1rem;margin-right:0}.rtl .related-tasks-body .task-name span{margin-left:.25rem;margin-right:0}.rtl tg-filter .search-action{left:.7rem;right:auto}.rtl .issues-table .assigned-field .icon,.rtl .issues-table .created-field .icon,.rtl .issues-table .issue-field .icon{margin-left:0;margin-right:.25rem}.rtl .icon-arrow-left,.rtl .icon-arrow-right{transform:scaleX(-1)}.rtl .issues-table .pop-status{left:auto;right:0}.rtl .issues-table .icon-upvote{margin-left:.25rem;margin-right:0}.rtl .highlighted .header svg,.rtl .issues-table .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .issues-table .subject{padding-left:1rem;padding-right:0}.rtl .issues-table .issue-assignedto .icon{left:0;right:auto}.rtl .single-filter{padding-left:.5rem;padding-right:0}.rtl .single-filter .number{left:0;right:auto}.rtl .discover-header .search-button{left:1rem;right:auto}.rtl .highlighted .header svg.icon-activity,.rtl .highlighted .header svg.icon-like{margin-left:.5rem;margin-right:0}.rtl .highlighted tg-most-liked{margin-left:8%;margin-right:0}.rtl .highlighted-project .statistic{margin-left:.5rem;margin-right:0}.rtl .highlighted-project .project-statistics svg{margin-left:.25rem;margin-right:0}.rtl .highlighted-project .project-logo{margin-left:1rem;margin-right:0}.rtl .featured-project .project-card-logo{margin-left:.5rem;margin-right:0}.rtl .featured-project .project-card-statistics svg{margin-left:.25rem;margin-right:0}.rtl .project-list-wrapper .project-list{margin-left:2rem;margin-right:0}.rtl .project-list-wrapper .list-itemtype-project .list-itemtype-project-image{margin-left:1rem;margin-right:0}.rtl .create-project-selector-question{left:1.5rem;right:auto}.rtl .create-project-title-wrapper .icon{margin-left:.5rem;margin-right:0}.rtl .create-project-privacity label .icon{margin-left:.25rem;margin-right:0}.rtl .create-project-action-submit{margin-left:0;margin-right:1rem}.rtl .summary-progress-bar{margin-left:10px;margin-right:0}.rtl .empty-burndown svg{margin-left:2rem;margin-right:0}.rtl .backlog-menu .button-bulk{margin-left:0;margin-right:.2rem}.rtl .ticket-header .detail-status{margin-left:0;margin-right:.25rem}.rtl .ticket-status .level-name{float:left}.rtl .ticket-status .level{margin-left:.5rem;margin-right:0}.rtl .ticket-data-container .icon{margin-left:0;margin-right:.25rem}.rtl .ticket-assigned-to .assigned-to{margin-left:0;margin-right:.5rem}.rtl .user-list-avatar{margin-left:.25rem;margin-right:0}.rtl .user-list-name{margin-left:0;margin-right:.5rem}.rtl .assigned-to-list .user-list-multiple .remove-assigned-to,.rtl .assigned-to-list .user-list-single .remove-assigned-to,.rtl .ticket-assigned-to .remove-user,.rtl .ticket-assigned-users .remove-user,.rtl .ticket-watchers .delete-watcher{left:.5rem;right:auto}.rtl .lightbox .close{left:3rem;right:auto}.rtl .activity .activity-avatar,.rtl .comment .comment-avatar{margin-left:1.5rem;margin-right:0}.rtl .comment .comment-creator{margin-left:.5rem;margin-right:0}.rtl tg-wysiwyg .tools{padding-left:0;padding-right:1rem}.rtl .add-tag-button .icon-add{margin:.5rem 0 0 .25rem}.rtl .add-tag-input .save{margin:.5rem .5rem 0 0}.rtl .issue-nav{left:1rem;right:auto}.rtl .upvote-btn{margin-left:.3rem;margin-right:0}.rtl .taskboard-table-header .taskboard-table-inner{margin-left:1rem}.rtl .taskboard-table-header .task-colum-name{margin:0 0 0 5px}.rtl .kanban-table-header{margin-left:-3.7rem}.rtl .kanban-table-body .task-column,.rtl .kanban-table-header .task-colum-name,.rtl .taskboard-table-body .task-column{margin:0 0 0 5px}.rtl .kanban-table-body .task-column:last-child,.rtl .taskboard-table-body .task-column:last-child{margin-left:0;margin-right:initial}.rtl .backlog-table-body .votes svg{margin-left:.25rem;margin-right:0}.rtl .backlog-table-header .backlog-table-title{padding-left:1rem;padding-right:0}.rtl .backlog-table-body .backlog-table-title .status,.rtl .backlog-table-body .row .status,.rtl .backlog-table-header .backlog-table-title .status,.rtl .backlog-table-header .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;text-align:right}.rtl .backlog-table-body .points .icon,.rtl .backlog-table-body .status .icon,.rtl .backlog-table-header .points .icon,.rtl .backlog-table-header .status .icon{margin-left:0;margin-right:.2rem}.rtl .sprints .sprint-table .column-points,.rtl .ticket-created-by .created-by .created-date,.rtl .ticket-created-by .created-by .created-title{text-align:left}.rtl .sprints .sprint .edit-sprint{left:0;margin-left:.5rem;margin-right:0;right:auto}.rtl .epic-row .progress-bar,.rtl .epic-row .progress-status{left:auto;right:0}.rtl .ticket-created-by .created-by .created-date,.rtl .ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem}.rtl tg-wysiwyg .markdown-editor-placeholder,.rtl tg-wysiwyg .medium-editor-placeholder{padding-left:0;padding-right:1rem;text-align:right}.rtl .attachments-header button{margin-left:.2rem;margin-right:0}.rtl .attachments-header label{margin-left:0;margin-right:.25rem}.rtl .attachment-list .attachment-comments,.rtl .attachment-list .editable-attachment-comment{margin-left:.5rem;margin-right:0}.rtl .attachment-list .editable-attachment-deprecated input{margin-left:.2rem;margin-right:0}.rtl .more-attachments .more-attachments-num{margin-left:0;margin-right:.5rem}.rtl .single-attachment .attachment-name{padding-left:1rem;padding-right:0}.rtl .single-attachment .attachment-name svg{margin-left:.25rem;margin-right:0}.rtl .wiki-nav .add-button svg{margin-left:.5rem;margin-right:0}.rtl .wiki-pages-table .created-field,.rtl .wiki-pages-table .creator-field,.rtl .wiki-pages-table .last-modifier-field,.rtl .wiki-pages-table .modified-field,.rtl .wiki-pages-table .title-field{text-align:right}.rtl .wiki-summary div{margin-left:1.25rem;margin-right:0}.rtl .summary .number{margin-left:.3rem;margin-right:0}.rtl .table-team .avatar .avatar-data{margin-left:0;margin-right:1rem;text-align:right}.rtl .table-team .leave-project .icon{margin-left:.2rem;margin-right:0}.rtl .belong-to-epic-text-wrapper{margin-left:1rem;margin-right:0}.rtl .epics-table-options-wrapper{left:.5rem;right:auto}.rtl .epics-table-dropdown{left:0;right:auto}.rtl .epic-row .icon-upvote,.rtl .story-row .icon-upvote{margin-left:.25rem;margin-right:0}.rtl .story-row{margin-left:0;margin-right:4rem}.rtl .epic-row .icon-arrow-down{margin-left:0;margin-right:.1rem}.rtl .epic-header-container .color-selector{margin-left:.5rem;margin-right:0}.rtl .related-userstories-header .related-userstories-title{margin-left:0;margin-right:1rem}.rtl tg-related-userstory-row .userstory-name{margin-left:1rem;margin-right:0}.rtl tg-related-userstory-row .userstory-name span{margin-left:0;margin-right:.25rem}.rtl tg-related-userstory-row .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .card-owner-actions .icon{margin-left:.25rem;margin-right:0}.rtl .card-owner img{margin-left:.5rem;margin-right:0}.rtl .card-owner .card-owner-avatar img{margin-left:.45rem;margin-right:0}.rtl .card-statistics .statistic{margin-left:.5rem;margin-right:.5rem}.rtl .card-statistics .icon{margin-left:.2rem;margin-right:0}.rtl .lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-left:.5rem;margin-right:0}.rtl .lightbox-create-related-user-stories .new-user-story-options{margin-left:0;margin-right:auto}.rtl .lightbox-generic-form .settings fieldset{margin-left:.5rem;margin-right:0}.rtl .ticket-estimation .popover{left:auto;right:.5rem}.rtl .ticket-estimation .popover::after{left:auto;right:10px}.rtl .profile .timeline-wrapper{margin-left:3.5rem;margin-right:0}.rtl .profile .profile-bar{margin-left:1rem;margin-right:0}.rtl .profile-content-tabs .icon{margin-left:.5rem;margin-right:0}.rtl .profile-sidebar h4 .icon{margin-left:.3rem;margin-right:auto}.rtl .profile-filter .searchbox input{margin-left:1rem;margin-right:0}.rtl .list-itemtype-project .list-itemtype-project-image,.rtl .list-itemtype-project .list-itemtype-track .list-itemtype-track-likers,.rtl .list-itemtype-ticket .list-itemtype-avatar,.rtl .list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers,.rtl .profile-filter .searchbox .icon-search{margin-left:.5rem;margin-right:0}.rtl .list-itemtype-project .list-itemtype-track-likers .icon,.rtl .list-itemtype-project .list-itemtype-track-watchers .icon,.rtl .list-itemtype-ticket .list-itemtype-track-likers .icon,.rtl .list-itemtype-ticket .list-itemtype-track-watchers .icon{margin-left:.25rem;margin-right:0}.rtl .list-itemtype-ticket.blocked-project .icon-blocked-project{margin-left:0;margin-right:.25rem}.rtl .list-itemtype-ticket .list-itemtype-ticket-data{margin-left:1rem;margin-right:0}.rtl .list-itemtype-user .list-itemtype-avatar{margin-left:.75rem;margin-right:0}.taskboard{overflow:hidden}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden}.team h2{margin:1rem 0}.team h2 span:last-child{color:#000}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#212121}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#757575}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#757575}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.save-wiki{float:right}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #b7b7b7;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#757575;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#757575}.menu-button,.trans-button:visited{color:#212121}.trans-button .icon,.trans-button span{color:#212121;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#c1c1c1;color:#757575}.menu-button span,.menu-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#000}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#212121;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#212121;color:#fff}.button-blackish{background:#212121;color:#c1c1c1}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff0062}.button-red:hover{background:#ff2400;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#000;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.button-auth,.button-bulk:hover{background:#212121}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#000;display:inline-block;margin-top:.5rem}.button-filter{background:#c1c1c1;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#757575;fill:#c1c1c1}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#ff2400;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#bcbcbc;border:1px dashed #adadad;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#adadad;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#adadad;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#a8a8a8;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#757575;height:25px;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#212121;margin-left:50%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#757575}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#000}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff0062;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#212121;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#757575;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#000}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(117,117,117,.2);color:#757575;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(33,33,33,.9);color:#c1c1c1}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(0,0,0,.5);border-bottom:0;color:#c1c1c1}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;background:#212121;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#212121}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;left:10px;position:absolute;top:-5px;width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#212121;color:#fff}.ticket-estimation .popover.fix{color:#fff;display:none;left:-160px;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#212121;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#000}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#757575;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #212121;color:#212121}.history-tabs .order-comments{color:#212121}.level{background-color:#757575;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#000}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#757575}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #c1c1c1;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#000}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#757575}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#757575}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:#ff2400;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#000}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#757575}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#757575;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#757575;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#ffc107}.loading-bar .item-1{animation-delay:1s;background:#009688}.loading-bar .item-2{animation-delay:2s;background:#e91e63}.loading-bar .item-3{animation-delay:3s;background:#9c27b0}.loading-bar .item-4{animation-delay:4s;background:#cddc39}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#757575;margin-left:.25rem}.notification-message-success{background:rgba(33,33,33,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(255,36,0,.9);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(117,117,117,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.paginator .active span,.paginator a,.paginator a:hover{transition:all .3s linear;color:#fff}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(255,36,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#757575;padding:.5rem 1rem}.paginator .active span,.paginator a:hover,.select-color{background:#212121}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#757575;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;position:absolute;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#212121;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{background:#212121;content:'';height:15px;left:-7px;position:absolute;top:13px;transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#757575;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color .empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#c1c1c1;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#757575;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#212121;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#000}.summary .stats svg{height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#424242;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#212121;height:24px}.summary-progress-bar .defined-points{background:#ff0062;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#212121;height:24px;position:absolute}.large-summary{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #212121;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #757575;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#000;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#212121;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#212121}.large-summary .icon.icon-stats.active:hover{color:#000;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#000;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#000;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(33,33,33,.4)}.track-button.active .icon{fill:#000}.track-button.active .track-button-counter{background:rgba(33,33,33,.6)}.track-button.is-hover .track-inner{background:#ff5033;color:#c1c1c1;transition:background .2s}.track-button.is-hover .icon{fill:#ff0062}.track-icon,.watch-options .watch-check svg{fill:#212121}.track-button.is-hover .track-button-counter{background:#ff2400;color:#c1c1c1;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#c1c1c1;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#b4b4b4;transition:background .3s}.track-icon{margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#b4b4b4;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#c1c1c1;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#b4b4b4;transition:background .3s}.watch-options{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-assigned-users,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(117,117,117,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox}.watch-options .watch-check{height:1.25rem;width:1.25rem}.upvote-btn a.active svg,.upvote-btn a:hover path{fill:#000}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#757575;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#000;transition:background .3s}.upvote-btn a.active{background:rgba(33,33,33,.2);color:#000;transition:all .3s}.upvote-btn a.is-hover{background:#ff2400;color:#c1c1c1}.upvote-btn a.is-hover svg{fill:#ff0062;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#757575;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-assigned-users .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-multiple,.ticket-watchers .user-list-single{-ms-flex-line-pack:center;padding:.25rem 0;vertical-align:middle;align-content:center}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-multiple{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex}.assigned-to-list .user-list-multiple.selected,.assigned-to-list .user-list-multiple:hover,.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(110,110,110,.3);cursor:pointer}.assigned-to-list .user-list-multiple:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#212121;margin-left:.5rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#212121;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:#ff2400}.assigned-to-list .user-list-multiple:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-multiple.is-active{background:rgba(110,110,110,.3);cursor:pointer;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-multiple .remove-assigned-to{display:block;fill:#212121;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-multiple .remove-assigned-to:hover{fill:#ff2400}.ticket-watchers .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-multiple{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-assigned-users .user-list-multiple,.ticket-assigned-users .user-list-single{background:0 0;display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.ticket-watchers .user-list-multiple:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#212121;margin-left:.5rem;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:#ff2400;transition:color .3s ease-in}.ticket-assigned-users .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:flex}.ticket-assigned-users .user-list-single:last-child{border:0}.ticket-assigned-users .user-list-multiple{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:flex}.ticket-assigned-users .user-list-multiple:last-child{border:0}.ticket-assigned-users .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-assigned-users .user-list-single{-ms-flex-positive:1;flex-grow:1}.ticket-assigned-users .user-list-single:hover .remove-user{opacity:1;transition:opacity .2s ease-in}.ticket-assigned-users .user-list-name{color:#212121;margin-left:.5rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .remove-user{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-assigned-users .remove-user:hover{fill:#ff2400;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{margin-bottom:2rem}.admin-common .admin-subtitle a{color:#000}.admin-common .admin-subtitle a:hover{color:#212121}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#c1c1c1;color:#212121;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #c1c1c1}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(33,33,33,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#757575}.custom-fields-table .single-custom-field{border-bottom:1px solid #c1c1c1;color:#757575}.custom-fields-table .icon-drag{fill:#757575;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#757575;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#000;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff0062}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;max-height:1rem;max-width:1rem}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#000;fill:#000}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#757575}.admin-functionalities .module-name{font-size:1.2rem;color:#757575;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#757575;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#757575}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#000}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff0062;display:inline-block;padding-left:.3rem}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#c1c1c1}.admin-membership-table .resend{background-color:#000;color:#fff}.admin-membership-table .resend:hover{background-color:#212121;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#757575;transition:fill .2s}.admin-membership-table .delete:hover{fill:#ff2400}.admin-membership-table .pending{color:#ff0062}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #a8a8a8}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#757575;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#757575;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:#ff2400}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #c1c1c1;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #c1c1c1;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#757575;margin-left:.5rem}.project-details .get-feedback-inner .check,.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#757575;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#212121;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(33,33,33,.4);color:#212121}.project-privacy-settings label:hover svg{fill:#212121}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#212121;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#212121;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#757575;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#757575}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#000}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff0062;border-radius:6px;color:#ff0062;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#000}.admin-project-profile-owner-actions a:hover{color:#212121;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#757575}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#212121}.admin-roles .icon:hover{fill:#000;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#757575;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#757575;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#c1c1c1;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:#ff2400;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#080808;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#1a1a1a;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#212121}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.admin-webhooks .table-body .webhook-service{color:#757575}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #c1c1c1}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#757575;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#000;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#212121}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#757575}.admin-webhooks .webhook-options svg:hover{fill:#000;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #c1c1c1;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(33,33,33,.1);transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#757575;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#212121}.admin-webhooks .history-response-icon.history-error{background:#ff2400}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#757575}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#212121;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{font-size:.9rem;color:#757575;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #c1c1c1;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#757575;opacity:0}.project-values-row .icon:hover{fill:#212121;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #c1c1c1}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#999;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff0062}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p{color:#212121;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #757575;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#212121;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin:1rem 0;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#757575;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#757575}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#757575}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#212121;fill:#212121}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#757575;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#212121;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#212121;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#212121;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#212121;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;position:absolute;background:#212121}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#212121;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#212121;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#212121;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #757575;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#757575}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #b7b7b7;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#999;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#757575;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#c1c1c1}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#999;transition:background .2s ease-in}.backlog-table-body input:checked{color:#212121;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff0062;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:#ff2400;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#212121}.backlog-table-body .icon-drag{cursor:move;fill:#757575;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#000;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#212121}.sprints .add-sprint svg{fill:#c1c1c1;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon,.ticket-assigned-users .assign-to-me .icon,.ticket-assigned-users .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#757575}.sprints .sprint svg:hover{fill:#000;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#757575;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#212121;transition:color .2s}.sprints .sprint-progress-bar{background:#757575;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#000;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#b4b4b4;border:2px dashed #8f8f8f;color:#757575;padding:1rem;text-align:center}.sprints .sprint-table .row{border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(117,117,117,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#949494;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#828282}.sprints .sprint-table .us-name.blocked{color:#ff2400}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#828282}.sprints .sprint-table .column-points.blocked{color:#ff2400}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#757575}.sprint-closed .sprint-progress-bar .current-progress{background:#5c5c5c}.sprint-closed .button-gray{background:#757575}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#000}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.ticket-assigned-to,.ticket-assigned-users{-ms-flex-align:center;border-bottom:1px solid #757575;border-top:1px solid #757575}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,36,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,36,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.ticket-assigned-to .loading-spinner,.ticket-assigned-users .loading-spinner{transform-origin:32 32;max-height:2rem;max-width:2rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#757575}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#000}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{margin:1rem auto}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#212121;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#000;cursor:default}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .remove-user:hover,.ticket-assigned-to .user-assigned.editable:hover,.ticket-assigned-users .assign-to-me.editable:hover,.ticket-assigned-users .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#757575;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{fill:#ff2400;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#000}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#000}.ticket-assigned-users .assigned-title,.ticket-assigned-users .tg-add-assigned span{color:#757575;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-assigned-users{align-items:center;margin-bottom:1rem;padding:.5rem 0;position:relative}.ticket-assigned-users .loading-spinner{margin:1rem auto}.ticket-assigned-users .assigned-title{display:block;margin:.2rem 0 .25rem}.ticket-assigned-users .tg-assigned-users{-ms-flex-align:center;align-items:center;position:relative}.ticket-assigned-users .tg-add-assigned{margin-top:.25rem}.ticket-assigned-users .tg-add-assigned .add-assigned{fill:#757575;opacity:1;right:.5rem;top:2rem}.ticket-assigned-users .tg-add-assigned .add-assigned:hover{cursor:pointer;fill:#ff2400;transition:fill .2s}.ticket-assigned-users .tg-add-assigned span{margin:.2rem .5rem}.ticket-assigned-users .assigned-users-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .assigned-users-options a{margin-right:.2rem}.ticket-assigned-users .assign-to-me,.ticket-assigned-users .assign-to-me.editable,.ticket-assigned-users .user-assigned,.ticket-assigned-users .user-assigned.editable{color:#000}.ticket-assigned-users .not-assigned-users{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .not-assigned-users .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-users .not-assigned-users .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-to-options a{margin-right:.2rem}.ticket-assigned-users .not-assigned-users .assign-to-me,.ticket-assigned-users .not-assigned-users .user-assigned{color:#000;cursor:default}.colors-table .row.edition .current-color,.ticket-assigned-users .not-assigned-users .assign-to-me:hover,.ticket-assigned-users .not-assigned-users .user-assigned:hover{cursor:pointer}.ticket-assigned-users .not-assigned-users .assign-to-me .icon,.ticket-assigned-users .not-assigned-users .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-users .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-users .user-avatar img{width:100%}.ticket-assigned-users .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-users .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-users .user-avatar .iocaine-symbol svg{background:#212121;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.category-config{border-bottom:1px solid #757575}.category-config:first-child{border-top:1px solid #757575}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#757575;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#757575;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#000}.category-config .summary-role .role-summary-single.inactive{background:#757575}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#c1c1c1;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #c1c1c1}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(110,110,110,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#c1c1c1;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#757575;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#212121;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#000;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#000;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff0062}.colors-table .gu-mirror{background:#999;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#757575}.duty-custom-fields .custom-field-options svg:hover{fill:#000}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff0062}.external-reference{font-size:.9rem;color:#757575;margin-top:.5rem}.external-reference a{border-left:1px solid #757575;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#000}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#757575;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff0062}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#c1c1c1}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #757575;color:#212121;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#212121;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#212121;border:1px solid #000}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff0062;border:1px solid #ff2400}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#000;border:1px solid #000;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:#ff2400;border:1px solid #ff2400;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#757575;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:#ff2400}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-sprint-add-edit .delete-sprint{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:#ff2400;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .subtitle{white-space:pre-line}.lightbox-generic-ask .options{display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#b4b4b4;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#212121;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#b4b4b4;bottom:35px;color:#757575;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#000}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(110,110,110,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#757575;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff0062}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#757575;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-set-due-date .delete-due-date .icon,.lightbox-set-due-date .delete-due-date:hover .icon{fill:currentColor}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}.lightbox-set-due-date{z-index:9999}.lightbox-set-due-date form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-set-due-date .date{margin:2rem 0 1rem}.lightbox-set-due-date .reason textarea{margin-top:.5rem}.lightbox-set-due-date .due-date-suggestions{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:1rem 0 .5rem}.lightbox-set-due-date .suggestion{background:rgba(184,184,184,.2);color:#B8B8B8;-ms-flex-pack:start;justify-content:flex-start;margin:0 .5rem .5rem;min-height:2rem;padding:.5rem .75rem;position:relative}.lightbox-set-due-date .suggestion:first-child{margin-left:0}.lightbox-set-due-date .suggestion:nth-child(4n+4){margin-right:0}.lightbox-set-due-date .suggestion.clickable.active,.lightbox-set-due-date .suggestion.clickable:hover{background:rgba(33,33,33,.9);color:#fff}.lightbox-set-due-date .delete-due-date{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-set-due-date .delete-due-date:hover{color:#ff2400;transition:color .3s linear}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#212121;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .item{font-size:1.2rem}.main-nav .active{color:#212121}.main-nav .active svg path{fill:#212121;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#212121;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#212121}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .iocaine{background:rgba(33,33,33,.1);border-left:10px solid #212121}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#212121}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #c1c1c1;color:#c1c1c1}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#c1c1c1}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#c1c1c1;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#212121;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,0,98,.2);border-left:10px solid #ff0062}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#757575}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#212121}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#000}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff0062}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{width:.8rem;height:.8rem;fill:#757575;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #212121;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#212121;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(33,33,33,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#8e8e8e;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#a8a8a8;transition:background .2s ease-in}.ticket-status .type-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#212121;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#212121;position:absolute;width:0}.ticket-status .severity-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#212121;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#212121;position:absolute;width:0}.ticket-status .priority-data{background:#b4b4b4;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#212121;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#212121;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#757575;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#212121}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:#ff2400;color:#c1c1c1;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff0062}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#212121}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff0062}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#757575;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#757575}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff0062}.ticket-detail-settings .item-unblock:hover{background:#ff2400}.ticket-detail-settings .button-delete{background:#ff0062}.ticket-detail-settings .button-delete:hover{background:#ff2400}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(193,193,193,.2) 100%);background-color:#c1c1c1}.introjs-helperLayer{border:1px solid rgba(33,33,33,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(33,33,33,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#212121}.introjs-button{background-color:#000;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#212121;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#000;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#000}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#757575}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-ms-flex:1;flex:1;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#a6a6a6;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ff66a1}.issues-table .row.is-blocked .blocked-text{color:#ff2400;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#757575}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #b7b7b7}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#757575;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#212121;transition:all .2s linear}.issues-table .votes:hover svg{fill:#212121;transition:all .2s linear}.issues-table .votes.inactive{color:#757575}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#757575;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#212121;transition:all .2s linear}.issues-table .is-voted svg{fill:#212121;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff0062}.issues-table .is-voted:hover svg{fill:#ff0062;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#212121;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#757575;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#000}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#757575;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#212121}.kanban-table-body .task-column .kanban-wip-limit{background:#ff2400;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #212121,2px 2px 4px #a8a8a8}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#bcbcbc;border:1px dashed #adadad;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #c1c1c1}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#adadad}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#757575;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #c1c1c1;border-right:1px solid #c1c1c1;color:#212121;position:relative;top:1px}.search-filter a.active .icon{fill:#212121}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#212121;color:#fff}.search-in input::-webkit-input-placeholder{color:#757575}.search-in input::-moz-placeholder{color:#757575}.search-in input:-moz-placeholder{color:#757575}.search-in input:-ms-input-placeholder{color:#757575}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#757575}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#999;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon{font-size:1rem;color:#757575}.search-result-table .user-story-name .icon:hover{color:#212121;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #c1c1c1}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#212121;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#000;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#757575}.table-team .attribute .points{font-size:1.6rem;color:#212121}.table-team .attribute .top{fill:#212121;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff0062}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:#ff2400}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #c1c1c1;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .popover{font-size:.9rem;background:#212121;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#212121;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#212121;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #757575}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#000;transition:background .3s linear}.policy-table label{background:#757575;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#212121;cursor:pointer;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile{max-width:780px}.user-profile form{display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:#ff2400}.user-profile .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:.5rem}.user-profile .delete-account,.user-profile .download-profile{font-size:.9rem;display:block;-ms-flex:1;flex:1;margin-top:.5rem}.user-profile .delete-account{text-align:right}.wiki-nav{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#212121}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#757575;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #757575}.wiki-nav input[type=text]{background:#c1c1c1;color:#212121;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#757575}.wiki-nav input[type=text]::-moz-placeholder{color:#757575}.wiki-nav input[type=text]:-moz-placeholder{color:#757575}.wiki-nav input[type=text]:-ms-input-placeholder{color:#757575}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#757575;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:#ff2400}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#757575}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#757575;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff0062}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#757575}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff0062}.attachment-gallery .icon-delete:hover svg{color:#ff2400}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span,.attachment-list .editable-attachment-deprecated span,.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#757575}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-size{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#757575;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#000}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:#ff2400}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#212121}.attachment-list .percentage{background:rgba(0,0,0,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments{margin-bottom:4rem}.attachments .gu-transit{background:#c1c1c1;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#212121;line-height:36px;padding:0 1rem}.attachments-header .options{display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#757575;border:0;display:inline-block;padding:.5rem;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#212121}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#212121}.attachments-header button svg{fill:#757575;height:1.6rem;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #c1c1c1;color:#757575;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#757575;height:.9rem;margin-right:.25rem;width:.9rem}.single-attachment .attachment-size{color:#757575}.more-attachments{font-size:.9rem;border-bottom:1px solid #757575;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#000;margin-left:.5rem}.more-attachments:hover{background:#999;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#757575}.attachment-preview .attachment-preview-container svg:hover{fill:#212121;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #c1c1c1;cursor:pointer}.assignable-member-single:hover{background:rgba(33,33,33,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.05);border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff0062;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:#ff2400}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#212121;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#050505}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(33,33,33,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(33,33,33,.3)}.range-slider:focus::-ms-fill-lower{background:#c1c1c1}.range-slider:focus::-ms-fill-upper{background:#c6c6c6}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#c1c1c1;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#c1c1c1;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#bcbcbc;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#c1c1c1;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#212121;cursor:pointer;box-shadow:0 0 0 2px rgba(33,33,33,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #a8a8a8;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #a8a8a8}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff0062}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,0,98,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-info.multiple .card-owner-avatar img{margin-right:.45rem}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#757575}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#212121}.card-owner-actions .card-actions{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:0 .5rem}.card-owner-actions .card-delete:hover{color:#ff0062}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem .5rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#757575;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-data .card-estimation.not-estimated{font-size:.8125rem}.card-statistics{font-size:.9rem;color:#b5b5b5;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#212121}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .statistic.card-votes{margin-left:.2rem}.card-statistics .statistic.card-due-date{margin-left:.1rem}.card-statistics .icon{width:.75rem;height:.75rem;fill:#b5b5b5;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#9c27b0}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#c1c1c1;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#212121;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#212121;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#c1c1c1}.card-tasks{border-top:1px solid #c1c1c1;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #c1c1c1}.card-task a{color:#757575;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff0062}.card-task a.closed-task{color:#757575;text-decoration:line-through}.card-task a:hover{color:#000}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(33,33,33,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #757575;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#212121;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #c1c1c1;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #c1c1c1;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:#ff2400;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#757575;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#757575;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg,.detail-title-wrapper .due-date-icon svg{width:1.3rem;height:1.3rem}.detail-title-wrapper.readonly .due-date-icon{margin-left:2.7rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.due-date-icon,.issue-nav a{display:inline-block}.edit-title-wrapper .edit-title-button:hover{fill:#000}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}.due-date-button,[disabled].due-date-button{background:#757575;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.due-date-button.closed,[disabled].due-date-button.closed{background:#B8B8B8}.due-date-button.due-set,[disabled].due-date-button.due-set{background:#9dce0a}.due-date-button.due-soon,[disabled].due-date-button.due-soon{background:#fcaf3e}.due-date-button.past-due,[disabled].due-date-button.past-due{background:#ff0062}.due-date-button:hover,[disabled].due-date-button:hover{background:#757575}.due-date-button.editable,[disabled].due-date-button.editable{cursor:pointer}.due-date-icon{margin:0 .25rem;position:relative}.due-date-icon svg{fill:#757575;transition:fill .2s ease-in}.due-date-icon.closed svg{fill:#B8B8B8}.due-date-icon.due-set svg{fill:#9dce0a}.due-date-icon.due-soon svg{fill:#fcaf3e}.due-date-icon.past-due svg{fill:#ff0062}.backlog-table-body .user-story-name .due-date-icon,.related-tasks .task-name .due-date-icon{top:.1rem}.issues-table .subject .due-date-icon{top:.25rem}.card-statistics .due-date-icon{margin:.1rem 0 0}.card-statistics .due-date-icon svg{height:.9rem;width:.9rem}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(0,0,0,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#212121;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#757575}tg-filter input::-moz-placeholder{color:#757575}tg-filter input:-moz-placeholder{color:#757575}tg-filter input:-ms-input-placeholder{color:#757575}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #757575;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#000}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#a8a8a8;color:#212121;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#b4b4b4;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#adadad;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#212121;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;border-color:transparent;border-style:solid;border-width:0 0 0 3px;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#8e8e8e;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#757575;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:#ff2400}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.add-tag-button .add-tag-text,.tag{font-size:.9rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#757575;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#212121;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#000}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #757575;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.tags-block,.terms-announcement{align-content:center;display:-ms-flexbox}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#a1a1a1;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#757575;cursor:pointer}.add-tag-button:hover,.tag{color:#212121}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-radius:0 5px 5px 0;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.terms-announcement-inner .title,.terms-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff0062;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.terms-announcement{-ms-flex-line-pack:center;background:#107a8a;display:flex;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.terms-announcement .terms-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.terms-announcement.visible{min-height:146px;pointer-events:auto;transition-delay:0s;width:100%}.terms-announcement.visible .terms-announcement-inner{opacity:1;transition:opacity .5s .5s}.terms-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.terms-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;height:auto;margin-right:1rem}.terms-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.terms-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.terms-announcement-inner .warning,.terms-announcement-inner .warning a{color:#0b525c}.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.terms-announcement-inner .close{display:block;position:absolute;right:.5rem;top:1rem}.terms-announcement-inner .close svg{width:2rem;height:2rem;fill:#f5f5f5;pointer-events:none;transition:fill .2s}.terms-announcement-inner .close svg:hover{fill:#0b525c}.terms-announcement-inner a{color:#f5f5f5}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(33,33,33,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff0062;transition:all .2s}.tribe-linked.is-active svg:hover{fill:#ff2400}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#000;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#000;cursor:pointer}.wysiwyg a:hover{color:#212121}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#c1c1c1;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #757575;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#757575 1px solid}.wysiwyg th{border-right:#757575 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#757575 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.wysiwyg hr{border:1px solid #c1c1c1}.medium-editor-mention-panel{background-color:#fff;border:1px solid #757575;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #757575;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#000;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:#ff2400}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#757575}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#757575;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#757575;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#757575;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #757575}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#212121}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#212121}.discover-header{background:url(../images/discover.png) bottom left repeat-x #c1c1c1;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#000}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#212121}.discover-header input[type=text]:-webkit-autofill{background:rgba(0,0,0,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#757575;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#000}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#757575;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#000}.filter-discover-search .discover-search-filter.active svg{fill:#000}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff0062;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:#ff2400}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#757575;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#212121;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#212121;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #c1c1c1;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#000}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#000}.featured-project .project-card-name a:hover{color:#212121}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#757575;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#757575;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#212121;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #c1c1c1;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#757575;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(33,33,33,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#000}.highlighted-project .project-title a:hover{color:#212121}.highlighted-project .project-description{font-size:.9rem;color:#757575;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#000}.highlighted-project .statistic.active svg{fill:#000}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#757575;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#212121;color:#fff}.discover-search .searchbox-filters label:hover{background:#c1c1c1;color:#757575}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#757575;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#000}.discover-results .statistic.active svg{fill:#000}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#000;border:1px solid #000;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:#ff2400;border:1px solid #ff2400;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #757575;color:#757575;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#212121;border:1px solid #000;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff0062;border:1px solid #ff2400}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(33,33,33,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,0,98,.5)}.epic-row.is-closed .name a{color:#9b9b9b;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#c1c1c1;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#212121;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#757575;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#212121;width:10vw}.epic-row .vote{color:#757575}.epic-row .vote.is-voter{color:#212121;fill:#212121}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#757575}.epic-row .epic-statuses{font-size:.9rem;background:rgba(33,33,33,.9);border-bottom:1px solid #212121;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#212121;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#000;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #757575;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #c1c1c1;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;color:#757575}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(33,33,33,.05)}.story-row.is-blocked{background:rgba(255,0,98,.5)}.story-row.is-closed .name{color:#757575;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#212121;width:10vw}.story-row .vote.is-voter{color:#212121;fill:#212121}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#212121;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#212121}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(193,193,193,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(33,33,33,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#212121;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#212121;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#212121;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#212121;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#212121}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(33,33,33,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#c1c1c1;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #c1c1c1;color:#c1c1c1}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#c1c1c1}tg-related-userstory-row .closed .userstory-name a{color:#c1c1c1;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,0,98,.2);border-left:10px solid #ff0062}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#757575;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#757575}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff0062}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-ms-flexbox;display:flex}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#F0EFD1;border:1px solid #000;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #757575;height:55px}.activity,.comment .comment-wrapper,.comment .deleted-comment-wrapper,.entry .entry-wrapper{border-bottom:1px solid #c1c1c1}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#000;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#757575}.comment .comment-edited{font-size:.9rem;background:#c1c1c1;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#000;fill:#000}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options .icon-close,.comment .comment-options .icon-edit{fill:#757575;margin-right:.5rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit:hover{fill:#757575}.comment .comment-options .icon-close:hover{fill:#ff2400}.comment .comment-options .icon-trash{fill:#ff0062}.comment .comment-options .icon-trash:hover{fill:#ff2400}.comment .deleted-comment-wrapper{padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#757575;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#000;fill:#000;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#000;fill:#000}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#000;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#757575}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#000;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#c1c1c1;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#757575;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(84,84,84,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,0,98,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#000;margin-right:.5rem}.activity .activity-date{color:#757575}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #c1c1c1;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(33,33,33,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,0,98,.2);color:#ff2400}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #c1c1c1;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#757575}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#757575;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#000}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#000}.home-project .project-card-name a:hover{color:#212121}.home-project:hover{border:1px solid rgba(33,33,33,.2);box-shadow:0 0 5px #c1c1c1}.home-project.blocked-project{border:#c1c1c1}.home-project.blocked-project:hover{border:#c1c1c1;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#c1c1c1;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #c1c1c1;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#b4b4b4;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #c1c1c1;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff0062;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:#ff2400}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#212121;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#212121}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#757575;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#212121;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#212121}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #c1c1c1;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(33,33,33,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(0,0,0,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#212121}.navbar a:hover svg{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.navbar-dropdown ul:after{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff0062;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#757575;display:block;padding:.8rem .5rem}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#212121}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#757575}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #c1c1c1}.profile-filter{-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#757575;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs{border-top:1px solid #c1c1c1}.profile-filter .searchbox input:focus{border-bottom:1px solid #757575;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#757575;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#212121}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{fill:#c1c1c1;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#757575;font-size:.9rem;margin:0}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#757575;transition:all .2s linear}.profile-bar .flag:hover path{fill:#ff2400;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .location,.profile-bar .username,.profile-bar h2{margin-bottom:1rem;color:#757575}.profile-bar h2{font-size:1.6rem;line-height:1.2}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#757575}.profile-bar .profile-stats{border-bottom:1px solid #c1c1c1;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#757575;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#212121}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #c1c1c1;border-right:1px solid #c1c1c1;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#000}.profile-content-tabs .icon{fill:#757575;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#757575;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#757575;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem}.profile-sidebar a{color:#000}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#000;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#757575;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-asana-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-asana-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#212121}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #c1c1c1;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(0,0,0,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(0,0,0,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#757575;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.create-project-import-type input:disabled+label .icon{color:#9b9b9b}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.create-project-privacity input:disabled+label .icon{color:#9b9b9b}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #c1c1c1}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#000;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#212121}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#000;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#757575;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-github-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-github-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#212121}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #c1c1c1;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(0,0,0,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(0,0,0,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;border-top:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#c1c1c1;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:#ff2400}.import-project-members-match{color:#757575}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #000;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(33,33,33,.3)}.import-project-members-match-true svg{fill:#000}.import-project-members-match-false{border:1px solid #ff2400;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(255,36,0,.3)}.import-project-members-match-false svg{fill:#ff2400}.import-project-members-choose{color:#000;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#212121}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#c1c1c1;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #c1c1c1;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#757575;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(0,0,0,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #c1c1c1}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#000;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#000;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#212121;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#212121;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#757575;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-jira-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-jira-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#212121}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(0,0,0,.6);stroke:rgba(0,0,0,.1)}.create-project-type-issues-subform-radiogr svg{fill:#c1c1c1;stroke:#a8a8a8;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:#ff2400;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff0062;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#000}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#757575;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-trello-form-import-type input:disabled+label .icon{color:#9b9b9b}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#9b9b9b}.import-project-trello-form-privacity input:disabled+label .icon{color:#9b9b9b}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;color:#212121;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(0,0,0,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #c1c1c1}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#000;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#212121}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#212121}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff0062;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #c1c1c1}.import-project-trello-form-warning .icon-exclamation{fill:#ff0062;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#000;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#212121}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#212121}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#757575;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(33,33,33,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#757575;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#c9c9c9;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#a1a1a1;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #c1c1c1;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#757575;margin-right:.5rem}.transfer-project-statistics svg{fill:#757575;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#000;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#212121}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#757575}.transfer-project-comment-header .icon-close:hover{fill:#ff0062;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #c1c1c1;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#000}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.profile-timeline .activity-item a:hover{color:#212121}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#757575;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#757575}a:hover,body,h1 .date,h2 .date,h3 .date,h4 .date,h5 .date,h6 .date{color:#000}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#212121;margin-right:.5rem}.main-nav svg,.navbar a svg,.summary .stats svg{fill:#fff}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}body{background:#fff}.extrabar,.master,.menu-secondary,.menu-tertiary{background:#fff;border-left:1px solid #000;border-right:1px solid #000}.master,.menu-secondary{background:#fff}.menu-tertiary{background-color:#fff}.extrabar{background:#fff}h1,h2,h3,h4,h5,h6{color:#212121;font-family:Arial,Helvetica,sans-serif}a{color:#212121}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{background:#fff;border-color:#000;color:#000}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#000}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#000}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=url]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#000}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#000}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #ff2400}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);color:#fff}blockquote{border-left:5px solid #757575}.home-project-list li,.tag{border:1px solid #000}blockquote,blockquote p,cite{color:#000}.navbar a :hover,.summary{color:#fff}.button-gray{background:#000}.tag{background:#fff}.summary{background:#212121}.navbar{background:#000}.navbar::after{background:url(../images/menu-vert.png) top left}.home-project-list p,.watch-options a.active,.working-on-container .list-itemtype-ticket .ticket-project,.working-on-container .list-itemtype-ticket .ticket-status,.working-on-container .list-itemtype-ticket .ticket-type{color:#000}tg-project-menu{background-color:#000;background-image:none}.main-nav .active svg,.taskboard-table-header .task-colum-name .icon{fill:#000}.main-nav .active{background:#fff}.single-project .title{background:#c1c1c1;color:#000}.summary .data .number,.wiki-summary .username{color:#fff}.activity-item p,.drag-drop-help,.duty-custom-fields .custom-field-data .custom-field-description,.kanban-table-header .task-colum-name .icon,.points-per-role>li,.private path,.table-team .avatar .position,.us-created-by .created-by .created-date,.us-created-by .created-by .created-title,.watching .duty-id,.working-on .duty-id{color:#000}.wiki-content.editable:hover .wysiwyg{background:#fff;border:1px solid}.taskboard-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.taskboard-table-body .taskboard-tasks-box{background:#fff;border:1px solid #000}.kanban-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.kanban-table-body .kanban-uses-box{background:#fff}.us-detail-settings .button-gray{background:0 0;border:1px solid #000;color:#000}.us-detail-settings .button-gray.active,.us-detail-settings .button-gray:hover{color:#fff}.history-tabs a,.more-attachments span,.us-detail-settings .button-gray span,.us-story-main-data .us-title .us-name{color:#000}.us-story-main-data .us-title{background:#fff}.login-main,.login-main a{color:#fff}.profile-content-tabs .tab,.profile-sidebar p{color:#212121}.settings-nav .active{background:#000;color:#fff}.admin-submenu ul a{color:#000}.policy-table input:checked+label,.policy-table label:hover{color:#fff}.admin-common .admin-subtitle,.admin-membership-table .avatar .email,.admin-membership-table .delete,.home-wrapper .title-bar{color:#000}.admin-functionalities .functionality.active{background:#fff;border:1px solid #000} \ No newline at end of file diff --git a/dist/v-1528953702317/styles/theme-material-design.css b/dist/v-1528953702317/styles/theme-material-design.css new file mode 100644 index 0000000..95a0671 --- /dev/null +++ b/dist/v-1528953702317/styles/theme-material-design.css @@ -0,0 +1,4 @@ +@charset "UTF-8";.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;content:'';position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */.pika-single{display:block;position:relative;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.loader-active,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#3f51b5}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal;color:#BDBDBD}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{min-width:240px;width:auto;z-index:999999}.pika-single .pika-title{color:#424242}.pika-single .is-selected .pika-button{background:#3f51b5;border-radius:0!important;box-shadow:inset 0 1px 3px #3f51b5}.pika-single .is-today .pika-button{color:#3f51b5}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#8c9eff!important;border-radius:0!important;box-shadow:inset 0 1px 3px #8c9eff!important}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#8c9eff;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#8c9eff;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#757575;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#3f51b5;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #757575;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #EEE}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#8c9eff;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#212121;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(255,255,255,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#1a237e;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);position:absolute;width:100%}.admin-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#BDBDBD;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#BDBDBD}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(../images/bg.png) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;overflow-y:auto;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{margin-left:.5rem;padding-bottom:1rem}.auth .login-text a,.auth .register-text a{text-decoration:underline}.auth .login-text a:hover,.auth .register-text a:hover{color:#8c9eff}.auth .register-terms{margin:.5rem 0 .75rem}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(63,81,181,.9);stroke:#8c9eff;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(140,158,255,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;overflow:hidden;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#212121;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #757575;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#8c9eff;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#BDBDBD;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#424242;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff;font-size:.9rem;margin-left:.5rem;padding-bottom:1rem;text-align:left}.invitation-main .register-text a{color:#3f51b5}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#3f51b5}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#EEE}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .kanban-settings{float:right}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff}.error-main a{color:#8c9eff}.rtl .navbar .nav-right{margin:0}.rtl .navbar .nav-right .user-avatar{padding-left:0;padding-right:2em;text-align:left}.rtl .navbar .nav-right img{margin-left:0;margin-right:.5rem}.rtl .admin-menu li a{padding:1rem 1rem 1rem 0}.rtl h1 span{margin-left:.5rem;margin-right:0}.rtl blockquote{border-left:0;border-right:5px solid #f5f5f5}.rtl .single-filter .name,.rtl .tag{border-width:0 3px 0 0}.rtl .single-filter .name,.subheader .tags-block .tag{border-color:transparent;border-style:solid}.rtl .tag{border-color:transparent;border-radius:5px 0 0 5px;margin:0 0 .5rem .5rem}.rtl .tag .icon-close{margin-left:0;margin-right:.25rem}.rtl .home-wrapper .working-on-container{margin-left:1rem;margin-right:0}.rtl .home-project .project-card-logo{margin-left:.5rem;margin-right:0}.rtl .home-project .project-card-statistics svg{margin-left:.25rem;margin-right:0}.rtl .contact-team-large .icon-mail{margin-left:.5rem;margin-right:0}.rtl .user-profile .project-details-image{margin-left:2rem;margin-right:0}.rtl .profile-timeline .activity-item .profile-contact-picture,.rtl .profile-timeline .activity-item .profile-member-picture,.rtl .single-project .project-logo{margin-left:1rem;margin-right:0}.rtl .profile-timeline .activity-item{padding:1rem 0 1rem .5rem}.rtl .profile-timeline .activity-item .activity-date{left:.5rem;right:auto}.rtl .profile-timeline .activity-item .activity-info{margin-left:130px;margin-right:0}.rtl .profile-timeline .activity-item blockquote{margin-left:0;margin-right:calc(35px + 1rem)}.rtl .profile-timeline .single-attachment .icon{margin-left:.5rem;margin-right:0}.rtl .project-data .involved-team li{margin-left:.13rem;margin-right:0}.rtl .project-details-form-data .actions .delete-account{text-align:left}.rtl .backlog-table-body .backlog-table-title .user-stories,.rtl .backlog-table-body .row .user-stories,.rtl .backlog-table-body .user-story-name a,.rtl .backlog-table-header .backlog-table-title .user-stories,.rtl .backlog-table-header .row .user-stories,.rtl .issues-table .assigned-field,.rtl .issues-table .created-field,.rtl .issues-table .issue-field,.rtl .issues-table .subject a,.rtl .sprints .sprint-table .column-us{text-align:right}.rtl .project-data .timeline{margin-left:1rem;margin-right:0}.rtl .track-icon{margin-left:.5rem;margin-right:0}.rtl .watch-options-arrow{margin-left:0;margin-right:auto}.rtl .ticket-estimation .ticket-role-points .icon-arrow-down{margin-left:0;margin-right:.25rem}.rtl .ticket-watch .ticket-watch-button,.rtl .ticket-watch svg{margin-left:.25rem;margin-right:0}.rtl .related-tasks-body .task-assignedto .icon{left:.5rem;right:0}.rtl .related-tasks-body .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .related-tasks-body .task-name{margin-left:1rem;margin-right:0}.rtl .related-tasks-body .task-name span{margin-left:.25rem;margin-right:0}.rtl tg-filter .search-action{left:.7rem;right:auto}.rtl .issues-table .assigned-field .icon,.rtl .issues-table .created-field .icon,.rtl .issues-table .issue-field .icon{margin-left:0;margin-right:.25rem}.rtl .icon-arrow-left,.rtl .icon-arrow-right{transform:scaleX(-1)}.rtl .issues-table .pop-status{left:auto;right:0}.rtl .issues-table .icon-upvote{margin-left:.25rem;margin-right:0}.rtl .highlighted .header svg,.rtl .issues-table .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .issues-table .subject{padding-left:1rem;padding-right:0}.rtl .issues-table .issue-assignedto .icon{left:0;right:auto}.rtl .single-filter{padding-left:.5rem;padding-right:0}.rtl .single-filter .number{left:0;right:auto}.rtl .discover-header .search-button{left:1rem;right:auto}.rtl .highlighted .header svg.icon-activity,.rtl .highlighted .header svg.icon-like{margin-left:.5rem;margin-right:0}.rtl .highlighted tg-most-liked{margin-left:8%;margin-right:0}.rtl .highlighted-project .statistic{margin-left:.5rem;margin-right:0}.rtl .highlighted-project .project-statistics svg{margin-left:.25rem;margin-right:0}.rtl .highlighted-project .project-logo{margin-left:1rem;margin-right:0}.rtl .featured-project .project-card-logo{margin-left:.5rem;margin-right:0}.rtl .featured-project .project-card-statistics svg{margin-left:.25rem;margin-right:0}.rtl .project-list-wrapper .project-list{margin-left:2rem;margin-right:0}.rtl .project-list-wrapper .list-itemtype-project .list-itemtype-project-image{margin-left:1rem;margin-right:0}.rtl .create-project-selector-question{left:1.5rem;right:auto}.rtl .create-project-title-wrapper .icon{margin-left:.5rem;margin-right:0}.rtl .create-project-privacity label .icon{margin-left:.25rem;margin-right:0}.rtl .create-project-action-submit{margin-left:0;margin-right:1rem}.rtl .summary-progress-bar{margin-left:10px;margin-right:0}.rtl .empty-burndown svg{margin-left:2rem;margin-right:0}.rtl .backlog-menu .button-bulk{margin-left:0;margin-right:.2rem}.rtl .ticket-header .detail-status{margin-left:0;margin-right:.25rem}.rtl .ticket-status .level-name{float:left}.rtl .ticket-status .level{margin-left:.5rem;margin-right:0}.rtl .ticket-data-container .icon{margin-left:0;margin-right:.25rem}.rtl .ticket-assigned-to .assigned-to{margin-left:0;margin-right:.5rem}.rtl .user-list-avatar{margin-left:.25rem;margin-right:0}.rtl .user-list-name{margin-left:0;margin-right:.5rem}.rtl .assigned-to-list .user-list-multiple .remove-assigned-to,.rtl .assigned-to-list .user-list-single .remove-assigned-to,.rtl .ticket-assigned-to .remove-user,.rtl .ticket-assigned-users .remove-user,.rtl .ticket-watchers .delete-watcher{left:.5rem;right:auto}.rtl .lightbox .close{left:3rem;right:auto}.rtl .activity .activity-avatar,.rtl .comment .comment-avatar{margin-left:1.5rem;margin-right:0}.rtl .comment .comment-creator{margin-left:.5rem;margin-right:0}.rtl tg-wysiwyg .tools{padding-left:0;padding-right:1rem}.rtl .add-tag-button .icon-add{margin:.5rem 0 0 .25rem}.rtl .add-tag-input .save{margin:.5rem .5rem 0 0}.rtl .issue-nav{left:1rem;right:auto}.rtl .upvote-btn{margin-left:.3rem;margin-right:0}.rtl .taskboard-table-header .taskboard-table-inner{margin-left:1rem}.rtl .taskboard-table-header .task-colum-name{margin:0 0 0 5px}.rtl .kanban-table-header{margin-left:-3.7rem}.rtl .kanban-table-body .task-column,.rtl .kanban-table-header .task-colum-name,.rtl .taskboard-table-body .task-column{margin:0 0 0 5px}.rtl .kanban-table-body .task-column:last-child,.rtl .taskboard-table-body .task-column:last-child{margin-left:0;margin-right:initial}.rtl .backlog-table-body .votes svg{margin-left:.25rem;margin-right:0}.rtl .backlog-table-header .backlog-table-title{padding-left:1rem;padding-right:0}.rtl .backlog-table-body .backlog-table-title .status,.rtl .backlog-table-body .row .status,.rtl .backlog-table-header .backlog-table-title .status,.rtl .backlog-table-header .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;text-align:right}.rtl .backlog-table-body .points .icon,.rtl .backlog-table-body .status .icon,.rtl .backlog-table-header .points .icon,.rtl .backlog-table-header .status .icon{margin-left:0;margin-right:.2rem}.rtl .sprints .sprint-table .column-points,.rtl .ticket-created-by .created-by .created-date,.rtl .ticket-created-by .created-by .created-title{text-align:left}.rtl .sprints .sprint .edit-sprint{left:0;margin-left:.5rem;margin-right:0;right:auto}.rtl .epic-row .progress-bar,.rtl .epic-row .progress-status{left:auto;right:0}.rtl .ticket-created-by .created-by .created-date,.rtl .ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem}.rtl tg-wysiwyg .markdown-editor-placeholder,.rtl tg-wysiwyg .medium-editor-placeholder{padding-left:0;padding-right:1rem;text-align:right}.rtl .attachments-header button{margin-left:.2rem;margin-right:0}.rtl .attachments-header label{margin-left:0;margin-right:.25rem}.rtl .attachment-list .attachment-comments,.rtl .attachment-list .editable-attachment-comment{margin-left:.5rem;margin-right:0}.rtl .attachment-list .editable-attachment-deprecated input{margin-left:.2rem;margin-right:0}.rtl .more-attachments .more-attachments-num{margin-left:0;margin-right:.5rem}.rtl .single-attachment .attachment-name{padding-left:1rem;padding-right:0}.rtl .single-attachment .attachment-name svg{margin-left:.25rem;margin-right:0}.rtl .wiki-nav .add-button svg{margin-left:.5rem;margin-right:0}.rtl .wiki-pages-table .created-field,.rtl .wiki-pages-table .creator-field,.rtl .wiki-pages-table .last-modifier-field,.rtl .wiki-pages-table .modified-field,.rtl .wiki-pages-table .title-field{text-align:right}.rtl .wiki-summary div{margin-left:1.25rem;margin-right:0}.rtl .summary .number{margin-left:.3rem;margin-right:0}.rtl .table-team .avatar .avatar-data{margin-left:0;margin-right:1rem;text-align:right}.rtl .table-team .leave-project .icon{margin-left:.2rem;margin-right:0}.rtl .belong-to-epic-text-wrapper{margin-left:1rem;margin-right:0}.rtl .epics-table-options-wrapper{left:.5rem;right:auto}.rtl .epics-table-dropdown{left:0;right:auto}.rtl .epic-row .icon-upvote,.rtl .story-row .icon-upvote{margin-left:.25rem;margin-right:0}.rtl .story-row{margin-left:0;margin-right:4rem}.rtl .epic-row .icon-arrow-down{margin-left:0;margin-right:.1rem}.rtl .epic-header-container .color-selector{margin-left:.5rem;margin-right:0}.rtl .related-userstories-header .related-userstories-title{margin-left:0;margin-right:1rem}.rtl tg-related-userstory-row .userstory-name{margin-left:1rem;margin-right:0}.rtl tg-related-userstory-row .userstory-name span{margin-left:0;margin-right:.25rem}.rtl tg-related-userstory-row .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .card-owner-actions .icon{margin-left:.25rem;margin-right:0}.rtl .card-owner img{margin-left:.5rem;margin-right:0}.rtl .card-owner .card-owner-avatar img{margin-left:.45rem;margin-right:0}.rtl .card-statistics .statistic{margin-left:.5rem;margin-right:.5rem}.rtl .card-statistics .icon{margin-left:.2rem;margin-right:0}.rtl .lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-left:.5rem;margin-right:0}.rtl .lightbox-create-related-user-stories .new-user-story-options{margin-left:0;margin-right:auto}.rtl .lightbox-generic-form .settings fieldset{margin-left:.5rem;margin-right:0}.rtl .ticket-estimation .popover{left:auto;right:.5rem}.rtl .ticket-estimation .popover::after{left:auto;right:10px}.rtl .profile .timeline-wrapper{margin-left:3.5rem;margin-right:0}.rtl .profile .profile-bar{margin-left:1rem;margin-right:0}.rtl .profile-content-tabs .icon{margin-left:.5rem;margin-right:0}.rtl .profile-sidebar h4 .icon{margin-left:.3rem;margin-right:auto}.rtl .profile-filter .searchbox input{margin-left:1rem;margin-right:0}.rtl .list-itemtype-project .list-itemtype-project-image,.rtl .list-itemtype-project .list-itemtype-track .list-itemtype-track-likers,.rtl .list-itemtype-ticket .list-itemtype-avatar,.rtl .list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers,.rtl .profile-filter .searchbox .icon-search{margin-left:.5rem;margin-right:0}.rtl .list-itemtype-project .list-itemtype-track-likers .icon,.rtl .list-itemtype-project .list-itemtype-track-watchers .icon,.rtl .list-itemtype-ticket .list-itemtype-track-likers .icon,.rtl .list-itemtype-ticket .list-itemtype-track-watchers .icon{margin-left:.25rem;margin-right:0}.rtl .list-itemtype-ticket.blocked-project .icon-blocked-project{margin-left:0;margin-right:.25rem}.rtl .list-itemtype-ticket .list-itemtype-ticket-data{margin-left:1rem;margin-right:0}.rtl .list-itemtype-user .list-itemtype-avatar{margin-left:.75rem;margin-right:0}.taskboard{overflow:hidden}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden}.team h2{margin:1rem 0}.team h2 span:last-child{color:#3f51b5}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#424242}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#BDBDBD}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#757575}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.save-wiki{float:right}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e4e4;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#BDBDBD;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#BDBDBD}.menu-button,.trans-button:visited{color:#212121}.trans-button .icon,.trans-button span{color:#212121;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#EEE;color:#757575}.menu-button span,.menu-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#3f51b5}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#8c9eff;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#8c9eff;color:#fff}.button-blackish{background:#212121;color:#EEE}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff5252}.button-red:hover{background:#f44336;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#3f51b5;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.button-bulk:hover{background:#8c9eff}.button-auth{background:#424242}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#3f51b5;display:inline-block;margin-top:.5rem}.button-filter{background:#EEE;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#BDBDBD;fill:#EEE}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#f44336;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#e9e9e9;border:1px dashed #dadada;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#dadada;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#dadada;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;margin:0}.check{background-color:#d5d5d5;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#757575;height:25px;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#8c9eff;margin-left:50%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#BDBDBD}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#3f51b5}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff5252;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.drag-drop-help{color:#757575}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#8c9eff;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#BDBDBD;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#3f51b5}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(189,189,189,.2);color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(140,158,255,.9);color:#EEE}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(26,35,126,.5);border-bottom:0;color:#EEE}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#424242}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;left:10px;position:absolute;top:-5px;width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#8c9eff;color:#fff}.ticket-estimation .popover.fix{background:#212121;color:#fff;display:none;left:-160px;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#8c9eff;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#3f51b5}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#BDBDBD;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #424242;color:#424242}.history-tabs .order-comments{color:#424242}.level{background-color:#BDBDBD;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#BDBDBD}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #EEE;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#BDBDBD}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#BDBDBD}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:#f44336;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#BDBDBD}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#757575;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#757575;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#ffc107}.loading-bar .item-1{animation-delay:1s;background:#009688}.loading-bar .item-2{animation-delay:2s;background:#e91e63}.loading-bar .item-3{animation-delay:3s;background:#9c27b0}.loading-bar .item-4{animation-delay:4s;background:#cddc39}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#BDBDBD;margin-left:.25rem}.notification-message-success{background:rgba(140,158,255,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(244,67,54,.9);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(189,189,189,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(244,67,54,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#BDBDBD;color:#fff;padding:.5rem 1rem;transition:all .3s linear}.paginator a:hover{background:#212121;color:#fff;transition:all .3s linear}.paginator .active span{background:#8c9eff}.select-color,.select-color:after{background:#212121;position:absolute}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#BDBDBD;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#8c9eff;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#BDBDBD;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color .empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#EEE;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#BDBDBD;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#8c9eff}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#8c9eff;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#3f51b5}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#8a8a8a;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#8c9eff;height:24px}.summary-progress-bar .defined-points{background:#ff5252;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#8c9eff;height:24px;position:absolute}.large-summary{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #212121;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #757575;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#3f51b5;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#8c9eff;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#8c9eff}.large-summary .icon.icon-stats.active:hover{color:#3f51b5;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:rgba(26,35,126,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#1a237e;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#1a237e;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(140,158,255,.4)}.track-button.active .icon{fill:#3f51b5}.track-button.active .track-button-counter{background:rgba(140,158,255,.6)}.track-button.is-hover .track-inner{background:#f77066;color:#EEE;transition:background .2s}.track-button.is-hover .icon{fill:#ff5252}.track-button.is-hover .track-button-counter{background:#f44336;color:#EEE;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#EEE;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#e1e1e1;transition:background .3s}.track-icon{fill:#424242;margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#e1e1e1;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#EEE;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#e1e1e1;transition:background .3s}.watch-options{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-assigned-users,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(189,189,189,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox}.watch-options a.active{color:#8c9eff}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check svg{fill:#8c9eff}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#BDBDBD;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#1a237e;transition:background .3s}.upvote-btn a:hover path{fill:#1a237e}.upvote-btn a.active{background:rgba(140,158,255,.2);color:#3f51b5;transition:all .3s}.upvote-btn a.active svg{fill:#3f51b5}.upvote-btn a.is-hover{background:#f44336;color:#EEE}.upvote-btn a.is-hover svg{fill:#ff5252;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#BDBDBD;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-assigned-users .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-multiple,.ticket-watchers .user-list-single{-ms-flex-line-pack:center;padding:.25rem 0;vertical-align:middle;align-content:center}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-multiple{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex}.assigned-to-list .user-list-multiple.selected,.assigned-to-list .user-list-multiple:hover,.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(255,255,255,.3);cursor:pointer}.assigned-to-list .user-list-multiple:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#424242;margin-left:.5rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#424242;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:#f44336}.assigned-to-list .user-list-multiple:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-multiple.is-active{background:rgba(255,255,255,.3);cursor:pointer;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-multiple .remove-assigned-to{display:block;fill:#424242;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-multiple .remove-assigned-to:hover{fill:#f44336}.ticket-watchers .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-multiple{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-assigned-users .user-list-multiple,.ticket-assigned-users .user-list-single{background:0 0;display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.ticket-watchers .user-list-multiple:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#424242;margin-left:.5rem;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:#f44336;transition:color .3s ease-in}.ticket-assigned-users .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:flex}.ticket-assigned-users .user-list-single:last-child{border:0}.ticket-assigned-users .user-list-multiple{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:flex}.ticket-assigned-users .user-list-multiple:last-child{border:0}.ticket-assigned-users .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-assigned-users .user-list-single{-ms-flex-positive:1;flex-grow:1}.ticket-assigned-users .user-list-single:hover .remove-user{opacity:1;transition:opacity .2s ease-in}.ticket-assigned-users .user-list-name{color:#424242;margin-left:.5rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .remove-user{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-assigned-users .remove-user:hover{fill:#f44336;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#BDBDBD;margin-bottom:2rem}.admin-common .admin-subtitle a{color:#3f51b5}.admin-common .admin-subtitle a:hover{color:#8c9eff}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#EEE;color:#424242;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #EEE}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(140,158,255,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#BDBDBD}.custom-fields-table .single-custom-field{border-bottom:1px solid #EEE;color:#757575}.custom-fields-table .icon-drag{fill:#BDBDBD;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#BDBDBD;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#3f51b5;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff5252}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{max-height:1rem;max-width:1rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#3f51b5;fill:#3f51b5}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#BDBDBD}.admin-functionalities .module-name{font-size:1.2rem;color:#BDBDBD;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#BDBDBD;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#BDBDBD}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#3f51b5}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff5252;display:inline-block;padding-left:.3rem}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#EEE}.admin-membership-table .resend{background-color:#3f51b5;color:#fff}.admin-membership-table .resend:hover{background-color:#8c9eff;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#BDBDBD;transition:fill .2s}.admin-membership-table .delete:hover{fill:#f44336}.admin-membership-table .pending{color:#ff5252}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #d5d5d5}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#757575;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#BDBDBD;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:#f44336}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #EEE;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #EEE;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#BDBDBD;margin-left:.5rem}.project-details .get-feedback-inner .check,.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#BDBDBD;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#424242;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(140,158,255,.4);color:#424242}.project-privacy-settings label:hover svg{fill:#424242}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#424242;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#8c9eff;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#BDBDBD;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#BDBDBD}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#3f51b5}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff5252;border-radius:6px;color:#ff5252;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#3f51b5}.admin-project-profile-owner-actions a:hover{color:#8c9eff;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#BDBDBD}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#424242}.admin-roles .icon:hover{fill:#3f51b5;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#BDBDBD;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#BDBDBD;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#EEE;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:#f44336;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#1d278b;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#232fa8;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#212121}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.admin-webhooks .table-body .webhook-service{color:#757575}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #EEE}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#BDBDBD;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#3f51b5;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#8c9eff}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#BDBDBD}.admin-webhooks .webhook-options svg:hover{fill:#3f51b5;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #EEE;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(140,158,255,.1);transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#757575;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#8c9eff}.admin-webhooks .history-response-icon.history-error{background:#f44336}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#BDBDBD}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#BDBDBD}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#8c9eff;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{font-size:.9rem;color:#BDBDBD;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #EEE;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#BDBDBD;opacity:0}.project-values-row .icon:hover{fill:#424242;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #EEE}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#fff;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff5252}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p{color:#424242;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #BDBDBD;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#424242;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin:1rem 0;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#757575;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#BDBDBD}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#BDBDBD}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#8c9eff;fill:#8c9eff}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#757575;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#212121;color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#212121;color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#8c9eff;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#8c9eff;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#212121;bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;background:#212121;position:absolute}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#8c9eff;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#8c9eff;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#212121;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#8c9eff;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #BDBDBD;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#BDBDBD}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #e4e4e4;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#fff;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#BDBDBD;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#EEE}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#fff;transition:background .2s ease-in}.backlog-table-body input:checked{color:#8c9eff;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff5252;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:#f44336;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#8c9eff}.backlog-table-body .icon-drag{cursor:move;fill:#BDBDBD;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#3f51b5;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#8c9eff}.sprints .add-sprint svg{fill:#EEE;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon,.ticket-assigned-users .assign-to-me .icon,.ticket-assigned-users .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#BDBDBD}.sprints .sprint svg:hover{fill:#3f51b5;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#BDBDBD;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#8c9eff;transition:color .2s}.sprints .sprint-progress-bar{background:#BDBDBD;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#3f51b5;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#e1e1e1;border:2px dashed #d7d7d7;color:#757575;padding:1rem;text-align:center}.sprints .sprint-table .row{border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(189,189,189,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#dcdcdc;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#cacaca}.sprints .sprint-table .us-name.blocked{color:#f44336}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#cacaca}.sprints .sprint-table .column-points.blocked{color:#f44336}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#BDBDBD}.sprint-closed .sprint-progress-bar .current-progress{background:#a4a4a4}.sprint-closed .button-gray{background:#BDBDBD}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#3f51b5}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.ticket-assigned-to,.ticket-assigned-users{-ms-flex-align:center;border-bottom:1px solid #BDBDBD;border-top:1px solid #BDBDBD}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(244,67,54,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(244,67,54,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.ticket-assigned-to .loading-spinner,.ticket-assigned-users .loading-spinner{transform-origin:32 32;max-height:2rem;max-width:2rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#BDBDBD}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#3f51b5}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{margin:1rem auto}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#424242;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#3f51b5;cursor:default}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .remove-user:hover,.ticket-assigned-to .user-assigned.editable:hover,.ticket-assigned-users .assign-to-me.editable:hover,.ticket-assigned-users .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#757575;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{fill:#f44336;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#3f51b5}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#3f51b5}.ticket-assigned-users .assigned-title,.ticket-assigned-users .tg-add-assigned span{color:#757575;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-assigned-users{align-items:center;margin-bottom:1rem;padding:.5rem 0;position:relative}.ticket-assigned-users .loading-spinner{margin:1rem auto}.ticket-assigned-users .assigned-title{display:block;margin:.2rem 0 .25rem}.ticket-assigned-users .tg-assigned-users{-ms-flex-align:center;align-items:center;position:relative}.ticket-assigned-users .tg-add-assigned{margin-top:.25rem}.ticket-assigned-users .tg-add-assigned .add-assigned{fill:#757575;opacity:1;right:.5rem;top:2rem}.ticket-assigned-users .tg-add-assigned .add-assigned:hover{cursor:pointer;fill:#f44336;transition:fill .2s}.ticket-assigned-users .tg-add-assigned span{margin:.2rem .5rem}.ticket-assigned-users .assigned-users-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .assigned-users-options a{margin-right:.2rem}.ticket-assigned-users .assign-to-me,.ticket-assigned-users .assign-to-me.editable,.ticket-assigned-users .user-assigned,.ticket-assigned-users .user-assigned.editable{color:#3f51b5}.ticket-assigned-users .not-assigned-users{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .not-assigned-users .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-users .not-assigned-users .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-to-options a{margin-right:.2rem}.ticket-assigned-users .not-assigned-users .assign-to-me,.ticket-assigned-users .not-assigned-users .user-assigned{color:#3f51b5;cursor:default}.colors-table .row.edition .current-color,.ticket-assigned-users .not-assigned-users .assign-to-me:hover,.ticket-assigned-users .not-assigned-users .user-assigned:hover{cursor:pointer}.ticket-assigned-users .not-assigned-users .assign-to-me .icon,.ticket-assigned-users .not-assigned-users .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-users .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-users .user-avatar img{width:100%}.ticket-assigned-users .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-users .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-users .user-avatar .iocaine-symbol svg{background:#424242;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.category-config{border-bottom:1px solid #BDBDBD}.category-config:first-child{border-top:1px solid #BDBDBD}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#BDBDBD;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#BDBDBD;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#3f51b5}.category-config .summary-role .role-summary-single.inactive{background:#757575}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#EEE;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #EEE}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(255,255,255,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#EEE;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#BDBDBD;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#8c9eff;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#3f51b5;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#3f51b5;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff5252}.colors-table .gu-mirror{background:#fff;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#BDBDBD}.duty-custom-fields .custom-field-options svg:hover{fill:#3f51b5}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem;color:#a8a8a8;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff5252}.external-reference{font-size:.9rem;color:#BDBDBD;margin-top:.5rem}.external-reference a{border-left:1px solid #BDBDBD;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#3f51b5}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#757575;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff5252}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#EEE}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #BDBDBD;color:#424242;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#424242;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#8c9eff;border:1px solid #3f51b5}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff5252;border:1px solid #f44336}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#3f51b5;border:1px solid #3f51b5;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:#f44336;border:1px solid #f44336;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#BDBDBD;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:#f44336}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#757575;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-sprint-add-edit .delete-sprint{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:#f44336;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .subtitle{white-space:pre-line}.lightbox-generic-ask .options{display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#e1e1e1;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#8c9eff;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e1e1e1;bottom:35px;color:#757575;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#3f51b5}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(255,255,255,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#757575;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff5252}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#BDBDBD;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-set-due-date .delete-due-date .icon,.lightbox-set-due-date .delete-due-date:hover .icon{fill:currentColor}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}.lightbox-set-due-date{z-index:9999}.lightbox-set-due-date form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-set-due-date .date{margin:2rem 0 1rem}.lightbox-set-due-date .reason textarea{margin-top:.5rem}.lightbox-set-due-date .due-date-suggestions{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:1rem 0 .5rem}.lightbox-set-due-date .suggestion{background:rgba(184,184,184,.2);color:#B8B8B8;-ms-flex-pack:start;justify-content:flex-start;margin:0 .5rem .5rem;min-height:2rem;padding:.5rem .75rem;position:relative}.lightbox-set-due-date .suggestion:first-child{margin-left:0}.lightbox-set-due-date .suggestion:nth-child(4n+4){margin-right:0}.lightbox-set-due-date .suggestion.clickable.active,.lightbox-set-due-date .suggestion.clickable:hover{background:rgba(140,158,255,.9);color:#fff}.lightbox-set-due-date .delete-due-date{font-size:.9rem;color:#757575;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-set-due-date .delete-due-date:hover{color:#f44336;transition:color .3s linear}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#8c9eff;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);width:12px;z-index:98}.main-nav svg{fill:#fff;height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .item{font-size:1.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#8c9eff}.main-nav .active svg path{fill:#8c9eff;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#212121;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#424242;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#8c9eff}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .iocaine{background:rgba(140,158,255,.1);border-left:10px solid #8c9eff}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#424242}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #EEE;color:#EEE}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#EEE}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#EEE;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,82,82,.2);border-left:10px solid #ff5252}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#757575}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#424242}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#3f51b5}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff5252}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{width:.8rem;height:.8rem;fill:#BDBDBD;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#212121;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #424242;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(140,158,255,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#bbb;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#d5d5d5;transition:background .2s ease-in}.ticket-status .type-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#8c9eff;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#212121;position:absolute;width:0}.ticket-status .severity-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#8c9eff;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#212121;position:absolute;width:0}.ticket-status .priority-data{background:#e1e1e1;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#212121;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#8c9eff;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#212121;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#BDBDBD;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#8c9eff}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:#f44336;color:#EEE;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff5252}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#8c9eff}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff5252}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#BDBDBD;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#757575}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff5252}.ticket-detail-settings .item-unblock:hover{background:#f44336}.ticket-detail-settings .button-delete{background:#ff5252}.ticket-detail-settings .button-delete:hover{background:#f44336}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(238,238,238,.2) 100%);background-color:#EEE}.introjs-helperLayer{border:1px solid rgba(140,158,255,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(66,66,66,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#8c9eff}.introjs-button{background-color:#3f51b5;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#8c9eff;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#3f51b5;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#3f51b5}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#BDBDBD}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-ms-flex:1;flex:1;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#fff;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ffb8b8}.issues-table .row.is-blocked .blocked-text{color:#f44336;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#757575}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #e4e4e4}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#757575;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#8c9eff;transition:all .2s linear}.issues-table .votes:hover svg{fill:#8c9eff;transition:all .2s linear}.issues-table .votes.inactive{color:#BDBDBD}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#BDBDBD;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#8c9eff;transition:all .2s linear}.issues-table .is-voted svg{fill:#8c9eff;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff5252}.issues-table .is-voted:hover svg{fill:#ff5252;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#212121;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#8c9eff;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#212121;height:15px;position:absolute;width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#BDBDBD;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#3f51b5}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#BDBDBD;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#212121}.kanban-table-body .task-column .kanban-wip-limit{background:#f44336;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #8c9eff,2px 2px 4px #d5d5d5}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#e9e9e9;border:1px dashed #dadada;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #EEE}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#dadada}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#BDBDBD;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #EEE;border-right:1px solid #EEE;color:#424242;position:relative;top:1px}.search-filter a.active .icon{fill:#8c9eff}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#424242;color:#fff}.search-in input::-webkit-input-placeholder{color:#BDBDBD}.search-in input::-moz-placeholder{color:#BDBDBD}.search-in input:-moz-placeholder{color:#BDBDBD}.search-in input:-ms-input-placeholder{color:#BDBDBD}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#BDBDBD}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#fff;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon{font-size:1rem;color:#BDBDBD}.search-result-table .user-story-name .icon:hover{color:#424242;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #EEE}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#212121;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#3f51b5;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#757575}.table-team .attribute .points{font-size:1.6rem;color:#424242}.table-team .attribute .top{fill:#8c9eff;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff5252}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:#f44336}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #EEE;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .avatar .position{color:#BDBDBD}.table-team .popover{font-size:.9rem;background:#212121;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#8c9eff;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#212121;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #BDBDBD}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#3f51b5;transition:background .3s linear}.policy-table label{background:#BDBDBD;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#8c9eff;cursor:pointer;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile{max-width:780px}.user-profile form{display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(33,33,33,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:#f44336}.user-profile .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:.5rem}.user-profile .delete-account,.user-profile .download-profile{font-size:.9rem;display:block;-ms-flex:1;flex:1;margin-top:.5rem}.user-profile .delete-account{text-align:right}.wiki-nav{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#8c9eff}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#BDBDBD;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #BDBDBD}.wiki-nav input[type=text]{background:#EEE;color:#424242;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#BDBDBD}.wiki-nav input[type=text]::-moz-placeholder{color:#BDBDBD}.wiki-nav input[type=text]:-moz-placeholder{color:#BDBDBD}.wiki-nav input[type=text]:-ms-input-placeholder{color:#BDBDBD}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#BDBDBD;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:#f44336}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#757575}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#BDBDBD;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff5252}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#BDBDBD}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff5252}.attachment-gallery .icon-delete:hover svg{color:#f44336}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#BDBDBD}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span{color:#757575}.attachment-list .attachment-size{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#BDBDBD;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#3f51b5}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:#f44336}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#BDBDBD}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#424242}.attachment-list .percentage{background:rgba(63,81,181,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments{margin-bottom:4rem}.attachments .gu-transit{background:#EEE;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#424242;line-height:36px;padding:0 1rem}.attachments-header .options{display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#757575;border:0;display:inline-block;padding:.5rem;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#8c9eff}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#8c9eff}.attachments-header button svg{fill:#BDBDBD;height:1.6rem;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.more-attachments span,.single-attachment .attachment-size{color:#BDBDBD}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #EEE;color:#BDBDBD;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#757575;height:.9rem;margin-right:.25rem;width:.9rem}.more-attachments{font-size:.9rem;border-bottom:1px solid #BDBDBD;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#3f51b5;margin-left:.5rem}.more-attachments:hover{background:#fff;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#BDBDBD}.attachment-preview .attachment-preview-container svg:hover{fill:#8c9eff;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #EEE;cursor:pointer}.assignable-member-single:hover{background:rgba(140,158,255,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(140,158,255,.05);border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff5252;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:#f44336}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#424242;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#1c2586}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(66,66,66,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(66,66,66,.3)}.range-slider:focus::-ms-fill-lower{background:#EEE}.range-slider:focus::-ms-fill-upper{background:#f3f3f3}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#EEE;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#EEE;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#e9e9e9;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#EEE;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#424242;cursor:pointer;box-shadow:0 0 0 2px rgba(66,66,66,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #d5d5d5;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #d5d5d5}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff5252}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,82,82,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-info.multiple .card-owner-avatar img{margin-right:.45rem}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#BDBDBD}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#8c9eff}.card-owner-actions .card-actions{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:0 .5rem}.card-owner-actions .card-delete:hover{color:#ff5252}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem .5rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#BDBDBD;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-data .card-estimation.not-estimated{font-size:.8125rem}.card-statistics{font-size:.9rem;color:#fdfdfd;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#8c9eff}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .statistic.card-votes{margin-left:.2rem}.card-statistics .statistic.card-due-date{margin-left:.1rem}.card-statistics .icon{width:.75rem;height:.75rem;fill:#fdfdfd;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#9c27b0}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#EEE;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#8c9eff;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#212121;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#EEE}.card-tasks{border-top:1px solid #EEE;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #EEE}.card-task a{color:#BDBDBD;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff5252}.card-task a.closed-task{color:#BDBDBD;text-decoration:line-through}.card-task a:hover{color:#3f51b5}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(140,158,255,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #BDBDBD;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#212121;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #EEE;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #EEE;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:#f44336;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#BDBDBD;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#757575;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg,.detail-title-wrapper .due-date-icon svg{width:1.3rem;height:1.3rem}.detail-title-wrapper.readonly .due-date-icon{margin-left:2.7rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.due-date-icon,.issue-nav a{display:inline-block}.edit-title-wrapper .edit-title-button:hover{fill:#3f51b5}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}.due-date-button,[disabled].due-date-button{background:#BDBDBD;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.due-date-button.closed,[disabled].due-date-button.closed{background:#B8B8B8}.due-date-button.due-set,[disabled].due-date-button.due-set{background:#9dce0a}.due-date-button.due-soon,[disabled].due-date-button.due-soon{background:#fcaf3e}.due-date-button.past-due,[disabled].due-date-button.past-due{background:#ff5252}.due-date-button:hover,[disabled].due-date-button:hover{background:#757575}.due-date-button.editable,[disabled].due-date-button.editable{cursor:pointer}.due-date-icon{margin:0 .25rem;position:relative}.due-date-icon svg{fill:#BDBDBD;transition:fill .2s ease-in}.due-date-icon.closed svg{fill:#B8B8B8}.due-date-icon.due-set svg{fill:#9dce0a}.due-date-icon.due-soon svg{fill:#fcaf3e}.due-date-icon.past-due svg{fill:#ff5252}.backlog-table-body .user-story-name .due-date-icon,.related-tasks .task-name .due-date-icon{top:.1rem}.issues-table .subject .due-date-icon{top:.25rem}.card-statistics .due-date-icon{margin:.1rem 0 0}.card-statistics .due-date-icon svg{height:.9rem;width:.9rem}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(63,81,181,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#424242;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#BDBDBD}tg-filter input::-moz-placeholder{color:#BDBDBD}tg-filter input:-moz-placeholder{color:#BDBDBD}tg-filter input:-ms-input-placeholder{color:#BDBDBD}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #BDBDBD;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#3f51b5}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#424242;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#d5d5d5;color:#424242;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#e1e1e1;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#dadada;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#424242;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;border-color:transparent;border-style:solid;border-width:0 0 0 3px;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#bbb;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#757575;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:#f44336}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.add-tag-button .add-tag-text,.tag{font-size:.9rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#BDBDBD;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#424242;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#3f51b5}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #BDBDBD;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.tags-block,.terms-announcement{align-content:center;display:-ms-flexbox}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#fff;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#BDBDBD;cursor:pointer}.add-tag-button:hover{color:#8c9eff}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#424242;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.terms-announcement-inner .title,.terms-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff5252;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.terms-announcement{-ms-flex-line-pack:center;background:#107a8a;display:flex;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.terms-announcement .terms-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.terms-announcement.visible{min-height:146px;pointer-events:auto;transition-delay:0s;width:100%}.terms-announcement.visible .terms-announcement-inner{opacity:1;transition:opacity .5s .5s}.terms-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.terms-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;height:auto;margin-right:1rem}.terms-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.terms-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.terms-announcement-inner .warning,.terms-announcement-inner .warning a{color:#0b525c}.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.terms-announcement-inner .close{display:block;position:absolute;right:.5rem;top:1rem}.terms-announcement-inner .close svg{width:2rem;height:2rem;fill:#f5f5f5;pointer-events:none;transition:fill .2s}.terms-announcement-inner .close svg:hover{fill:#0b525c}.terms-announcement-inner a{color:#f5f5f5}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(66,66,66,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff5252;transition:all .2s}.tribe-linked.is-active svg:hover{fill:#f44336}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#3f51b5;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#3f51b5;cursor:pointer}.wysiwyg a:hover{color:#8c9eff}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#EEE;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #BDBDBD;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#BDBDBD 1px solid}.wysiwyg th{border-right:#BDBDBD 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#BDBDBD 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.wysiwyg hr{border:1px solid #EEE}.medium-editor-mention-panel{background-color:#fff;border:1px solid #BDBDBD;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #BDBDBD;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#1a237e;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:#f44336}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#BDBDBD}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#BDBDBD;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#BDBDBD;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#BDBDBD;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #BDBDBD}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#8c9eff}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#8c9eff}.discover-header{background:url(../images/discover.png) bottom left repeat-x #EEE;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#3f51b5}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#8c9eff}.discover-header input[type=text]:-webkit-autofill{background:rgba(26,35,126,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#BDBDBD;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#3f51b5}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#BDBDBD;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#3f51b5}.filter-discover-search .discover-search-filter.active svg{fill:#3f51b5}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff5252;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:#f44336}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#BDBDBD;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#8c9eff;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#424242;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #EEE;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#3f51b5}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#3f51b5}.featured-project .project-card-name a:hover{color:#8c9eff}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#BDBDBD;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#BDBDBD;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#424242;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #EEE;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#BDBDBD;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(140,158,255,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#3f51b5}.highlighted-project .project-title a:hover{color:#8c9eff}.highlighted-project .project-description{font-size:.9rem;color:#757575;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#BDBDBD;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#3f51b5}.highlighted-project .statistic.active svg{fill:#3f51b5}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#BDBDBD;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#8c9eff;color:#fff}.discover-search .searchbox-filters label:hover{background:#EEE;color:#757575}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#BDBDBD;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#3f51b5}.discover-results .statistic.active svg{fill:#3f51b5}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#3f51b5;border:1px solid #3f51b5;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:#f44336;border:1px solid #f44336;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #BDBDBD;color:#BDBDBD;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#8c9eff;border:1px solid #3f51b5;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff5252;border:1px solid #f44336}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(140,158,255,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,82,82,.5)}.epic-row.is-closed .name a{color:#e3e3e3;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#EEE;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#424242;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#BDBDBD;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#8c9eff;width:10vw}.epic-row .vote{color:#757575}.epic-row .vote.is-voter{color:#8c9eff;fill:#8c9eff}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#BDBDBD}.epic-row .epic-statuses{font-size:.9rem;background:rgba(33,33,33,.9);border-bottom:1px solid #424242;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#8c9eff;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#3f51b5;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #BDBDBD;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #EEE;color:#BDBDBD;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(140,158,255,.05)}.story-row.is-blocked{background:rgba(255,82,82,.5)}.story-row.is-closed .name{color:#BDBDBD;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#8c9eff;width:10vw}.story-row .vote{color:#757575}.story-row .vote.is-voter{color:#8c9eff;fill:#8c9eff}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#757575;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#8c9eff;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#8c9eff}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(238,238,238,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(140,158,255,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#8c9eff;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#424242;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#8c9eff;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#424242;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#8c9eff}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(140,158,255,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#EEE;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #EEE;color:#EEE}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#EEE}tg-related-userstory-row .closed .userstory-name a{color:#EEE;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,82,82,.2);border-left:10px solid #ff5252}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#BDBDBD;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#757575}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff5252}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-ms-flexbox;display:flex}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #BDBDBD;height:55px}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#3f51b5;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#BDBDBD}.comment .comment-edited{font-size:.9rem;background:#EEE;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#3f51b5;fill:#3f51b5}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit{fill:#BDBDBD;margin-right:.5rem}.comment .comment-options .icon-edit:hover{fill:#757575}.comment .comment-options .icon-close{fill:#BDBDBD;margin-right:.5rem}.comment .comment-options .icon-close:hover{fill:#f44336}.comment .comment-options .icon-trash{fill:#ff5252}.comment .comment-options .icon-trash:hover{fill:#f44336}.comment .deleted-comment-wrapper{border-bottom:1px solid #EEE;padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#BDBDBD;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#3f51b5;fill:#3f51b5;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#3f51b5;fill:#3f51b5}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#3f51b5;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#BDBDBD}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#3f51b5;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#EEE;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#BDBDBD;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(242,244,255,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,82,82,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#3f51b5;margin-right:.5rem}.activity .activity-date{color:#BDBDBD}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #EEE;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(140,158,255,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,82,82,.2);color:#f44336}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #EEE;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#757575}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#BDBDBD;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#3f51b5}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#3f51b5}.home-project .project-card-name a:hover{color:#8c9eff}.home-project:hover{border:1px solid rgba(140,158,255,.2);box-shadow:0 0 5px #EEE}.home-project.blocked-project{border:#EEE}.home-project.blocked-project:hover{border:#EEE;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#EEE;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #EEE;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e1e1e1;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #EEE;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff5252;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:#f44336}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#424242;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#8c9eff}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#BDBDBD;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#424242;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#212121}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #EEE;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(140,158,255,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(26,35,126,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#8c9eff}.navbar a:hover svg{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.navbar-dropdown ul:after{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(33,33,33,0);border-bottom-color:#212121;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff5252;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#BDBDBD;display:block;padding:.8rem .5rem}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#8c9eff}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#757575}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #EEE}.profile-filter{-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#757575;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-contacts,.profile-content-tabs{border-top:1px solid #EEE}.profile-filter .searchbox input:focus{border-bottom:1px solid #BDBDBD;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#BDBDBD;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#212121}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{fill:#EEE;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#BDBDBD;font-size:.9rem;margin:0}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#BDBDBD;transition:all .2s linear}.profile-bar .flag:hover path{fill:#f44336;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar h2{font-size:1.6rem;color:#757575;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#BDBDBD;margin-bottom:1rem}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#BDBDBD}.profile-bar .profile-stats{border-bottom:1px solid #EEE;border-top:1px solid #EEE;color:#757575;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#BDBDBD;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#757575;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#8c9eff}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #EEE;border-right:1px solid #EEE;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#3f51b5}.profile-content-tabs .icon{fill:#BDBDBD;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#757575;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#BDBDBD;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem;color:#BDBDBD}.profile-sidebar a{color:#3f51b5}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#3f51b5;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-asana-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-asana-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#8c9eff}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #EEE;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(63,81,181,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(63,81,181,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#BDBDBD;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.create-project-import-type input:disabled+label .icon{color:#e3e3e3}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.create-project-privacity input:disabled+label .icon{color:#e3e3e3}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #EEE}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#8c9eff}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-github-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-github-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #EEE}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#8c9eff}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #EEE;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(63,81,181,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(63,81,181,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;border-top:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#EEE;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:#f44336}.import-project-members-match{color:#BDBDBD}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #3f51b5;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(140,158,255,.3)}.import-project-members-match-true svg{fill:#3f51b5}.import-project-members-match-false{border:1px solid #f44336;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(244,67,54,.3)}.import-project-members-match-false svg{fill:#f44336}.import-project-members-choose{color:#3f51b5;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#8c9eff}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#EEE;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #EEE;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#757575;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(63,81,181,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #EEE}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#3f51b5;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#3f51b5;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#424242;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#424242;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-jira-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-jira-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #EEE}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#8c9eff}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(63,81,181,.6);stroke:rgba(63,81,181,.1)}.create-project-type-issues-subform-radiogr svg{fill:#EEE;stroke:#d5d5d5;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:#f44336;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff5252;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#3f51b5}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#BDBDBD;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#757575}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-trello-form-import-type input:disabled+label .icon{color:#e3e3e3}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#e3e3e3}.import-project-trello-form-privacity input:disabled+label .icon{color:#e3e3e3}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;color:#424242;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(63,81,181,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #EEE}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#3f51b5;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#424242}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#8c9eff}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff5252;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #EEE}.import-project-trello-form-warning .icon-exclamation{fill:#ff5252;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#3f51b5;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#424242}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#8c9eff}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#BDBDBD;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(140,158,255,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#BDBDBD;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#f6f6f6;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#fff;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.master,body{background:#fff}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#BDBDBD;margin-right:.5rem}.transfer-project-statistics svg{fill:#BDBDBD;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#3f51b5;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#8c9eff}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#BDBDBD}.transfer-project-comment-header .icon-close:hover{fill:#ff5252;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #EEE;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#3f51b5}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#757575}.profile-timeline .activity-item a:hover{color:#8c9eff}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-ms-flex-align:center;align-items:center;color:#BDBDBD;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#BDBDBD;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#BDBDBD}a,body{color:#424242}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#424242;margin-right:.5rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}.menu-secondary{background:#fcfdff}.menu-tertiary{background-color:#1a237e}.extrabar{background:#fcfdff}h1,h2,h3,h4,h5,h6{color:#212121}a:hover{color:#3f51b5}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#3f51b5;color:#424242}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a4a4a4}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#a4a4a4}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=url]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#a4a4a4}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a4a4a4}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #f44336}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);color:#fff}blockquote{border-left:5px solid #8c9eff}blockquote,blockquote p,cite{color:#757575}.summary{background:#424242;color:#fff}.navbar{background:rgba(233,30,99,.6)}.navbar::after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#0d113f;background-image:none}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #3f51b5}.taskboard-table-header .task-colum-name .icon{fill:#3f51b5}.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.kanban-table-header .task-colum-name{background:#fbfbfb;border-top:3px solid #3f51b5}.kanban-table-header .task-colum-name .icon{color:#3f51b5}.kanban-table-body .kanban-uses-box{background:#fbfbfb} \ No newline at end of file diff --git a/dist/v-1528953702317/styles/theme-taiga.css b/dist/v-1528953702317/styles/theme-taiga.css new file mode 100644 index 0000000..9cefb12 --- /dev/null +++ b/dist/v-1528953702317/styles/theme-taiga.css @@ -0,0 +1,4 @@ +@charset "UTF-8";.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;box-sizing:content-box}.introjs-bullets ul,.introjs-bullets ul li,.introjs-bullets ul li a,.introjs-button,.introjs-helperLayer,.introjs-helperNumberLayer,.introjs-hint,.introjs-overlay,.introjs-progress,.introjs-progressbar,.introjs-tooltip,.introjs-tooltipReferenceLayer{box-sizing:content-box}.pika-table,table{border-collapse:collapse;border-spacing:0}h1 .date,h1 span{text-overflow:ellipsis}.lightbox textarea,textarea{resize:vertical}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0)";filter:"progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000)";box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;content:'';position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-bullets,.pika-table th,.pika-title{text-align:center}.introjs-button{position:relative;overflow:visible;display:inline-block;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{overflow:hidden;height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint-dot,.introjs-hint-pulse{box-sizing:content-box;position:absolute}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}.gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80)}.gu-hide{display:none!important}.gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}.awesomplete>ul:empty{display:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}.project-values-title,h1{text-transform:uppercase}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */.pika-single{display:block;position:relative;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-select{display:inline-block}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.medium-editor-anchor-preview,.medium-editor-toolbar{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;top:0;z-index:2000}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}@-webkit-keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes medium-editor-image-loading{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes medium-editor-pop-upwards{0%{opacity:0;-webkit-transform:matrix(.97,0,0,1,0,12);transform:matrix(.97,0,0,1,0,12)}20%{opacity:.7;-webkit-transform:matrix(.99,0,0,1,0,2);transform:matrix(.99,0,0,1,0,2)}40%{opacity:1;-webkit-transform:matrix(1,0,0,1,0,-1);transform:matrix(1,0,0,1,0,-1)}100%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}.medium-editor-anchor-preview{left:0;line-height:1.4;max-width:280px;position:absolute;text-align:center;word-break:break-all;word-wrap:break-word;visibility:hidden}.medium-editor-anchor-preview a{color:#fff;display:inline-block;margin:5px 5px 10px}.medium-editor-placeholder-relative:after,.medium-editor-placeholder:after{content:attr(data-placeholder)!important;padding:inherit;margin:inherit;white-space:pre;font-style:italic}.medium-editor-anchor-preview-active{visibility:visible}.medium-editor-dragover{background:#ddd}.medium-editor-image-loading{-webkit-animation:medium-editor-image-loading 1s infinite ease-in-out;animation:medium-editor-image-loading 1s infinite ease-in-out;background-color:#333;border-radius:100%;display:inline-block;height:40px;width:40px}.medium-editor-placeholder{position:relative}.medium-editor-placeholder:after{position:absolute;left:0;top:0}.medium-editor-placeholder-relative,.medium-editor-placeholder-relative:after{position:relative}.medium-toolbar-arrow-over:before,.medium-toolbar-arrow-under:after{border-style:solid;content:'';display:block;height:0;left:50%;margin-left:-8px;position:absolute;width:0}.medium-toolbar-arrow-under:after{border-width:8px 8px 0}.medium-toolbar-arrow-over:before{border-width:0 8px 8px}.medium-editor-toolbar{left:0;position:absolute;visibility:hidden}.medium-editor-toolbar ul{margin:0;padding:0}.medium-editor-toolbar li{float:left;list-style:none;margin:0;padding:0}.medium-editor-toolbar li button{box-sizing:border-box;cursor:pointer;display:block;font-size:14px;line-height:1.33;margin:0;padding:15px;text-decoration:none}.medium-editor-toolbar li button:focus{outline:0}.medium-editor-toolbar li .medium-editor-action-underline{text-decoration:underline}.medium-editor-toolbar li .medium-editor-action-pre{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;font-weight:100;padding:15px 0}.medium-editor-toolbar-active{visibility:visible}.medium-editor-sticky-toolbar{position:fixed;top:1px}.master,.medium-editor-relative-toolbar{position:relative}.medium-editor-toolbar-active.medium-editor-stalker-toolbar{-webkit-animation:medium-editor-pop-upwards 160ms forwards linear;animation:medium-editor-pop-upwards 160ms forwards linear}.medium-editor-action-bold{font-weight:bolder}.medium-editor-action-italic{font-style:italic}.medium-editor-toolbar-form{display:none}.medium-editor-toolbar-form a,.medium-editor-toolbar-form input{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.medium-editor-toolbar-form .medium-editor-toolbar-form-row{line-height:14px;margin-left:5px;padding-bottom:5px}.medium-editor-toolbar-form .medium-editor-toolbar-input,.medium-editor-toolbar-form label{border:none;box-sizing:border-box;font-size:14px;margin:0;padding:6px;width:316px;display:inline-block}body,html{width:100%}.medium-editor-toolbar-form .medium-editor-toolbar-input:focus,.medium-editor-toolbar-form label:focus{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;box-shadow:none;outline:0}.medium-editor-toolbar-form a{display:inline-block;font-size:24px;font-weight:bolder;margin:0 10px;text-decoration:none}.medium-editor-toolbar-form-active{display:block}.medium-editor-toolbar-actions:after{clear:both;content:"";display:table}.medium-editor-element{word-wrap:break-word;min-height:30px}.master,body,html{min-height:100%}.medium-editor-element img{max-width:100%}.medium-editor-element sub{vertical-align:sub}.medium-editor-element sup{vertical-align:super}.medium-editor-hidden{display:none}.medium-toolbar-arrow-under:after{border-color:#242424 transparent transparent;top:50px}.medium-toolbar-arrow-over:before{border-color:transparent transparent #242424;top:-8px}.medium-editor-toolbar{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.75));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.75));border:1px solid #000;border-radius:5px;box-shadow:0 0 3px #000}.medium-editor-toolbar li button{background-color:#242424;background:-webkit-linear-gradient(top,#242424,rgba(36,36,36,.89));background:linear-gradient(to bottom,#242424,rgba(36,36,36,.89));border:0;border-right:1px solid #000;border-left:1px solid #333;border-left:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px rgba(0,0,0,.3);color:#fff;height:50px;min-width:50px;-webkit-transition:background-color .2s ease-in;transition:background-color .2s ease-in}.medium-editor-toolbar li button:hover{background-color:#000;color:#ff0}.medium-editor-toolbar li .medium-editor-button-first{border-bottom-left-radius:5px;border-top-left-radius:5px}.medium-editor-toolbar li .medium-editor-button-last{border-bottom-right-radius:5px;border-top-right-radius:5px}.medium-editor-toolbar li .medium-editor-button-active{background-color:#000;background:-webkit-linear-gradient(top,#242424,rgba(0,0,0,.89));background:linear-gradient(to bottom,#242424,rgba(0,0,0,.89))}.medium-editor-toolbar-form{background:#242424;border-radius:5px;color:#999}.medium-editor-toolbar-form .medium-editor-toolbar-input{background:#242424;box-sizing:border-box;color:#ccc;height:50px}.medium-editor-toolbar-form a{color:#fff}.medium-editor-toolbar-anchor-preview{background:#242424;border-radius:5px;color:#fff}.medium-editor-placeholder:after{color:#b3b3b1}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}.loader-active,body.loading-project,h1 .date,h1 span{overflow:hidden}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.prism-token.prism-cdata,.prism-token.prism-comment,.prism-token.prism-doctype,.prism-token.prism-prolog{color:#708090}.prism-token.prism-punctuation{color:#f8f8f2}.prism-namespace{opacity:.7}.prism-token.prism-constant,.prism-token.prism-deleted,.prism-token.prism-property,.prism-token.prism-symbol,.prism-token.prism-tag{color:#f92672}.prism-token.prism-boolean,.prism-token.prism-number{color:#ae81ff}.prism-token.prism-attr-name,.prism-token.prism-builtin,.prism-token.prism-char,.prism-token.prism-inserted,.prism-token.prism-selector,.prism-token.prism-string{color:#a6e22e}.prism-language-css .prism-token.prism-string,.prism-style .prism-token.prism-string,.prism-token.prism-entity,.prism-token.prism-operator,.prism-token.prism-url,.prism-token.prism-variable{color:#f8f8f2}.prism-token.prism-atrule,.prism-token.prism-attr-value,.prism-token.prism-function{color:#e6db74}.prism-token.prism-keyword{color:#66d9ef}.prism-token.prism-important,.prism-token.prism-regex{color:#fd971f}.prism-token.prism-bold,.prism-token.prism-important{font-weight:700}.prism-token.prism-italic{font-style:italic}.prism-token.prism-entity{cursor:help}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}h1,p{line-height:1.5}.wysiwyg dl dt,.wysiwyg i,em{font-style:italic}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}*{box-sizing:border-box}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}body .master.ng-animate{transition:0}.drag-active{overflow-x:hidden}.master{height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-ms-flexbox;display:flex;height:100%}.menu-secondary{-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions header{-ms-flex:1;flex:1}.header-with-actions .action-buttons{-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;float:right;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg b,.wysiwyg dl dt,strong,tg-wysiwyg .mention{font-weight:700}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem}h1 span,h2{font-size:1.6rem}h1 span{margin-right:.5rem;vertical-align:bottom;white-space:nowrap}h1 span.green,h1 span:last-child{-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}blockquote,p{margin:0 0 20px}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#5b8200}h1 .date{display:inline-block;max-width:500px;white-space:nowrap;word-wrap:normal;color:#767676}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p img{margin:0}small{font-size:1rem}hr{border:solid #050505;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{transition:color .3s linear}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);transform:rotate(360deg)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;transform:translateY(0)}}@keyframes loadBar{0%,20%{-ms-flex:1;flex:1}10%{-ms-flex:10;flex:10}}@keyframes dropdownFade{0%{opacity:0;transform:translateY(-.25rem)}60%{opacity:1}100%{transform:translateY(0)}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote,blockquote p{line-height:1.25rem}blockquote{padding:.5rem 1.25rem}blockquote cite{font-size:.9rem;display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}.card-task,.main-nav,.wysiwyg .list-stye-none{list-style:none}sup{font-size:.9rem;vertical-align:super}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{min-width:240px;width:auto;z-index:999999}.pika-single .pika-title{color:#444}.pika-single .is-selected .pika-button{background:#5b8200;border-radius:0!important;box-shadow:inset 0 1px 3px #5b8200}.pika-single .is-today .pika-button{color:#5b8200}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#9dce0a!important;border-radius:0!important;box-shadow:inset 0 1px 3px #9dce0a!important}div.awesomplete>ul,div.awesomplete>ul::before{background:rgba(0,0,0,.95)}.spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:2rem;max-width:2rem}.capslock.ng-enter,.capslock.ng-leave{animation:dropdownFade .2s ease-in}div.awesomplete input{display:inline-block}div.awesomplete>ul{color:#9dce0a;top:2.25rem;transition:all .2s ease}div.awesomplete>ul[hidden]{position:absolute;top:1.5rem;transform:scale(1)}div.awesomplete li:hover mark,div.awesomplete mark,div.awesomplete>ul>li:hover{background:#9dce0a;color:#000}fieldset{border:0;margin:0;padding:0;position:relative;width:100%}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.capslock.ng-leave{animation-direction:reverse}.capslock .icon-capslock{bottom:.8rem;fill:#555;height:.9rem;position:absolute;right:1rem;width:.9rem}.admin-membership .limit-users-warning{font-size:.9rem;color:#5b8200;margin-right:1rem}.admin-membership .check input{height:40px;width:85px}.add-tag-container{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:.5rem 0;padding:1rem}.add-tag-container .color-column{cursor:pointer;-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.add-tag-container .tag-name{-ms-flex-preferred-size:80%;flex-basis:80%;margin-right:1rem}.add-tag-container .options-column{display:-ms-flexbox;display:flex}.add-tag-container .options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.add-tag-container .current-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.add-tag-container .current-color.empty-color:after,.add-tag-container .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.add-tag-container .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.add-tag-container .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.add-tag-container input[type=text]{background:#fff}.add-tag-container .icon.icon-close,.add-tag-container .icon.icon-save{opacity:1}.tags-table .table-tags-editor input[type=text]{background-color:transparent;border:0;border-bottom:1px solid transparent;box-shadow:none;transition:border-bottom .2s linear}.tags-table .table-tags-editor input[type=text]:focus{border-bottom:1px solid #555;outline:0}.tags-table .table-tags-editor .row.header-tag-row{cursor:default;padding-left:1rem}.tags-table .color-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-positive:1;flex-grow:1;padding:0 10px;position:relative}.tags-table .color-filter:hover input{border-bottom:1px solid #e4e3e3}.tags-table .color-filter input{padding:0}.tags-table .color-filter label{cursor:pointer}.tags-table .row.tag-row{margin:.3rem 0;padding:.7rem}.tags-table .row.tag-row:hover{cursor:default}.tags-table .row .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mix-tags{position:relative}.tags-table .mix-tags .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#050505;bottom:2rem;color:#fff;display:none;list-style-type:none;margin:0;padding:10px;position:absolute;right:-85%;width:120px;z-index:99;text-align:"center"}.tags-table .mix-tags .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.tags-table .mix-tags .popover a:last-child{border:0}.tags-table .mix-tags .popover a:hover{color:#9dce0a;transition:color .3s linear}.tags-table .mix-tags .popover a:hover.point{color:#fff}.tags-table .mix-tags .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;transform:rotate(45deg);width:1rem}.tags-table .mix-tags:hover .popover{display:block}.tags-table .mixing-options-column{text-align:right}.tags-table .mixing-options-column .loading-spinner{margin-right:1.2rem;width:1.2rem}.tags-table .mixing-tags-from,.tags-table .mixing-tags-to{background:rgba(216,248,121,.2)}.tags-table .mixing-confirm{margin:0 .5rem}.tags-table .mixing-help-text{font-size:.75rem;color:#879b89;display:inline;padding-right:.5rem;text-align:center}@media (max-width:1280px){.tags-table .mixing-help-text{display:block;padding:.5rem}}.tags-table .current-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.tags-table .current-color.empty-color:after,.tags-table .current-color.empty-color:before{content:"";width:2px;height:54px;background:#ff8282;position:absolute;top:0}.tags-table .current-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.tags-table .current-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);position:absolute;width:100%}.admin-attributes .admin-attributes-section .admin-tags-section-wrapper-empty{color:#767676;padding:10vh 0 0;text-align:center}.admin-attributes .admin-attributes-section .loading-spinner{max-height:3rem;max-width:3rem}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.admin-roles p{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#767676}.auth .logo,.project-values-title h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.auth .logo,.auth .tagline{color:#fff;text-align:center}.project-values-title{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem}.project-values-title h2{font-size:1.2rem;margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(../images/bg.png) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;overflow-y:auto;position:fixed;right:0;top:0;z-index:999}.auth .auth-container{-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.auth .logo{font-size:3rem}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{margin-left:.5rem;padding-bottom:1rem}.auth .login-text a,.auth .register-text a{text-decoration:underline}.auth .login-text a:hover,.auth .register-text a:hover{color:#9dce0a}.auth .register-terms{margin:.5rem 0 .75rem}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{animation-duration:5s;animation-iteration-count:infinite;animation-name:moustache;animation-timing-function:ease-in-out;fill:rgba(91,130,0,.9);stroke:#9dce0a;stroke-width:1px;transform-origin:50% 50%;transition:.3s}.moustache:hover{fill:rgba(157,206,10,.9);transition:.3s}@keyframes moustache{0%,30%,70%,90%{transform:rotate(0)}10%{transform:rotate(-10deg)}80%{transform:rotate(10deg)}}.backlog-filter{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;opacity:0;overflow:hidden;position:relative;transition:all .2s linear;width:0}.backlog-filter tg-filter{transform:translateX(-260px);transition:all .2s linear}.backlog-filter.active tg-filter,.issues tg-filter{transform:translateX(0)}.backlog-filter.active{opacity:1;transition:all .2s linear;width:260px}.backlog-menu{background:#f5f5f5;color:#050505;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .menu-button.move-to-sprint,.multiple-drag-mirror.us-item-row .icon-drag,.multiple-drag-mirror.us-item-row .points,.multiple-drag-mirror.us-item-row .status,.multiple-drag-mirror.us-item-row .tags-block,.multiple-drag-mirror.us-item-row .us-settings,.multiple-drag-mirror.us-item-row .votes,.multiple-drag-mirror.us-item-row input{display:none}@media (max-width:1280px){.backlog-menu{-ms-flex-direction:column;flex-direction:column}}.backlog-menu .menu-button .icon-move{margin-right:.25rem}.backlog-menu .button-bulk{margin-left:.2rem}.multiple-drag-mirror.us-item-row{background:#fff;border-radius:4px;box-shadow:2px 2px 5px #555;min-height:calc(40px + 1rem);opacity:.9;padding:1rem}.multiple-drag-mirror.us-item-row.is-checked,.multiple-drag-mirror.us-item-row:hover{background:#fff}.forecasting-add-sprint{font-size:.9rem;background:#f5f5f5;cursor:pointer;padding:.5rem 0;text-align:center}.invitation-main .avatar .person-name,.invitation-main .invitation-text{font-size:1.2rem;color:#fff;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.forecasting-add-sprint:hover{background:#ededed;transition:background .2s}.forecasting-add-sprint .icon-add{width:1.75rem;height:1.75rem;background:#9dce0a;fill:#fff;margin-right:1rem;padding:.25rem;vertical-align:middle}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background-size:cover;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;height:100vh;-ms-flex-pack:center;justify-content:center;z-index:999}.kanban,.taskboard{height:calc(100vh - 40px)}.invitation-main .invitation-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.error-main h1,.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{font-size:.9rem;color:#767676;opacity:1;position:absolute;right:1rem;top:.5rem;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#444;transition:color .3s linear}.invitation-main .login-form,.invitation-main .register-form{-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff}.invitation-main .register-text{color:#fff;font-size:.9rem;margin-left:.5rem;padding-bottom:1rem;text-align:left}.invitation-main .register-text a{color:#5b8200}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#5b8200}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.invitation-main .public-register-disabled{width:400px}.invitation-main .public-register-disabled .login-form{border-right:0}.invitation-main .contrib-plugins-wrapper label{color:#e4e3e3}.issues .filters-bar{position:relative;width:260px}.kanban{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px);position:relative}.kanban header{min-height:70px}.kanban .kanban-settings{float:right}.kanban .burndown-container{display:none}.kanban .zoom-loading img{display:block;margin-right:1rem}.kanban-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.kanban-header .options{display:-ms-flexbox;display:flex}.taskboard-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-ms-flex-align:center;align-items:center;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.duty-content,.taskboard{position:relative}.error-main .error-container{color:#fff;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff}.error-main a{color:#9dce0a}.rtl .navbar .nav-right{margin:0}.rtl .navbar .nav-right .user-avatar{padding-left:0;padding-right:2em;text-align:left}.rtl .navbar .nav-right img{margin-left:0;margin-right:.5rem}.rtl .admin-menu li a{padding:1rem 1rem 1rem 0}.rtl h1 span{margin-left:.5rem;margin-right:0}.rtl blockquote{border-left:0;border-right:5px solid #f5f5f5}.rtl .single-filter .name,.rtl .tag{border-width:0 3px 0 0}.rtl .single-filter .name,.subheader .tags-block .tag{border-color:transparent;border-style:solid}.rtl .tag{border-color:transparent;border-radius:5px 0 0 5px;margin:0 0 .5rem .5rem}.rtl .tag .icon-close{margin-left:0;margin-right:.25rem}.rtl .home-wrapper .working-on-container{margin-left:1rem;margin-right:0}.rtl .home-project .project-card-logo{margin-left:.5rem;margin-right:0}.rtl .home-project .project-card-statistics svg{margin-left:.25rem;margin-right:0}.rtl .contact-team-large .icon-mail{margin-left:.5rem;margin-right:0}.rtl .user-profile .project-details-image{margin-left:2rem;margin-right:0}.rtl .profile-timeline .activity-item .profile-contact-picture,.rtl .profile-timeline .activity-item .profile-member-picture,.rtl .single-project .project-logo{margin-left:1rem;margin-right:0}.rtl .profile-timeline .activity-item{padding:1rem 0 1rem .5rem}.rtl .profile-timeline .activity-item .activity-date{left:.5rem;right:auto}.rtl .profile-timeline .activity-item .activity-info{margin-left:130px;margin-right:0}.rtl .profile-timeline .activity-item blockquote{margin-left:0;margin-right:calc(35px + 1rem)}.rtl .profile-timeline .single-attachment .icon{margin-left:.5rem;margin-right:0}.rtl .project-data .involved-team li{margin-left:.13rem;margin-right:0}.rtl .project-details-form-data .actions .delete-account{text-align:left}.rtl .backlog-table-body .backlog-table-title .user-stories,.rtl .backlog-table-body .row .user-stories,.rtl .backlog-table-body .user-story-name a,.rtl .backlog-table-header .backlog-table-title .user-stories,.rtl .backlog-table-header .row .user-stories,.rtl .issues-table .assigned-field,.rtl .issues-table .created-field,.rtl .issues-table .issue-field,.rtl .issues-table .subject a,.rtl .sprints .sprint-table .column-us{text-align:right}.rtl .project-data .timeline{margin-left:1rem;margin-right:0}.rtl .track-icon{margin-left:.5rem;margin-right:0}.rtl .watch-options-arrow{margin-left:0;margin-right:auto}.rtl .ticket-estimation .ticket-role-points .icon-arrow-down{margin-left:0;margin-right:.25rem}.rtl .ticket-watch .ticket-watch-button,.rtl .ticket-watch svg{margin-left:.25rem;margin-right:0}.rtl .related-tasks-body .task-assignedto .icon{left:.5rem;right:0}.rtl .related-tasks-body .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .related-tasks-body .task-name{margin-left:1rem;margin-right:0}.rtl .related-tasks-body .task-name span{margin-left:.25rem;margin-right:0}.rtl tg-filter .search-action{left:.7rem;right:auto}.rtl .issues-table .assigned-field .icon,.rtl .issues-table .created-field .icon,.rtl .issues-table .issue-field .icon{margin-left:0;margin-right:.25rem}.rtl .icon-arrow-left,.rtl .icon-arrow-right{transform:scaleX(-1)}.rtl .issues-table .pop-status{left:auto;right:0}.rtl .issues-table .icon-upvote{margin-left:.25rem;margin-right:0}.rtl .highlighted .header svg,.rtl .issues-table .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .issues-table .subject{padding-left:1rem;padding-right:0}.rtl .issues-table .issue-assignedto .icon{left:0;right:auto}.rtl .single-filter{padding-left:.5rem;padding-right:0}.rtl .single-filter .number{left:0;right:auto}.rtl .discover-header .search-button{left:1rem;right:auto}.rtl .highlighted .header svg.icon-activity,.rtl .highlighted .header svg.icon-like{margin-left:.5rem;margin-right:0}.rtl .highlighted tg-most-liked{margin-left:8%;margin-right:0}.rtl .highlighted-project .statistic{margin-left:.5rem;margin-right:0}.rtl .highlighted-project .project-statistics svg{margin-left:.25rem;margin-right:0}.rtl .highlighted-project .project-logo{margin-left:1rem;margin-right:0}.rtl .featured-project .project-card-logo{margin-left:.5rem;margin-right:0}.rtl .featured-project .project-card-statistics svg{margin-left:.25rem;margin-right:0}.rtl .project-list-wrapper .project-list{margin-left:2rem;margin-right:0}.rtl .project-list-wrapper .list-itemtype-project .list-itemtype-project-image{margin-left:1rem;margin-right:0}.rtl .create-project-selector-question{left:1.5rem;right:auto}.rtl .create-project-title-wrapper .icon{margin-left:.5rem;margin-right:0}.rtl .create-project-privacity label .icon{margin-left:.25rem;margin-right:0}.rtl .create-project-action-submit{margin-left:0;margin-right:1rem}.rtl .summary-progress-bar{margin-left:10px;margin-right:0}.rtl .empty-burndown svg{margin-left:2rem;margin-right:0}.rtl .backlog-menu .button-bulk{margin-left:0;margin-right:.2rem}.rtl .ticket-header .detail-status{margin-left:0;margin-right:.25rem}.rtl .ticket-status .level-name{float:left}.rtl .ticket-status .level{margin-left:.5rem;margin-right:0}.rtl .ticket-data-container .icon{margin-left:0;margin-right:.25rem}.rtl .ticket-assigned-to .assigned-to{margin-left:0;margin-right:.5rem}.rtl .user-list-avatar{margin-left:.25rem;margin-right:0}.rtl .user-list-name{margin-left:0;margin-right:.5rem}.rtl .assigned-to-list .user-list-multiple .remove-assigned-to,.rtl .assigned-to-list .user-list-single .remove-assigned-to,.rtl .ticket-assigned-to .remove-user,.rtl .ticket-assigned-users .remove-user,.rtl .ticket-watchers .delete-watcher{left:.5rem;right:auto}.rtl .lightbox .close{left:3rem;right:auto}.rtl .activity .activity-avatar,.rtl .comment .comment-avatar{margin-left:1.5rem;margin-right:0}.rtl .comment .comment-creator{margin-left:.5rem;margin-right:0}.rtl tg-wysiwyg .tools{padding-left:0;padding-right:1rem}.rtl .add-tag-button .icon-add{margin:.5rem 0 0 .25rem}.rtl .add-tag-input .save{margin:.5rem .5rem 0 0}.rtl .issue-nav{left:1rem;right:auto}.rtl .upvote-btn{margin-left:.3rem;margin-right:0}.rtl .taskboard-table-header .taskboard-table-inner{margin-left:1rem}.rtl .taskboard-table-header .task-colum-name{margin:0 0 0 5px}.rtl .kanban-table-header{margin-left:-3.7rem}.rtl .kanban-table-body .task-column,.rtl .kanban-table-header .task-colum-name,.rtl .taskboard-table-body .task-column{margin:0 0 0 5px}.rtl .kanban-table-body .task-column:last-child,.rtl .taskboard-table-body .task-column:last-child{margin-left:0;margin-right:initial}.rtl .backlog-table-body .votes svg{margin-left:.25rem;margin-right:0}.rtl .backlog-table-header .backlog-table-title{padding-left:1rem;padding-right:0}.rtl .backlog-table-body .backlog-table-title .status,.rtl .backlog-table-body .row .status,.rtl .backlog-table-header .backlog-table-title .status,.rtl .backlog-table-header .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;text-align:right}.rtl .backlog-table-body .points .icon,.rtl .backlog-table-body .status .icon,.rtl .backlog-table-header .points .icon,.rtl .backlog-table-header .status .icon{margin-left:0;margin-right:.2rem}.rtl .sprints .sprint-table .column-points,.rtl .ticket-created-by .created-by .created-date,.rtl .ticket-created-by .created-by .created-title{text-align:left}.rtl .sprints .sprint .edit-sprint{left:0;margin-left:.5rem;margin-right:0;right:auto}.rtl .epic-row .progress-bar,.rtl .epic-row .progress-status{left:auto;right:0}.rtl .ticket-created-by .created-by .created-date,.rtl .ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem}.rtl tg-wysiwyg .markdown-editor-placeholder,.rtl tg-wysiwyg .medium-editor-placeholder{padding-left:0;padding-right:1rem;text-align:right}.rtl .attachments-header button{margin-left:.2rem;margin-right:0}.rtl .attachments-header label{margin-left:0;margin-right:.25rem}.rtl .attachment-list .attachment-comments,.rtl .attachment-list .editable-attachment-comment{margin-left:.5rem;margin-right:0}.rtl .attachment-list .editable-attachment-deprecated input{margin-left:.2rem;margin-right:0}.rtl .more-attachments .more-attachments-num{margin-left:0;margin-right:.5rem}.rtl .single-attachment .attachment-name{padding-left:1rem;padding-right:0}.rtl .single-attachment .attachment-name svg{margin-left:.25rem;margin-right:0}.rtl .wiki-nav .add-button svg{margin-left:.5rem;margin-right:0}.rtl .wiki-pages-table .created-field,.rtl .wiki-pages-table .creator-field,.rtl .wiki-pages-table .last-modifier-field,.rtl .wiki-pages-table .modified-field,.rtl .wiki-pages-table .title-field{text-align:right}.rtl .wiki-summary div{margin-left:1.25rem;margin-right:0}.rtl .summary .number{margin-left:.3rem;margin-right:0}.rtl .table-team .avatar .avatar-data{margin-left:0;margin-right:1rem;text-align:right}.rtl .table-team .leave-project .icon{margin-left:.2rem;margin-right:0}.rtl .belong-to-epic-text-wrapper{margin-left:1rem;margin-right:0}.rtl .epics-table-options-wrapper{left:.5rem;right:auto}.rtl .epics-table-dropdown{left:0;right:auto}.rtl .epic-row .icon-upvote,.rtl .story-row .icon-upvote{margin-left:.25rem;margin-right:0}.rtl .story-row{margin-left:0;margin-right:4rem}.rtl .epic-row .icon-arrow-down{margin-left:0;margin-right:.1rem}.rtl .epic-header-container .color-selector{margin-left:.5rem;margin-right:0}.rtl .related-userstories-header .related-userstories-title{margin-left:0;margin-right:1rem}.rtl tg-related-userstory-row .userstory-name{margin-left:1rem;margin-right:0}.rtl tg-related-userstory-row .userstory-name span{margin-left:0;margin-right:.25rem}.rtl tg-related-userstory-row .avatar figcaption{margin-left:0;margin-right:.5rem}.rtl .card-owner-actions .icon{margin-left:.25rem;margin-right:0}.rtl .card-owner img{margin-left:.5rem;margin-right:0}.rtl .card-owner .card-owner-avatar img{margin-left:.45rem;margin-right:0}.rtl .card-statistics .statistic{margin-left:.5rem;margin-right:.5rem}.rtl .card-statistics .icon{margin-left:.2rem;margin-right:0}.rtl .lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-left:.5rem;margin-right:0}.rtl .lightbox-create-related-user-stories .new-user-story-options{margin-left:0;margin-right:auto}.rtl .lightbox-generic-form .settings fieldset{margin-left:.5rem;margin-right:0}.rtl .ticket-estimation .popover{left:auto;right:.5rem}.rtl .ticket-estimation .popover::after{left:auto;right:10px}.rtl .profile .timeline-wrapper{margin-left:3.5rem;margin-right:0}.rtl .profile .profile-bar{margin-left:1rem;margin-right:0}.rtl .profile-content-tabs .icon{margin-left:.5rem;margin-right:0}.rtl .profile-sidebar h4 .icon{margin-left:.3rem;margin-right:auto}.rtl .profile-filter .searchbox input{margin-left:1rem;margin-right:0}.rtl .list-itemtype-project .list-itemtype-project-image,.rtl .list-itemtype-project .list-itemtype-track .list-itemtype-track-likers,.rtl .list-itemtype-ticket .list-itemtype-avatar,.rtl .list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers,.rtl .profile-filter .searchbox .icon-search{margin-left:.5rem;margin-right:0}.rtl .list-itemtype-project .list-itemtype-track-likers .icon,.rtl .list-itemtype-project .list-itemtype-track-watchers .icon,.rtl .list-itemtype-ticket .list-itemtype-track-likers .icon,.rtl .list-itemtype-ticket .list-itemtype-track-watchers .icon{margin-left:.25rem;margin-right:0}.rtl .list-itemtype-ticket.blocked-project .icon-blocked-project{margin-left:0;margin-right:.25rem}.rtl .list-itemtype-ticket .list-itemtype-ticket-data{margin-left:1rem;margin-right:0}.rtl .list-itemtype-user .list-itemtype-avatar{margin-left:.75rem;margin-right:0}.taskboard{overflow:hidden}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.taskboard .zoom-loading img{display:block;margin-right:1rem}.taskboard-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.taskboard-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden}.team h2{margin:1rem 0}.team h2 span:last-child{color:#5b8200}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.subheader{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-negative:0;flex-shrink:0}@media (max-width:1280px){.subheader .ticket-created-by{-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-order:1;order:1}}.subheader .tags-block{-ms-flex:1;flex:1}@media (max-width:1280px){.subheader .tags-block{-ms-flex-order:2;order:2}}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#444}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#767676}.duty-content .markdown{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;transition:opacity .2s linear}.duty-content .save-container .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:1.5rem;max-width:1.5rem}.duty-content .edit{cursor:pointer;fill:#555}.duty-content .view-description .edit{background:#f5f5f5;height:2rem;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;transition:all .2s linear;width:2rem}.duty-content .edit-description{margin-bottom:2rem}.duty-content .edit-description .save{cursor:pointer;display:inline-block;position:relative;top:.3rem}.duty-content .edit-description .edit{display:inline-block;position:absolute;right:2.5rem;top:.4rem;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.save-wiki{float:right}.wiki{max-width:1024px}.wiki .wysiwyg{margin-bottom:0}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #dad9d9;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}@media (max-width:767px){.basic-table .row{-ms-flex-direction:column;flex-direction:column}}.basic-table .row .width-1{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.button,.button-auth,.button-blackish,.button-bulk,.button-filter,.button-gray,.button-green,.button-red,.button-tribe,.menu-button,.trans-button,a.button-gray,a.button-green{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.6rem 2rem;text-align:center;text-transform:uppercase;transition:all .2s linear;vertical-align:middle}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-filter:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button-tribe:hover,.button:hover,.menu-button:hover,.trans-button:hover{color:#fff;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-filter:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button-tribe:visited,.button:visited,.menu-button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-filter span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.button-tribe span,.loading.menu-button span,.loading.trans-button span{animation:loading .5s linear}.button .icon,.button span,.button-auth .icon,.button-auth span,.button-blackish .icon,.button-blackish span,.button-bulk .icon,.button-bulk span,.button-filter .icon,.button-filter span,.button-gray .icon,.button-gray span,.button-green .icon,.button-green span,.button-red .icon,.button-red span,.button-tribe .icon,.button-tribe span,.menu-button .icon,.menu-button span,.trans-button .icon,.trans-button span{color:#fff}.button.disabled,.button[disabled],.disabled.button-auth,.disabled.button-blackish,.disabled.button-bulk,.disabled.button-filter,.disabled.button-gray,.disabled.button-green,.disabled.button-red,.disabled.button-tribe,.disabled.menu-button,.disabled.trans-button,[disabled].button-auth,[disabled].button-blackish,[disabled].button-bulk,[disabled].button-filter,[disabled].button-gray,[disabled].button-green,[disabled].button-red,[disabled].button-tribe,[disabled].menu-button,[disabled].trans-button{background:#f5f5f5;box-shadow:none;color:#767676;cursor:not-allowed;opacity:.65}.button.disabled:hover,.button[disabled]:hover,.disabled.button-auth:hover,.disabled.button-blackish:hover,.disabled.button-bulk:hover,.disabled.button-filter:hover,.disabled.button-gray:hover,.disabled.button-green:hover,.disabled.button-red:hover,.disabled.button-tribe:hover,.disabled.menu-button:hover,.disabled.trans-button:hover,[disabled].button-auth:hover,[disabled].button-blackish:hover,[disabled].button-bulk:hover,[disabled].button-filter:hover,[disabled].button-gray:hover,[disabled].button-green:hover,[disabled].button-red:hover,[disabled].button-tribe:hover,[disabled].menu-button:hover,[disabled].trans-button:hover{background:#f5f5f5;color:#767676}.menu-button,.trans-button:visited{color:#050505}.trans-button .icon,.trans-button span{color:#050505;transition:color .2s linear}.trans-button .icon{margin-right:.5rem}.menu-button{border-radius:0}.menu-button:hover{background:#e4e3e3;color:#555}.menu-button span,.menu-button:visited{color:#050505}.submit-button{width:100%}.button-green,a.button-green{background:#5b8200}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#9dce0a;color:#fff}.button-gray,a.button-gray{background:#555}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#9dce0a;color:#fff}.button-blackish{background:#050505;color:#e4e3e3}.button-blackish:hover{background:#050505;color:#fff}.button-red{background:#ff8282}.button-red:hover{background:red;color:#fff}.button-red .icon{color:#fff}.button-bulk{background:#5b8200;padding:.55rem .75rem}.button-bulk .icon{fill:currentColor;margin-right:0;position:relative;top:1px}.button-bulk:hover{background:#9dce0a}.button-auth{background:#444}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.button-tribe{-ms-flex-align:center;align-items:center;background:#107a8a;display:-ms-flexbox;display:flex;padding:.4rem .4rem .4rem 1.5rem}.button-tribe.active,.button-tribe:hover{background:#0b525c;color:#fff}.button-tribe .tribe-logo{margin-right:.5rem;width:1.5rem}.tribe-more-info{font-size:.9rem;color:#5b8200;display:inline-block;margin-top:.5rem}.button-filter{background:#e4e3e3;margin-left:1rem;padding:.4rem .5rem;position:relative}.button-filter:hover{background:#767676;fill:#e4e3e3}.button-filter .filter-num{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:red;border-radius:50%;height:1rem;left:-.5rem;position:absolute;top:-.5rem;width:1rem}.card-placeholder{background:#dfdede;border:1px dashed #d0cece;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:-ms-flexbox;display:flex}.card-placeholder .image{background:#d0cece;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-ms-flex:1;flex:1}.card-placeholder .line{background:#d0cece;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;margin:0}.check{background-color:#cbc9c9;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:50px;left:-10px;opacity:0;position:absolute;top:-10px;width:100px;z-index:999}.check input+div{background-color:#555;height:25px;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#9dce0a;margin-left:50%;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.list-itemtype-project.blocked-project .list-itemtype-project-description,.list-itemtype-project.blocked-project .list-itemtype-project-image,.list-itemtype-project.blocked-project .list-itemtype-project-name,.list-itemtype-project.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .list-itemtype-avatar,.list-itemtype-ticket.blocked-project .list-itemtype-track,.list-itemtype-ticket.blocked-project .ticket-id,.list-itemtype-ticket.blocked-project .ticket-project,.list-itemtype-ticket.blocked-project .ticket-status,.list-itemtype-ticket.blocked-project .ticket-title,.list-itemtype-ticket.blocked-project .ticket-type{opacity:.4}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#767676}.ticket-created-by{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555;display:block;text-align:right}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#5b8200}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.doom-line{-ms-flex-align:center;align-items:center;background:#ff8282;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:.5rem 0;padding:.25rem 0}.doom-line span{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.45rem .5rem}.wysiwyg-help a{display:inline-block}.drag-drop-help{color:#555}.help-button:hover span,.help-markdown:hover span{transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{fill:#9dce0a;transition:fill .2s linear}.help-button span,.help-markdown span{vertical-align:text-top}.help-button .icon,.help-markdown .icon{width:.9rem;height:.9rem;fill:#767676;margin-right:.2rem}.empty-filter,.empty-large,.empty-small{margin-top:4rem;text-align:center}.empty-filter img,.empty-large img,.empty-small img{margin-bottom:1rem;width:100%}.empty-filter .title,.empty-large .title,.empty-small .title{font-size:1.2rem;text-transform:uppercase}.empty-filter p,.empty-large p,.empty-small p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.empty-filter a,.empty-large a,.empty-small a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#5b8200}.empty-small img{max-width:175px}.empty-large img{max-width:800px}.empty-filter{margin-top:1rem}.ticket-estimation .points-per-role{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.ticket-estimation .ticket-role-points{background:rgba(118,118,118,.2);color:#767676;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(157,206,10,.9);color:#e4e3e3}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points:last-child{background:rgba(135,155,137,.5);border-bottom:0;color:#e4e3e3}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:currentColor;fill:currentColor}.ticket-estimation .ticket-role-points .icon-arrow-down{fill:currentColor;height:.6rem;margin-left:.25rem;width:.6rem}.ticket-estimation .popover.fix:after,.ticket-estimation .popover:after{height:10px;transform:rotate(45deg);content:''}.ticket-estimation .popover,.ticket-estimation .popover.fix{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0;z-index:99;position:absolute;font-size:.9rem;list-style-type:none}.ticket-estimation .ticket-role-points .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#444}.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .popover{background:#050505;color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#050505;left:10px;position:absolute;top:-5px;width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#9dce0a;color:#fff}.ticket-estimation .popover.fix{background:#050505;color:#fff;display:none;left:-160px;padding:10px;top:100%;width:200px;text-align:"center"}.ticket-estimation .popover.fix a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#9dce0a;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#050505;left:90%;position:absolute;top:-5px;width:10px}.history-tabs{background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.history-tabs a{display:inline-block;padding:.75rem 1rem}.history-tabs a:hover{color:#5b8200}.history-tabs .history-tab{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid transparent;color:#767676;transition:all .1s linear}.history-tabs .history-tab.active{border-bottom:3px solid #444;color:#444}.history-tabs .order-comments{color:#444}.level{background-color:#767676;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project{border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-project .list-itemtype-track-likers.active .icon,.list-itemtype-project .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-project .icon{fill:#767676}.list-itemtype-project h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-project p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .icon-blocked-project{width:.75rem;height:.75rem}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{-ms-flex-item-align:end;align-self:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .tag{-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket,.list-itemtype-user{border-bottom:1px solid #e4e3e3;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-ms-flexbox;display:flex;position:relative}.list-itemtype-ticket .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-ticket .ticket-id,.list-itemtype-ticket .ticket-project{color:#767676}.list-itemtype-ticket .list-itemtype-track-likers.active .icon,.list-itemtype-ticket .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-ticket .icon{fill:#767676}.list-itemtype-ticket h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1rem}.list-itemtype-ticket p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:0}.list-itemtype-ticket .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket.blocked-project .icon-blocked-project{width:1rem;height:1rem;margin-left:.25rem}.list-itemtype-user .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-type{margin-left:.3rem;text-transform:uppercase}.list-itemtype-ticket .list-itemtype-ticket-data{-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-blocked{color:red;margin-right:.25rem}.list-itemtype-user{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#5b8200}.list-itemtype-user .list-itemtype-track-likers.active .icon,.list-itemtype-user .list-itemtype-track-watchers.active .icon{fill:currentcolor}.list-itemtype-user .icon{fill:#767676}.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0;text-transform:none;font-size:1.2rem}.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-menu li,.admin-submenu li,.empty-burndown .title,.sprints-empty .title,tg-project-menu{text-transform:uppercase}.list-itemtype-user p{margin-bottom:0}.list-itemtype-user .list-itemtype-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .extra-info{font-size:.9rem;margin-top:.25rem}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:100%;-ms-flex-pack:center;justify-content:center;width:100%}.loader p{font-size:1.2rem;color:#555;text-align:center}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{animation-duration:5s;animation-iteration-count:infinite;animation-name:loadBar;animation-timing-function:ease-in;background:#555;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{animation-delay:0s;background:#bbe831}.loading-bar .item-1{animation-delay:1s;background:#237400}.loading-bar .item-2{animation-delay:2s;background:#e43050}.loading-bar .item-3{animation-delay:3s;background:#810061}.loading-bar .item-4{animation-delay:4s;background:#618000}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;transform-origin:32 32}.look-for-people{width:1rem;height:1rem;fill:#767676;margin-left:.25rem}.notification-message-success{background:rgba(157,206,10,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);right:-370px;top:2%;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{animation:animSlide 2s;animation-fill-mode:forwards;animation-iteration-count:1;opacity:1}.notification-message-success.inactive{animation:animSlideOut .5s;opacity:0;transform:none}.notification-message-success p{margin:0}.notification-message-success .warning{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:1.2}@keyframes animSlide{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}100%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlideOut{0%{opacity:1;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(255,0,0,.9);opacity:1;top:0;transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;transform:translateY(0);transition:all .6s ease-in-out}.notification-light,.notification-light.inactive{opacity:0;transform:translateY(-100%);transition:all .6s}.notification-message-error.inactive{transition:all .6s ease-in-out}.notification-message-error .icon-error{width:3rem;height:3rem;fill:#fff;margin-right:.5rem}.notification-message-error .warning{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#fff;line-height:2.4rem}.notification-light p,.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-message-error .text p{margin:0}.notification-message-error .close{display:block;position:absolute;right:1rem;top:1rem}.notification-message-error .icon-close{cursor:pointer;fill:#fff}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-ms-flex-align:center;align-items:center;background:rgba(118,118,118,.95);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;position:absolute;top:0;width:100%;z-index:99999}.notification-light.active{opacity:1;transform:translateY(0);transition:all .6s}.notification-light p{margin:0}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{display:block;margin-right:1rem;width:2rem}.notification-light .close svg{fill:#fff}.notification-message-light-error{background:rgba(255,0,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:-ms-flexbox;display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator a{background:#767676;color:#fff;padding:.5rem 1rem;transition:all .3s linear}.paginator a:hover{background:#050505;color:#fff;transition:all .3s linear}.paginator .active span{background:#9dce0a}.select-color,.select-color:after{background:#050505;position:absolute}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.icon-lock{fill:#767676;margin-left:.5rem}.select-color{color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;text-align:"center";border-radius:0 10px 10px 0;padding:15px}.select-color a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#9dce0a;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#767676;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color .empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.select-color .empty-color:after,.select-color .empty-color:before{content:"";width:2px;height:47px;background:#ff8282;position:absolute;top:0}.select-color .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.select-color .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#e4e3e3;width:243px}.summary .description,.summary .number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.select-color input::-webkit-input-placeholder{color:#555}.select-color input::-moz-placeholder{color:#555}.select-color input:-moz-placeholder{color:#555}.select-color input:-ms-input-placeholder{color:#555}.select-color .selected-color{background:#767676;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;height:65px;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;overflow:hidden;padding:1rem}.summary .summary-stats{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#9dce0a}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{font-size:.9rem;line-height:1}.summary .stats{cursor:pointer;display:block;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .graph{fill:#9dce0a;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#5b8200}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;transition:all .2s;width:100%}.summary .stats .graph{fill:#434343;transition:fill .2s}.summary .main-summary-stats{display:-ms-flexbox;display:flex;transform:translateY(0);transition:all .2s ease-in-out}.summary .show-role-points .points-per-role-stats{transform:translateY(-35px)}.summary .show-role-points .main-summary-stats{transform:translateY(-65px)}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#9dce0a;height:24px}.summary-progress-bar .defined-points{background:#ff8282;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#9dce0a;height:24px;position:absolute}.large-summary{-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;padding:.75rem 1rem}.large-summary .stats-wrapper{padding-top:.35rem}.large-summary .large-summary-wrapper{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.large-summary .summary-progress-bar{-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats.summary-closed-tasks,.large-summary .summary-stats.summary-completed-points{border-right:1px solid #050505;margin-right:0;padding-right:1rem}.large-summary .summary-stats.summary-closed-tasks+.summary-stats,.large-summary .summary-stats.summary-completed-points+.summary-stats{border-left:1px solid #555;margin-left:0;padding-left:1rem}.large-summary .icon{width:1.3rem;height:1.3rem;fill:currentColor;margin-right:.4rem;vertical-align:middle}.large-summary .icon.icon-stats{color:#5b8200;float:right;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#9dce0a;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#9dce0a}.large-summary .icon.icon-stats.active:hover{color:#5b8200;transition:color .3s linear}.large-summary .points-per-role-stats-content{display:-ms-flexbox;display:flex;padding-left:1rem}.large-summary .points-per-role-stats-content .summary-stats{padding:0}.large-summary .toggle-points-per-role{color:#fff;cursor:pointer}.large-summary .toggle-points-per-role svg{width:1rem;height:1rem}.large-summary .points-per-role-stats{margin-left:.5rem;transform:translateY(35px);transition:all .2s ease-in-out}.large-summary .points-per-role-stats .number{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.empty-burndown,.empty-burndown .title,.large-summary .points-per-role-stats .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.large-summary .points-per-role-stats .role{font-size:.75rem}.empty-burndown{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:rgba(135,155,137,.15);display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{width:4rem;height:4rem;fill:#879b89;-ms-flex-preferred-size:4rem;flex-basis:4rem;-ms-flex-negative:0;flex-shrink:0;margin-right:2rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-ms-flex:1;flex:1}.empty-burndown .title{font-size:1.2rem;color:#879b89;margin:0}.empty-burndown a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;animation:blink 2s infinite}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.graphics-container{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.graphics-container.open{transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;transition:none}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-ms-flex-align:stretch;align-items:stretch;border-radius:4px;display:-ms-flexbox;display:flex;margin:0;padding:0}.track-button.active .track-inner{background:rgba(157,206,10,.4)}.track-button.active .icon{fill:#5b8200}.track-button.active .track-button-counter{background:rgba(157,206,10,.6)}.track-button.is-hover .track-inner{background:#f33;color:#e4e3e3;transition:background .2s}.track-button.is-hover .icon{fill:#ff8282}.track-button.is-hover .track-button-counter{background:red;color:#e4e3e3;transition:background .2s}.track-button .watch-options-arrow{margin-left:auto}.track-button .icon-arrow-down{width:.75rem;height:.75rem}.track-inner{-ms-flex-align:center;align-items:center;background:#e4e3e3;border-radius:4px 0 0 4px;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:start;justify-content:flex-start;min-width:140px;padding:.25rem 1rem}.track-inner:hover{background:#d7d6d6;transition:background .3s}.track-icon{fill:#444;margin-right:.5rem;position:relative;top:2px}.track-button-counter{-ms-flex-align:center;align-items:center;background:#d7d6d6;border-radius:0 4px 4px 0;padding:.25rem .75rem}.contact-team{background:#e4e3e3;border-radius:4px;padding:.25rem .75rem}.contact-team:hover{background:#d7d6d6;transition:background .3s}.watch-options{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-assigned-users,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(118,118,118,.3);color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox}.watch-options a.active{color:#9dce0a}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check svg{fill:#9dce0a}.upvote-btn{-ms-flex-align:stretch;align-items:stretch;display:flex;-ms-flex:0;flex:0;-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#767676;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#879b89;transition:background .3s}.upvote-btn a:hover path{fill:#879b89}.upvote-btn a.active{background:rgba(157,206,10,.2);color:#5b8200;transition:all .3s}.upvote-btn a.active svg{fill:#5b8200}.upvote-btn a.is-hover{background:red;color:#e4e3e3}.upvote-btn a.is-hover svg{fill:#ff8282;transform:rotate(180deg);transition:all .3s}.upvote-btn svg{fill:#767676;height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-assigned-users .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.assigned-to-list .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-multiple,.ticket-watchers .user-list-single{-ms-flex-line-pack:center;padding:.25rem 0;vertical-align:middle;align-content:center}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-multiple{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex}.assigned-to-list .user-list-multiple.selected,.assigned-to-list .user-list-multiple:hover,.assigned-to-list .user-list-single.is-active,.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:rgba(216,248,121,.3);cursor:pointer}.assigned-to-list .user-list-multiple:last-child{border:0}.assigned-to-list .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#444;margin-left:.5rem}.assigned-to-list .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{margin-bottom:1rem;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-single .remove-assigned-to{display:block;fill:#444;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-single .remove-assigned-to:hover{fill:red}.assigned-to-list .user-list-multiple:hover{transition:background .3s linear;transition-delay:.2s}.assigned-to-list .user-list-multiple.is-active{background:rgba(216,248,121,.3);cursor:pointer;position:relative;transition:background .3s linear;transition-delay:.1s}.assigned-to-list .user-list-multiple .remove-assigned-to{display:block;fill:#444;opacity:1;position:absolute;right:1rem;top:1.5rem;transition:all .2s ease-in}.assigned-to-list .user-list-multiple .remove-assigned-to:hover{fill:red}.ticket-watchers .user-list-single{-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-multiple{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-assigned-users .user-list-multiple,.ticket-assigned-users .user-list-single{background:0 0;display:-ms-flexbox;padding:.25rem 0;align-content:center;vertical-align:middle}.ticket-watchers .user-list-multiple:last-child{border:0}.ticket-watchers .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#444;margin-left:.5rem;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .delete-watcher{opacity:1;transition:opacity .2s ease-in}.ticket-watchers .delete-watcher{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-watchers .delete-watcher:hover{fill:red;transition:color .3s ease-in}.ticket-assigned-users .user-list-single{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:flex}.ticket-assigned-users .user-list-single:last-child{border:0}.ticket-assigned-users .user-list-multiple{-ms-flex-line-pack:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:flex}.ticket-assigned-users .user-list-multiple:last-child{border:0}.ticket-assigned-users .user-list-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-assigned-users .user-list-single{-ms-flex-positive:1;flex-grow:1}.ticket-assigned-users .user-list-single:hover .remove-user{opacity:1;transition:opacity .2s ease-in}.ticket-assigned-users .user-list-name{color:#444;margin-left:.5rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex:1;flex:1;position:relative}.admin-functionalities .module-name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .remove-user{cursor:pointer;fill:currentColor;opacity:0;position:absolute;right:.5rem;top:0;transition:all .2s ease-in}.ticket-assigned-users .remove-user:hover{fill:red;transition:color .3s ease-in}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#767676;margin-bottom:2rem}.admin-common .admin-subtitle a{color:#5b8200}.admin-common .admin-subtitle a:hover{color:#9dce0a}.admin-common .total{font-size:1.2rem;-ms-flex-align:center;align-items:center;background-color:#e4e3e3;color:#444;display:-ms-flexbox;display:flex;padding:.3rem 1rem}.admin-common .total:hover .icon-edit{opacity:1;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #e4e3e3}.custom-fields-table .table-header .custom-description,.custom-fields-table .table-header .custom-name{padding-left:1.1rem}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag{opacity:1;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#767676}.custom-fields-table .single-custom-field{border-bottom:1px solid #e4e3e3;color:#555}.custom-fields-table .icon-drag{fill:#767676;opacity:0;padding:0 .25rem 0 .1rem;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{margin-right:.5rem}.custom-fields-table .custom-name{-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options svg{cursor:pointer;fill:#767676;margin-right:.5rem;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options svg:hover{fill:#5b8200;transition:color .2s linear}.custom-fields-table .custom-options svg.icon-close,.custom-fields-table .custom-options svg.icon-trash{fill:#ff8282}.custom-fields-table .custom-options-wrapper{opacity:0;transition:opacity .3s linear}.custom-fields-table .custom-options-wrapper a{display:inline-block}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities .module-container{max-width:900px;width:100%}.admin-project-export-result .spin img,.project-details .loading-spinner{max-height:1rem;max-width:1rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-functionalities .module{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:1rem 0}.admin-functionalities .module.active .module-icon .icon,.admin-functionalities .module.active .module-name{color:#5b8200;fill:#5b8200}.admin-functionalities .module-icon{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem 0 0}.admin-functionalities .module-icon .icon{width:3rem;height:3rem;fill:#767676}.admin-functionalities .module-name{font-size:1.2rem;color:#767676;-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-negative:0;flex-shrink:0;margin:0 .5rem}.admin-functionalities .module-desc{font-size:.9rem;color:#767676;-ms-flex:1;flex:1;margin:0 2rem 0 0}.admin-functionalities .module-desc p{margin:0}.admin-functionalities .module-desc-options,.admin-functionalities .videoconference-attributes{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-top:.5rem}.admin-functionalities .module-desc-options .options,.admin-functionalities .videoconference-attributes .options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:2.5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .module-desc-options fieldset,.admin-functionalities .videoconference-attributes .icon,.admin-functionalities .videoconference-attributes fieldset{margin:0 .5rem}.admin-functionalities .module-desc-options .icon,.admin-functionalities .videoconference-attributes .icon{fill:#767676}.admin-functionalities .module-desc-options .icon:hover,.admin-functionalities .videoconference-attributes .icon:hover{fill:#5b8200}.admin-functionalities .module-scrum .options{-ms-flex-item-align:end;align-self:flex-end}.admin-functionalities .module-videoconference .options{-ms-flex-item-align:start;align-self:flex-start}.admin-membership-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.admin-membership-table .avatar img{border-radius:4px;-ms-flex-positive:0;flex-grow:0;margin:0 .5rem 0 .3rem;width:50px}.admin-membership-table .avatar .data{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555;margin-top:.2rem}.admin-membership-table .avatar .pending,.admin-menu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-membership-table .avatar .pending{color:#ff8282;display:inline-block;padding-left:.3rem}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#e4e3e3}.admin-membership-table .resend{background-color:#5b8200;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;transition:background-color .3s linear}.admin-membership-table .delete{fill:#767676;transition:fill .2s}.admin-membership-table .delete:hover{fill:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-ms-flex-preferred-size:210px;flex-basis:210px;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:1;flex-grow:1}.admin-menu li{border-bottom:1px solid #cbc9c9}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{margin:0 auto;transform-origin:32 32;width:100%}.admin-project-export-result h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.2rem;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-project-export-result p{color:#767676;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details form{display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.project-details .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .loading-spinner{margin:0 auto;border:0;transform-origin:center center}.project-details .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .get-feedback,.project-details .looking-for-people{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-bottom:1px solid #e4e3e3;padding:1rem 0}.project-details .looking-for-people{border-top:1px solid #e4e3e3;margin-bottom:0}.project-details .get-feedback-inner,.project-details .looking-for-people-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.project-details .get-feedback-inner svg,.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#767676;margin-left:.5rem}.project-details .get-feedback-inner .check,.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{animation:dropdownFade .2s reverse;animation-delay:.1s}.project-details .delete-project{font-size:1rem;display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{font-size:1rem;color:#767676;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-ms-flex:1;flex:1;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings .privacy-project:checked~input[type=text],tg-admin-project-restrictions span{display:block}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(157,206,10,.4);color:#444}.project-privacy-settings label:hover svg{fill:#444}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#444;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#9dce0a;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project[disabled]+label{background:#f5f5f5;box-shadow:none;color:#767676;cursor:not-allowed;opacity:.65}.project-privacy-settings .privacy-project[disabled]+label:hover{background:#f5f5f5;color:#767676}tg-admin-project-restrictions p{font-size:1rem;text-align:center}tg-admin-project-restrictions a{color:#5b8200}tg-admin-project-restrictions span:first-child::before{border:1px solid #ff8282;border-radius:6px;color:#ff8282;content:'!';display:inline-block;height:12px;line-height:12px;margin-right:.5rem;text-align:center;width:12px}.admin-project-profile-owner-actions{-ms-flex-align:center;align-items:center;border-top:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem}.admin-project-profile-owner-actions a{color:#5b8200}.admin-project-profile-owner-actions a:hover{color:#9dce0a;transition:color .2s}.admin-project-profile-owner-actions img{width:100%}.admin-project-profile-owner-actions .owner-info{-ms-flex:1;flex:1;padding-left:.5rem}.admin-project-profile-owner-actions .owner-info-title{color:#767676}.admin-project-profile-owner-actions .owner-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-roles .general-category,.admin-roles .role-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-profile-owner-actions .owner-avatar{width:2.5rem}.admin-project-profile-owner-actions .request{-ms-flex-negative:0;flex-shrink:0}.admin-roles .save{display:inline-block}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .icon:hover{fill:#5b8200;transition:fill .2s linear}.admin-roles .icon-edit{cursor:pointer;fill:#767676;margin-left:.5rem;opacity:0;transition:opacity .2s linear}.admin-roles .icon-save{fill:#767676;margin-left:.5rem;transition:fill .2s linear}.admin-roles .edit-role{background-color:#e4e3e3;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{font-size:.9rem;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category.external-user{-ms-flex-pack:start;justify-content:flex-start}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.admin-submenu ul a span,.admin-webhooks .webhook-url span{max-width:85%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.admin-submenu li{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;transition:all .2s}.admin-submenu ul a span{display:block}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .webhooks-table{margin-bottom:1rem}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;transition:opacity .2s linear}.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #e4e3e3}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-negative:0;flex-shrink:0}.admin-webhooks .webhook-url{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.admin-webhooks .webhook-url span{word-wrap:normal;color:#767676;display:inline-block;vertical-align:middle}.admin-webhooks .webhook-url a{color:#5b8200;cursor:pointer;margin-left:.5rem;white-space:nowrap}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto}.admin-webhooks .webhook-options a{cursor:pointer;display:inline-block;margin-right:.5rem}.admin-webhooks .webhook-options svg{fill:#767676}.admin-webhooks .webhook-options svg:hover{fill:#5b8200;transition:fill .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{display:none}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #e4e3e3;margin-left:22%}.admin-webhooks .history-single{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{transform:rotate(180deg);transition:transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{transform:rotate(0);transition:transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#767676}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-header a{font-size:.9rem;color:#767676}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{font-family:'courier new',monospace;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{font-size:.9rem;color:#767676;-ms-flex-preferred-size:20%;flex-basis:20%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace;border:0;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #e4e3e3;margin-bottom:1rem}.admin-contrib input{margin-bottom:1rem}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:0 1rem}.admin-contrib .check-item{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0;margin-bottom:1rem}.contrib-form-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.contrib-form-wrapper input{margin:0}.contrib-form-wrapper .contrib-input{border:0;-ms-flex:5;flex:5;margin:0}.contrib-form-wrapper .contrib-test{border:0;-ms-flex:1;flex:1;margin:0 0 0 1rem}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv .csv-regenerate-field .icon:not(.icon-clipboard){fill:currentColor;height:.9rem;margin-right:.3rem;vertical-align:middle;width:.9rem}.project-csv .field-with-options{display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{cursor:pointer;fill:#767676;opacity:0}.project-values-row .icon:hover{fill:#444;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #e4e3e3}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#e9ffb5;cursor:move;transition:background .2s ease-in}.project-values-body .project-values-row:hover .icon{opacity:1;transition:opacity .2s ease-in}.project-values-name{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.project-values-value{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{display:inline-block;margin-right:.5rem}.project-values-settings svg.icon-trash{fill:#ff8282}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p{color:#444;margin-bottom:.5rem;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-ms-flex-align:center;align-items:center;border:1px solid #767676;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{font-size:.9rem;opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;transition:opacity .2s linear}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-password-text,.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;transition:opacity .3s linear}.login-form-container .forgot-pass{font-size:.9rem;color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;transition:color .3s linear}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin:1rem 0;text-align:center}.register-form-container .register-text{font-size:.9rem}.backlog-table-body,.backlog-table-header{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-ms-flex-preferred-size:25px;flex-basis:25px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{width:100%}.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .votes,.backlog-table-header .votes{color:#555;-ms-flex-preferred-size:65px;flex-basis:65px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .votes.inactive,.backlog-table-header .votes.inactive{color:#767676}.backlog-table-body .votes.inactive svg,.backlog-table-header .votes.inactive svg{fill:#767676}.backlog-table-body .votes.is-voted,.backlog-table-header .votes.is-voted{color:#9dce0a;fill:#9dce0a}.backlog-table-body .votes svg,.backlog-table-header .votes svg{fill:#555;height:.75rem;margin-right:.25rem;vertical-align:middle;width:.75rem}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.2rem}.backlog-table-body .pop-points,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-header .pop-points,.backlog-table-header .pop-role,.backlog-table-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;margin:0;position:absolute;z-index:99;text-align:"center";font-size:.9rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;padding:10px 1rem 10px 10px;top:0;width:200px}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;padding:10px;top:0;width:200px}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;padding:10px 3rem 10px 10px;width:150px}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:none;left:30px;list-style-type:none;margin:0;z-index:99;text-align:"center";font-size:.9rem;background:#050505;position:absolute}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{color:#fff;padding:10px;top:0;width:200px}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{bottom:0;color:#fff;padding:10px;top:auto;width:200px}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;border-bottom:2px solid #767676;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:1rem}.backlog-table-header .points{cursor:pointer}.backlog-table-header .header-points span{color:#767676}.backlog-table-body.forecasted-stories{border:.5rem solid #f5f5f5;border-bottom:0}.backlog-table-body .row{border-bottom:1px solid #dad9d9;cursor:move;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#e9ffb5;transition:background .2s ease-in;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag,.backlog-table-body .row:hover .us-settings{opacity:1;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.gu-mirror{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .row .icon-arrow-down{fill:#767676;height:.7rem;width:.7rem}.backlog-table-body .gu-transit{background:#e4e3e3}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .sortable-placeholder *{display:none}.backlog-table-body .is-checked{background:#e9ffb5;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;transition:color .2s ease-in}.backlog-table-body .user-story-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:inline-block;-ms-flex:1;flex:1}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{font-size:.9rem;margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .us-settings{-ms-flex-negative:0;flex-shrink:0;margin-left:2rem;opacity:0}.backlog-table-body .us-settings svg{fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}.backlog-table-body .us-settings svg:hover{fill:#9dce0a}.backlog-table-body .icon-drag{cursor:move;fill:#767676;opacity:0;padding:.1rem}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.backlog-table-body .us-status tg-svg{display:inline-block}.backlog-table-body .loading{margin:2% auto;width:3rem}.backlog-table-body .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.empty-large .row{display:none}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#5b8200;padding:.25rem .25rem 0;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{fill:#e4e3e3;height:1.4rem;width:1.5rem}.sprints .filter-closed-sprints{font-size:.9rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading{text-align:center}.sprints .loading-spinner{border:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;transform-origin:center center}.sprints .sprint-name a{font-size:1rem;display:inline-block;margin-right:.5rem}.sprints .sprint{margin-bottom:2rem}.sprints .sprint header{position:relative}.sprints .sprint:hover .edit-sprint{opacity:1;transition:opacity .2s ease-in}.sprints .sprint .edit-sprint{opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in;vertical-align:baseline}.lightbox-generic-form .settings .iocaine,.lightbox-generic-form .settings .requirement,.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon,.ticket-assigned-users .assign-to-me .icon,.ticket-assigned-users .user-assigned .icon{vertical-align:middle}.sprints .sprint svg{fill:#767676}.sprints .sprint svg:hover{fill:#5b8200;transition:fill .2s ease-in}.sprints .sprint .number{font-size:.75rem;margin-right:.2rem}.sprints .sprint .description{font-size:.75rem;line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{font-size:.9rem;color:#767676;-ms-flex:1;flex:1}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint ul{margin:0;text-align:right}.sprints .compact-sprint{transform:rotate(0);transition:all .2s}.sprints .compact-sprint.active{transform:rotate(90deg);transition:all .2s}.sprints .compact-sprint:hover .icon{fill:#9dce0a;transition:color .2s}.sprints .sprint-progress-bar{background:#767676;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#5b8200;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table{min-height:2rem}.sprints .sprint-table .sprint-empty{background:#d7d6d6;border:2px dashed #909090;color:#555;padding:1rem;text-align:center}.sprints .sprint-table .row{border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:rgba(118,118,118,.2);cursor:move;transition:background .2s ease-in}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.readonly{cursor:auto}.sprints .sprint-table .row.ui-sortable-helper{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;transition:background .2s ease-in}.sprints .sprint-table .gu-transit{background:#959595;height:40px}.sprints .sprint-table .gu-transit *{display:none}.sprints .sprint-table .column-us{font-size:.9rem;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{display:block}.sprints .sprint-table .us-name.closed{color:#838383}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#838383}.sprints .sprint-table .column-points.blocked{color:red}.sprints .sprint-table.sprint-empty-wrapper .row{display:none}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input{display:none}.sprints .us-item-row .user-story-name{font-size:.9rem;line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#767676}.sprint-closed .sprint-progress-bar .current-progress{background:#5d5d5d}.sprint-closed .button-gray{background:#767676}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{font-size:1.2rem;margin-bottom:.5rem}.sprints-empty a{color:#5b8200}.taskboard-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.taskboard-table.zoom-0 .task-colum-name span{padding-right:1rem}.taskboard-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;min-height:2.4rem;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.taskboard-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#555;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;text-transform:uppercase;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name.column-fold{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-header .task-colum-name span{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.taskboard-table-header tg-svg{display:block;margin-right:.3rem}.taskboard-table-header tg-svg:hover{cursor:pointer}.taskboard-table-header tg-svg.hfold,.taskboard-table-header tg-svg.hunfold{display:inline-block;transform:rotate(90deg)}.taskboard-table-body{-ms-flex:1;flex:1;margin-bottom:5rem;overflow:auto;width:100%}.taskboard-table-body .task-column{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:300px;width:300px}.taskboard-table-body .column-fold .card .card-owner img,.taskboard-table-body .row-fold .card .card-owner img{height:1.3rem;margin-right:0;width:1.3rem}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .row-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .row-fold .card .card-data,.taskboard-table-body .row-fold .card .card-owner-actions,.taskboard-table-body .row-fold .card .card-owner-name,.taskboard-table-body .row-fold .card .card-statistics,.taskboard-table-body .row-fold .card .card-tag,.taskboard-table-body .row-fold .card .card-title,.taskboard-table-body .row-fold .card .card-unfold,.taskboard-table-body .row-fold .card tg-card-slideshow{display:none}.taskboard-table-body .row-fold .task-column,.taskboard-table-body .row-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .card .card-data,.taskboard-table-body .column-fold .card .card-owner-actions,.taskboard-table-body .column-fold .card .card-owner-name,.taskboard-table-body .column-fold .card .card-statistics,.taskboard-table-body .column-fold .card .card-tag,.taskboard-table-body .column-fold .card .card-title,.taskboard-table-body .column-fold .card .card-unfold,.taskboard-table-body .column-fold .card tg-card-slideshow,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table-body .column-fold .card{-ms-flex-item-align:start;align-self:flex-start;margin-top:.5rem}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .column-fold.task-column{-ms-flex-line-pack:start;align-content:flex-start;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-flow:row wrap;flex-flow:row wrap}.ticket-assigned-to,.ticket-assigned-users{-ms-flex-align:center;border-bottom:1px solid #767676;border-top:1px solid #767676}.taskboard-table-body .column-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to{display:none}.taskboard-table-body .task-row{display:-ms-flexbox;display:flex;margin-bottom:.25rem;min-height:10rem;width:100%}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg,.taskboard-table-body .task-row.blocked .taskboard-userstory-box svg:hover{color:#fff;fill:#fff;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.ticket-assigned-to .loading-spinner,.ticket-assigned-users .loading-spinner{transform-origin:32 32;max-height:2rem;max-width:2rem;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.taskboard-table-body .task-row.row-fold .icon-add,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .us-title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{font-size:.9rem;color:#767676}.taskboard-userstory-box .points-value span{margin-right:.1rem}.taskboard-userstory-box tg-svg{cursor:pointer;display:block;position:absolute;right:.5rem;top:.7rem}.taskboard-userstory-box tg-svg:hover svg{fill:#5b8200}.taskboard-userstory-box tg-svg.add-action{right:2rem}.taskboard-userstory-box tg-svg.fold-action{left:0;right:inherit;top:1rem}.ticket-assigned-to{align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .remove-user{opacity:1;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{margin:1rem auto}.ticket-assigned-to .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-to .assigned-to .assigned-to-options a{margin-right:.2rem}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#5b8200;cursor:default}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover,.ticket-assigned-to .remove-user:hover,.ticket-assigned-to .user-assigned.editable:hover,.ticket-assigned-users .assign-to-me.editable:hover,.ticket-assigned-users .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-to .remove-user{fill:#555;opacity:0;position:absolute;right:.5rem;top:2rem}.ticket-assigned-to .remove-user:hover{fill:red;transition:fill .2s}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{color:#5b8200}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#5b8200}.ticket-assigned-users .assigned-title,.ticket-assigned-users .tg-add-assigned span{color:#555;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-assigned-users{align-items:center;margin-bottom:1rem;padding:.5rem 0;position:relative}.ticket-assigned-users .loading-spinner{margin:1rem auto}.ticket-assigned-users .assigned-title{display:block;margin:.2rem 0 .25rem}.ticket-assigned-users .tg-assigned-users{-ms-flex-align:center;align-items:center;position:relative}.ticket-assigned-users .tg-add-assigned{margin-top:.25rem}.ticket-assigned-users .tg-add-assigned .add-assigned{fill:#555;opacity:1;right:.5rem;top:2rem}.ticket-assigned-users .tg-add-assigned .add-assigned:hover{cursor:pointer;fill:red;transition:fill .2s}.ticket-assigned-users .tg-add-assigned span{margin:.2rem .5rem}.ticket-assigned-users .assigned-users-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .assigned-users-options a{margin-right:.2rem}.ticket-assigned-users .assign-to-me,.ticket-assigned-users .assign-to-me.editable,.ticket-assigned-users .user-assigned,.ticket-assigned-users .user-assigned.editable{color:#5b8200}.ticket-assigned-users .not-assigned-users{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.colors-table .table-header,.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.ticket-assigned-users .not-assigned-users .assigned-to{-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-users .not-assigned-users .assigned-to-options{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex}.ticket-assigned-users .not-assigned-users .assigned-to-options a{margin-right:.2rem}.ticket-assigned-users .not-assigned-users .assign-to-me,.ticket-assigned-users .not-assigned-users .user-assigned{color:#5b8200;cursor:default}.colors-table .row.edition .current-color,.ticket-assigned-users .not-assigned-users .assign-to-me:hover,.ticket-assigned-users .not-assigned-users .user-assigned:hover{cursor:pointer}.ticket-assigned-users .not-assigned-users .assign-to-me .icon,.ticket-assigned-users .not-assigned-users .user-assigned .icon{fill:currentColor;height:.75rem;width:.75rem}.ticket-assigned-users .user-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-users .user-avatar img{width:100%}.ticket-assigned-users .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-users .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-users .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.category-config{border-bottom:1px solid #767676}.category-config:first-child{border-top:1px solid #767676}.category-config .resume{-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:-ms-flexbox;display:flex;padding:1rem;position:relative}.category-config .resume.open-drawer .icon{transform:rotate(90deg)}.category-config .icon{transform:rotate(0);transition:all .4s}.category-config .resume-title{width:280px}.category-config .count{color:#767676;float:left;padding-right:5px}.category-config .summary-role{-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#767676;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#5b8200}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .category-items{max-height:0;transition:max-height .5s ease-in;overflow:hidden;background-color:#e4e3e3;width:100%}.colors-table .table-header .row:hover,.colors-table .table-header:hover{background:0 0}.category-config .category-items.open{transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;border-bottom:3px solid #e4e3e3}.colors-table .table-header .row{padding-left:50px}.colors-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:last-child{border:0}.colors-table .row.edition{padding-left:3rem}.colors-table .row.hidden{display:none}.colors-table .row:hover{background:rgba(216,248,121,.2);cursor:move;transition:background .2s ease-in}.colors-table .row:hover .icon{opacity:1;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;transition:opacity .3s linear}.colors-table .row.no-draggable{padding-left:50px}.colors-table .row.no-draggable:hover{cursor:auto}.colors-table .row .color-column{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.colors-table .row .color-name,.colors-table .row .status-name{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 10px;position:relative}.colors-table .row .color-name span,.colors-table .row .status-name span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.colors-table .row .color-name{-ms-flex-preferred-size:100px;flex-basis:100px}.colors-table .row .status-slug{display:none;-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:6;flex-grow:6;padding:0 10px}@media (min-width:1400px){.colors-table .row .status-slug{display:block}}.colors-table .row .status-slug span{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:100px;text-align:center}.colors-table .row .status-wip-limit{display:none;max-width:100px;padding:0 0 0 10px;text-align:center}@media (min-width:1400px){.colors-table .row .status-wip-limit{display:block}}.colors-table .options-column a{cursor:pointer;display:inline-block}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#e4e3e3;border-radius:2px;height:40px;width:40px}.colors-table .icon{cursor:pointer;fill:#767676;margin-right:1rem;opacity:0}.colors-table .icon:hover{fill:#9dce0a;transition:all .2s ease-in}.colors-table .icon.icon-check{cursor:default;fill:#5b8200;opacity:1}.colors-table .icon.icon-merge{cursor:default;opacity:1}.colors-table .icon.icon-search{cursor:none;fill:#5b8200;opacity:1}.colors-table .icon.icon-drag{cursor:move}.colors-table .icon.icon-trash{fill:#ff8282}.colors-table .gu-mirror{background:#e9ffb5;opacity:1}.colors-table .gu-transit *{visibility:hidden}.contrib-plugins-wrapper{margin:1rem 0 2rem}.contrib-plugins-wrapper label{font-size:.9rem;display:block;margin-bottom:.5rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header{-ms-flex-line-pack:justify;align-content:space-between;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value,.lightbox h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header .icon{cursor:pointer}.duty-custom-fields .custom-fields-header .collapse{display:block;transform:rotate(-90deg);transition:.1s ease-out}.duty-custom-fields .custom-fields-header .open{transform:rotate(0)}.duty-custom-fields .custom-field-single{border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;padding:.7rem}.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-options{margin:0;opacity:0;transition:opacity .2s linear}.duty-custom-fields .custom-field-options a{display:inline-block}.duty-custom-fields .custom-field-options svg{fill:#767676}.duty-custom-fields .custom-field-options svg:hover{fill:#5b8200}.duty-custom-fields .custom-field-data{-ms-flex:0;flex:0;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem;color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-value{-ms-flex-align:start;align-items:flex-start;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.duty-custom-fields .custom-field-value.js-value-view-mode{white-space:pre-line}.duty-custom-fields .custom-field-value.js-value-view-mode.wysiwyg{white-space:normal}.duty-custom-fields form label{cursor:pointer}.duty-custom-fields form input{width:100%}.custom-fields-body{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:50%;flex-basis:50%}@media (max-width:1280px){.custom-fields-body.collapse-fields .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even),.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0}}.custom-fields-body.collapse-fields .custom-attribute:nth-child(even){padding:0 0 0 2rem}.custom-fields-body.collapse-fields .custom-attribute:nth-child(odd){padding:0 2rem 0 0}.custom-fields-body .custom-attribute{-ms-flex-preferred-size:100%;flex-basis:100%}.custom-fields-body .custom-attribute:nth-child(even),.custom-fields-body .custom-attribute:nth-child(odd){padding:0}.custom-fields-body .custom-field-single{height:100%}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#767676;margin-top:.5rem}.external-reference a{border-left:1px solid #767676;padding:0 .2rem;transition:color .3s linear}.external-reference a:hover{color:#5b8200}.external-reference a:first-child{border:0}.lightbox{background:rgba(255,255,255,.95);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox .close{width:2rem;height:2rem;cursor:pointer;fill:#555;position:absolute;right:3rem;top:3rem;transition:fill .2s;display:block}.lightbox .close:hover{fill:#ff8282}.lightbox .close svg{width:2rem;height:2rem;pointer-events:none}.lightbox.open{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1;transition:opacity .3s ease}.lightbox.close{opacity:0;transition:opacity .3s ease}.lightbox .lb-icon{margin:1rem auto;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox .lb-icon svg{width:6rem;height:6rem;display:block;fill:#e4e3e3}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox h2{font-size:2rem}.lightbox-generic-form form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form fieldset{position:relative}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{font-size:.75rem;background:#f5f5f5;border:1px solid #767676;color:#444;cursor:pointer;display:block;padding:7px 30px;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #5b8200}.lightbox-generic-form .settings .iocaine svg,.lightbox-generic-form .settings .requirement svg{width:.75rem;height:.75rem}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#5b8200;border:1px solid #5b8200;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-search fieldset,.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox-generic-form .attachment-delete svg{fill:#767676;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-sprint-add-edit .delete-sprint .icon,.lightbox-sprint-add-edit .delete-sprint:hover .icon{fill:currentColor}.lightbox-generic-bulk form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-sprint-add-edit form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem;color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-sprint-add-edit .delete-sprint{font-size:.9rem;color:#555;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-ask-choice .subtitle,.lightbox-generic-ask .subtitle{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint:hover{color:red;transition:color .3s linear}.lightbox-generic-ask form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .subtitle{white-space:pre-line}.lightbox-generic-ask .options{display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-ask-choice .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.lightbox-delete-account p{text-align:center}.lightbox-delete-account form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .newsletter input+label{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox-delete-project .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1.2rem}.lightbox-delete-account .options{display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:100%;max-width:100%;width:100%}.backlog-sprints-menu::after,.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after,.ticket-header .pop-status:after{content:'';transform:rotate(45deg)}.lightbox-generic-loading .progress-bar-wrapper{background:#d7d6d6;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#d7d6d6;bottom:35px;color:#555;padding:.3rem;position:absolute;transition:left .1s linear}.lightbox-import-error .description a,.lightbox-select-user .add-comment a{color:#5b8200}.lightbox-create-issue form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-select-user .add-comment textarea,.lightbox-select-user .submit-button{margin-top:1rem}.lightbox-block .form{-ms-flex-preferred-size:420px;flex-basis:420px;-ms-flex-positive:0;flex-grow:0;width:420px}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.lightbox-select-user .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:rgba(216,248,121,.3);cursor:pointer}.lightbox-select-user .user-list-single:hover{transition:background .3s linear;transition-delay:.2s}.lightbox-select-user .more-watchers{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;padding:.5rem;text-align:center}.lightbox-select-user .add-comment{position:relative;text-align:center}.lightbox-select-user .add-comment .icon-close{cursor:pointer;fill:#555;position:absolute;right:0;top:0;transition:fill .2s}.lightbox-select-user .add-comment .icon-close:hover{fill:#ff8282}.lightbox-select-user .add-comment .icon-close svg{width:2rem;height:2rem}.lb-create-edit-userstory .points-per-role{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{-ms-flex-preferred-size:100%;flex-basis:100%;margin:.1rem 0;min-width:100%}.lightbox-import-error{text-align:center}.lightbox-import-error .content{width:500px}.lightbox-import-error h2{margin-top:1rem}.lightbox-import-error img{height:5rem}.lightbox-leave-project-warning{text-align:center}.lightbox-leave-project-warning .icon{fill:#767676;height:3rem;margin-bottom:1rem;width:3rem}.lightbox-set-due-date .delete-due-date .icon,.lightbox-set-due-date .delete-due-date:hover .icon{fill:currentColor}.lightbox-leave-project-warning .content,.lightbox-request-ownership .content{width:500px}.lightbox-request-ownership{text-align:center}.lightbox-set-due-date{z-index:9999}.lightbox-set-due-date form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-set-due-date .date{margin:2rem 0 1rem}.lightbox-set-due-date .reason textarea{margin-top:.5rem}.lightbox-set-due-date .due-date-suggestions{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:1rem 0 .5rem}.lightbox-set-due-date .suggestion{background:rgba(184,184,184,.2);color:#B8B8B8;-ms-flex-pack:start;justify-content:flex-start;margin:0 .5rem .5rem;min-height:2rem;padding:.5rem .75rem;position:relative}.lightbox-set-due-date .suggestion:first-child{margin-left:0}.lightbox-set-due-date .suggestion:nth-child(4n+4){margin-right:0}.lightbox-set-due-date .suggestion.clickable.active,.lightbox-set-due-date .suggestion.clickable:hover{background:rgba(157,206,10,.9);color:#fff}.lightbox-set-due-date .delete-due-date{font-size:.9rem;color:#555;float:right;margin:1rem .25rem 0 0;transition:color .3s linear}.lightbox-set-due-date .delete-due-date:hover{color:red;transition:color .3s linear}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:calc(100vh - 40px);min-width:50px;padding:1rem 0;position:relative;z-index:99}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav,.main-nav a,.main-nav li{position:relative}.main-nav{padding:0;text-align:center}.main-nav a{padding:1.1rem .8rem}.main-nav a:hover{background:rgba(0,0,0,.2);transition:color .3s linear}.main-nav a:hover svg{fill:#9dce0a;transition:fill .3s linear}.backlog-sprints-menu,.main-nav a:hover .helper{animation:slideLeft .2s ease-in-out both;padding:.4rem 1rem;transition:all .2s;position:absolute;white-space:nowrap}.main-nav a:hover .helper{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:calc(50% - 1rem);z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .item{font-size:1.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.backlog-sprints-menu{font-size:.9rem;background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;top:1rem;z-index:99}.backlog-sprints-menu a{color:#fff;padding:.6rem .8rem;text-align:left;text-transform:none}.backlog-sprints-menu a:nth-child(2){padding:1rem .8rem .6rem}.backlog-sprints-menu a:last-child{padding:.6rem .8rem .4rem}.backlog-sprints-menu a:hover{background:0 0}.backlog-sprints-menu::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(1rem - 12px/2);width:12px;z-index:98}.related-tasks,.related-tasks-body .status{position:relative}.related-tasks{margin-bottom:2rem}.related-tasks-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .related-tasks-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#9dce0a}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}.related-tasks-body .row:hover .task-settings{opacity:1;transition:all .2s ease-in}.related-tasks-body .row .task-name{-ms-flex:1;flex:1}.related-tasks-body .row .task-settings{-ms-flex-negative:0;flex-shrink:0;width:60px}.related-tasks-body .row .status{-ms-flex-negative:0;flex-shrink:0;width:125px}.related-tasks-body .row .assigned-to{cursor:pointer;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .iocaine{background:rgba(157,206,10,.1);border-left:10px solid #9dce0a}.related-tasks-body .task-name{display:-ms-flexbox;display:flex;margin-right:1rem}.related-tasks-body .task-name span{margin-right:.25rem}.related-tasks-body .task-name input{font-size:1rem;margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .pop-status,.ticket-header .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;list-style-type:none;z-index:99;text-align:"center"}.related-tasks-body .task-name.loading span{animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover{left:0;top:1rem}.related-tasks-body .status .popover a{display:block}.related-tasks-body .status .icon{width:.8rem;height:.8rem;fill:currentColor;margin-left:.2rem}.related-tasks-body .closed,.related-tasks-body .closed:hover{border-left:10px solid #e4e3e3;color:#e4e3e3}.related-tasks-body .closed a,.related-tasks-body .closed svg,.related-tasks-body .closed:hover a,.related-tasks-body .closed:hover svg{fill:#e4e3e3}.related-tasks-body .closed .task-name a,.related-tasks-body .closed:hover .task-name a{color:#e4e3e3;text-decoration:line-through}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .pop-status{font-size:.9rem;background:#050505;color:#fff;display:none;left:40%;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px}.related-tasks-body .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:rgba(255,130,130,.2);border-left:10px solid #ff8282}.related-tasks-body .task-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;opacity:0}.related-tasks-body .task-settings svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}.related-tasks-body .task-settings svg:hover{fill:#555}.related-tasks-body .task-settings a:hover{cursor:pointer}.related-tasks-body .delete-task:hover .icon-edit,.related-tasks-body .edit-task:hover .icon-edit,.related-tasks-body .save-task:hover .icon-edit{fill:#444}.related-tasks-body .delete-task:hover .icon-save,.related-tasks-body .edit-task:hover .icon-save,.related-tasks-body .save-task:hover .icon-save{fill:#5b8200}.related-tasks-body .delete-task:hover .icon-trash,.related-tasks-body .edit-task:hover .icon-trash,.related-tasks-body .save-task:hover .icon-trash{fill:#ff8282}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{width:.8rem;height:.8rem;fill:#767676;opacity:0;position:absolute;right:.5rem;top:.5rem;transition:opacity .3s linear}.related-tasks-body .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.related-tasks-body .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .ticket-title{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;text-transform:uppercase;vertical-align:sub}.ticket-header .detail-status{font-size:.9rem;display:-ms-flexbox;display:flex;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-down{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem}.ticket-header .detail-status-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start}.ticket-header .detail-status-inner>span{color:#fff;padding:.15rem .25rem;text-transform:uppercase}.ticket-header .pop-status{font-size:.9rem;background:#050505;color:#fff;display:none;left:0;margin:0;position:absolute;top:1.25rem;width:150px;padding:0;text-transform:none}.ticket-data-container,.ticket-header .pop-status a{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.ticket-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem;text-align:left}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;left:30px;top:30px;text-align:"left";font-size:.9rem;z-index:99;list-style-type:none}.ticket-data-container .icon{width:.7rem;height:.7rem;color:currentColor;margin-left:.25rem}.ticket-status .priority-data .pop-priority:after,.ticket-status .severity-data .pop-severity:after,.ticket-status .type-data .pop-type:after{content:'';height:15px;transform:rotate(45deg)}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.ticket-status .level-name{color:#b2afaf;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#cbc9c9;transition:background .2s ease-in}.ticket-status .type-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .type-data .pop-type a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;position:absolute;width:0}.ticket-status .severity-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-status .severity-data .pop-severity a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;position:absolute;width:0}.ticket-status .priority-data{background:#d7d6d6;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;margin:0;padding:10px;position:absolute;width:150px}.ticket-watch .ticket-watch-button,.ticket-watch svg{margin-right:.25rem}.ticket-status .priority-data .pop-priority a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;position:absolute;width:0}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.introjs-tooltip p,.single-project .description,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-watch .ticket-watch-inner{display:-ms-flexbox;display:flex}.ticket-watch svg{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem;background:#767676;color:#fff;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;transition:background .25s}.ticket-watch .add-watcher svg,.ticket-watch .ticket-watch-button svg{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#9dce0a}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:red;color:#e4e3e3;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff8282}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#9dce0a}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff8282}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-detail-settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#767676;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#555}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff8282}.ticket-detail-settings .item-unblock:hover{background:red}.ticket-detail-settings .button-delete{background:#ff8282}.ticket-detail-settings .button-delete:hover{background:red}.ticket-detail-settings svg{fill:#fff;height:100%}.ticket-detail-settings .icon-lock{margin:0}.ticket-detail-settings a{display:block}.epic-header-container{display:-ms-flexbox;display:flex}.epic-header-container .color-selector{margin-right:.5rem}.epic-header-container tg-detail-header{-ms-flex:1;flex:1;width:100%}.introjs-overlay{background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(228,227,227,.2) 100%);background-color:#e4e3e3}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#5b8200;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .single-project-intro{display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-ms-flex:1;flex:1}.single-project .intro-options{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.single-project h1{color:#5b8200;display:inline-block;line-height:1.2;margin-bottom:0;vertical-align:middle}.single-project .private{width:1.1rem;height:1.1rem}.single-project .track-buttons-container{display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{font-size:.9rem;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.25rem}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#5b8200}.single-project .track-container .list-itemtype-track-likers.active .icon,.single-project .track-container .list-itemtype-track-watchers.active .icon{fill:currentcolor}.single-project .track-container .icon{fill:#767676}.single-project .description{font-size:1rem;margin:0}.single-project .project-data{display:-ms-flexbox;display:flex}.single-project .title{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-ms-flex:1;flex:1;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .looking-for-people h3{font-size:.9rem}.single-project .looking-for-people .is-empty{margin-bottom:.5rem}.single-project .looking-for-people p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.single-project .looking-for-people .contact-team{margin-bottom:1rem}.single-project .involved-data{-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-team{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-team li{-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem;position:relative}.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-team a{display:block}.single-project .involved-team img{border-radius:.2rem;width:100%}.single-project .involved-team .icon-badge{width:1.2rem;height:1.2rem;background:rgba(0,0,0,.5);bottom:5%;padding:.1rem;position:absolute;right:5%}.issues-options{-ms-flex-align:center;align-items:center;background-color:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table{display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f0ffcf;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{font-size:.9rem;border-bottom:1px solid #dad9d9}.issues-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-ms-flex-preferred-size:60%;flex-basis:60%;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-ms-flex-preferred-size:85px;flex-basis:85px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:85px}.issues-table .votes{color:#555;cursor:pointer;-ms-flex-preferred-size:75px;flex-basis:75px;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes:hover{color:#9dce0a;transition:all .2s linear}.issues-table .votes:hover svg{fill:#9dce0a;transition:all .2s linear}.issues-table .votes.inactive{color:#767676}.issues-table .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.issues-table .icon-arrow-down,.issues-table .icon-arrow-up{width:.7rem;height:.7rem;fill:#767676;margin-left:.25rem;vertical-align:middle}.issues-table .is-voted{color:#9dce0a;transition:all .2s linear}.issues-table .is-voted svg{fill:#9dce0a;transition:all .2s linear}.issues-table .is-voted:hover{color:#ff8282}.issues-table .is-voted:hover svg{fill:#ff8282;transform:rotate(180deg)}.issues-table .pop-status:after,.table-team .popover:after{transform:rotate(45deg);content:''}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:block}.issues-table .subject span{vertical-align:middle}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field .icon,.issues-table .created-field .icon,.issues-table .issue-field .icon{width:.75rem;height:.75rem;fill:currentColor;margin-left:.25rem;vertical-align:middle}.issues-table .assigned-field{-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{width:.75rem;height:.75rem;opacity:0;position:absolute;right:0;top:.75rem;transition:opacity .3s linear}.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99;text-align:"center"}.kanban-table-body .task-column .kanban-column-intro,.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.issues-table .pop-status a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.issues-table .pop-status a:hover{color:#9dce0a;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;height:15px;position:absolute;width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.issues-table .issue-status{display:inline-block}.kanban-table{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table.zoom-0 .task-colum-name,.kanban-table.zoom-0 .task-column{max-width:148px}.kanban-table.zoom-0 .task-colum-name span{padding-right:1rem}.kanban-table .vfold tg-card{display:none}.kanban-table .vfold.task-colum-name{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold.task-colum-name .option:not(.hunfold),.kanban-table .vfold.task-colum-name .title,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{-ms-flex-preferred-size:2.4rem;flex-basis:2.4rem;min-height:2.4rem;position:relative}.kanban-table-header .kanban-table-inner{display:-ms-flexbox;display:flex;overflow:hidden;position:absolute;width:100%}.kanban-table-header .options{display:-ms-flexbox;display:flex}.kanban-table-header .task-colum-name{font-size:1rem;-ms-flex-align:center;align-items:center;color:#555;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;margin:0 5px 0 0;max-width:296px;padding:.5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name .title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;width:100%}.kanban-table-header .task-colum-name .title .counter{font-size:.75rem;line-height:1.6;margin:0 .5rem}.kanban-table-header .task-colum-name .title .name{display:inline-block;max-width:65%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.kanban-table-header .task-colum-name .option{margin-right:.3rem}.kanban-table-header .task-colum-name .icon{fill:#767676;height:1rem;transition:color .2s linear;width:1rem}.kanban-table-header .task-colum-name .icon:hover{fill:#5b8200}.kanban-table-body{font-size:1rem;display:-ms-flexbox;display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-ms-flex-preferred-size:296px;flex-basis:296px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin:0 5px 0 0;max-width:296px;overflow-y:auto;widows:296px;width:296px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem;color:#767676;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-body .kanban-task-selected.card:not(.gu-transit-multi){box-shadow:0 0 0 1px #9dce0a,2px 2px 4px #cbc9c9}.kanban-table-inner{display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.card-transit-multi{background:#dfdede;border:1px dashed #d0cece;display:none;opacity:1;padding:1rem}.search-filter,.search-result-table,.table-team .hero .row{border-top:1px solid #e4e3e3}.card-transit-multi .fake-img,.card-transit-multi .fake-text{background:#d0cece}.card-transit-multi .fake-us{display:-ms-flexbox;display:flex;margin-bottom:1rem}.card-transit-multi .fake-us:last-child{margin-bottom:0}.card-transit-multi .column{padding-left:.5rem;width:100%}.card-transit-multi .fake-img{-ms-flex-preferred-size:48px;flex-basis:48px;-ms-flex-negative:0;flex-shrink:0;height:48px;width:48px}.card-transit-multi .fake-text{height:1rem;margin-bottom:1rem;width:80%}.card-transit-multi .fake-text:last-child{margin-bottom:0;width:40%}.card.gu-transit-multi .card-transit-multi{display:block}.card.gu-transit-multi .card-inner{display:none}.search-filter{display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#767676;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{transition:color .3s linear}.search-filter a:hover .icon{fill:currentColor}.search-filter a.active{border-left:1px solid #e4e3e3;border-right:1px solid #e4e3e3;color:#444;position:relative;top:1px}.search-filter a.active .icon{fill:#9dce0a}.search-filter .icon{fill:currentColor;margin-right:.4rem}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#767676}.search-in input::-moz-placeholder{color:#767676}.search-in input:-moz-placeholder{color:#767676}.search-in input:-ms-input-placeholder{color:#767676}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{fill:#767676}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .row{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-ms-flex-preferred-size:30px;flex-basis:30px;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-positive:10;flex-grow:10;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .sprint,.search-result-table .row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#e9ffb5;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.single-filter .name img,.tag img,.wiki-nav .add-button{vertical-align:middle}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon{font-size:1rem;color:#767676}.search-result-table .user-story-name .icon:hover{color:#444;transition:color .3s linear}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #e4e3e3}.search-result-table .points,.search-result-table .sprint,.search-result-table .status{position:relative}.search-result-table .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters li{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676;text-transform:uppercase}.table-team .attribute,.table-team .attribute .points{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.team-filters li:last-child{border-bottom:0}.team-filters li .icon{fill:#050505;opacity:0;transition:opacity .3s linear}.team-filters a{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.team-filters a.active,.team-filters a:hover{color:#5b8200;transition:color .3s linear}.team-filters a.active .icon,.team-filters a:hover .icon{fill:currentColor;opacity:1}.team-filters .active{opacity:1;transition:opacity .3s linear}.table-team .row{padding:.5rem}.table-team .username{-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:6;flex:6;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{width:1.75rem;height:1.75rem;fill:#555}.table-team .attribute .points{font-size:1.6rem;color:#444}.table-team .attribute .top{fill:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{font-size:.9rem;color:#ff8282}.table-team .leave-project .icon{width:.8rem;height:.8rem;fill:currentColor;margin-right:.2rem}.table-team .leave-project:hover{color:red}.table-team .leave-project:hover .icon{color:currentColor;transition:fill .3s linear}.table-team .team-header{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:0}.table-team .hero{width:100%}.table-team .hero .row{border-bottom:1px solid #e4e3e3;margin:1rem 0;padding:1.5rem 1rem}.table-team .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.table-team .avatar img{-ms-flex-preferred-size:66px;flex-basis:66px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;width:66px}.table-team .avatar .avatar-data{margin-left:1rem}.table-team .avatar .avatar-data span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.table-team .avatar .position{color:#767676}.table-team .popover{font-size:.9rem;background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99;text-align:"center"}.table-team .popover a{font-size:.9rem;border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;height:15px;left:50%;position:absolute;width:15px}.table-team .icon-badge{position:relative;top:.15rem}.policy-table .policy-table-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:2px solid #767676}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#5b8200;transition:background .3s linear}.policy-table label{background:#767676;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile{max-width:780px}.user-profile form{display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;transform-origin:center center}.user-profile .use-default-image{font-size:1rem;display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-top:.5rem}.user-profile .delete-account,.user-profile .download-profile{font-size:.9rem;display:block;-ms-flex:1;flex:1;margin-top:.5rem}.user-profile .delete-account{text-align:right}.wiki-nav{padding:0;width:240px}.wiki-nav .title{font-size:1.6rem;padding:2rem 1rem 0 2rem}.wiki-nav .add-button{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:1rem 1rem 1rem 2rem;text-transform:uppercase}.wiki-nav .add-button:hover svg{background:#9dce0a}.wiki-nav .add-button svg{width:1.25rem;height:1.25rem;background:#767676;border-radius:2px;fill:#fff;margin-right:.5rem;padding:.25rem;transition:background .2s linear}.wiki-nav .wiki-link-container{margin:0}.wiki-nav .wiki-link-container.wiki-all-links{border-top:1px solid #767676}.wiki-nav input[type=text]{background:#e4e3e3;color:#444;margin:1rem 1rem 1rem 2rem;width:80%}.wiki-nav input[type=text]::-webkit-input-placeholder{color:#767676}.wiki-nav input[type=text]::-moz-placeholder{color:#767676}.wiki-nav input[type=text]:-moz-placeholder{color:#767676}.wiki-nav input[type=text]:-ms-input-placeholder{color:#767676}.wiki-nav .loading{padding:1rem;text-align:center}.wiki-link{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-left:2rem;padding-right:1rem;position:relative}.wiki-link:hover .remove-wiki-page{cursor:pointer;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link:hover .dragger{cursor:move;opacity:1;transition:opacity .2s linear;transition-delay:.1s}.wiki-link.gu-mirror{border-bottom:0}.wiki-link.fixed-link{font-size:1.2rem;text-transform:uppercase}.wiki-link.is-sortable{cursor:move}.wiki-link .link-title{cursor:pointer;display:block;-ms-flex-positive:1;flex-grow:1;padding:1rem 0}.wiki-link .dragger{fill:#767676;left:-1rem;opacity:0;position:absolute;top:1rem}.wiki-link .dragger svg{width:.7rem;height:.7rem}.wiki-link .remove-wiki-page{opacity:0}.wiki-link .remove-wiki-page:hover .icon{fill:red}.wiki-pages-table{display:-ms-flexbox;display:flex}.wiki-pages-table .row{padding:.5rem}.wiki-pages-table .title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wiki-pages-table .table-main{font-size:.9rem}.wiki-pages-table .title-field{-ms-flex-preferred-size:180px;flex-basis:180px;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.wiki-pages-table .created-field,.wiki-pages-table .modified-field{-ms-flex-preferred-size:10vw;flex-basis:10vw;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.wiki-pages-table .editions-field{-ms-flex-preferred-size:80px;flex-basis:80px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;text-align:center}.wiki-pages-table .creator-field,.wiki-pages-table .last-modifier-field{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:200px;flex-basis:200px}.wiki-pages-table .creator-field .user-avatar,.wiki-pages-table .last-modifier-field .user-avatar{-ms-flex-positive:0;flex-grow:0}.wiki-pages-table .creator-field .user-avatar img,.wiki-pages-table .last-modifier-field .user-avatar img{height:2rem}.wiki-pages-table .creator-field .user-full-name,.wiki-pages-table .last-modifier-field .user-full-name{-ms-flex-positive:1;flex-grow:1;padding:.5rem}.wiki-summary{-ms-flex-align:center;align-items:center;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.wiki-summary.summary{background:#f5f5f5;color:#555}.wiki-summary div{display:-ms-flexbox;display:flex;margin-right:1.25rem}.wiki-summary .wiki-user-modification{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary .avatar{margin-right:.5rem;width:2.25rem}.wiki-summary img{height:100%;width:100%}.wiki-summary .username{font-size:1.2rem;white-space:nowrap}.wiki-summary .remove{fill:#767676;margin-left:auto;transition:fill .1s linear}.wiki-summary .remove:hover{cursor:pointer;fill:#ff8282}.wiki-summary .remove svg{width:1.5rem;height:1.5rem}.attachment-gallery{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;display:inline-block}.attachment-gallery .attachment-image{display:inline-block}.attachment-gallery img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery.deprecated img{opacity:.5}.attachment-gallery.deprecated .attachment-name{color:#767676}.attachment-gallery .attachment-data{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .icon-delete{margin-left:auto;opacity:0;transition:opacity .2s ease-in;transition-delay:.1s}.attachment-gallery .icon-delete svg{fill:#ff8282}.attachment-gallery .icon-delete:hover svg{color:red}.attachment-gallery .loading-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:150px;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#767676}.attachment-list .attachment-name{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;-ms-flex-preferred-size:25%;flex-basis:25%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-ms-flex:2;flex:2;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span{color:#555}.attachment-list .attachment-size{-ms-flex-preferred-size:125px;flex-basis:125px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:10%;flex-basis:10%;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .settings{opacity:0}.attachments .gu-mirror,.card-owner:hover .card-owner-actions{opacity:1}.attachment-list .attachment-settings .editable-settings{display:block;opacity:1}.attachment-list .attachment-settings svg{fill:#767676;pointer-events:none}.attachment-list .attachment-settings .icon-edit:hover,.attachment-list .attachment-settings .icon-save:hover{fill:#5b8200}.attachment-list .attachment-settings .icon-close:hover,.attachment-list .attachment-settings .icon-trash:hover{fill:red}.attachment-list .attachment-settings .icon-drag{cursor:move}.attachment-list .editable-attachment-deprecated{display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#767676}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#444}.attachment-list .percentage{background:rgba(91,130,0,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments{margin-bottom:4rem}.attachments .gu-transit{background:#e4e3e3;height:40px}.attachments .gu-transit *{display:none}.attachments .gu-mirror form{background:#e9ffb5;box-shadow:1px 1px 10px rgba(0,0,0,.1);transition:background .2s ease-in}.attachments-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .attachments-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1rem;color:#444;line-height:36px;padding:0 1rem}.attachments-header .options{display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#555;border:0;display:inline-block;padding:.5rem;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#9dce0a}.attachments-header label svg{fill:#fff;height:1.2rem;margin-bottom:-.2rem;width:1.2rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#9dce0a}.attachments-header button svg{fill:#767676;height:1.6rem;width:1.6rem}.attachments-header .size-info{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;padding-left:1rem}.attachments-empty,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.more-attachments span,.single-attachment .attachment-size{color:#767676}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #e4e3e3;color:#767676;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment{font-size:.9rem;background:rgba(255,255,255,.9)}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name svg{fill:#555;height:.9rem;margin-right:.25rem;width:.9rem}.more-attachments{font-size:.9rem;border-bottom:1px solid #767676;display:block;padding:1rem 0 1rem 1rem}.more-attachments .more-attachments-num{color:#5b8200;margin-left:.5rem}.more-attachments:hover{background:#e9ffb5;transition:background .2s ease-in}.attachment-preview .attachment-preview-container svg{width:3rem;height:3rem;fill:#767676}.attachment-preview .attachment-preview-container svg:hover{fill:#9dce0a;transition:fill .3s linear}.attachment-preview .previous{left:3rem;position:absolute;top:calc(50% - 3rem)}.attachment-preview .next{position:absolute;right:3rem;top:calc(50% - 3rem)}.attachment-preview img{max-height:80vh;max-width:80vw}.assignable-member-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:.25rem 0}.assigned-members-option .assignable-member-single{background:#fff;border-bottom:1px solid #e4e3e3;cursor:pointer}.assignable-member-single:hover{background:rgba(157,206,10,.05)}.assignable-member-single .assignable-member-avatar{-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.5rem;max-height:3rem;max-width:3rem}.assignable-member-single .assignable-member-name{-ms-flex:1;flex:1}.assigned-to-container{width:600px}.assignable-member-list{margin-top:1rem}.assignable-member-list .assigned-member{-ms-flex-align:center;align-items:center;background:rgba(157,206,10,.05);border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.assignable-member-list .unassign-epic{cursor:pointer;margin-right:1rem}.assignable-member-list .icon{fill:#ff8282;transition:fill .2s}.assignable-member-list .icon:hover{cursor:pointer;fill:red}.belong-to-epic-pill-wrapper{display:inline-block;position:relative}.belong-to-epic-pill-wrapper:hover .belong-to-epic-pill-data{display:block}.belong-to-epic-pill{background-color:#f5f5f5;border-radius:50%;display:inline-block;height:.7rem;margin:0 .1rem;position:relative;width:.7rem}.belong-to-epic-text-wrapper{margin-right:1rem}.belong-to-epic-text{margin-left:.25rem}.belong-to-epic-label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.75rem;background:#444;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.detail-title-wrapper,.edit-title-wrapper{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.range-slider{-webkit-appearance:none;display:block;margin:7px 0;width:200px}.range-slider:focus{outline:0}.range-slider:focus::-webkit-slider-runnable-track{background:#8da08e}.range-slider:focus::-webkit-slider-thumb{box-shadow:0 0 0 4px rgba(68,68,68,.3)}.range-slider:focus::-moz-range-thumb{box-shadow:0 0 0 4px rgba(68,68,68,.3)}.range-slider:focus::-ms-fill-lower{background:#e4e3e3}.range-slider:focus::-ms-fill-upper{background:#e9e8e8}.range-slider::-webkit-slider-runnable-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#e4e3e3;border:0 solid transparent;border-radius:1px}.range-slider::-webkit-slider-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s;-webkit-appearance:none;margin-top:-5.5px}.range-slider::-moz-range-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:#e4e3e3;border:0 solid transparent;border-radius:1px}.range-slider::-moz-range-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s}.range-slider::-ms-track{width:200px;height:3px;cursor:pointer;transition:all .2s ease;background:0 0;border-color:transparent;border-width:14px 0;color:transparent}.card-inner.card-blocked .card-estimation,.card-inner.card-blocked .card-owner-name,.card-inner.card-blocked .card-title a,.card-inner.card-blocked .statistic,.card-inner.card-blocked .statistic.active,.card-inner.card-blocked.zoom-0 .card-title,.card-inner.card-blocked.zoom-1 .card-title{color:#fff}.range-slider::-ms-fill-lower{background:#dfdede;border:0 solid transparent;border-radius:2px}.range-slider::-ms-fill-upper{background:#e4e3e3;border:0 solid transparent;border-radius:2px}.range-slider::-ms-thumb{border:0 solid transparent;height:14px;width:14px;border-radius:50%;background:#444;cursor:pointer;box-shadow:0 0 0 2px rgba(68,68,68,.3);transition:box-shadow .2s}.card{box-shadow:2px 2px 4px #cbc9c9;cursor:move;display:block;margin:0 .6rem .6rem;outline:0;overflow:hidden;transition:box-shadow .2s ease-in}.card .loading-extra.loading{padding:.2rem;text-align:center}.card:hover{box-shadow:3px 3px 6px #cbc9c9}.card-inner{background:#fff;border-radius:.25rem}.card-inner.zoom-0 .card-title,.card-inner.zoom-1 .card-title{-ms-flex:1;flex:1;margin:0;padding:.25rem}.card-inner.zoom-1 .card-owner-info{-ms-flex-align:start;align-items:flex-start}.card-inner.card-blocked{background:#ff8282}.card-inner.card-blocked .card-owner-actions,.card-inner.card-blocked .card-unfold:hover{background:rgba(255,130,130,.9)}.card-inner.card-blocked svg{fill:#fff}.card-owner-actions:hover svg,.card-statistics .statistic.active svg{fill:currentColor}.card-tags{display:-ms-flexbox;display:flex}.card-tags .card-tag{display:block;-ms-flex:1;flex:1;height:.5rem}.card-owner{position:relative}.card-owner .card-owner-info{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.card-owner .card-owner-info.multiple .card-owner-avatar img{margin-right:.45rem}.card-owner .card-owner-avatar{line-height:0;position:relative}.card-owner .is-iocaine{-webkit-filter:hue-rotate(265deg) saturate(3);filter:hue-rotate(265deg) saturate(3)}.card-owner img{-ms-flex-negative:0;flex-shrink:0;height:2.5rem;margin-right:.5rem;width:2.5rem}.card-owner .card-owner-name{color:#767676}.card-owner-actions{background:rgba(255,255,255,.9);display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;left:0;opacity:0;position:absolute;top:0;transition:all .2s;width:100%}.card-owner-actions:hover{color:#9dce0a}.card-owner-actions .card-actions{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:0 .5rem}.card-owner-actions .card-delete:hover{color:#ff8282}.card-owner-actions .icon{width:1.2rem;height:1.2rem;display:inline-block;margin-right:.25rem;padding:0}.card-owner-actions a{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;padding:.6rem .5rem}.card-title{font-size:1rem;line-height:1.25;margin-bottom:.25rem;padding:1rem 1rem 0}.card-title span{padding-right:.25rem}.card-data{color:#767676;display:-ms-flexbox;display:flex;font-size:14px;-ms-flex-pack:justify;justify-content:space-between;padding:0 1rem .5rem}.card-data .card-estimation.not-estimated{font-size:.8125rem}.card-statistics{font-size:.9rem;color:#b6b6b6;display:-ms-flexbox;display:flex;margin-left:auto}.card-statistics .statistic{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;margin-left:.5rem}.card-statistics .statistic.active{color:#9dce0a}.card-statistics .statistic.card-iocaine{cursor:help}.card-statistics .statistic.card-votes{margin-left:.2rem}.card-statistics .statistic.card-due-date{margin-left:.1rem}.card-statistics .icon{width:.75rem;height:.75rem;fill:#b6b6b6;margin-right:.2rem}.card-statistics .icon-iocaine{fill:#810061}.card-completion{margin:0 1rem .5rem;position:relative}.card-completion .card-completion-bar{background:#e4e3e3;height:.4rem;width:100%}.card-completion .card-completion-percentage{background:#9dce0a;cursor:pointer;height:.4rem;left:0;position:absolute;top:0}.card-completion .card-completion-percentage:hover+.card-tooltip{opacity:1}.card-completion .card-tooltip{background:#050505;border-radius:5px;color:#fff;font-size:14px;left:calc(25% - 50px);opacity:0;padding:.25rem 1rem;position:absolute;text-align:center;top:-2.25rem;transition:opacity .2s;width:100px}.card-completion .card-tooltip::after{background:#000;content:'';height:10px;left:50%;position:absolute;top:70%;transform:rotate(45deg);width:10px}.color-selector .tag-color.empty-color:after,.color-selector .tag-color.empty-color:before{content:"";top:0;height:48px;width:2px;background:#ff8282;position:absolute}.card-unfold{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:0;outline:0;padding:.25rem}.card-unfold:hover{background:linear-gradient(to bottom,#fff,#fcfcfc)}.card-unfold svg{width:2rem;height:.3rem;fill:#e4e3e3}.card-tasks{border-top:1px solid #e4e3e3;margin:.5rem 0 0;padding:0}.card-task{font-size:.75rem;border-bottom:1px solid #e4e3e3}.card-task a{color:#767676;display:block;overflow:hidden;padding:.5rem .75rem;text-overflow:ellipsis;transition:color .2s;white-space:nowrap}.card-task a.blocked-task{color:#ff8282}.card-task a.closed-task{color:#767676;text-decoration:line-through}.card-task a:hover{color:#5b8200}.detail-header-container.blocked,.detail-header-container.blocked .detail-number,.detail-header-container.blocked .detail-subject,.detail-header-container.blocked a{color:#fff}.card-slideshow{position:relative}.card-slideshow:hover .slideshow-left,.card-slideshow:hover .slideshow-right{background:rgba(255,255,255,.2);padding:.25rem;transition:background .2s}.card-slideshow .slideshow-icon{cursor:pointer;position:absolute;top:35%}.card-slideshow .slideshow-icon:hover{background:rgba(157,206,10,.5);transition:background .2s}.card-slideshow svg{width:1.2rem;height:1.2rem;transition:fill .2s}.card-slideshow .slideshow-left,.card-slideshow .slideshow-right{background:0 0;padding:.25rem}.card-slideshow .slideshow-left{left:0}.card-slideshow .slideshow-right{right:0}.card-slideshow img{width:100%}.card-slideshow-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:120px;-ms-flex-pack:center;justify-content:center;overflow:hidden}.card-slideshow-wrapper .loading-spinner{min-height:3rem;min-width:3rem}.color-selector{position:relative}.color-selector .tag-color{cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;border:1px solid #767676;border-radius:0;margin:0;transition:background .3s ease-out}.color-selector .tag-color:nth-child(7n){margin-right:0}.color-selector .tag-color.disabled{cursor:auto}.color-selector .tag-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.color-selector .tag-color.empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector .tag-color.empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.color-selector-dropdown{background:#050505;left:0;padding:1rem;position:absolute;top:2.25rem;width:332px;z-index:99}.color-selector-dropdown-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;margin-bottom:0}.color-selector-dropdown-list .color-selector-option{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0}.color-selector-dropdown-list .color-selector-option:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;margin:0 .5rem .5rem 0;background:#f5f5f5;border:1px solid #e4e3e3;position:relative}.color-selector-dropdown-list .empty-color:after,.color-selector-dropdown-list .empty-color:before{width:2px;height:48px;background:#ff8282;position:absolute;top:0;content:""}.color-selector-dropdown-list .empty-color:nth-child(7n){margin-right:0}.color-selector-dropdown-list .empty-color:after{transform:rotate(-45deg);left:0;transform-origin:top}.color-selector-dropdown-list .empty-color:before{transform:rotate(45deg);right:0;transform-origin:top}.custom-color-selector{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.custom-color-selector .custom-color-input{margin:0;width:100%}.custom-color-selector .display-custom-color-wrapper{background:#f5f5f5;margin-right:.5rem}.custom-color-selector .display-custom-color{border-radius:2px;cursor:pointer;height:2.25rem;width:2.25rem;min-width:2.25rem;-ms-flex-negative:0;flex-shrink:0;margin:0}.custom-color-selector .display-custom-color:nth-child(7n){margin-right:0}.custom-color-selector .display-custom-color.empty-color{background:#f5f5f5;border:1px solid #e4e3e3;position:relative;cursor:default}.custom-color-selector .display-custom-color.empty-color:after{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(-45deg);position:absolute;top:0;left:0;transform-origin:top}.custom-color-selector .display-custom-color.empty-color:before{content:"";width:2px;height:48px;background:#ff8282;transform:rotate(45deg);position:absolute;top:0;right:0;transform-origin:top}.detail-header-container{background:#f5f5f5;-ms-flex:1;flex:1;padding:1rem;position:relative}.detail-header-container.blocked,.detail-title-wrapper.blocked{background:red;transition:all .2s linear}.detail-header-container:hover .detail-edit{opacity:1}.detail-header-container.blocked svg{fill:#fff}.detail-header-container .belong-to-epics-wrapper,.detail-header-container .block-desc-container,.detail-header-container .issue-external-reference,.detail-header-container .item-generated-us,.detail-header-container .item-origin-issue,.detail-header-container .task-belongs-to{font-size:.9rem;margin-top:.5rem}.detail-header-container .issue-external-reference a,.detail-header-container .item-generated-us a,.detail-header-container .item-origin-issue a,.detail-header-container .task-belongs-to a{cursor:pointer;padding:0 .2rem}.detail-header-container .issue-external-reference .item-ref,.detail-header-container .item-generated-us .item-ref,.detail-header-container .item-origin-issue .item-ref,.detail-header-container .task-belongs-to .item-ref{padding:0 .2rem}.detail-title-wrapper{font-size:1.6rem;-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;max-width:95%;position:relative;transition:all .2s linear}.detail-title-wrapper .detail-title-text{line-height:normal;margin:0}.detail-title-wrapper .detail-number{color:#767676;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem}.detail-title-wrapper .detail-subject{color:#555;-ms-flex-positive:1;flex-grow:1}.detail-title-wrapper .detail-edit{cursor:pointer;margin-left:.75rem;opacity:0;transition:opacity .2s}.detail-title-wrapper .detail-edit svg,.detail-title-wrapper .due-date-icon svg{width:1.3rem;height:1.3rem}.detail-title-wrapper.readonly .due-date-icon{margin-left:2.7rem}.edit-title-wrapper{font-size:1.6rem;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-input{background:#fff;-ms-flex:1;flex:1}.edit-title-wrapper .edit-title-button{background:0 0;display:inline;margin-left:1rem;transition:fill .2s}.due-date-icon,.issue-nav a{display:inline-block}.edit-title-wrapper .edit-title-button:hover{fill:#5b8200}.block-desc-container .block-description-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-right:.5rem}.issue-nav{position:absolute;right:1rem;top:1rem}.issue-nav svg{width:1.2rem;height:1.2rem;fill:currentColor}.due-date-button,[disabled].due-date-button{background:#767676;display:inline-block;margin-right:.5rem;padding:1rem;transition:background .2s linear;transition-delay:.1s}.due-date-button.closed,[disabled].due-date-button.closed{background:#B8B8B8}.due-date-button.due-set,[disabled].due-date-button.due-set{background:#9dce0a}.due-date-button.due-soon,[disabled].due-date-button.due-soon{background:#fcaf3e}.due-date-button.past-due,[disabled].due-date-button.past-due{background:#ff8282}.due-date-button:hover,[disabled].due-date-button:hover{background:#555}.due-date-button.editable,[disabled].due-date-button.editable{cursor:pointer}.due-date-icon{margin:0 .25rem;position:relative}.due-date-icon svg{fill:#767676;transition:fill .2s ease-in}.due-date-icon.closed svg{fill:#B8B8B8}.due-date-icon.due-set svg{fill:#9dce0a}.due-date-icon.due-soon svg{fill:#fcaf3e}.due-date-icon.past-due svg{fill:#ff8282}.backlog-table-body .user-story-name .due-date-icon,.related-tasks .task-name .due-date-icon{top:.1rem}.issues-table .subject .due-date-icon{top:.25rem}.card-statistics .due-date-icon{margin:.1rem 0 0}.card-statistics .due-date-icon svg{height:.9rem;width:.9rem}tg-filter{background-color:#f5f5f5;box-shadow:1px 1px 5px rgba(91,130,0,.2);display:block;left:0;min-height:100%;padding:1rem 0;position:absolute;top:0;transform:translateX(-260px);transition-duration:.5s;width:260px;z-index:1}tg-filter .filters-applied{padding:0 1rem 1rem}tg-filter .filters-applied .single-filter:hover{color:currentColor;cursor:default;opacity:.5;transition:none}tg-filter form,tg-filter h1{padding:0 1rem}tg-filter input{background:#444;color:#fff;padding-right:2rem}tg-filter input::-webkit-input-placeholder{color:#767676}tg-filter input::-moz-placeholder{color:#767676}tg-filter input:-moz-placeholder{color:#767676}tg-filter input:-ms-input-placeholder{color:#767676}tg-filter .search-action{position:absolute;right:.7rem;top:.7rem}tg-filter.open{transform:translateX(0)}.filter-list{overflow-y:auto;padding:1rem}.filters-step-cat{margin-top:2rem}.filters-cats ul{margin-bottom:0}.filters-cats li{border-bottom:1px solid #767676;text-transform:uppercase}.filters-cats li.selected{border-bottom:0}.filters-cats .custom-filters .title{color:#5b8200}.filters-cats .filters-cat-single{-ms-flex-align:center;align-items:center;color:#444;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 1.5rem;transition:color .2s ease-in}.filters-cats .filters-cat-single.selected,.filters-cats .filters-cat-single:hover{background-color:#cbc9c9;color:#444;transition:background-color .2s ease-in}.filters-cats .filters-cat-single.selected .icon,.filters-cats .filters-cat-single:hover .icon{opacity:1;transition:opacity .2s ease-in}.filters-cats .icon-arrow-down{fill:currentColor;float:right;height:.9rem;opacity:0;transition:opacity .2s ease-in;width:.9rem}.single-filter{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;-ms-flex-align:center;align-items:center;background:#d7d6d6;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;opacity:.5;padding-right:.5rem;position:relative}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.single-filter::after{clear:both;content:"";display:block}.single-filter:hover{background:#d0cece;opacity:1;transition:opacity .2s linear}.single-filter.active,.single-filter.selected{color:#444;opacity:1;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;border-color:transparent;border-style:solid;border-width:0 0 0 3px;display:block;width:100%}.profile-bar .not-full-name,.profile-bar h1,.wysiwyg p{word-wrap:break-word}.single-filter .number{background:#b2afaf;position:absolute;right:0;top:0}.single-filter .remove-filter{cursor:pointer;display:block}.single-filter .remove-filter svg{fill:#555;transition:fill .2s linear}.single-filter .remove-filter:hover svg{fill:red}.live-announcement{-ms-flex-line-pack:center;align-content:center;background:#107a8a;display:-ms-flexbox;display:flex;height:0;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;transition:opacity .5s .5s}.live-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.add-tag-button .add-tag-text,.tag{font-size:.9rem}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#0b525c}.live-announcement-inner .close{display:block;position:absolute;right:0;top:1rem}.live-announcement-inner .close svg{width:2rem;height:2rem;fill:#138ea1;pointer-events:none;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#0b525c}.add-tag-input{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;position:relative;width:250px}.add-tag-input input{border-color:#767676;padding:6px;width:14rem}.add-tag-input .save{cursor:pointer;display:inline-block;fill:#444;margin:.5rem 0 0 .5rem;transition:.2s linear}.add-tag-input .save:hover{fill:#5b8200}.add-tag-input .tags-dropdown{font-size:.9rem;background:#fff;border:1px solid #767676;border-top:0;box-shadow:2px 2px 3px rgba(0,0,0,.2);left:0;max-height:20vh;min-height:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:2.25rem;width:85%;z-index:99}.add-tag-input .tags-dropdown-option{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.tags-block,.terms-announcement{align-content:center;display:-ms-flexbox}.add-tag-input .tags-dropdown-color{height:1rem;width:1rem}.add-tag-input li.selected,.add-tag-input li:hover{background:#f4fdda;cursor:pointer;transition:.2s;transition-delay:.1s}.tags-block{-ms-flex-line-pack:center;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.add-tag-button,.tag{display:inline-block}.add-tag-button{color:#767676;cursor:pointer}.add-tag-button:hover{color:#9dce0a}.add-tag-button .icon-add{width:.9rem;height:.9rem;fill:currentColor;margin:.5rem .25rem 0 0}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#444;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.terms-announcement-inner .title,.terms-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.tag .icon-close{width:.7rem;height:.7rem;cursor:pointer;fill:#ff8282;margin-left:.25rem}.tag .loading-spinner{height:1rem;width:1rem}.terms-announcement{-ms-flex-line-pack:center;background:#107a8a;display:flex;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;transition:width .5s,height .5s;transition-delay:.5s;width:0;z-index:99}.terms-announcement .terms-announcement-inner{opacity:0;transition:opacity .5s;width:100%}.terms-announcement.visible{min-height:146px;pointer-events:auto;transition-delay:0s;width:100%}.terms-announcement.visible .terms-announcement-inner{opacity:1;transition:opacity .5s .5s}.terms-announcement-inner{display:-ms-flexbox;display:flex;max-width:1200px}.terms-announcement-inner .announcement-decoration{-ms-flex-item-align:end;align-self:flex-end;height:auto;margin-right:1rem}.terms-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.terms-announcement-inner .title{font-size:1.6rem;color:#0b525c;margin-bottom:.5rem}.terms-announcement-inner .warning,.terms-announcement-inner .warning a{color:#0b525c}.tribe-linked.is-active .delete-link,.tribe-linked.is-active .gig-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.terms-announcement-inner .close{display:block;position:absolute;right:.5rem;top:1rem}.terms-announcement-inner .close svg{width:2rem;height:2rem;fill:#f5f5f5;pointer-events:none;transition:fill .2s}.terms-announcement-inner .close svg:hover{fill:#0b525c}.terms-announcement-inner a{color:#f5f5f5}.tribe-linked{margin-left:auto;overflow:hidden;position:absolute;right:0;top:0;z-index:99}.tribe-linked .tribe-linked-inner{padding:.5rem;transition:.2s}.tribe-linked .tribe-linked-inner:hover{background:#fff;cursor:pointer}.tribe-linked .tribe-linked-inner .close,.tribe-linked .tribe-linked-inner .delete-link,.tribe-linked .tribe-linked-inner .gig-title,.tribe-linked .tribe-linked-inner .synchronize-link,.tribe-linked .tribe-linked-inner .title{display:none;opacity:0}.tribe-linked .tribe-logo{height:2rem;width:2rem}.tribe-linked.is-active{animation-duration:1s;animation-name:slideTribeInner;background:#fff;box-shadow:1px 1px 5px rgba(68,68,68,.2);overflow:hidden}.epic-row .epic-statuses,.epics-table-dropdown{box-shadow:3px 3px 2px rgba(0,0,0,.1);z-index:99}.tribe-linked.is-active .tribe-linked-inner{height:100%;min-width:300px}.tribe-linked.is-active .tribe-linked-inner .close,.tribe-linked.is-active .tribe-linked-inner .delete-link,.tribe-linked.is-active .tribe-linked-inner .gig-title,.tribe-linked.is-active .tribe-linked-inner .synchronize-link,.tribe-linked.is-active .tribe-linked-inner .title{animation-duration:1.25s;animation-name:fadeInFromNone;display:block;opacity:1}.tribe-linked.is-active .tribe-linked-header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:1rem}.tribe-linked.is-active .tribe-logo{margin-right:.5rem;vertical-align:text-bottom}.tribe-linked.is-active svg{width:1rem;height:1rem;fill:#ff8282;transition:all .2s}.tribe-linked.is-active svg:hover{fill:red}.tribe-linked.is-active .title{margin-bottom:0}.tribe-linked.is-active .gig-title{color:#107a8a;margin-bottom:.5rem}.tribe-linked.is-active .delete-link{font-size:.9rem;color:#5b8200;display:block;margin-bottom:1rem}.tribe-linked.is-active .synchronize-link{display:block;padding:.5rem}.tribe-linked.is-active .close{-ms-flex-item-align:start;align-self:flex-start;margin-left:1rem}@keyframes slideTribeInner{0%{max-height:60px;width:100px}20%{max-height:60px;width:300px}100%{max-height:225px}}@keyframes fadeInFromNone{0%{display:none;opacity:0}80%{display:block;opacity:0}100%{display:block;opacity:1}}tg-wysiwyg-code-lightbox textarea{height:350px}.wysiwyg{line-height:1.4rem;overflow:auto;padding:1rem}.wysiwyg h1,.wysiwyg h2,.wysiwyg h3{padding-bottom:.5rem}.wysiwyg h1{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:2.25em;line-height:1.2;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.wysiwyg h2,.wysiwyg h3,.wysiwyg h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-top:1rem;margin-bottom:1rem}.wysiwyg h2{font-size:1.6rem;line-height:1.225}.wysiwyg h3{font-size:1.2rem}.wysiwyg ol,.wysiwyg ul{line-height:1.5;list-style-position:outside;margin-bottom:1rem;margin-top:0;padding-left:2em}.wysiwyg ol ol,.wysiwyg ol ul,.wysiwyg ul ol,.wysiwyg ul ul{padding-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg a{color:#5b8200;cursor:pointer}.wysiwyg a:hover{color:#9dce0a}.wysiwyg code,.wysiwyg pre:not([class*=language-]){font-size:.9rem;background:#272822;color:#e4e3e3;direction:ltr;font-family:'courier new',monospace;overflow:auto;unicode-bidi:embed}.wysiwyg p{margin-bottom:1rem}.wysiwyg .codehilite{overflow:auto}.wysiwyg blockquote p{margin:0}.wysiwyg pre:not([class*=language-]){line-height:1.4rem;margin-bottom:.5rem;padding:1rem;white-space:pre-wrap}.wysiwyg code{padding:.2rem}.wysiwyg table{border:1px solid #767676;margin-bottom:1rem}.medium-editor-mention-panel ul,tg-wysiwyg div[contenteditable=true] :last-child{margin-bottom:0}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#767676 1px solid}.wysiwyg th{border-right:#767676 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#767676 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.wysiwyg hr{border:1px solid #e4e3e3}.medium-editor-mention-panel{background-color:#fff;border:1px solid #767676;position:absolute}.medium-editor-mention-panel:empty{border:0}.medium-editor-mention-panel li{border-top:1px solid #767676;cursor:pointer;padding:2px 5px}.medium-editor-mention-panel li:first-child{border-top:0}.medium-editor-mention-panel li.active,.medium-editor-mention-panel li:hover{background-color:#879b89;color:#fff}.code-language-search,.code-language-selector{font-size:.75rem;background-color:#fff;position:absolute}tg-wysiwyg{display:-ms-flexbox;display:flex;margin-bottom:2rem}tg-wysiwyg pre{cursor:pointer}tg-wysiwyg .outdated{color:red}tg-wysiwyg .tools{padding-left:1rem}tg-wysiwyg .tools:not(.visible){opacity:0;pointer-events:none}tg-wysiwyg .tools:not(.visible) a{cursor:default}tg-wysiwyg .tools a{display:block;margin-bottom:.5rem}tg-wysiwyg .tools svg{fill:#767676}tg-wysiwyg .editor{width:100%}tg-wysiwyg .mode-editor span{color:#767676;cursor:pointer;margin-right:.5rem}tg-wysiwyg .markdown-editor-placeholder,tg-wysiwyg .medium-editor-placeholder{color:#767676;overflow:visible;padding-left:1rem}tg-wysiwyg .markdown-editor-placeholder::after,tg-wysiwyg .medium-editor-placeholder::after{color:#767676;font-style:normal}tg-wysiwyg .markdown:not(.empty) p{margin-bottom:0;white-space:pre-wrap}tg-wysiwyg .read-mode{cursor:pointer}tg-wysiwyg .medium{border:1px solid transparent}.code-language-search,.code-language-selector,tg-wysiwyg .edit-mode .markdown,tg-wysiwyg .edit-mode .medium{border:1px solid #767676}tg-wysiwyg .edit-mode .medium-editor-element{min-height:10rem}.code-language-selector{cursor:pointer;padding:.2rem .5rem 0}.code-language-search ul{cursor:pointer;margin-bottom:0;max-height:20vh;overflow-y:scroll}.epic-row .sprint,.epics-table-header .sprint,.story-row .sprint{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.code-language-search li{padding:.2rem .5rem}.medium-editor-toolbar li .medium-editor-button-active{color:#9dce0a}.medium-editor-toolbar svg{fill:#fff}.medium-editor-toolbar button:hover svg{fill:#9dce0a}.discover-header{background:url(../images/discover.png) bottom left repeat-x #e4e3e3;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header .project-number{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;color:#5b8200}.discover-results-header .title,.featured-projects .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#9dce0a}.discover-header input[type=text]:-webkit-autofill{background:rgba(135,155,137,.5)}.discover-header .search-button{width:1.5rem;height:1.5rem;fill:#767676;position:absolute;right:1rem;top:1rem;transition:fill .2s}.discover-header .search-button:hover{cursor:pointer;fill:#5b8200}.discover-results-header .discover-results-header-inner{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.2rem;height:1.2rem;fill:#767676;margin-right:.25rem}.discover-results-header .title{font-size:1.6rem;text-transform:uppercase}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#5b8200}.filter-discover-search .discover-search-filter.active svg{fill:#5b8200}.filter-discover-search svg{width:.8rem;height:.8rem}.discover-search-subfilter{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{animation:dropdownFade .2s}.discover-search-subfilter .results{font-size:.9rem;color:#ff8282;display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;transition:all .2s}.discover-search-subfilter .filter-list a:hover{background:#767676;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#fff}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects .title{font-size:1.6rem;color:#444;text-align:center}.featured-projects-inner{-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #e4e3e3;margin:.5rem;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:23%;flex-basis:23%;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555}.featured-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.featured-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.featured-project .statistic.active{color:#5b8200}.featured-project .statistic.active svg{fill:currentColor}.featured-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:1.25}.featured-project .project-card-name a{font-size:1.2rem;color:#5b8200}.featured-project .project-card-name a:hover{color:#9dce0a}@media (max-width:767px){.featured-project{-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-ms-flex-preferred-size:100%;flex-basis:100%}}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-ms-flex-line-pack:stretch;align-content:stretch;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:.8rem;height:.8rem;fill:#767676;margin-left:.5rem}.highlighted .title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.highlighted .title-wrapper svg{width:1.25rem;height:1.25rem;fill:#767676;margin-right:.5rem}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:1.6rem;color:#444;display:inline-block;margin:0}.highlighted .highlighted-projects-container{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #e4e3e3;-ms-flex:1;flex:1;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#767676;margin:1rem auto}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .current-filter:hover svg{fill:currentColor}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{animation:dropdownFade .2s ease-in;animation-direction:reverse}.filter-highlighted li{font-size:.9rem;color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-ms-flex:1;flex:1}.highlighted-project .single-project-header{-ms-flex-line-pack:center;align-content:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{font-size:1.2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.epic-row .epic-pill,.epic-row .epic-statuses{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title a{color:#5b8200}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .project-description{font-size:.9rem;color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:140px;flex-basis:140px;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.75rem;height:.75rem;fill:#767676;margin-right:.25rem}.highlighted-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#5b8200}.highlighted-project .statistic.active svg{fill:#5b8200}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#767676;cursor:pointer;display:inline-block;padding:.4rem .75rem;transition:all .2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#e4e3e3;color:#555}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-ms-flex:1;flex:1;vertical-align:middle}.discover-results .project-statistics{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:300px;flex-basis:300px;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.7rem;height:.7rem;fill:#767676;margin-right:.2rem}.discover-results .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#5b8200}.discover-results .statistic.active svg{fill:#5b8200}.discover-results .more-results{display:block;margin:0 20rem;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.lightbox-create-epic{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;opacity:1}.lightbox-create-epic .create-epic-container{max-width:700px;width:90%}.lightbox-create-epic .subject-container{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.lightbox-create-epic .subject-container .subject{padding-left:1rem;width:100%}.lightbox-create-epic .attachments{margin-bottom:0}.lightbox-create-epic .settings{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-create-epic .settings fieldset{margin-right:.5rem}.lightbox-create-epic .settings fieldset:hover{color:#fff;transition:all .2s ease-in;transition-delay:.2s}.lightbox-create-epic .settings fieldset:last-child{margin:0}.lightbox-create-epic .settings input{display:none}.lightbox-create-epic .settings input:checked+label{background:#5b8200;border:1px solid #5b8200;color:#fff}.lightbox-create-epic .settings input:checked+.blocked{background:red;border:1px solid red;color:#fff}.lightbox-create-epic label{font-size:.9rem;background:#f5f5f5;border:1px solid #767676;color:#767676;cursor:pointer;display:block;padding:.5rem 3rem;text-transform:none;transition:all .2s ease-in}.lightbox-create-epic label:hover{background:#9dce0a;border:1px solid #5b8200;color:#fff}.lightbox-create-epic label.blocked:hover{background:#ff8282;border:1px solid red}.lightbox-create-epic .create-epic-button{display:block;width:100%}.epic-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;cursor:move;display:-ms-flexbox;display:flex;transition:background .2s}.epic-row .assigned,.epic-row .project{padding:.5rem}.epic-row .name,.epic-row .progress,.epic-row .sprint,.epic-row .status,.epic-row .vote{padding:1rem .5rem}.epic-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .assigned,.epic-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epic-row .sprint,.epic-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epic-row .name,.epic-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epic-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epic-row .sprint{width:90%}.epic-row:hover{background:rgba(157,206,10,.05)}.epic-row:hover .icon-drag{opacity:1}.epic-row.not-empty{cursor:pointer}.epic-row.is-blocked{background:rgba(255,130,130,.5)}.epic-row.is-closed .name a{color:#9c9c9c;text-decoration:line-through}.epic-row.unfold .name .icon{transform:rotate(0)}.epic-row .name .icon{transform:rotate(180deg);transition:all .2s}.epic-row .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#e4e3e3;opacity:0;transition:opacity .1s}.epic-row .epic-pill{font-size:.75rem;background:#444;border-radius:.25rem;color:#fff;margin:0 .5rem;padding:.1rem .25rem}.epic-row .status{cursor:pointer;position:relative}.epic-row .status button{background:0 0}.epic-row .icon-arrow-down{width:.7rem;height:.7rem;fill:#767676;margin-left:.1rem}.epic-row .progress-bar,.epic-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.epic-row .progress-bar{background:#f5f5f5;max-width:40vw;padding-right:1rem;width:100%}.epic-row .progress-status{background:#9dce0a;width:10vw}.epic-row .vote{color:#555}.epic-row .vote.is-voter{color:#9dce0a;fill:#9dce0a}.epic-row .assigned img{width:40px}.epic-row .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.epic-row .is-unassigned{color:#767676}.epic-row .epic-statuses{font-size:.9rem;background:rgba(5,5,5,.9);border-bottom:1px solid #444;color:#fff;left:0;list-style-type:none;margin:0;position:absolute;text-align:left;top:2.5rem;width:200px}.epic-row .epic-statuses:last-child{border:0}.epic-row .epic-statuses li{padding:.5rem}.epic-row .epic-statuses li:hover{color:#9dce0a;transition:color .3s linear}.empty-epics{text-align:center}.empty-epics a{color:#5b8200;display:block;margin-bottom:2rem}.epics-table{margin-top:2rem}.epics-table .loading{margin:2% auto;width:3rem}.epics-table .loading img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.epics-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #767676;display:-ms-flexbox;display:flex;padding:.5rem;position:relative}.epics-table-header .name,.epics-table-header .progress,.epics-table-header .sprint,.epics-table-header .status,.epics-table-header .vote{padding:1rem .5rem}.epics-table-header .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.epics-table-header .assigned,.epics-table-header .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;padding:1rem .5rem}.epics-table-header .sprint,.epics-table-header .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.epics-table-header .name,.epics-table-header .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.epics-table-header .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.epics-table-header .sprint{width:90%}.epics-table-options-wrapper{bottom:1rem;position:absolute;right:.5rem}.epics-table-option-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;background:0 0}.epics-table-option-button .icon{width:.7rem;height:.7rem}.epics-table-dropdown{background:#fff;border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);border-right:1px solid rgba(0,0,0,.1);padding:.5rem;position:absolute;right:0;top:1.3rem;width:250px}.epics-table-dropdown.ng-hide-remove{animation:dropdownFade .2s}.epics-table-dropdown.ng-hide-add{animation:dropdownFade .2s reverse}.epics-table-dropdown .fieldset{font-size:.9rem;border-bottom:1px solid #e4e3e3;color:#767676;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.epics-table-dropdown .fieldset:last-child{border:0}.story-row{font-size:.9rem;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;margin-left:4rem;transition:background .2s}.story-row .assigned,.story-row .project{padding:.5rem}.story-row .name,.story-row .progress,.story-row .sprint,.story-row .status,.story-row .vote{padding:1rem .5rem}.story-row .vote{-ms-flex-preferred-size:60px;flex-basis:60px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .assigned,.story-row .project{-ms-flex-preferred-size:100px;flex-basis:100px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center}.story-row .sprint,.story-row .status{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:150px;text-align:center}.story-row .name,.story-row .progress{-ms-flex-preferred-size:20vw;flex-basis:20vw;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;max-width:40vw}.story-row .progress{-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;position:relative}.story-row .sprint{width:90%}.story-row:hover{background:rgba(157,206,10,.05)}.story-row.is-blocked{background:rgba(255,130,130,.5)}.story-row.is-closed .name{color:#767676;text-decoration:line-through}.story-row .name{-ms-flex-preferred-size:17.5vw;flex-basis:17.5vw}.story-row .name a{cursor:pointer}.story-row .progress-bar,.story-row .progress-status{height:1.5rem;left:0;position:absolute;top:.25rem}.story-row .progress-bar{background:#f5f5f5;max-width:40vw;width:100%}.story-row .progress-status{background:#9dce0a;width:10vw}.story-row .vote{color:#555}.story-row .vote.is-voter{color:#9dce0a;fill:#9dce0a}.story-row .project{cursor:pointer}.story-row .assigned img,.story-row .project img{width:40px}.story-row .icon-upvote{width:.75rem;height:.75rem;fill:#555;margin-right:.25rem;vertical-align:middle}.lightbox-create-related-user-stories .lightbox-create-related-user-stories-wrapper{max-width:600px;width:90%}.lightbox-create-related-user-stories .related-with-selector{display:-ms-flexbox;display:flex;margin-bottom:1rem}.lightbox-create-related-user-stories .related-with-selector input{display:none}.lightbox-create-related-user-stories .related-with-selector input:checked+label{background:#9dce0a;color:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input:checked+label:hover{background:#9dce0a}.lightbox-create-related-user-stories .related-with-selector input+label{background:rgba(228,227,227,.7);cursor:pointer;display:block;padding:2rem 1rem;text-align:center;text-transform:uppercase;transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector input+label:hover{background:rgba(157,206,10,.3);transition:background .2s ease-in}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single{-ms-flex:1;flex:1}.lightbox-create-related-user-stories .related-with-selector .related-with-selector-single:first-child{margin-right:.5rem}.lightbox-create-related-user-stories fieldset label{display:inline-block;margin-bottom:.5rem}.lightbox-create-related-user-stories .new-user-story-title{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex}.lightbox-create-related-user-stories .existing-user-story-form,.lightbox-create-related-user-stories .new-user-story-form{margin-bottom:1rem}.lightbox-create-related-user-stories .no-stories-found{padding:1rem 0 0}.lightbox-create-related-user-stories .new-user-story-options{display:-ms-flexbox;display:flex;margin-left:auto}.lightbox-create-related-user-stories .new-user-story-options input{display:none}.lightbox-create-related-user-stories .new-user-story-options input:checked+label{background:#9dce0a;color:#fff;fill:#fff;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label{background:#f5f5f5;color:#444;cursor:pointer;display:block;padding:.5rem;transition:background .2s ease-in}.lightbox-create-related-user-stories .new-user-story-options input+label:hover{background:#9dce0a;color:#fff;fill:#fff}.lightbox-create-related-user-stories button{width:100%}.related-userstories{margin-bottom:2rem;position:relative}.related-userstories-header{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-userstories-header .related-userstories-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-userstories-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;transition:background .25s}.related-userstories-header .add-button.is-active,.related-userstories-header .add-button:hover{background:#9dce0a}.related-userstories-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-userstories-body{width:100%}tg-related-userstory-row{font-size:.9rem;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem}tg-related-userstory-row.sortable{cursor:move}tg-related-userstory-row.sortable:hover{background:rgba(157,206,10,.05)}tg-related-userstory-row.sortable:hover .userstory-settings{opacity:1;transition:all .2s ease-in}tg-related-userstory-row.sortable:hover .icon-drag{opacity:1}tg-related-userstory-row.sortable .icon-drag{width:.75rem;height:.75rem;cursor:move;fill:#e4e3e3;opacity:0;transition:opacity .1s}tg-related-userstory-row .status{-ms-flex-negative:0;flex-shrink:0;position:relative;width:125px}tg-related-userstory-row .assigned-to-column{-ms-flex-negative:0;flex-shrink:0;width:150px}tg-related-userstory-row .assigned-to-column img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .project{cursor:pointer;-ms-flex-preferred-size:100px;flex-basis:100px}tg-related-userstory-row .project img{width:40px}tg-related-userstory-row .userstory-name{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;margin-right:1rem}tg-related-userstory-row .userstory-name a{cursor:pointer}tg-related-userstory-row .userstory-name span{display:inline-block;margin-left:.25rem}tg-related-userstory-row .closed{border-left:10px solid #e4e3e3;color:#e4e3e3}tg-related-userstory-row .closed a,tg-related-userstory-row .closed svg{fill:#e4e3e3}tg-related-userstory-row .closed .userstory-name a{color:#e4e3e3;text-decoration:line-through}tg-related-userstory-row .blocked{background:rgba(255,130,130,.2);border-left:10px solid #ff8282}tg-related-userstory-row .userstory-settings{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;opacity:0;width:60px}tg-related-userstory-row .userstory-settings svg{width:1.1rem;height:1.1rem;fill:#767676;margin-right:.5rem;transition:fill .2s ease-in}tg-related-userstory-row .userstory-settings svg:hover{fill:#555}tg-related-userstory-row .userstory-settings a:hover{cursor:pointer}tg-related-userstory-row .delete-userstory:hover .icon-trash{fill:#ff8282}tg-related-userstory-row .avatar{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}tg-related-userstory-row .avatar img{-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}tg-related-userstory-row .avatar figcaption{margin-left:.5rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:4rem;margin:0 auto;width:4rem}.external-app-wrapper svg{width:4rem;height:4rem}.comment .comment-main,.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-ms-flexbox;display:flex}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper .app-card a,.external-app-wrapper .user-card a{font-size:1rem;display:block}.external-app-wrapper .app-card .app-image{-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-ms-flex:1;flex:1}.external-app-wrapper .app-card p{font-size:1rem}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .button-green{display:block}.external-app-wrapper .cancel{font-size:.9rem;display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.comments{clear:both}.comments tg-wysiwyg{margin-top:1.5rem}.comments .read-mode{border:1px solid #767676;height:55px}.activity,.comment .comment-wrapper,.comment .deleted-comment-wrapper,.entry .entry-wrapper{border-bottom:1px solid #e4e3e3}.comments .read-mode .markdown-editor-placeholder,.comments .read-mode .medium-editor-placeholder{height:55px}.comments .add-comment{margin-top:1rem}.comments .add-comment textarea{height:3rem}.comments .add-comment .edit,.comments .add-comment .preview-icon{position:absolute;right:1rem}.comments .save-comment-wrapper{-ms-flex-align:end;align-items:flex-end;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.comments .save-comment{margin-top:1rem;padding:.5rem 4rem}.comment{display:block}.comment .comment-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.comment .comment-wrapper:hover .comment-option{opacity:1}.comment .comment-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.comment .comment-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:1rem}.comment .comment-creator{color:#5b8200;margin-right:.5rem}.comment .comment-date{font-size:.9rem;color:#767676}.comment .comment-edited{font-size:.9rem;background:#e4e3e3;margin:0 .5rem;padding:.25rem}.comment .comment-edited .separator{margin:0 .25rem}.comment .comment-edited a{color:#5b8200;fill:#5b8200}.comment .comment-edited svg{width:.75rem;height:.75rem;margin:0 0 0 .25rem}.comment .comment-options{-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;margin-left:1.5rem}.comment .comment-options .comment-option{cursor:pointer;opacity:0}.comment .comment-options .icon-edit{fill:#767676;margin-right:.5rem}.comment .comment-options .icon-edit:hover{fill:#555}.comment .comment-options .icon-close{fill:#767676;margin-right:.5rem}.comment .comment-options .icon-close:hover{fill:red}.comment .comment-options .icon-trash{fill:#ff8282}.comment .comment-options .icon-trash:hover{fill:red}.comment .deleted-comment-wrapper{padding:1rem 0;width:100%}.comment .deleted-comment-main{font-size:.75rem;color:#767676;display:-ms-flexbox;display:flex;width:100%}.comment .toggle-deleted-comment{color:#5b8200;fill:#5b8200;margin:0 1rem;transition:none}.comment .toggle-deleted-comment .icon-arrow-down,.comment .toggle-deleted-comment .icon-arrow-up{width:.8rem;height:.8rem;margin-left:.25rem}.comment .restore-comment{margin-left:auto;transition:all .2s}.comment .restore-comment:hover{color:#5b8200;fill:#5b8200}.comment .restore-comment .icon-reload{width:.8rem;height:.8rem;margin-right:.25rem}.comment .deleted-comment-comment{margin-top:1rem}.comment-text{max-width:80rem}.comment-text.wysiwyg{margin-bottom:0;padding:0}.lightbox-display-historic{display:none}.lightbox-display-historic .history-container{max-width:800px;width:90%}.lightbox-display-historic .history-wrapper{max-height:600px;overflow-x:hidden;overflow-y:auto;padding:2rem}.entry{display:block}.entry .entry-wrapper{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.entry .entry-avatar{-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:50px}.entry .entry-main{-ms-flex:1;flex:1;max-width:calc(100% - 100px)}.entry .entry-data{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.entry .entry-creator{color:#5b8200;margin-right:.5rem}.entry .entry-date{font-size:.9rem;color:#767676}.entry .display-full-entry{width:1.25rem;height:1.25rem;cursor:pointer;fill:#5b8200;margin-left:auto;transform:rotate(0);transition:transform .2s}.entry .display-full-entry.inactive{transform:rotate(180deg)}.entry .entry-text{margin-bottom:0}.entry .entry-text.ellipsed{max-height:3rem;overflow:hidden}.entry .entry-text.blurry{position:relative}.entry .entry-text.blurry::after{background-image:linear-gradient(to top,#fff,transparent);content:'';height:100%;left:0;position:absolute;top:0;width:100%}.history-tabs .order-comments{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:auto;transition:none}.history-tabs .icon-arrow-down,.history-tabs .icon-arrow-up{width:.75rem;height:.75rem}.activity-diff .key{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e4e3e3;margin-right:.5rem;padding:.25rem}.add-member-suggest .add-member-suggest-name,.home-project .project-card-description,.home-wrapper .title-bar,.invite-members-form .invite-members-single-help,.profile-bar .profile-edition,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.activity-diff .diff{line-height:1.6}.activity-diff .icon-arrow-right{width:.75rem;height:.75rem;fill:#767676;margin:0 .5rem}.activity-diff .diff-status-wrapper p{display:inline-block}.activity-diff .diff-status-wrapper ins{background:rgba(203,246,72,.3);text-decoration:underline}.activity-diff .diff-status-wrapper del{background:rgba(255,130,130,.3)}.activity-diff .diff-color-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.activity-diff .diff-color-wrapper .diff{display:inline-block;height:1.2rem;width:1.2rem}.activity{-ms-flex-align:start;align-items:flex-start;display:-ms-flexbox;display:flex;padding:2rem 0}.activity .activity-avatar{-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;width:60px}.activity .activity-data{margin-bottom:1rem}.activity .activity-creator{color:#5b8200;margin-right:.5rem}.activity .activity-date{color:#767676}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #e4e3e3;cursor:pointer;transition:background .2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-ms-flex-align:center;align-items:center;border-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,130,130,.2);color:red}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper{display:-ms-flexbox;display:flex}@media (max-width:767px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .duty-summary{-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .dashboard-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}@media (max-width:1280px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:767px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}@media (max-width:480px){.home-wrapper .dashboard-container{-ms-flex-direction:column;flex-direction:column}}.home-wrapper .watching-container,.home-wrapper .working-on-container{-ms-flex:1;flex:1;padding-left:.5rem;padding-right:.5rem}.home-wrapper .working-on-container{margin-right:1rem}.home-wrapper .project-list{-ms-flex-preferred-size:250px;flex-basis:250px;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.2rem;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:-ms-flexbox;display:flex;margin:0 0 .5rem;padding:.5rem 1rem}.home-project{background:#fff;border:1px solid #e4e3e3;margin:.5rem .5rem 1rem;cursor:pointer;transition:all .2s}.home-project .tags-container{display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{font-size:.9rem;color:#555}.home-project .project-card-statistics{display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.75rem;height:.75rem;fill:currentColor;margin-right:.25rem}.home-project .statistic{font-size:.9rem;color:#767676;display:inline-block;margin-right:.5rem}.home-project .statistic.active{color:#5b8200}.home-project .statistic.active svg{fill:currentColor}.home-project .project-card-header{display:-ms-flexbox;display:flex;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-ms-flex-preferred-size:50px;flex-basis:50px;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:1.25}.home-project .project-card-name a{font-size:1.2rem;color:#5b8200}.home-project .project-card-name a:hover{color:#9dce0a}.home-project:hover{border:1px solid rgba(157,206,10,.2);box-shadow:0 0 5px #e4e3e3}.home-project.blocked-project{border:#e4e3e3}.home-project.blocked-project:hover{border:#e4e3e3;box-shadow:none}.home-project.blocked-project .project-card-description,.home-project.blocked-project .project-card-logo,.home-project.blocked-project .project-card-name a,.home-project.blocked-project .project-card-statistics,.home-project.blocked-project .tags-container{opacity:.3}.projects-empty{text-align:center}.projects-empty svg{fill:#e4e3e3;height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty p{font-size:.9rem}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 2rem 1rem;text-align:center}.empty-ticket{display:-ms-flexbox;display:flex}.empty-ticket:not(:last-child){border-bottom:1px solid #e4e3e3;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#d7d6d6;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:8vw}@media (max-width:1280px){.empty-ticket .line{width:30vw}}@media (max-width:767px){.empty-ticket .line{width:30vw}}@media (max-width:480px){.empty-ticket .line{width:30vw}}.empty-ticket .line:last-child{margin:0;width:18vw}@media (max-width:1280px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:767px){.empty-ticket .line:last-child{width:50vw}}@media (max-width:480px){.empty-ticket .line:last-child{width:50vw}}.invite-members-form{border-top:1px solid #e4e3e3;margin:0 5rem}.invite-members-form .invite-members-form-list{margin:0 0 1rem}.invite-members-form .invite-members-single{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:1rem}.invite-members-form .invite-members-single-data{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.invite-members-form .invite-members-single-avatar{height:4rem;margin-right:1rem;width:4rem}.invite-members-form .invite-members-single-remove{color:#ff8282;margin-left:1rem;transition:color .2s}.invite-members-form .invite-members-single-remove:hover{color:red}.invite-members-form .invite-members-single-role{-ms-flex-preferred-size:40%;flex-basis:40%;-ms-flex-negative:0;flex-shrink:0}.invite-members-form .invite-members-single-new{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding:1rem 0}.invite-members-form .invite-members-single-new .invite-members-single-new-btn{cursor:pointer}.invite-members-form .invite-members-single-new .icon-add{width:2rem;height:2rem;fill:#444;transition:fill .2s}.invite-members-form .invite-members-single-new:hover .icon-add{fill:#9dce0a}.invite-members-form .invite-members-single-send{font-size:1.2rem;display:block;margin:1.5rem 0 1rem;padding:1rem;width:100%}.invite-members-form .invite-members-single-help{font-size:.9rem}.lightbox-add-member .add-members-wrapper{max-width:900px;width:90%}.add-member-suggest .add-member-suggest-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:2rem 0 0}.add-member-suggest .add-member-suggest-filter{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;padding:0 15rem;position:relative}.add-member-suggest .add-member-suggest-filter-input{-ms-flex:1;flex:1;margin-right:.25rem}.add-member-suggest .add-member-suggest-filter-hint{font-size:.75rem;color:#767676;position:absolute;right:16rem;top:.5rem}.add-member-suggest .add-member-suggest-filter-hint.to-send{right:19rem}.add-member-suggest .add-member-suggest-filter-addmail{background:#444;border-radius:.25rem;padding:.5rem .75rem;transition:background .2s linear}.add-member-suggest .add-member-suggest-filter-addmail:hover{background:#050505}.add-member-suggest .add-member-suggest-filter-addmail svg{width:1.3rem;height:1.3rem;fill:#fff}.add-member-suggest .add-member-suggest-single{-ms-flex-align:center;align-items:center;background:#fff;border-bottom:1px solid #e4e3e3;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(25% - 1rem);flex-basis:calc(25% - 1rem);-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;padding:.2rem;transition:.2s linear}.add-member-suggest .add-member-suggest-single:hover{background:rgba(157,206,10,.1)}.add-member-suggest .add-member-suggest-single:nth-child(4n){margin-right:0}.add-member-suggest .add-member-suggest-avatar{-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;height:5rem;margin:.5rem;width:5rem}.navbar{display:-ms-flexbox;display:flex;height:40px;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.navbar .nav-left a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left .logo{background:rgba(0,0,0,.2);padding:.3rem .75rem}.navbar .nav-left svg{width:1.6rem;height:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar .nav-right svg{width:1.2rem;height:1.2rem;fill:rgba(135,155,137,.8);transition:all .2s linear}.navbar a{color:#fff;display:inline-block;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#9dce0a}.navbar a:hover svg{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;margin-left:.5rem;vertical-align:middle}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#050505;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.navbar-dropdown ul:after{border-color:rgba(5,5,5,0);border-bottom-color:#050505;border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-color:rgba(5,5,5,0);border-bottom-color:#050505;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown .plugin:hover .new{color:#fff}.navbar-dropdown .plugin .new{font-size:.9rem;background:#ff8282;float:right;margin-left:auto;padding:.1rem .25rem}.navbar-dropdown a{color:#767676;display:block;padding:.8rem .5rem}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#9dce0a}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-ms-flex:1;flex:1}.navbar-dropdown a.blocked-project{color:#555}.navbar-dropdown a.blocked-project svg{margin-left:.5rem;position:relative;top:.25rem}.navbar-dropdown .create-options{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #e4e3e3}.profile-filter{-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile-filter .searchbox{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{fill:#555;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-ms-flex:1;flex:1;margin-right:1rem}.import-project-asana-form-selector li:first-child,.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs{border-top:1px solid #e4e3e3}.profile-filter .searchbox input:focus{border-bottom:1px solid #767676;outline:0;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#767676;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile{display:-ms-flexbox;display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile .profile-sidebar{-ms-flex-preferred-size:150px;flex-basis:150px;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{fill:#e4e3e3;height:10rem;margin:2rem auto;text-align:center;width:10rem}.profile .empty-tab p{color:#767676;font-size:.9rem;margin:0}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;transform:translateY(0);transition:all .2s cubic-bezier(.01,.7,1,1);transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{font-size:1.2rem;background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#767676;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;transition:all .2s linear}.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;font-size:2rem;line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar h2{font-size:1.6rem;color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#767676;margin-bottom:1rem}.profile-bar .username{font-size:1.2rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#767676}.profile-bar .profile-stats{border-bottom:1px solid #e4e3e3;color:#555;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{font-size:2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;display:block;line-height:1}.profile-bar .profile-stats .stat-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:.9rem;display:block}.profile-bar .profile-quote{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:1.2rem;background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contacts{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#767676;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#555;transition:color .2s linear}.profile-content-tabs .tab.active .icon,.profile-content-tabs .tab:hover .icon{fill:#9dce0a}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #e4e3e3;border-right:1px solid #e4e3e3;position:relative;top:1px;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#5b8200}.profile-content-tabs .icon{fill:#767676;height:.8rem;margin-right:.5rem;transition:fill .2s linear}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.contact-team-large,.import-project-asana-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-sidebar h4 .icon{fill:#767676;margin-right:.3rem;margin-top:-3px;vertical-align:middle}.profile-sidebar p{font-size:.9rem;color:#767676}.profile-sidebar a{color:#5b8200}.contact-team{margin-left:.75rem}.contact-team-large{font-size:.9rem;-ms-flex-pack:center;justify-content:center;margin-left:0;width:100%}.contact-team-large .icon-mail{margin-right:.5rem;vertical-align:center}.lightbox-contact-project{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.lightbox-contact-project-container{max-width:600px;text-align:center;width:90%}.lightbox-contact-project-logo{width:5rem}.lightbox-contact-project-title{margin:0}.lightbox-contact-project-name{font-size:1.6rem;color:#5b8200;margin-bottom:1rem}.lightbox-contact-project-message{max-height:400px}.lightbox-contact-project-button{display:block;margin-top:.5rem;width:100%}.import-project-asana-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-asana-form{width:90%;min-width:0}}.import-project-asana-form fieldset{margin-bottom:1rem}.import-project-asana-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-asana-form label .mumble{margin-left:.25rem}.import-project-asana-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-asana-form-check span{display:block}.import-project-asana-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-asana-form-check .check{position:absolute;right:0;top:0}.import-project-asana-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-asana-form-title-wrapper .create-project-title{display:inline-block}.import-project-asana-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-description,.import-project-asana-form-title{margin:0;text-align:center}.import-project-asana-form-import-type label .icon,.import-project-asana-form-privacity label .icon{margin-right:.25rem}.import-project-asana-form-description{color:#767676;margin-bottom:2rem}.import-project-asana-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-asana-form-import-type input:checked+label,.import-project-asana-form-privacity input:checked+label,.import-project-asana-form-selector-template,.import-project-asana-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-asana-form-import-type{display:-ms-flexbox;display:flex}.import-project-asana-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-import-type input:checked+label{background:#dcdcdc}.import-project-asana-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-asana-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-asana-form-import-type input{display:none}.import-project-asana-form-import-type label{background:#f5f5f5}.import-project-asana-form-privacity{display:-ms-flexbox;display:flex}.import-project-asana-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-asana-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-asana-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-asana-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-asana-form-privacity input:checked+label{background:#dcdcdc}.import-project-asana-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-asana-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-asana-form-privacity input{display:none}.import-project-asana-form-privacity label{background:#f5f5f5}.import-project-asana-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-asana-form-type span{margin-left:.5rem}.import-project-asana-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-asana-form-action-back,.import-project-asana-form-action-cancel,.import-project-asana-form-selector a:hover{color:currentColor}.import-project-asana-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-asana-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-asana-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-asana-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-asana-form-selector-template{text-transform:uppercase}.import-project-asana-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-asana-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-asana-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-asana-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-asana-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-asana-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-asana-form-selector p{margin-bottom:0}.import-project-asana-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-asana-form-action button{font-size:1.2rem;padding:.75rem}.import-project-asana-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-asana-form-action-back:hover,.import-project-asana-form-action-cancel:hover{color:#9dce0a}.import-project-asana-form-action-cancel{-ms-flex:1;flex:1}.import-project-asana-form-action-back{width:10%}.import-project-asana-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-asana-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-asana-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-asana-form .spin{text-align:center;width:100%}.create-project-asana-import-type{margin-bottom:1rem;text-align:center}.create-project-asana-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-asana-import-type fieldset{background:#fff;border-right:1px solid #e4e3e3;transition:background .2s linear}.create-project-asana-import-type fieldset:last-child{border:0}.create-project-asana-import-type input{display:none}.create-project-asana-import-type input:checked+label{background:rgba(91,130,0,.1)}.create-project-asana-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-asana-import-type label:hover{background:rgba(91,130,0,.1);cursor:pointer}.create-project-asana-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-asana-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.create-project{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.create-project{width:90%;min-width:0}}.create-project fieldset{margin-bottom:1rem}.create-project label{font-size:.9rem;display:block;margin-bottom:.25rem}.create-project label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.create-project-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.create-project-check span{display:block}.create-project-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-check .check{position:absolute;right:0;top:0}.create-project-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.create-project-title-wrapper .create-project-title{display:inline-block}.create-project-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.create-project-description,.create-project-title{margin:0;text-align:center}.create-project-import-type label .icon,.create-project-privacity label .icon{margin-right:.25rem}.create-project-description{color:#767676;margin-bottom:2rem}.create-project-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.create-project-import-type input:checked+label,.create-project-privacity input:checked+label,.create-project-selector-template,.create-project-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-import-type{display:-ms-flexbox;display:flex}.create-project-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.create-project-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-import-type input:checked+label{background:#dcdcdc}.create-project-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.create-project-import-type input:disabled+label .icon{color:#9c9c9c}.create-project-import-type input{display:none}.create-project-import-type label{background:#f5f5f5}.create-project-privacity{display:-ms-flexbox;display:flex}.create-project-privacity label,.create-project-type{-ms-flex-align:center;display:-ms-flexbox;text-transform:uppercase}.create-project-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.create-project-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.create-project-privacity label{align-items:center;cursor:pointer;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem}.create-project-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.create-project-privacity input:checked+label{background:#dcdcdc}.create-project-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.create-project-privacity input:disabled+label .icon{color:#9c9c9c}.create-project-privacity input{display:none}.create-project-privacity label{background:#f5f5f5}.create-project-type{align-items:center;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem}.create-project-type span{margin-left:.5rem}.create-project-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.create-project-action-back,.create-project-action-cancel,.create-project-selector a:hover{color:currentColor}.create-project-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.create-project-selector li:first-child{border-top:1px solid #e4e3e3}.create-project-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.create-project-selector-icon .icon{width:2.25rem;height:2.25rem}.create-project-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.create-project-selector-template{text-transform:uppercase}.create-project-selector-description,.import-project-github-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.create-project-selector-long-description.ng-hide{line-height:0;max-height:0}.create-project-selector-question{position:absolute;right:1.5rem;top:1.5rem}.create-project-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.create-project-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.create-project-selector p{margin-bottom:0}.create-project-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.create-project-action button{font-size:1.2rem;padding:.75rem}.create-project-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.create-project-action-back:hover,.create-project-action-cancel:hover{color:#9dce0a}.create-project-action-cancel{-ms-flex:1;flex:1}.create-project-action-back{width:10%}.create-project-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.create-project-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.create-project-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.create-project .spin{text-align:center;width:100%}.duplicate-project-reference{margin-bottom:2rem}.import-project-github-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-github-form{width:90%;min-width:0}}.import-project-github-form fieldset{margin-bottom:1rem}.import-project-github-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-github-form label .mumble{margin-left:.25rem}.import-project-github-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-github-form-check span{display:block}.import-project-github-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-github-form-check .check{position:absolute;right:0;top:0}.import-project-github-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-github-form-title-wrapper .create-project-title{display:inline-block}.import-project-github-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-github-form-description,.import-project-github-form-title{margin:0;text-align:center}.import-project-github-form-import-type label .icon,.import-project-github-form-privacity label .icon{margin-right:.25rem}.import-project-github-form-description{color:#767676;margin-bottom:2rem}.import-project-github-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-github-form-import-type input:checked+label,.import-project-github-form-privacity input:checked+label,.import-project-github-form-selector-template,.import-project-github-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-github-form-import-type{display:-ms-flexbox;display:flex}.import-project-github-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-import-type input:checked+label{background:#dcdcdc}.import-project-github-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-github-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-github-form-import-type input{display:none}.import-project-github-form-import-type label{background:#f5f5f5}.import-project-github-form-privacity{display:-ms-flexbox;display:flex}.import-project-github-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-github-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-github-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-github-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-github-form-privacity input:checked+label{background:#dcdcdc}.import-project-github-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-github-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-github-form-privacity input{display:none}.import-project-github-form-privacity label{background:#f5f5f5}.import-project-github-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-github-form-type span{margin-left:.5rem}.import-project-github-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-github-form-action-back,.import-project-github-form-action-cancel,.import-project-github-form-selector a:hover{color:currentColor}.import-project-github-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-github-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-github-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-github-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-github-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-github-form-selector-template{text-transform:uppercase}.import-project-github-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-github-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-github-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-github-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-github-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-github-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-github-form-selector p{margin-bottom:0}.import-project-github-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-github-form-action button{font-size:1.2rem;padding:.75rem}.import-project-github-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-github-form-action-back:hover,.import-project-github-form-action-cancel:hover{color:#9dce0a}.import-project-github-form-action-cancel{-ms-flex:1;flex:1}.import-project-github-form-action-back{width:10%}.import-project-github-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-github-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-github-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-github-form .spin{text-align:center;width:100%}.create-project-github-import-type{margin-bottom:1rem;text-align:center}.create-project-github-import-type p{margin-bottom:.5rem}.create-project-github-import-type-question{-ms-flex-line-pack:stretch;align-content:stretch;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex}.create-project-github-import-type fieldset{background:#fff;border-right:1px solid #e4e3e3;transition:background .2s linear}.create-project-github-import-type fieldset:last-child{border:0}.create-project-github-import-type input{display:none}.create-project-github-import-type input:checked+label{background:rgba(91,130,0,.1)}.create-project-github-import-type label{background:#fff;height:100%;padding:1rem;transition:background .2s ease-in}.create-project-github-import-type label:hover{background:rgba(91,130,0,.1);cursor:pointer}.create-project-github-import-type-name{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;display:inline-block;margin-bottom:.5rem}.create-project-github-import-type-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem}.import-project-members{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-members{width:90%;min-width:0}}.import-project-members .avatar{width:48px}.import-project-members-title{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:0}.import-project-description,.import-project-jira-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-members-system{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0 0;padding:.5rem 0}.import-project-members-system img{width:100%}.import-project-members-logo{max-height:3rem;max-width:3rem}.import-project-members-row{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;border-top:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.import-project-members-row:hover .import-project-members-delete{opacity:1;transition:all .2s ease-in}.import-project-members-single{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-username{margin-left:1rem}.import-project-members .avatar.empty{background-color:#e4e3e3;line-height:3rem;text-align:center;width:3rem}.import-project-members-actions{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-delete{background:0 0;opacity:0;padding:.25rem .5rem}.import-project-members-delete svg{width:.75rem;height:.75rem;fill:red}.import-project-members-match{color:#767676}.import-project-members-match button{background:#fff;border-radius:50%;padding:.25rem .5rem}.import-project-members-match button svg{width:.75rem;height:.75rem}.import-project-members-match-true{border:1px solid #5b8200;margin:0 .1rem 0 .25rem;transition:background .2s}.import-project-members-match-true:hover{background:rgba(157,206,10,.3)}.import-project-members-match-true svg{fill:#5b8200}.import-project-members-match-false{border:1px solid red;margin:0 .25rem 0 .1rem;transition:background .2s}.import-project-members-match-false:hover{background:rgba(255,0,0,.3)}.import-project-members-match-false svg{fill:red}.import-project-members-choose{color:#5b8200;padding-right:0;text-transform:lowercase}.import-project-members-choose:hover{color:#9dce0a}.import-project-members-selected{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.import-project-members-selected-img{margin-left:.5rem;max-width:3rem}.import-project-members-selected img{width:100%}.import-project-members-submit{display:block;margin:2rem auto 0;padding:.75rem 4rem}.import-project-selector{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-selector{width:90%;min-width:0}}.import-project-selector .import-project-selector-service img{display:block;margin:1rem auto;width:4rem}.import-project-selector .import-project-selector-filter{-ms-flex-align:center;align-items:center;background:#e4e3e3;display:-ms-flexbox;display:flex;padding:.5rem}.import-project-selector .import-project-selector-filter input{background:#f5f5f5;border:0;-ms-flex:1;flex:1;padding:.5rem}.import-project-from-site,.import-project-selector .import-project-selector-title{border-bottom:1px solid #e4e3e3;padding:1rem}.import-project-selector .import-project-selector-filter svg{width:1rem;height:1rem;fill:#555;margin:0 1rem}.import-project-selector .import-project-selector-title:hover{background:rgba(91,130,0,.1);cursor:pointer}.import-project-from-site{-ms-flex-align:center;align-items:center;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;position:relative}.import-project-from-site:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-from-site:first-child{border-top:1px solid #e4e3e3}.import-project-from-site:first-child .import-project-name{margin:0}.import-project-from-site:first-child .import-project-logo img{padding:0 .9rem 0 1rem;width:5.1rem}.import-project-logo{-ms-flex-item-align:start;align-self:flex-start;margin-right:.5rem}.import-project-logo img{padding:0 1rem;width:5rem}.import-project-name-wrapper{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.import-project-description{margin-bottom:0}.import-project-description a{color:#5b8200;margin-left:.3rem}.import-project-url{margin-top:.5rem}.import-project-input{vertical-align:middle}.import-project-button{background:#5b8200;color:#fff;padding:.4rem 1rem}.create-project-invite-avatars{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.create-project-invite-avatar{cursor:pointer;display:block;margin-right:.25rem}.create-project-invite-avatar:hover{background:#f5f5f5;position:relative;border:0;opacity:.9;transition:all .2s;transition-delay:.2s}.create-project-invite-avatar:hover:after,.create-project-invite-avatar:hover:before{content:"";width:2px;height:66px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled{opacity:.3;transition:opacity .2s}.create-project-invite-avatar.disabled:hover{background:#f5f5f5;position:relative;border:0;opacity:.6;transition:all .2s ease-in}.create-project-invite-avatar.disabled:hover:after,.create-project-invite-avatar.disabled:hover:before{content:"";width:2px;height:33px;background:#ff8282;position:absolute;top:0}.create-project-invite-avatar.disabled:hover:after{transform:rotate(-45deg);left:0;transform-origin:top}.create-project-invite-avatar.disabled:hover:before{transform:rotate(45deg);right:0;transform-origin:top}.create-project-invite-avatar.disabled:hover::after{background:#444;left:24px;top:8px;transform:rotate(0);transform-origin:center}.create-project-invite-avatar.disabled:hover::before{background:#444;right:22px;top:8px;transform:rotate(90deg);transform-origin:center}.create-project-invite-avatar img{cursor:pointer;width:3rem}.import-project-jira-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-jira-form{width:90%;min-width:0}}.import-project-jira-form fieldset{margin-bottom:1rem}.import-project-jira-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-jira-form label .mumble{margin-left:.25rem}.import-project-jira-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-jira-form-check span{display:block}.import-project-jira-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-jira-form-check .check{position:absolute;right:0;top:0}.import-project-jira-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-jira-form-title-wrapper .create-project-title{display:inline-block}.import-project-jira-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-description,.import-project-jira-form-title{margin:0;text-align:center}.import-project-jira-form-import-type label .icon,.import-project-jira-form-privacity label .icon{margin-right:.25rem}.import-project-jira-form-description{color:#767676;margin-bottom:2rem}.import-project-jira-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-jira-form-import-type input:checked+label,.import-project-jira-form-privacity input:checked+label,.import-project-jira-form-selector-template,.import-project-jira-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-jira-form-import-type{display:-ms-flexbox;display:flex}.import-project-jira-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-import-type input:checked+label{background:#dcdcdc}.import-project-jira-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-jira-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-jira-form-import-type input{display:none}.import-project-jira-form-import-type label{background:#f5f5f5}.import-project-jira-form-privacity{display:-ms-flexbox;display:flex}.import-project-jira-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-jira-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-jira-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-jira-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-jira-form-privacity input:checked+label{background:#dcdcdc}.import-project-jira-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-jira-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-jira-form-privacity input{display:none}.import-project-jira-form-privacity label{background:#f5f5f5}.import-project-jira-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-jira-form-type span{margin-left:.5rem}.import-project-jira-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-jira-form-action-back,.import-project-jira-form-action-cancel,.import-project-jira-form-selector a:hover{color:currentColor}.import-project-jira-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-jira-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-jira-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-jira-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-jira-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-jira-form-selector-template{text-transform:uppercase}.create-project-import-type-info,.import-project-jira-form-selector-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-jira-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-jira-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-jira-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-jira-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-jira-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-jira-form-selector p{margin-bottom:0}.import-project-jira-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-jira-form-action button{font-size:1.2rem;padding:.75rem}.import-project-jira-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-jira-form-action-back:hover,.import-project-jira-form-action-cancel:hover{color:#9dce0a}.import-project-jira-form-action-cancel{-ms-flex:1;flex:1}.import-project-jira-form-action-back{width:10%}.import-project-jira-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.import-project-jira-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-jira-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-jira-form .spin{text-align:center;width:100%}.create-project-import-type-info{font-size:.9rem;margin-bottom:1rem}.create-project-type-issues-subform{margin:1rem 0 2rem}.create-project-type-issues-subform-title{font-size:.9rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.create-project-type-issues-subform-radiogr input{opacity:0}.create-project-type-issues-subform-radiogr input:checked+svg{fill:rgba(91,130,0,.6);stroke:rgba(91,130,0,.1)}.create-project-type-issues-subform-radiogr svg{fill:#e4e3e3;stroke:#cbc9c9;stroke-width:1px;vertical-align:middle}.create-project-type-issues-subform-radiogr .control-indicator{padding-left:.25rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.create-project-import-type{margin-bottom:.25rem}.create-project-import-type fieldset{margin:0}tg-select-import-user-lightbox .form{-ms-flex-preferred-size:600px;flex-basis:600px;-ms-flex-positive:0;flex-grow:0;width:600px}tg-select-import-user-lightbox .candidate-user{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-bottom:1.5rem}tg-select-import-user-lightbox .candidate-user .candidate-user-name{margin-left:.5rem}tg-select-import-user-lightbox .candidate-user .user-list-avatar{background-color:red;height:32px;margin-right:.5rem;width:32px}tg-select-import-user-lightbox .error{color:#ff8282;text-align:center}tg-select-import-user-lightbox .more-users{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;padding:1rem;text-align:center}tg-select-import-user-lightbox .group{display:-ms-flexbox;display:flex}tg-select-import-user-lightbox .group input{-ms-flex-positive:2;flex-grow:2;margin-right:.5rem}tg-select-import-user-lightbox .group .submit-button{-ms-flex-positive:0;flex-grow:0;width:auto}tg-select-import-user-lightbox .search-user-mode{font-size:.9rem;background:0 0;margin-top:2rem;padding:.5rem;text-align:left;transition:.2s;width:100%}tg-select-import-user-lightbox .search-user-mode:hover{color:#5b8200}tg-select-import-user-lightbox label{display:block;padding-bottom:.5rem}.import-project-trello-form{margin:1rem auto;min-width:768px;max-width:800px}@media (max-width:767px){.import-project-trello-form{width:90%;min-width:0}}.import-project-trello-form fieldset{margin-bottom:1rem}.import-project-trello-form label{font-size:.9rem;display:block;margin-bottom:.25rem}.import-project-trello-form label .mumble{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-left:.25rem}.import-project-trello-form-check{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;position:relative}.import-project-trello-form-check span{display:block}.import-project-trello-form-check .description{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.import-project-trello-form-check .check{position:absolute;right:0;top:0}.import-project-trello-form-title-wrapper{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.import-project-trello-form-title-wrapper .create-project-title{display:inline-block}.import-project-trello-form-title-wrapper .icon{width:1.75rem;height:1.75rem;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-description,.import-project-trello-form-title{margin:0;text-align:center}.import-project-trello-form-import-type label .icon,.import-project-trello-form-privacity label .icon{margin-right:.25rem}.import-project-trello-form-description{color:#767676;margin-bottom:2rem}.import-project-trello-form-limit{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;font-size:.9rem;color:#555}.import-project-trello-form-import-type input:checked+label,.import-project-trello-form-privacity input:checked+label,.import-project-trello-form-selector-template,.import-project-trello-form-type{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.import-project-trello-form-import-type{display:-ms-flexbox;display:flex}.import-project-trello-form-import-type fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-import-type fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-import-type label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-import-type label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-import-type input:checked+label{background:#dcdcdc}.import-project-trello-form-import-type input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-trello-form-import-type input:disabled+label .icon{color:#9c9c9c}.import-project-trello-form-import-type input{display:none}.import-project-trello-form-import-type label{background:#f5f5f5}.import-project-trello-form-privacity{display:-ms-flexbox;display:flex}.import-project-trello-form-privacity fieldset:first-child label{border-radius:.25rem 0 0 .25rem}.import-project-trello-form-privacity fieldset:last-child label{border-radius:0 .25rem .25rem 0}.import-project-trello-form-privacity label{-ms-flex-align:center;align-items:center;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;text-align:center;padding:.75rem;text-transform:uppercase}.import-project-trello-form-privacity label:hover{background:#e8e8e8;transition:background .2s linear}.import-project-trello-form-privacity input:checked+label{background:#dcdcdc}.import-project-trello-form-privacity input:disabled+label{cursor:not-allowed;color:#9c9c9c}.import-project-trello-form-privacity input:disabled+label .icon{color:#9c9c9c}.import-project-trello-form-privacity input{display:none}.import-project-trello-form-privacity label{background:#f5f5f5}.import-project-trello-form-type{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:2rem;text-transform:uppercase}.import-project-trello-form-type span{margin-left:.5rem}.import-project-trello-form-selector a{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;color:#444;cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;position:relative}.import-project-trello-form-action-back,.import-project-trello-form-action-cancel,.import-project-trello-form-selector a:hover{color:currentColor}.import-project-trello-form-selector li:hover{background:rgba(91,130,0,.1);transition:background .3s ease-in}.import-project-trello-form-selector li:first-child{border-top:1px solid #e4e3e3}.import-project-trello-form-selector-icon{-ms-flex-item-align:start;align-self:flex-start;padding:1.5rem 1rem}.import-project-trello-form-selector-icon .icon{width:2.25rem;height:2.25rem}.import-project-trello-form-selector-template-wrapper{-ms-flex:1;flex:1;padding:1.25rem}.import-project-trello-form-selector-template{text-transform:uppercase}.import-project-trello-form-selector-description,.project-list-wrapper .project-list-title h1,.transfer-project .transfer-title,.transfer-project-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.import-project-trello-form-selector-long-description{margin-top:1rem;max-height:120px;overflow:hidden;transition:all .3s .2s cubic-bezier(0,0,.53,1.32)}.import-project-trello-form-selector-long-description.ng-hide{line-height:0;max-height:0}.import-project-trello-form-selector-question{position:absolute;right:1.5rem;top:1.5rem}.import-project-trello-form-selector-question:hover svg{fill:#5b8200;transition:fill .2s linear}.import-project-trello-form-selector-question svg{width:1.2rem;height:1.2rem;fill:#444}.import-project-trello-form-selector p{margin-bottom:0}.import-project-trello-form-action{display:-ms-flexbox;display:flex;margin:3rem 0 0}.import-project-trello-form-action button{font-size:1.2rem;padding:.75rem}.import-project-trello-form-action-submit{-ms-flex:4;flex:4;margin-left:1rem}.import-project-trello-form-action-back:hover,.import-project-trello-form-action-cancel:hover{color:#9dce0a}.import-project-trello-form-action-cancel{-ms-flex:1;flex:1}.import-project-trello-form-action-back{width:10%}.import-project-trello-form-warning{font-size:.9rem;border:1px solid #ff8282;display:-ms-flexbox;display:flex;padding:1rem;margin-bottom:1rem}.profile-projects,.profile-timeline,.transfer-project-detail{border-top:1px solid #e4e3e3}.import-project-trello-form-warning .icon-exclamation{fill:#ff8282;margin-right:.5rem;vertical-align:middle}.import-project-trello-form-warning a{color:#5b8200;display:inline-block;margin-left:.25rem}.import-project-trello-form .spin{text-align:center;width:100%}.warning-users-import-lightbox{max-width:600px}.warning-users-import-lightbox .warning-users-import-title{text-align:center}.warning-users-import-lightbox .actions{display:-ms-flexbox;display:flex;margin:2rem}.warning-users-import-lightbox .actions button{-ms-flex:1;flex:1}.warning-users-import-lightbox .actions button:first-child{-ms-flex:0;flex:0;-ms-flex-preferred-size:40%;flex-basis:40%;margin-right:.5rem}.warning-users-import-lightbox .actions .button-trans{color:#444}.profile-projects .list-itemtype-project{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;min-height:9rem;padding:.75rem}.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-image,.profile-projects .list-itemtype-project.blocked-project .list-itemtype-project-right,.profile-projects .list-itemtype-project.blocked-project .project-description,.profile-projects .list-itemtype-project.blocked-project .project-title{opacity:.4}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-negative:0;flex-shrink:0;-ms-flex-pack:justify;justify-content:space-between;width:200px}.profile-projects .list-itemtype-project .icon-blocked-project,.project-list-wrapper .icon-badge,.project-list-wrapper .icon-blocked-project,.project-list-wrapper .icon-lock{width:1rem;height:1rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;margin:0}.project-list-wrapper .icon-badge{margin-left:.5rem}.project-list-wrapper .create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .import-project-button{padding:.53rem .8rem}.project-list-wrapper .import-project-button:hover .icon-upload{fill:#9dce0a}.project-list-wrapper .import-project-button .icon-upload{fill:#fff}.project-list-wrapper .project-list-section{display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .help-area{font-size:.9rem;color:#767676;width:200px}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:rgba(157,206,10,.1);cursor:move;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project.blocked-project .icon-badge,.project-list-wrapper .list-itemtype-project.blocked-project .list-itemtype-project-image,.project-list-wrapper .list-itemtype-project.blocked-project .private,.project-list-wrapper .list-itemtype-project.blocked-project .project-description,.project-list-wrapper .list-itemtype-project.blocked-project .project-title{opacity:.25}.project-list-wrapper .list-itemtype-project.blocked-project:hover .icon-drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;opacity:0}.project-list-wrapper .drag svg{fill:#767676;height:1.1rem;margin-right:.5rem;transition:opacity .2s;width:1.1rem}.project-list-wrapper .gu-transit{background-color:#ecebeb;height:5rem;opacity:1}.project-list-wrapper .gu-transit *{display:none}.project-list-wrapper .gu-mirror{background:#edffc4;opacity:1}.blocked-project-detail,.transfer-project{background:url(../images/discover.png) bottom center repeat-x;min-height:calc(100vh - 40px)}.blocked-project-detail{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center;min-width:100vw;width:100vw}.blocked-project-inner{width:330px}.blocked-project-title{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex}.blocked-project-title .project-image{-ms-flex-preferred-size:6rem;flex-basis:6rem;margin-right:1rem;max-width:6rem;position:relative}.blocked-project-title img{width:100%}.blocked-project-title .icon-blocked-project{width:1.5rem;height:1.5rem;position:absolute;right:-.5rem;top:-.5rem}.blocked-project-title .project-title{font-size:1.6rem}.blocked-project-message{margin-top:4rem;text-align:center}.blocked-project-message .project-block-title{font-size:2rem}.transfer-project-wrapper{-ms-flex-preferred-size:500px;flex-basis:500px;-ms-flex-positive:0;flex-grow:0;width:90%}.transfer-project{-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:calc(100vh - 40px);-ms-flex-pack:center;justify-content:center}.master,body{background:#fff}.transfer-project-detail{-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e3e3;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;margin:1rem 0 3rem;padding:1rem 0}.transfer-project-image{margin-right:1rem;width:4rem}.transfer-project-title{font-size:1.6rem;margin-bottom:.25rem}.transfer-project-statistics span{color:#767676;margin-right:.5rem}.transfer-project-statistics svg{fill:#767676;margin-right:.25rem}.transfer-project-private{text-transform:uppercase}.transfer-project-comment-link{color:#5b8200;cursor:pointer;display:block;margin-bottom:1rem}.transfer-project-comment-link:hover{color:#9dce0a}.transfer-project-comment-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.transfer-project-comment-header .icon-close{cursor:pointer;fill:#767676}.transfer-project-comment-header .icon-close:hover{fill:#ff8282;transition:fill .2s}.transfer-project-comment-form.ng-enter{animation:dropdownFade .2s}.transfer-project-comment-label{display:block;margin-bottom:.5rem}.transfer-project-comment{margin-bottom:1rem;min-height:6rem}.transfer-project-options{display:-ms-flexbox;display:flex}.transfer-project-options a{font-size:1.2rem;display:block;-ms-flex:1;flex:1;padding:.75rem}.transfer-project-options a:first-child{margin-right:.5rem}.profile-timeline .activity-item{border-bottom:1px solid #e4e3e3;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#5b8200}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-ms-flex-align:center;align-items:center;color:#767676;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#767676;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-item .new-color{border-radius:50%;display:inline-block;height:1rem;margin-left:.2rem;position:relative;top:.1rem;width:1rem}.profile-timeline .activity-member-view{display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-ms-flex:1;flex:1}.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .activity-member-view p{color:#767676}a,body{color:#444}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;font-size:1rem;display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:sub;white-space:nowrap}.profile-timeline .single-attachment .icon{fill:#444;margin-right:.5rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;transform-origin:32 32;max-height:3rem;max-width:3rem}.wiki-history{margin-bottom:2rem}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}svg{pointer-events:none}a[ng-click] svg{pointer-events:auto}tg-card .card-title span:last-child{word-break:break-word}.menu-secondary{background:#f5f5f5}.menu-tertiary{background-color:#879b89}.extrabar{background:#f5f5f5}h1,h2,h3,h4,h5,h6{color:#050505}a:hover{color:#5b8200}input[type=number],input[type=text],input[type=password],input[type=url],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#767676;color:#444}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#909090}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#909090}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=url]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#909090}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#909090}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=url].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid red}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);color:#fff}blockquote{border-left:5px solid #f5f5f5}blockquote,blockquote p,cite{color:#555}.summary{background:#444;color:#fff}.navbar{background:rgba(0,0,0,.5)}.navbar::after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#879b89;background-image:url(../images/menu.png)}.kanban-table-body .kanban-uses-box,.kanban-table-header .task-colum-name,.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.main-nav svg{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #767676}.taskboard-table-header .task-colum-name .icon{fill:#767676}.kanban-table-header .task-colum-name{border-top:3px solid #767676}.kanban-table-header .task-colum-name .icon{color:#767676} \ No newline at end of file diff --git a/dist/v-1527758585938/svg/editor.svg b/dist/v-1528953702317/svg/editor.svg similarity index 100% rename from dist/v-1527758585938/svg/editor.svg rename to dist/v-1528953702317/svg/editor.svg diff --git a/dist/v-1527758585938/svg/icons/block-user.svg b/dist/v-1528953702317/svg/icons/block-user.svg similarity index 100% rename from dist/v-1527758585938/svg/icons/block-user.svg rename to dist/v-1528953702317/svg/icons/block-user.svg diff --git a/dist/v-1527758585938/svg/icons/multi-block-project.svg b/dist/v-1528953702317/svg/icons/multi-block-project.svg similarity index 100% rename from dist/v-1527758585938/svg/icons/multi-block-project.svg rename to dist/v-1528953702317/svg/icons/multi-block-project.svg diff --git a/dist/v-1527758585938/svg/icons/project-limit.svg b/dist/v-1528953702317/svg/icons/project-limit.svg similarity index 100% rename from dist/v-1527758585938/svg/icons/project-limit.svg rename to dist/v-1528953702317/svg/icons/project-limit.svg diff --git a/dist/v-1527758585938/svg/icons/team-question.svg b/dist/v-1528953702317/svg/icons/team-question.svg similarity index 100% rename from dist/v-1527758585938/svg/icons/team-question.svg rename to dist/v-1528953702317/svg/icons/team-question.svg diff --git a/dist/v-1527758585938/svg/logo-color.svg b/dist/v-1528953702317/svg/logo-color.svg similarity index 100% rename from dist/v-1527758585938/svg/logo-color.svg rename to dist/v-1528953702317/svg/logo-color.svg diff --git a/dist/v-1527758585938/svg/logo-moustache.svg b/dist/v-1528953702317/svg/logo-moustache.svg similarity index 100% rename from dist/v-1527758585938/svg/logo-moustache.svg rename to dist/v-1528953702317/svg/logo-moustache.svg diff --git a/dist/v-1527758585938/svg/logo-nav.svg b/dist/v-1528953702317/svg/logo-nav.svg similarity index 100% rename from dist/v-1527758585938/svg/logo-nav.svg rename to dist/v-1528953702317/svg/logo-nav.svg diff --git a/dist/v-1527758585938/svg/logo.svg b/dist/v-1528953702317/svg/logo.svg similarity index 100% rename from dist/v-1527758585938/svg/logo.svg rename to dist/v-1528953702317/svg/logo.svg diff --git a/dist/v-1527758585938/svg/pattern.svg b/dist/v-1528953702317/svg/pattern.svg similarity index 100% rename from dist/v-1527758585938/svg/pattern.svg rename to dist/v-1528953702317/svg/pattern.svg diff --git a/dist/v-1527758585938/svg/spinner-circle.svg b/dist/v-1528953702317/svg/spinner-circle.svg similarity index 100% rename from dist/v-1527758585938/svg/spinner-circle.svg rename to dist/v-1528953702317/svg/spinner-circle.svg diff --git a/dist/v-1527758585938/svg/spinner.svg b/dist/v-1528953702317/svg/spinner.svg similarity index 100% rename from dist/v-1527758585938/svg/spinner.svg rename to dist/v-1528953702317/svg/spinner.svg diff --git a/dist/v-1527758585938/svg/sprite.svg b/dist/v-1528953702317/svg/sprite.svg similarity index 100% rename from dist/v-1527758585938/svg/sprite.svg rename to dist/v-1528953702317/svg/sprite.svg