From 979dcead496171ee8678e5a3f850520daff4d3ab Mon Sep 17 00:00:00 2001 From: Rokt33r Date: Thu, 8 Oct 2015 20:40:19 +0900 Subject: [PATCH] before applying redux --- .gitignore | 1 + .gitmodules | 4 + app.icns | Bin 0 -> 158353 bytes browser/finder/Components/FinderDetail.jsx | 2 +- browser/finder/Components/FinderInput.jsx | 2 +- browser/finder/Components/FinderList.jsx | 2 +- browser/finder/index.electron.html | 72 - browser/finder/index.html | 39 + browser/finder/index.jsx | 2 +- browser/index.html | 11 - browser/main/Components/AboutModal.jsx | 2 +- browser/main/Components/AddMemberModal.jsx | 2 +- browser/main/Components/ArticleDetail.jsx | 209 + browser/main/Components/ArticleList.jsx | 63 + browser/main/Components/CodeEditor.jsx | 15 +- browser/main/Components/CodeForm.jsx | 2 +- browser/main/Components/CodeViewer.jsx | 2 +- browser/main/Components/ContactModal.jsx | 49 +- browser/main/Components/EditProfileModal.jsx | 4 +- browser/main/Components/HomeNavigator.jsx | 110 +- browser/main/Components/LaunchModal.jsx | 2 +- browser/main/Components/LogoutModal.jsx | 2 - browser/main/Components/ModeIcon.jsx | 79 + browser/main/Components/NoteForm.jsx | 2 +- .../main/Components/PlanetArticleDetail.jsx | 126 - browser/main/Components/PlanetArticleList.jsx | 100 - browser/main/Components/PlanetCreateModal.jsx | 2 +- browser/main/Components/PlanetHeader.jsx | 2 +- browser/main/Components/PlanetNavigator.jsx | 2 +- .../main/Components/PlanetSettingModal.jsx | 2 +- browser/main/Components/PreferencesModal.jsx | 2 +- browser/main/Components/ProfileImage.jsx | 2 +- browser/main/Components/TeamCreateModal.jsx | 2 +- browser/main/Components/TeamSettingsModal.jsx | 2 +- browser/main/Components/TopBar.jsx | 30 + browser/main/Components/UserNavigator.jsx | 53 + browser/main/Containers/HomeContainer.jsx | 41 - browser/main/Containers/LoginContainer.js | 92 + browser/main/Containers/LoginContainer.jsx | 108 - browser/main/Containers/MainContainer.js | 45 + browser/main/Containers/MainContainer.jsx | 107 - ...PlanetContainer.jsx => PlanetContainer.js} | 3 +- browser/main/Containers/SignupContainer.js | 98 + browser/main/Containers/SignupContainer.jsx | 139 - browser/main/Containers/UserContainer.jsx | 367 -- .../HomeContainer/Components/ArticleDetail.js | 9 + .../HomeContainer/Components/ArticleList.js | 11 + .../Components/ArticleNavigator.js | 12 + .../HomeContainer/Components/UserNavigator.js | 33 + browser/main/HomeContainer/actions.js | 10 + browser/main/HomeContainer/index.js | 50 + browser/main/HomeContainer/reducer.js | 15 + browser/main/Mixins/AuthFilter.js | 4 +- browser/main/Mixins/Markdown.js | 1 + browser/main/Mixins/Modal.jsx | 2 +- .../Mixins/{LinkedState.js => linkState.js} | 10 +- browser/main/Services/Hq.js | 118 +- browser/main/Services/socket.js | 49 +- browser/main/Stores/AuthStore.js | 131 - browser/main/Stores/PlanetStore.js | 179 - browser/main/Stores/UserStore.js | 58 - browser/main/helpers/linkState.js | 29 + browser/main/helpers/openExternal.js | 6 + browser/main/index.electron.html | 99 - browser/main/index.html | 96 +- browser/main/index.js | 29 + browser/main/index.jsx | 46 - browser/main/style.js | 2 - .../styles/main/components/ArticleDetail.styl | 169 + .../styles/main/components/ArticleList.styl | 69 + browser/styles/main/components/Select.styl | 21 +- browser/styles/main/components/TopBar.styl | 43 + .../styles/main/containers/HomeContainer.styl | 153 + .../main/containers/LoginContainer.styl | 21 +- .../styles/main/containers/UserContainer.styl | 421 +- browser/styles/main/index.css | 3733 +++++++++++++++++ browser/styles/main/index.styl | 43 +- browser/styles/mixins/marked.styl | 22 +- browser/styles/mixins/util.styl | 3 +- browser/styles/vars.styl | 8 +- config.js | 4 +- finder-window.js | 4 +- lib/key-gen.js | 7 + main-window.js | 5 +- package.json | 39 +- submodules/ace | 1 + 86 files changed, 5445 insertions(+), 2323 deletions(-) create mode 100644 app.icns delete mode 100644 browser/finder/index.electron.html delete mode 100644 browser/index.html create mode 100644 browser/main/Components/ArticleDetail.jsx create mode 100644 browser/main/Components/ArticleList.jsx create mode 100644 browser/main/Components/ModeIcon.jsx delete mode 100644 browser/main/Components/PlanetArticleDetail.jsx delete mode 100644 browser/main/Components/PlanetArticleList.jsx create mode 100644 browser/main/Components/TopBar.jsx create mode 100644 browser/main/Components/UserNavigator.jsx delete mode 100644 browser/main/Containers/HomeContainer.jsx create mode 100644 browser/main/Containers/LoginContainer.js delete mode 100644 browser/main/Containers/LoginContainer.jsx create mode 100644 browser/main/Containers/MainContainer.js delete mode 100644 browser/main/Containers/MainContainer.jsx rename browser/main/Containers/{PlanetContainer.jsx => PlanetContainer.js} (99%) create mode 100644 browser/main/Containers/SignupContainer.js delete mode 100644 browser/main/Containers/SignupContainer.jsx delete mode 100644 browser/main/Containers/UserContainer.jsx create mode 100644 browser/main/HomeContainer/Components/ArticleDetail.js create mode 100644 browser/main/HomeContainer/Components/ArticleList.js create mode 100644 browser/main/HomeContainer/Components/ArticleNavigator.js create mode 100644 browser/main/HomeContainer/Components/UserNavigator.js create mode 100644 browser/main/HomeContainer/actions.js create mode 100644 browser/main/HomeContainer/index.js create mode 100644 browser/main/HomeContainer/reducer.js rename browser/main/Mixins/{LinkedState.js => linkState.js} (75%) delete mode 100644 browser/main/Stores/AuthStore.js delete mode 100644 browser/main/Stores/PlanetStore.js delete mode 100644 browser/main/Stores/UserStore.js create mode 100644 browser/main/helpers/linkState.js create mode 100644 browser/main/helpers/openExternal.js delete mode 100644 browser/main/index.electron.html create mode 100644 browser/main/index.js delete mode 100644 browser/main/index.jsx delete mode 100644 browser/main/style.js create mode 100644 browser/styles/main/components/ArticleDetail.styl create mode 100644 browser/styles/main/components/ArticleList.styl create mode 100644 browser/styles/main/components/TopBar.styl create mode 100644 browser/styles/main/containers/HomeContainer.styl create mode 100644 browser/styles/main/index.css create mode 100644 lib/key-gen.js create mode 160000 submodules/ace diff --git a/.gitignore b/.gitignore index bb20f469..3f4e490c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ electron_build/ .env dist/ vendor/ +Boost-darwin-x64/ diff --git a/.gitmodules b/.gitmodules index e69de29b..e274b379 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "submodules/ace"] + path = submodules/ace + url = https://github.com/ajaxorg/ace-builds.git + branch = master diff --git a/app.icns b/app.icns new file mode 100644 index 0000000000000000000000000000000000000000..6eeed2012ad6b626a970927e8a99444e7a7e2706 GIT binary patch literal 158353 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…oAvidy`=wZOf*5U^C{wjB7Zm$1e zq8!un{}#>_P(~23!RPvSQKpWu$ijl>f0Xd(eTi*YARPHArHszNb`b*2xY=!H2!j%i4#7IU|DgFcj#3PM{|GI zuA4BiHngK$oiIC01@>vmf2QEiPani0&};t3FvA40!U|RI1l+vOX`>4JiEW$6S|c*JLaxQ>@$- zd&q5Rq)oC@6b!x;kP>|4_#qcR7h{?Xw{(FEpj~a#H#SDJKb}MBzq4sIFfwq}T z>O7=|h}d>BhZG->LN#_b72Y#9_+Vx19z-;L`%vASXB}U< zXy}eA0U+z@l>ZZR69aMQ0(Qw|;fBCB4u@!Y9d{Nuc9{Yozscr7U9GGWV4O?4t0!6} z#21hylv?7hpj!mPAWQt7B;PcbGe!Buuo~E%E776t@hA@7Xq8JYyN~sW()K(?wC;40+XwWMrOc zDUCrLPK|kt3B$A)4PP^`H*^*~cUkk-s8OyA4CV>g1{%aq9}%G}8Y4RBep>T?Sinaq zC6G`)rQ+rK`*|R)8l>9DkCM8`GD9A|%!W5)c;EGpf7Ap0|9kle{Di5CdO19Z9s!U(Tva|5M05&a zGr!J_=PR1Miy6>O+XviON`b6uAl-?;Qnwaljt)Ec1Z*9SNnIU`BwB-PM!)t&&fp#@ z)PdupJ*02A)+g#%fvm(!>m!arZ_s#y?0jfit^KdyHYcUMP@7Za;%G!**ZKT83Ri~A z5~dqRuoz9dFUx%)W=3Ga9@9jdFc#Qa>@!S;M{MyHO(1y!`gY7aza-JwCssqY>7^P@nc5S+)*H zzF=X4i#o4z1fR+;npr*-OIp>|GLc2VG}IgL`iDhke7&VX^y*`1gk3e368Mt&HV)W4 zN6X|@xv4cDw4hV6Yep#5mCz2+bw2i%OYHwqP{=7Lel=GcWv+`J)r3ANciZaBcAwE) zO;i^=ScD2(YF!-&hQ?e#@33UxUo1tIy%MKf`jrhhPBo-jh4E zVdiH@+wzQvrNfBPFeEN}8lVK5c#nCE@#~H@s<3Ra^Q$vit=WJ}2?s(g5XM83E&o+} zJY-P1U4{c^QkFgX0U@#Nj_xm}p20T=&CDf4MbsA&IB%QA)KpXl({@kH8o56fhu7DSBLySnp^7PSKy}~8nwJN0kQUTzbgiKk*xV7AE`*11}=daQ7(uH)r ze<(DR9pCT`D}j9^?S&M6F;bjPK>*9dJaAhxg3;c9K2^^1J0(m6JbDrsUb6md4qTJk zY*4Xl^b`y7f*!vlV>H*K!%D7zgv@%`ZY!;J2_INl@|>oQmczKudEst~`g2)08Fs8N z4+N8YtKVOQ$7BhkIlhl?YeUftlEkz z$n0o|`x5a)P6IQhvx#F6wv*uvZddc|<^4*dj_7b1`NbA~&ep47!%(h|t{^caqse34 zO~;DRPuy#f(zW7TN~60+gA!+T9e|qE4nJ;JDJ70G+8;&gHF2)jTy*WAX7=(+yquN` z+ZqlM49bgqCQrnUib8o1nzXMwAN7F;enn%MFbwej4kcpe${{jS_sHy+P*Wl=inG`@ zl{w{YUtu_Iy7mmPtZg9G_;6sW5fpw$UCt4BrF_nDL{@gu+k1nDpT(GGGIzL)Gn~og zi@MPKfl_TQg&tBfB+n@N!0ggY#AcQAX%U`|UHaO0XwSP989wYvzdyTrv=5dO8a5C0 zffIfW(uDM|htksB!@5H^H=wkK8S)~oetGFZ8OMH02R}Sm(c@N1_C#cILu?egpY$e{ z&xl9dO#;H(-9lnrWYP?IYCD!aZa>Qxe4U8q91hjFA)jWIDTyM{^@NFq^`n9bcmNk^Nx(rQ=NN>MD$ zPRFsXn@nO1iot7Mj_exZ<$Xduef^*A4uLyLJeZ+cCqg z97J|;2HyS5?%dLe?ReDMYnSkDt9lDS+xZDmjB!aWz{rm@FUNJZSduRaNB8yNMKhVv z9p|>Tg^3Nf5&nGOKBgA(YuS~)ol-^T0d+``-duZg7iVp_&0CEgT_ffcL956w~V6g z@bL(RgO`hlj=bNsh~?-sME#hwe&O@ly*w8r-kqB}9o5z_rQ*NItKRpB8(ZhI3!!ih z0~{usO!czdjHywmlH-3L?h_9SGL^Jyp-{Iao2Qe!9@S)iT9&;kXzqF|{*W5H)T(BT z>~mrXh1&s0mk}ppf=|<3UrK=kYXnETSSYqX%Z|!p5tdlOuw2WaT_o%&zY=VV)<7MR z^kp+^E5y+8lsz-2ID|fEm^FLGH0w6uB6PnM9#7?LOI?=3tvbk>VZn9tJSy{ijZU)tq_p&}N&(520w zZcOGOIX&tp^*?fOwm26Gp9h!NM+1*M4)5GOzqe0U;cuQb1YBJC-*nJMSk9J>-P;_4 z7r4g@vREY}rW7c-L*G-JntTzWl$)k`-AVSq4fj`!LPRdPTb9t52gG+1h0A&Ka*dyu z;!LK8Hc~6vC@Ru^rvgKh={f40x{3SACq;C_O3Pb*(Fmux7KWb8nsPyUKyFqrfpxum zMC^M4a-ZURx^SUu5KYQqSr*!=JG^8KgEk5yt9)Wo<>JDzuC1e@ldMo4itZ@>41M%> z=nQCcrgf2xJ7eduhR+DjMt1uEt}8x(}!9V2;V zGgV7CSzdJHTi+1Ts=D{AJXIkTaUGOFce=E7Vhf{C)MoQzWcacw^niTaJPlI?SVZ(N zNls)+Jk}$aFDe^|Jip}e1P5(zj1ZTG5~7pJy3QE&wdFZa87c`Yb3CS;efuYRPA|w& z3RENfVV@1a#uHdsHx}p-?yJ(Mgrm@cZITjqc*J9tdBsO-oUhYK8r_-V4Hk?2I>6`i zcqwxl1WDO1D7wmA84H6LTI}A?yDdL&{LTULNF2$$;U_eR@^w@gUeZelwBj9BHp-pY z01z%x5fCZHG=uK1vtFU}%$B>O-S_PQ>R&zXsG-YOPr*^qQ2H6k%$(lP<_4Vpm-mcK zMLNB8!Y@2b*K?ie5+Ess%=^4xMfu#4C;NI@Y@xV=}zX>?0vqz7N`3mCE5 zY9wq*AoE*6a$73mI{HtkXE^vED(DnRA)8-rAk^fc(}1gEkT6+F8+BUfZ`H(_#L}MT zDlvZ~{tkg{eM=vdeY-1XdswM-Gj&o9<%NWeE-rKRT9OldrwLK@l}8)um z{eWjz(fP@2-_Cw(iESiKf#~^)D61jEcDs(6&Z@_Sjh{|rrXmT{B~Pqp3j_k7Ktx%& zTaEhXPkIm#LVSYgHm6u9y;UKVv7&8~%;bL~Klbu5gXq<}^Q!nMnJj0xA7`%&2^oc7v~Fu7LRI4rB0WRp`x^OSbM(8RX4*< zXuM_zpUv8_jS408r78>*N3M&HSHHfN1a6Vmp!HUdnyzByHsn$|4ZpIzFex}xgE`wT zT!%Q!UF@u6Yh`GxX|`*UJ~3G<&~V1Uu(<|jx8#TgD$3apj>CtrL{K8PZlF`(hg&wc zWUhs4#AUs(6B6iy_2jH)!C9f)z!PyCzzW&Td{0HHaa1yV{>u(Y)fgnaXL6t;SenTqi8zPqld?KEe) zT=CPbhSo$zQ6Bv8_T8cD6Xio;ViMo~Bn=N;yx5IrCj*V7Ox0~*z!F;Fi6lD`%n3h? zqC4lddm>f8gUfMvZL)8NZeRME@AVz_p1It0SJ8{;WlYC$6^7$RIIzwR1m{-(hsjqS8kuJ^VcZO@T;eIRG-NHqkfnt!ke`3GHf2dR8i3 zr}=rruDDSTSnz1M+zBkeE0yQhF09ir=~5(fFV_hG4pElu*V}9*_4r~#f!TOKXL%kh zyuoCS()&WRuSnHG&=2*&<3Dsfq;LpV6gg%NSMv56E_J?BblYIuy^p)~+}s+@=%zx= z#;<`RT~N?2QIVt4EOwKHh^q3bIU#co1+oeEa<2sD2%%xyfvfYWPrN}wGguq4c4^t+AcTHi4W)gWlWmr^RaduRH&Nj9xe2$rq}& z+t(N{23LvZ79nP%u4Olvw6G3e+~(FZXhMk(1bw*%x!hiEn}$F= zeU_v%%pd(G^xg5S364^P11=8}x2A+c^L^8rBlRF-pEc>h`BSBIpZi|#eF0df^H3A$ zx=FhhRwt*+Mbbc+4J~q~ix6J}asYpm{{>@-#lg*JIH-lF%W-lKivlF_gEVJZ+}Y#{ z`-L4*Pt`QV!a!_L_dO{sEk^nf#MnT%wpgauuPb?5$Y-#QTV8C3E>lWiUJ(&^QUi0@pAiunC5(Qvr~~#Ui&eic#3KZ(TTEy?ksRsYGw9RSOFjP? zYA;$08{wB7DXkX>+C3}Mus>DT0;iEHiUw$LX@5Dgw^?Ub8h=G(k;mo?y^a~vve z&Fj1e>7jzndH+(4T|4D8x2sra6OaQpXnpCVNuXwn(-Urcy?)CMBi#IKp@@St_FBMAe0|+yAG0uKZAmKT)@Tx9=KLmR9 zr6#40xupwCznIfLxk3Wi-?zOh#h%(Y$^mtpqsE+aFXDVYavi3Eyp9IHN_b$9_zLy3 zaF=8Hs!Ie&LdB~ZFznyC$@3k)T%bP>04WI%F(-`=KzeZ#`Ri7Mg3l9W^T%(KN;Wbu zO*!$nZbVDVt-mh#Zq`%*rBX7B@q~OPFt$Dpf-p#&Lw76lCiS6yt(<7g*B<;)brkQb z53pz$#R(iumlSORvM2)fHe^ZYkUGF{Oy{S`v_(3-otjb}pzGk1p3VUH9gD1HDTKn% z$mG;&*7W@Qv-2q^gCNy<@ww>^jcr?$$+PAqLd<&*_=hWqWy;ks>kr{+klWW27L{R< z@41c#3YN8nJRWG!Xt_WalNO=Qq2GqUx8^iHoMpWhx;#<3OYSGpb@HrB5esDhe)k7P zAxzAgRwQoW#~sC$?*K23X|Te81qf|Qs^mqF{7;)??C3e;TTKE`aX>)qeDSp4HXqd+ zboD8boIx)HauniWT&}bcR7AoO862@Fr#blw^M^9%dfaru&Hh`)p-Y$lIaZrHT`g)U zC1qytC)9FJayevLSW2#V9S_3HUsPX?1npSN?t$ye1@KcfvzUiG39wykcB=NVt^R%; zl0!J6Ur2no^wA*JllIjR>7((5PxG!!(nzAluBb81uEEVa-8R%_u-4n`- zSx~n2@b%M*G|$MxHtF*DW#C2R0lFgkepxmxc6d@6(RuixoIG|?621rbQv%H!ux>n9 zZ{wy$v;jOgVhh{h`Q5T<2B*^$tYfq0>S)|Gwmican$h9QE#D5Ab=kS#e|*VLqSg4SDejdIVNU!%1^M{bM=N=3iJFOgDMoD$ebi|qqA z$k5*7ghoD+(o0(OKAX%+Op0KTi9rw`dI`G~7nsNYcx&53aiTfi^eV7WLUKuWCt5qr zo4ae^8zM!5M2opU+8gckFV6VT9zo$ymZVVC)#iSq?R2~**WlmdgjRRpNsWn>BKSG5 zHs;og2+NJMoMBCiI2z!)C3hL>oQPZW$wL^CL;W^s?MLJDN~_=rw75-I|4K&7{1sC5 zINV!IgSki3cPTAvOXL9EqYaSrNBCN(4Ih))4BW?YhjEJ09UO&QtO=RdyZmoo5gIJ`A}CI=2;h?_twGb)FTa`1Uy^RB=Rvmg*G6oZ z8pAB*!OS}*6gDVwAbfH>BC~x$09HpCZJ}=`t2w?Jy1`!5bF9TctYNIin{a^O== zj6hI6eUfrW4{VHR&}2K~MKx(_5!xA5n!A@R*7m6ukNcI)lF1sN`T{e%0Mib3F6m@&P^~urOJ%Z6ff$&&G}oLaiEMTwQYUPe~&NVNIKUsXwT) z&=^k+;K30MGHYUsiVdK*eYwyH)*@g9cKu?b_BwTguI~6T#o&J77o=V-_0g%=ck*)| zrQ;ur&NG>Q_q+h^0qdp0E8R+uMgM50?~z8=B;--P1}ig}kFAT68qzu8g0`))v`!)) z2`Axb(>QL^Jy7F13NJDb$6mX!?RaoFk?T$^R6T8r%_X{ zSe0v1aKfP^G@~}P^W34n+ST9qbawNDD5P?P}Esc)RJuLGH9K5F%PzCdv5ek$D5_b2ypY>6$9N7wT{tD@r>0bg>< zP`J3N1le@t)py@E7`OoFOze2HwUbvaQzR_x#Q#+TiCJrWYGdm*J3l?~?eIjzy%yW^ zN(jtb^gJQ4P;bSZ8aHQpIE6-~Td$n24m-~8)!%uCZN3^T7~Bf=LeJ*(X{@Tck9l{h z7CI?Edx%F%4p(cuPbB}C806<;jrW7!KQ6%=ZpUNkcu^kpil zgEJApjQ-uzAd3&sGeHk?Ef?$dJQtVU7KqOyUZpf{yGgR42Ha5D^?@eq-2)E zFgXDz4r&-?pfct6v6CuJUiUbkb)JKkM-vrA%Zhd%XzfDlXr*xmrGu>|h^iBJB3>3} z0|^55u$E3{*1IR7vSNlmntnPPpamppjTO{;Yx;>^vKwyTQ3ysd-+O+MN%=*kHpn|7 zMd>HDoWOp`ZjGK@bf5-$r{d8Z!m>Z%j(j#{g7b2j$>y$?=-LavqYFI=J4 zsy2gk8E>A+=nBaoVay~7%bAmN7USnP$)_R^EPx ze>fb$+oXhnTzx0BdHh8pqE*~n@5FYiRagqOL+n&RZc--@eL(YJc zGn#2-T6s$I@GxWtLE~LpjG%wmdiTf_aPg{WzIuSjSWV7~qg?KV%hTFu#^ZAv=+r4E z|4f7Fimaoz8Dv4ynVJ_)fW*T~$&A)mA)2@qbTc~pgtP-XpM=%+iSWDnV3*~Vz^9it z+^ljgXY3jL?9s#E>7jcn;CWw|#Auo-)xm$8gEvmx$>E+cD{9_JB$0yhdg@_{`wr?J zd|@M>l_9@C4BV6>Gr@Zpqf4p3f)UjWA2d7@r@u?gEGils%Zqr;&r0C~5&|&yWR~1b zheZj2Qo*C7=iJacY^_^5pr~hY|2!4Jo(@eFTg$(sEhEGhtFpz{OMVcexG`&?SOHZi z!Pd7=oy|v{raGf49YD$@`xMYRm$)+L#BgrYfVh9ryMe6~7HAjH&Vng-Z`gI@fM)`E zG}P|h!{IYXEYBQqo4g;q>yPFRzWM%kXj&sI*+T~wV0NG;+^l_PxJMlf)ho)lkz%1q z&gjrYJC8xm?}?GK^gp^;B|%4Z%OVlSRFRhzOyf|^JX3$}Yr3*8GRUZw=NtWFi}C>Y zXwdl0y^YtQpWr?z*wf^)88Z-87|D-WrPq?_MQHq~RtR(Y>VM?ydBP{s3A34UyIJva zWIkWjhvDU!GTfuo@SrvQH2vBhVyrgb`S^~-1WByA@Oi|rg3f?H38euZi6}HSa#3y$ zGeV0D@5|L$)SRwniAjvb8a?tmL4!IAifgaLk1=hh3v$kqI(L2&~QXpQkF(aXnlW7tcvt=^~ z7xXyvrSQX%4;w<@c?dWoX2s#)=9n|hu_yZ%fpB?Mg!u~F<}XYEXxF=n^{9a72p#w7 zfdUC0-*piO}6ifFy;2CQG<0b9nWC1LAI`+j(W(and$UXhJ0N<}) z#GvV-%kxs+T*;Q}ZxRq`JjB_BbYvcRq?9`nMcg^~u|v4JTWP19O!sY-P!u->KS)xo zF=9ds$$?8cAtt?L&aOm!@v)SrK>Cx(!Nr1?{F2N!IGHKzU(`vyW>0Hh;=;rf|lE~5w$7WDV#CrDT54a&HKt~3I^2>j>e=vB zsY4t!X3N{_s2>z1aTEqRXVaz$BtFx#`-HnGGKgAf$tc$toJ*WZ?iJ}@y>L#e7Lp$8 zNE%)dK9N)dD1MN0rN$4PXwHPmz^or8Q_<9q+d*B|dL?^h1qR_Y$A61%gAS#C`R&=m z-2vvQfeQP8Um;;$ozCNt#u0t_?AbE{(hqhXffiWLT+zrQWNw43) zQ`()?<*zK*}p9N4YlkHE5gQ$7onC zk!@cLwAJ9K2!t*J?@0VRwjU(8Qw0Sz;y)?jmzw&IJE}>mZcwG-TBMCXiF2bg0dUn^ zj#PF!ei-pHf;7^B&Hk-DZb+kVK>tgIXPS)&Yr#i{d59do)QuhM9oq|>yVlJEMOZ4r z?;{X!cCAei*{Q&|DkGktW1f=B+hYXiMzyeFtPE=;U=)E?GnU0v>LjFQ0;q{Eb;Sj% zUoFC5YvGIBIuHtV?5;2Ov~>*q($$%Q?x*;2OoKrP@+w^fH7FCu z|9=8`SdNR_bUi8SQ_S_><;w7bR)Ld$^4P*7iK;eOs7*+sr_5|gxSKMIl#A0_Dku@_ z4Bcwe*u_jh3G-rgFApa!dBai1Sk2(RKGJ?As0q#}#VNe_!OIo;ZD?XxSp4kRy0}dF zt@_&P!2ne>f5~V4>D+qw%7w8|#^gm+lz2_8Bj|x(oJpxn{wi5ek&~RMVX_~^Rc_nZ z(AdT5hkrT-TL>9_A`J6zB;^oZM(?SS3{`h5M913`7wn}3nr-TaYK?f{`Z;Y|3Jug& zWOs%e)PRmq(fqREGuEb6HL5q4YvXB5nd{ElmFIj*jrooAR#bDT0De=P=DtWDHHg_9 z3(4NRT%~0lSj~CQasI*nh0upVu~VBNt-mr_NAoO4&wLg+^XGJ>*q!f7{}l` zq7uDkIJw_>bP`q;dZ3mUUp{e$*t@I1pt-!Ce-bw*KJ5=5+bG?&H<6&<$9%d#0tl#e z{jD+L_SG!3GkZ7r4{Ugw2G*sw!4WcfSS>lw;68IG&Jb(Yv%mokR9CWW-%s%XUrE}m zjBm-XL{E}6W)_p6FuhA{=g73?JYKT_yek=^ncwTr;{>d8=^g#>sSd)0<>x1 z)!cix#%IM~(3Od!ajq^I^TLwKCVxBcaCbUFdDd{6D!?VVkP!v)1ydq_fj{IA_;F&x z7Ajl+Pa}31JWu<>`hF3@3)_Y&%rFR=!2z&}e*DD1oD%N#I3(zXJFKq7B<4*}R@LZ# z<>m(c3abRaZ~sB|A0xv{k@3;nt6K=vele4Oh+}3wOMQI&m#L7Ygj-5xA9JY2+{l{J z7n%uuzDN9BFggRIT83NF{R$RBdTgwinIFV-IgUeo_*x{9a}1~bg}sZaIU){xS>4<$ zE97iN$7Wd1_z^BRNmf))G|j9-{G;3WDzHgjn<;`NzHxg!NRrF92K;f^A(fLRc-WI8 zWgm)FhQZtHTLL7VWKZ%uw7Qjs2h?Yq(Kv5E=ay=CF=qjR%_G)ISHCf(tpH^tdU)K= zS6LmJyGoWUPt9k*)}KeOKuf>9e)F1U2lu)a@+$|e&!xUTg2s{mf9bRXKsFu)pMNT6 zXOzt52`L*)<&&KNGox^m!~Vo?JA)ADuj#psx`YNv&x#CxN!=K6(D%Nd6g9Z(iV(Hl zXC&q6aodF4oDf^nhs=h(ly_>FYY~_{$uH(b;|FBu_aumJfb7;#444Y^ZoE_+VH{L~8rg>^9x8Xzv}LKOJ7GcC zOo|?_e=c9@=@b`C&mh*?gF#|Yz7YfPWpz`9NRVpd_I(6{OE@4?(p5~XbduPVkIBVo zDM2pm2+nh;23GFe57!9KmuBQi0AZT_;g?85))i;`AraAfGW_*yTIQ2ss31(DF-@tF z{*!3-2wX&qun@T{;q7OiPwc|$EJY(ULj9Yr3>P|NjFh0GEptkwVNO2R zThad(rmS_EH(X36o?*5UjjnU^d*&N#_+I8*R1+>r_+k7L&$*mLlQRn%9C({G*TTe5 zH+!(AKpD$TO3hkBZ$wLLEKS!%w^n)Yg{+!+#-h@yLZ0d{ZW&+4tYFCmQCkISBuF7m zQ;NtEK@>B)M4BT6+dmX~=hA$4mO3xApvo1H6QS~sVRtCCyL#ZNmFeBz0 zFtm}2@#odnxM>j~jax%3Z3(~%%yQ0&94v!_y2l?!b9Al*wUo# zm3KLc5#b!j*~BE*xQ5)%%>1dS!3uEXtTFW6 zCJLWpv#RGG6X&MceBrA^^Wugd85&QCVb62RQsTA6lu_&zx!%CLos|rdpX6Z+$RE)) zbLNX?=6;HXB}rds7?0;oOI~m7m7oj2;^r&Um*;Pl6qKn-@OxQeZLhFpGll#k8K6nl z*^?i>LVSb^IpzOIs3=jpvm8&qZ~f2=#0;<{q0S!JAj0DIt?_Z8Gs>-(_6bS9g@{-Itl9g{3j|?(X3<~-wJe9wY`{Z_L&^PvvO3$3NitE$dlErEif<-*3?to zB0}{F)M)e@Udfcn1ZU&>7N%_j+fxAL7(vNO@mNVLgF|&355NUvHE{A;9No~;5m$&o z*hXsxju6-qkkL#iPBHsk(;C$R3kCx_yf(&{-U_!nTxNU<|-gKRE0;=&f3#fOuh$S;LH zA1Jm~ATgR|@=TuVlcJPCL#Iq8G$2uColm#q@&fx`R1|3Qo)*ka#yjAxZJfm4JTvFo zY2eaM4w=*dp>#c3)t!L7fu#t|p++>ko7g5odTMe~ZAdlgFz%gh$GvZr{I4#b#On?p zl`&f`y}duiTxPk3Uk7;*Tq!5b;~hxHZnv)qke{@vJ+}@cG8b%F#K>;xlxX<}r+or? zC*xt8E2aGbjv=yvq_~lbKs+wiYlY`PgJlANx2MJ3M0=Rygow$A0A1~!r5^rKYSSN! zg5AC_B&-h)D_*Nsmogc{MGaJ(13{Qi_7z+GS__;8 z=6>t!;@H7Vo&B?#uvk5TR*B{JVquES@xDK%V{pm>@|J&%I6Rp@ph?|qPP-2rfNes$ zX?5(c)3sr-qDVMb6u z^PZTLc?(u%sweA0qg%5fm3_kxAU(0=5g+(QlYoTmu=B_^AtF=aV&w~K1m-HM0^U$5 zDcB-TRte&FjoORcBns%@nFGqURzZEOWs6Zy~X3ox$ z-)-lkM@|5K04L{-6hCO3H=}sK1PN6Lr{V7ZcRP6SF)AGKJZyTaHn!o-mgX~=>C5GK zW>`y|ldStO_J3oHAKHoz=lhQ$IZ9-45-@gmfTymGn(QW!fmr>jiZZe#&@ zIyTH{o*biB<%C_|H*V1Cy?z66qHN0);FV!Y+Y^mmWtBLamDkcL;tp7#ijiAP=9R#` zbAA)pOZzes5Sj0-!^#&vO)J{#;K=^_ozI7Oqa*kBBst+6=0Kt;-9%# zFgN1J z;nHXC=OM#9A`@Y$pEHQ1*M5@6t8nbr99fgI?T~Qz4E8E@wO#4B92h>HBL`weepL~M z`8=XN3x#EKKVn26Py#?fNWDV}fx@pfr}DO;=E!zEE=IJ+rYz zNRKxmah#IFj6|)jYdq_KQ0SKL*G#^I*F8O;pI!GBCErWnG_pPqyVeBP;ClmOL4w$E zhgsrOl)4MQfV5P%gSn4B0!G;PG04Vs9~#Z%cS{ekY7W&VQL8{od-qQLX6U^(Q(pUa z;~Hn&AMG3zrY%uGT00 zr%?`5R^#T~uff%B-z>KTjAd!>M5*2?LxrISt%m+cI|Kfz31r6>u_Dj<@#$+keykc0-(LGd!Z!*SsVjjK)oJfvL?1xO`j1AeEgr4qXCnb4L`<(#_| z>AD=!yIyl-u94)!L%ra7B>kqe0b>0OYiwskgf`$64bH~WXG~7IKM6sorcWy5hkT&R z|9Qq{-t>6O<%b|S+ylYk(HwiCw}14J*>b|~OnccldDT_TTzRb1s)4or8pv4w zhab6(Mb<10*TgU+TUX|JU(i3xmR7A4Z8;i-qMSxN(d2b!Mr_*NTS!kT{voGsyP0pq z%mdNX?}!~uGJs4lMxNHYMj62JCuUyWt_HNl=vz42Q*4x;)T$aH#@(w!IL{J1;MIig zSgsTFpBSY)Zh#DLJR*l3U7W?q@~?2rrbk;M({{23 zK&3kBAG(hrf#h8)GdrB^)+E4e`asd5#tC7zFQY)#m!Mjm2+3>OGQs`-FXW>TiNen~ z;t9M8KOl=%e0W{-vWp5~%FZB0Umhkpn^crXST4;rU%uUloKNac@f{hj34fNIOTp`| z+Pug2FJbsK&>X%s9<~6)4eXyN0e{EZT8Uh-o}*iG~EU{PJ`vV3N>uA1OuO!n*#Dx&vMcG z!Ad+Z%nu7z3)l%W`z2y-o_^je+p}~rIhEh=b1DL-1Objfk1&d0gZw6MTN1x^+FU3QOWyP^r+o+JGiBX z&@Byd=xKn7;xzs(}U$+@2c3@zO^|0&`IyI?q^woT+R;v$sgk$nBZMmZ<_u#&-4)fZabkq}1 ztaRg9X9{4XH?;x)r`@C!yfIe2)b@v++_2G{CUWzS&keYiE1I7c=_1Ru2mE7%Ku-t&x|M7nh@LOorGF`uPz*X1Y9K8U4$Ixdos$03b?JgpsIBI(AH z_6m^_M|B6)0RTqCN|4KB266&Y?E${JO6|8(6R}(S=fc{?>ybO#_|L$EbC`$Y9DVc z{+rOya{}35yk`t4X&+5lsyEV8l=V88b?1$m`gZWEaOBe6|+8#G)TUQC1AjE?t0b zu$YdiHevjsd@A|voPwFjAw;;llj4Mn_q_E3zWTRK(D8PP`Ep{wst#jXzY<|&+9!7n z1FD6At!COzGLH^i03djEv`+k0VU^|oV?3`%ijlg}Q5OV4cw^e% z>bBU3Uf0jHS||=%CM6Z9;%o%t&Y6%qc}^^voIms&oQ0D0Eg40gMx+*a9Ebl^n-k?4 z^eLRE93}2A11+2^nK%k6+O++M=EHeW?ybN)cKCi?_eu6ofP6dC?OZr`pklSk%i=QG!_-r zeKX_!nP0&R;2=YS=ZF)_Hp|KD;wl>YX=`#yf^zCy3^YL^-K!XC&wBbfipumTax%2% zkqIt~Ky`sq0pc}6k}>6n=rWA|HDmhTHGdkOBMbpzwYqMAGC11FhkgEDM!<;>xPWo% zaw|quutD$ZUQepEkZL}kUp{t)-F$Dr;_yT$0wei)Q9qz}o5V?;9TXvc0j;%nG0O_xVm_`a(@ZRnnFl z@6I{u*05n-S;V1a{{E0Myl!wJTf-n-%hoi#{1M{LyzY3C4xiT5nZl9f@owgU0lh&5 zhxkgIKD|ntvIRIxPJ6tfO6Yex~#t4F>kx!q*9R{ z4eCwvUYh}Sy93OJ50?0NO?`YXNtn(JTr$w9pQ;c(?Ni~*@ejaWQBV=j=KS?MY=f{r^V?e7 z=RHu$uhQ5#JpI~v8cNzO^rj1QV94w7Km)D6=m^#xa`9^VR?%@_%D~lr+E@_~YD%%~ zBsF$zkOy56#R*>r{N1$V7N>@L-zN!eW#zPY3iY;#MESXC>cx0ed8zhm zqgxcd-A_=+_X@YwIofsn3nVQEio)C}N#3ZhUEY2h_XJwRH%Ktve8R9xfX5}0|6wx4 z&F6{ek{DfDVZL`Dmtbs|=w>e7A)gwd|37O(0+{K%4ARh-(wL&k--p5;7DrewUv*r^ zM;ZT19evFCo#UY;zg*v2z5NqEdywpk5Hwo&cFfp0rc~8#-{+>iI=xHImo(T%w`6jcj?g2n-k zM5Zu0*k({NgE`;H5R@NU{g|Nif+p3v-z9snYs{7N1&IL{P0jOMw5;l~aah#gb5na` zoA6OnN?U%iWn8)i{jb6VnM`X1UnN_6mhc6Q=X+0*RKKMwE2<9|w75%CTX&Rl4I9A? z;V{X#hqDh9A$u(GS$oDM zqj65IP~vq~P02ja4F$GxNf2JVxEBmsc3u(rXYd#BT3fz-Tz7G`b9G4;t{kKC6!~;( zxvvEf)_sT|ZXxPL9Y6y|cJe|=11`c*Z@OX34TGiZyS^I#QeiDKh+47__f4*&6bim2 z%BxG004XXX_}3S(-g62{D}8<<7-~&RhLGwt1%TaB%20QQM@MaF(E$qRUi*-$xwNEr z#;}$SwQiR|*iF6mG{O1hVZ+5oa2tb z$q^XOY(3RW_KcP3^*?$z{y*z?2|1J(Z+%UcMH*0p#OfqA;Nsas>>wsq4%b&6V+LDc z_q*Aioc{!F;h$}n9~c^7 zuBSH1eluASuq@q=B0fAMIvsKCX7|!hTE;;D-;yW;xWE5iiyjt&#Hy%8KKoP#6GQ^h z5~S11XaZ97TAz%HEvPQgI$^g>$f1pat}`4URy=kT7!L zpf_dksV}x!wVp_NCSutA3^K3Xxv^ItA;o%LyKO~fK(xCq6X?UVS1OcVN)l6;WD8IV zZ@ee^sc%QMxq5VYLRpj2dca#Sthha|@jG_qKy8QmyKr!L_66v_igfQ4f}U`ubVY0L z>w*prJT^&CG25&C90nee>X`cw3?AmXNeLmW?GoqoNYcb6HtL7KrR7XHO@q-^0~m1$ zW!goHQhziz>**U0g5i0fF^Ea?sK4=(@{vDUD9eH!F66{-&k>+vf_!_oG{*SxDr4!1 zjFAWs4ySD1q>+p%iCav0s!oFAhrVYvHh+GSO+RYT$G<`->_E^WraI4hhx&FIfy3&& zc(K$KxtJ~hdAIav?rI=W6On8}8&|8b_u;K&&pn2uTmpPXA}3aM^$%G9d^L7HX_V?E zHMDNT?G%1`U3_7Cpq1ZBqKG^2MxJejXRczGO-Tk2KkJ&tC+zNYvKRowKI&n8Jm4>t zExAu^D5INhlqB1@wC$$Qijti`t&^Arfdyx!#yiA6RcHA|^{=l)q6$xOQ!5sJi0kY*yAWL-WEEiACZl@z!)QseUt!;)tNtg&}r zEObf9Po~!+#h+u~s#F~>7NqX`&+M?I>f#!BszBaw{L0k&RM3IXJUvjn$?i{{oCJlKw*b`fR=zsU^ z5BJ=bhDIxo>Zb@@sJ8LC#bWjl08Qx~~PSTXeiQGTpb4V(6R+_PC(b_kfp6G~27%wW$;^ zGdqKkx}gh}!h;8MX3UiddGmd%-@?t`w?J>HNBC)V_V)SvcHj2d|9Dw9+r7K?`U`&D zIiFIL`mXu&?7Qk(=KEOxLgwGMLvN`^_-V!V_d|VKv3*px{3}cC+HL!N6K|_Sr_`f; zx*7X)Hu{#h{{s*3vv=*iziOZG(fjT0llJc4?Wlj@TVHPKZ`ChZo}~r3V+PjTqbJF zjZzyrJr0JRpQzCcKr+XDJ7ksA6E;c8SyX(n%+B1NNur<$m0Eg>#;a(r?zyfXV5r(tDO3R@QIlqODn{6&b8;*_Y5d$cv-!748YNn%d6UFYRRQAmVJaSkdq8 zX({STo{~kbY@3x}Ja^%MmgDridcHs=HcvToY(gq>FAc%OWBf!{?K@(u&`2i~V!^IQ zvm7_E9RC#Q=m3=u%nf?LjEoRG7>mq8Q@phQXOD(E!v9X}sBZSbk2h#EDVKOT)$KAR zgZ?R;R6dBP$mi=R(UC1b+dbP)E zId>T&Zd*1iFK0(sDP1O}EC+%EXm8p81j`7;mg953bT^=Ud5f+N5_`a)eg)oWF%RbCBu0JW}D(7Niz`_f0gJ1;3eesj&) zt6^{_dA*}{)2YIS_s)K{59nJ$smzgvYqBO5M!l+5#`i3<4HpfL2nw`k~l>Gcmk7X=xaHE#E5|c{pWmBakc@E8jJj5Z|qdJABUZ3`uB5o@!IoS33qYtN_6V2U8f+_I(Ge(}*@V`zp0wYI(5WLxvOndrW^U6<#up8I zcxfex>de`dQXOH3&j2rzpDRyS@~za!(Inj!QBd$)xrzZ|-;2Fyi;ePQKJMHsF=%s| zL-vz-Y<1Iw!8_c+%&n`%3qcARLvaG-bOE&t)HoB+xadbqo?7=a_uI`=%;xGID~32GW?5e@XRm7&rgky$isr!B(kxK3Y3B73%kPniaqMoUe;x`Lfsf;6!KEAUi-JeupnYE6OUKZjEcvECqsy1X^%oi`qvpKN;$^GJJ(LZENg|}wRjWQBP05>&}Ev%FiCKv&% z#SCUJ)p;FdlC@y=9JJK5 zd0-(P2ok21;TKBZ&SXlL1F)8ww+@KVqK&WAHLHs+5=>CTCL8%!4&@#>Jf(0k2c6Ze zxJi&vEz<1?s-KjOfA;X+xEWf_%H!_cDX6C^vl$&blvcvHWr->$`;KpIXk1{vH|rl- zpdw1Ibg)iWrX%b^N=_YLPz@69_G&3*29hQrvN*@6I$Z^>V%4|v515};O%}v%fm0x5 zQARwZ!oCTFPuRkMk|1x^(&FX`%9Z~#9W*f3oU|(Nl%AROFgV7q7m%J~RMPd7! zUD~g}nRc$(sfzPOwT2XjeBN`}f_5s>gl9{jgTck0iQk5lz){Bf*!lN_Ym51m zalN0sw$#B;KQ`npuiWGN-enf>S8N{}Jqy7=HU~Hdi~u_RWp~OkDl<~pY;9lP42FvRwoeI%Nl8nmVR+Xdc#7=jVC%5^;c zq-Wj#Y?3CBcA@c4N@nkfJrm3Jr@akpURDXjBR)Ug6@QPsUZ-}^1S**epz76hL0I!1|5{#W@+>tX+Ke9_Sm0XYLatz4z zXB0^8n!{NBsn)-UzY%dX=iqX2$FX3oN7;?vL#gi4h1v8c!KK6gbLhH7f=hZ_{k_~U zZ4z7Z$6As_>#fTtzx?gtSi%C3dEcT=p0)!*RfhQ&Xjc`dfH6LWQ$_46 z473L6x(}!VL0Yjr>2$*8J>XI%Qd*K~dygXRiFAlWB*$QZw0* z=kcE+ZJpGs3)JD9T=jQ#tgmzRGA@YD4#ap5Lpk2VBZtS*l39?Hlu|Pps+K;Qu5PlcDd#P67=r3QzdMFKR>K{{!cavO7D?LqXrc4dLAeN9hiChOpCh8D^+ao$gv zz}@k_H!+=L2ej(>3Z1G?&KoR@>QJs*D$=Nny%K&1st0mo$%AaE?*z4YJz3>;8HjHr z@^s_t0V0!(7*$6mNVmqad3v`|>h0zm+`_Foc{XwZ_Pmsb@;F}$V*&s{K)%173Z##> zV>$x&Ctq9sw3Se_vtF<|uVi{Dd2}4KHVAY7F1Eyuh~_*_EdB&ln@VW7Zpr9C{<*my z`Mlsz?tUc$*L@N9A0RpXUmSnReT2sA;gez@(T>MYQ-V^r#5fMTiOD_>_4H=oRAJ|{ z{?>cJ5xEGO+#MI>3$iPvJEkTwzA|*u5`%9V*|V~f#B^adox zzp2;b$=;fXZZNHt-u2P%17HKV+?G@BcaMZ6bUQWmG0J>|u%OU_0-YFh9XI{zKxm}k zA8kW?GRUcQv=SYDuX??E^?IVe5jcv4I9KOCkp|96fN0#C1G$DlhxL^q1y5cQMI^;< zRFHrL_}9bReG_43w^o8p2^5hD{v3fwT?J5JF}sCL#3wJFOxkj=2w<~jotp)~;#Wp< z>zkIuxP)K(k!L9-UxLTc!6VYkXZbnq?(ssd)59uOcrXnx=pMGc48E2q3yvIx0hGP1 z9rSa^(#>!GR`~17b~6Xi`iK(+kyhL&4cEldVU1#ei$P6}g9Hq-9XLcIkJLl_!p@^pqQJX&0c!v{d506&?1{NOchW1NNw-O6jxZzpCqh- zzNI%vMP;?txAU9yu66A$4rz$iHv!I$G66FiPf&hlSLi4gI3}FplN)Pj1QvUAXRF0qDq~yv3ilt31V69}|pz zQ4vR;WF3^OOOwW^;WkTf$`FgwQJRw7%qzpFDhW_apjdFmPU5)#zO+`r3D1_E(-Cn~yCIx;nPBbz2I>Qjj6BgvN*XGa&AS!?xomC< z*7zE|$hPefJpwY}%{Yj4ffbM;V0N0$j34m0>j?~+MK99_YPG~O$o!NMnv|cVD2FY= z7fnns0_0MshXy_jRY1*NA`0DC9|3{?1;zX4jys^^`&6L1f^z9v{Sey18iWplMx1A{ z%8F811^hWIJ(T33ZnjdFl08bfMh&5OBsr&yAyG?rkS;=YG}MkIJ?F`PoH_snynJwS zSz3?tcGo@8A0v@+eutwn@L}Imd$;FpVbHKux()*Ce(-9sfG4q~-m)3s!9*C6Dv@7! zn4jU z+9|dQ3sH!nlY72Uma(sk_{{D|_>&#hVkiEftaP)48Ow2X81%#uKm$41L!Enh2D5(d7h6YXtg$i>wAiNLBy)lK!>d1!h$Jv#swm3RPZ4>Tsi)XuTo4Fb=X8Htc* zrNyG=W6=j|jG{T-E49iPQ&_sI4UCq}0hioa67fvZPEL$7kKW?^;{x{N8Y2i|)OE)dHNC`lS^kL&9@VTUwzd9Q+epI*RtZP4%KFc)1^x7-r6_W{ zAY=0O&ZZWz!jPhBMZf0nXRh8iD1Ef&3PUuFt>&P7lhROG~L>UB-gK*CqZ8hS7*J{*j6VUDnX<|o6(F2Bjti|Lc(Rc?764La>3H<0V@lX!Nu938}e+UnMKCeFlX{4J%v}p z@Q&01y4h7@4)nvpnpP;SdcT(*OT<)H6l}0Z;I-WtBk!mqW^5jpLmIhj$*43#joH4q zq2vid5bDljZJhY;l=Y=@LpDg31=(vnm>7Qz)6qxD*?Z0nQp_n4_Ys5Qe-ny9qtpYja{7vaw<-D%JH+s-th{8NTxB2Qj&fIBAS1WEfMCAmC*b^dO0JRzYK+PC6ZX`JskP(h#7`Ey#9%L! z=&fBro?W_O-Di|FDa&_f86#?i;6}^Z50DJf z`nA&^`O@P7neZN{OzQ(!6{w5Go_~Zl_gC65$ep*VFeH(v&~I{=ZY)lc#O67Hv&THF zl{JUf4maecMYE6Jy`a7qU#1|#QGe&S$(AYha?yZHnW~_JG9Dsa=Sp1C&70zHhAyLM zk{%L;eypoVRzT0YRkuyYz!kbsY@F~@sVb|Uj7i*~Df9v7^@-4)>Do};bP9oD)~ml& z8#c;?Jz^0`ee1Bs_rt5F5<#thF3yHiU01`T_yhdLGr0z@&TuS!v@`3TYTTTVR?YMW ze$NPCVPbYNCDRkD^v|*)ks9JZS_+34_9rzPH_KS_3!Sc zU4~L^zdHVHam0JD8Ha%zQ3Cj^SS%wQ`X!Irreoj(&VhfJ+o=UPxVA!bYiH|U**Pfb z78$t&()SFrPb-?usFug%D-KQx&$}gXv<*jMloAVwJvyGbOo$7qr++i^PDF>R1`c`f zy-VFM(>0nTXeMbtZGC*}fa zN-0+7I(qiUWQOFHQDS)j1t=W|7oUOXKvGsdXw^oP^2K|5vq3{-Ku zS;zJ>a$`bM@)$}!)@fjgcI(Zz=pIY$1NYB6?&w%*36}kek7QGw@8t*oah*gNNib)W zBrDcC$9Hg8Meo;wEJl?%fvR{uX+;I>UmijeF^NrI=fXmJE-Z8F=yp*R@4RSOKfApet=0WQj)^7yJExaPR1r~sjn8()! z0@&Lj4dV&9xa$n3C^kjB80(`lC{#XfySG?u8+7F2HXs0JOxCW{fM(4L8Vmv;lFJHH zKfYGqmiCr7xOK^D$_&BU?+8-a2gRj!T3-6VtBz3t;lURY8(8{4Ss9ah8y+*Wz*Hjs zv5+z^NXt^s;4@!nw;p7^I*ixJlaV^VVg3?H!NWPx$K786X|TY#izirjd2T^Trc5FA zV!0g9^TfuNMBZYrTZw_%bUup z(f99^H@k0CY$VE7HV=~=CV`yEg`j@O_jLnazwC!BUh-VFSfbffkf&uc&D*&)FGo42 zF|v28gxwx0)9sg>N;l(01MF_J$iEIjkrclGW~(rOPPXefNKMSOC!uT3TgieF(B-bO zs?L!&mcwu6dby!%2^RP5aQSTfziARfE7XRN(5PLmf}|~mSMUuHQ7hb7fLVVS_QIIP zp0e`Eon@>sFvqVXn>r?q>+L3ne$0trqyw%Ec%7=n8j(3q$u|_x!PPT-j%AogA|~58 zg={9rDAj7L{~n^!bKB@&KGFjei!s?;q&p27+M=Bmr{cE?!wdzsNK5ch9ozDkMmlhB zh*py$=b(e@H@Fa#3(mWxpx0F=RgNa>Q+ie~{PF zUGrw8@wXNeZn5wSRU_dG>Dgt@*IWSz;g*aUv!*A2k0Lo1Ufwr8f_pZB6 zcA3_2m|)Ih!4a9B@7^Y2T_1WK;cGRom&zN@>g`}F2O=v3QM|mG+$M2Z3~W<%Ysg6! z50W!b6Apo%A)_<^UsGeumaw~-*m>g%apsn^1M1+b>^;a?f+<2E)ahIX zkhdbaxhAWrh)2Oj^|3AV4nSScUtYe>$erzrzw9-L^Cp?OM65h;H@Ek6rXz(pK^6O; zWi8x%S;;0-4%`THPK?(ycdnBXv*pXgtXK7RF@|jHjrBV19Hfu!9(L~x?VTUHLu|B8W1^B;cAyNR>-`wp40K;bJaCnY*P8Odv6)gA93Zd%$>s51|yg){c+A zw6shRb=dS<6XLyIA{EfBtS@T$d(bSx^df|xQ{`d`*MR~y z+BE|(nGry^Q&%Gi2kpQ-H(~5cvKTHhKPBB#MQ9y*^!0xO$Puc{6RuBGi3H>$QF2S} zU$-!mCw2OTB8RR+W}_L zV<6%dT7?q3!XuMcP;hmogvl z8}p9eNHFZ9&FSSFH4Drp&RYnd@Y1a#qi*r^jqxK-k_{Dmrv}-xzXmXoN7J+R9(E>N zS>mrXz1V@7Z&CjfceL*aE{AaBjer|{UEN79UX$uou60DJ_V7=d;Z7hD4UUG-VgqIG zi-9#-KgLjfbyVFmKps*paVKzbjHP_!@zZXu^I)4BV8$l(9_oCmMX0y!7 zSnnF%#tzT9xOD#zfxXAEn`JarwXg4uge}18ueF7l%%$eL8xUd(IzghCVk%p;N1Kz9 z%*dkSNP(W4Z;FB7ULbVI#gW*U(3kwNbmO!eExUkJ-|NIKMR1y}R9|+j=n{Mp*@QjN z{B_85Ho*vS6lLKfYL0SC$?k>;!|~tnzJNOvmX>ho>AdC{Gv`EA`t=IG!cG!^&*k9I zS`{|aH2Z*T{ac5#dq)V!((b2rW_dmwzU5<~T2)}vK-sw}Z_slJy8k09Xh?mXLURTz z1Y_M5D5=Tk_0GH>6$e$zSDw^HZKXq3u*^m$;>cB62c=Hs7x%S*D{Zl`GX(z!y+KC> z|9gpO`;#YT4Y%gDc77N_?bEVdO$}R& z4g2?a(-5RbVm0{^(@es@?Gm>VDXaTiVDw7A?H;h_@qo<`{|t{MV%5mXR)*AES!5y` z^I&sh>-eKt3+WxH8=+1ko7?sAfW1{~C(9UqVay9YEpWz_MNMrgZE{>OQ_dVVdq()A zQn0?48Q-|Z<$?J;io-vZZeHUktd^(=FqW+HH!Z~{D?Q)-dW3_%2Dk3Uv4JtN_vJ99 z2Mgqu}af&UStoNApMYsLUa1w|~Gm^9-s z1~PZpPxnW3(Lds25yH4RnlZvkYFJF}&p;zWLzfy+#2qv(9*)}_mBt1Y8PtHg0XE=g zx*HhNZIrF$LBm9xF@Za@aaJPAl=bklqTQJEb$W-DMa=D@z^>yV7SZR{goVS8AE7QA zE${i@y%;Ro=u*?GbOn&PnT*`mhNLXbO+7rp1`O3NNu_yhImpQe&cq`>#pz2xE`FiJ zj>q~?wztE6>GjTgY|Y#yZ%NGb7Tg?2z>}!-bw?LD1+8m+O7=v&v5qYS_uYtl+G&m` zqzUw4pJ~T-D`o>dnWY!X$WD zh)WL3Jgi^HtJ>h_O@(25nAPhGvn5)PcL76xCwIRWj)5kR9B2J_~->^^UrOk^0ATgZ#iXr z)u*x1DvIjh$G#A2|0B^VfQ1eLMMe;Tm!wv@Wr$reUpkx{L&vcXx(`GrL9z&tHNw{g ztnJO6&};|nJqb(ZKs*<%-USejkm7U0AGp-Vaky}Sq8Qy~g2#<5aWKf@bd@R`lnOj_ zmG@6w!BpVnS@PA?HcTk4nQCJ(|2Yv|f4upo$8CaDkku$w){Qh?8 zJa7#!h=A;p1w9Y6a|zVvy*w~n!5&_V1>3pc{E(mQpb6ertn_3KxcaIf;bJiiZH;I= z_6E9reZ}Vf=}iAz^dl-K&^-&*KZ|mi$S9}eI_>)?f2FI>V2p6}k4EKcM5o5lda4b~ zdnb{T3?=)S{fFZm28fW_e)D3=Lox(A(8vm%VguPH zWrE{hNJ^lGuXwo!_&!7N*|JHlzb(hN;4K3=5NW?+1(Z3$LV{-P*tO2pMq{&qwh}s! zm=D*5Ny2RrD;WPdTMlKWi#1=!d;D!3fOv836b~?y;E*SP6kqlOe7Jy|hG%9_G2E5u(11)c8N^rlREq03aUfa%VSpZ2?qTPMW+YA_!szB_DlDwjd?5CMd5vgCJ1>YrY^eor-KsvAuK$lT#FU# z3w-!dEB$c5gaRBYWw4ipToy0ny&_2$oZ+eVwr%`(nh2Z7jYKII|2-Sxt{Od0&y>#r z?KU2+Tatd67bf&z%b*{|q;Mxx4VnA0{YHj@8VMwm$mVwsoQ60&>UdM-UN=Ser6Fch zbpJ$MxY)yN=zloZ%K zJo9H89?xJq*4=(C?BR;x1V0Z8-Ic_g0gWjizy9UPFX&{lJ3Ai~En>mPX6=^ndDFyP zfZi0TP$!?o5A~#beOnEUitA3;&gq(~o6Fa`r-1cAST9f=TZrEMkN_*W$~Y_N*thyT zn89p|Ew=o*I{B3YE49KsjNhDA3}@@+vaoeBu&e5!9trZ%DLqu`K$~8kEEh9R(h1!Yy!9{Uo73rMdHRzFP3S=MxN&i=N zO_QvSuNa^%f7e#krZDNA6xPMSg?FHy^1<&A+6w09+B6lvwasgIIudwneLhZ=pc_lF zp(0Ja(D%h(s)GIcTy&t456Vbwqi=wsE^!90g8=ziuJ-V9m3HRHRLha(vM6Q#7sHEua%&N&jP2106jLTuknXPEW>sdQgK{_hIRfE|@DC`)}F+?zbm$ zpe@0m1wa?%*SV&lQ9Hq*kP{I%(fNr9`NLJlN{dmkvywN5|5Z3-R0tnvAFUZ5!(G*! zdAFh@pDO=7@5-IVHEWx|G0k|F>&LOlqO2Y%7zycxwXsYvfbN=3y`iq|5^ApPisDE@ zRiF~%-iw#|#j$2RBNCKAeh_2W#>CwJfLxas!@Pr4PLseuWHB7kT$hm34i(s)$+nOU zst0>MC>Z}Px@Mndb{z^aK9>uw61;zH^v!Ni!f}m!5S1Ky6Vp2y3?>I3%+k*$f{?X{ zXmxrpz3PMHuq)=x{nPGDcpx@&q$#Ic@ zH*M|*2vgC$ZCwlnWhxTf?PLkO0^CK8?m?!+(O^bLe3kLyyazp8Eas7g&8+=2g`|PV zr%b0tqaadE@S=0R)3Lvz@*{$**$+SLbGRQuZX}jBY+5pe5BuSmo5}|i3V|1J(F=>= zvZvD4FMt(I0H=&)ii~d11Q7Ws2aIIxhhN%w>C)Wh%dgW2W4de91v5@37cdA^R zzjgB9*Vr=Ox^?Zho`={6S+coyAW=DUe5kJ4c6nR3m-57Ry0%nt?C0H@L=5NGF?zHz zzY}-;uF%ef8j&$yTTaM%1QATjvH-r<6|niuLJ+UElG_ksy4Zn|P!m|-O$q@IQIKWd zh=Pnzx74xMbUh=5zAts;r}X(%sbvi|_i_SDNxcg5V_=i`)IEO9w>Zef4poO;-&K2elsPE1emAf-yn#m<+C7{R~g+i{_BVV%B=v~d$rXh4E3GDW|lb- zQHR5`SX6|BW_0$NNpv0rk-v=JkK$nW-_H&fqSGjzrBed+8u8=V@osKXuw8V(#I zZqnJdsAJcbU{D+GtdI8UV0=IB8I22dzsB4=RoycWLpc$=7y|Pvk&5zGeBex9)J>+l zfQbV>VK9rkw7m(bYZqN%L>CTg%MsY~?xGxU77!whjpS z{h0^c?rwknMi^MGlHWs$CoppR+3>;|a`qmLcZ|oiBuOzX^wG9Ms-4$nOl0h)7+*^d z4=qjdmt3hZP&l&#SH-|s&}8ps?aW#PL0osiP9&?gG;x`ltYE!8q0F{@;b5joAbUnQ zuye$02Y@wBnl#2}K;v4&?Pq%YPOb>g2^7k>RcLoC%vR9Tk-NzyVd`8$Ybq$hr48GKSR6EvmQxV z5422dxaXg>D^2lIClXhDN7Q0M9o_dO(m%-S{O;5g*SAOho}(mCl=)CG#TpC7S}y>! zYpq_lh=Phw_&L#KU9Ff6vGnMN82g8G+7dYd#MEG?^xf^|bf#A>q!cF1Sx%tjASx!- z$>;Q*#c)?T)Ke$>_ABLxu3lm=Ia}#T*e`TL0m69H#p;Z(ZrJ9IShpA0r+=d zo+!Qv-Km@;naQ$af|tp~ARHZ_c6m@E$_L)wu1(BWHg2qgQ3e9ImkG+1rrkCZcC2%&OAp1# z#_u!!jHyqi6OU{~q>U=wh<(-DwKECQ6(yPbVMz-&d0&)^{(<4;ZIBqCmdX2rAtz0~W&y0xy`+K3uU=}>j z69H9aklpXf>v%t?v$WA$Fu+A225!O({76%bM3d0SLf8LT55oI7vWEFO02g)tWxCp- zxZhpsI$`@hlb?KCa@8!Fk6IzpO?&)=mIln(bayPgu^)tV(USGUi5%ez4@@o|=Q7>y z@?K27Q`Ho9a@u2v3UkynZi0(V#Xppqk$xzO2Q&b%=rkGXG=-vuNNPy)<(7f!3JRbB zR!ZK+y?#-*z0Z^k+)>6>2i+6BK5tn{K?l8>5u!M}GR`!22cp>GC)0pLN|zIC9I2r< zy5vhdzBLH6Jvhg*FCrfMvBk$UZxhzLdjOmqoW2@=J+A;>??)F8N56p9-G>N43)|?@ z8aurT(0n?B1`e%U>?+A?3=FIazrC{sKdg$H>DoX9JP07;)PuPkPnN@?Jn?16+Yam4 ze4UFAJ4dRG+~Dngm~d+O3)PBcITqPqdhsFjIH@FI$=Vyh={b8JoO8+9QSKC_99v|R z(k+!py^GfgTie>r?p0N3Ek?ZCjbc2i#TzCbLg*~IMeB64GO#-4Z78Kn^l?v(ZQM1s z5mCKfGngO)G9Z3F)@hn-1m&ulX5FN~**6CIWP%%r5xyga34G0MssQ|m<7~|wkC9$T z)Vxu?N#zAI(Dz%HhC|i$4ck(H(?$;y@8L(sa5VuO8YMO#&j5V_k_$d49%5O<10i4{v${_+@d{1 zpmhOI@TO4%V;(EeauLi7VZ{ZU;%Psm2!5|G+ZJv`FWu}IK^=BIB5{Ujgy%>{dlFg; z62sc7W~KF-ZHAHAZUfE4Y5z$vtVJ5`Enci{rs{HjbnuEYlPYT?p+opIQZG@Uv4slw z4sup>%U?m!*PodB*xjD>i1s>pSTIr#D{N6P{|!Skwod&J=ZHxF6!dF&4WgPVU^DqX z8at4PV`;XtKtV5Ry(H)+?-b94EIM#p`-w_M=KR(&zBk&+qI&s?!ha*+FdtGn6WLdKBk^QzyO!N#%{ap*D*8~f^B6+TTZd+D@=M8lOw70?OKVcuMk@>J+@B(*IDM9 zA;(5gJa?^p5RQr#at#ZrughN7UdK-m-q22cI zesJ91>+?dkkUkeou+#f`NOjJRd&u34q1NC=`9{-g?O^@a2!PD!@p|9;L`Iz;WHW$S z$D64&B|NGwP4mMr67D5JJ6UGI9e}z>g7Mu166AYSP9v5Z0u72>-|nbFHZ&}b4thtb zhVm7s1}encB6vMsT!;TcLl=SNGr0bnQ+q|2QAm^kh#Thgg}VJ0!{J7QHHDhn6e0V$ z@#=mqT<_1u%Arn$+p>Eh91kL^?yI1K!N%uC;$u`Qaz8UJK+E^ZTflYy zd;fD!F9Qw-RQ>-6iqjg7y}#LO1$t7M5Ym^f0)alN%r+=BC#4x6>xuJ5EbwyZ6QAI$ zS%^->-|Rs_4y+nNP&ccjJSja_{`94{L`Ob_B-*f7`-rQ_&b&K9+RF=Cbbqr$%%J51 zNydR5mY_eb9Lt4s0n3QNE&+oP-=xoqw3~LZnvmp|BE7F4IJ8qL0q=tc=-pGCRP57L zDY`eCZG~S?(&*L$zVQ~-nT(`>1ZqxU7M&{sC`Q(#M)FkW#zr(tZ*R<3rEqaXuq_R( zs)pLr#H0Kx{L3Pq+kZ0kIP~9(>ToQ_wLE_XRLQgWk7_4G{sZGbM!5v17~O~Zh`R9@ zbYY);f2@R}+qR>0X8|f6Oet(}zJb&H*`wqx2nwY{N$I^m72G7LTx^y`qA+ZoN9a>D zN;N}>ps?@8#oy1!_0uc)xp{pZZ%m6)DqFy%S4Sn{;(@qlGkqJ_8Z~NNv>B)52|-ju zoV6Oo3+3}-IFc*6jC{jWlsisj{7vW!UZ!`#>m2^)h)<8u`%oSCh`_TuAP`PUeF#+Y znRr~}@`NAQ29w;a>DIiT!IN%5c*jGw@~16nj7mG+1mcl(>ICW$Noo2d8@4paUegAG z{+#c($$l2G&Yj9VP-lJ1;AW+`H-t=}!pbxp`dHq=aog`vj#?2(V^|0`F=xZ@XSoI| zV#(w56af&N@OGq+j%XYE_w;==MQ_#ts>^yRPSzaK5>TrS#olvJdBs8$z`+&WS=TGY z$>w%a2;~TrY7#f5uejnIsw&T_rfnd?tXu($?<-tze*Z@v1P9jJ|9^;P@*WMCUNG1{ z*}(Za?+wil(XsQ`#tsFgT`j?A2Qv8P*MC1Xe&rSH9VRikYaQREh5wJ-7A)`-OK~0 zXCciCfkXK_CDdvJAEZ4D*nVM72oX8GW@9p3(a~78qqa}M?U*2E#y|aNK^)AwX4W}Y zC0n&YJDbui((t67!ts-a_VI7bA&=NyZ*!fnUE@m%riCCCrHpK2r!cqdlc?)Tyg%jJMV0<<#cQwv6(N3;PnDBuFNzp}UNQkSU`kvZzst1`!hE2?E! z#@fA|-7yDcPXz-dC?Vm$0v#xj_VV#N`>75?{E5cd^qa!(pp!V#cg@zX?VscGb~*i& z)YR4E)b@%rSxRmgJbe6~Cp1s|_1X<^ba_SGT4Na7OS(?|sO*I~nsi zTA(dLZ{iVa(0AGxvjE$CX<6c|qz-@7M+Mx;41}sqM|%ru?kyZ*4yRXZt4FQP%y4)h z*qy03^7!Wf69Ryy3Zf9|9A8MU5j~r76MsJpPB}c}SVzxWRw9fMb zW2DiUnd#s~_H=f)vA8{Ky->vuz5JGyl>LdDacU3hoaq2Qj|j-2!? z#kSAy0ll6!r{mO(3}}m<)8hdkDMxp6ctLCpZAX6{8R%5tA_Zt^@lrw{M0YVX2&*)* zBx17Qvraw2b3cud*f070`qRPmn`a+13+$>j4XH!fm^SoHP?YMnM@A-|cVQsROF8nG z3i0A$qFm$cLL6l17idkQyUo~6%tr!H-V)fFVl#hLlKfW*{jH~%HuEJt$^&p4H(lDB z_g!}XEvR3*9nlahtK^kfohw%+WFnSRy&PlW8xX2$mt!!hg$)G5N|Yc=0jf+4bBPtP zjUg1Tk)K>^Gar(q%{sfNp7M!o`AOOaldKYwk7luaIb}DD!wMCUYfU;X_9g&JXN&&! z1CQ5N{K%W-7WO3dJ5)qr&FcrJh=3H~aSw`fj-ddOREy)pN0F^O3aq83^j)FFSlUX+ zufjWg2?Pep%#@D!Tq4w;`+ew&pfbVoTCjeW0PBtRga17LH&wgo=s)7c7*6Loy37Pt zSqG7FNRg!u?;KKN&}&EuWL#JrK?9CzM&w<4zVp7f`!|%%ZTbX)+X0O1MKn=nETm>u zJPOlj5xmTH?C?8RsZb_ifgR=qL$|+q)!vu*X$2D_J?3~Oxr$TdV!djW6TM_nAoGpB z3cv_{FNWTb&5OCQG6Obm#Yj|q%fol3l1vC%jz(U9?e{rDkt_j3wN6KJ+MvTeqI9FU zVHrYLa1-Y*CJYj-HCoxZRxBEWvFnn; z=ul&0MpjV_M!CEC;LnN&A%iGblw%U?+q%-A%4xxj(p|kQ zq7qUseIr7TUseH))>4-aIEP?Z5AY7Th?ko8;sQl1NA<8rr#6}-pp_= zB|wY%0Zsup809t{MjY80x62sW#dMcDfIYB8BAz+B;hjq!wy#Y;P(yeeR|cap3xEim z$6J_nDXdZ$5z!IJW_ix<9HFyM#V zQS^$|4%};gy)#8dJ>D`AO#gr5p`Y;ZPF-2gC+z!aKRiu--}P3uq?!UkLYv<{$L0%$cQi}+vWRDr1xbhb@IW87bU$a17z7X}GL)pEAqXX?ml6ryti#h}A}agl2qz*Hq`o(#afVS8 zmA^F79U59b$>+9f5b%;p`F@v^u7`j@+|(os5CB%Ugl0wRM8+4@ucYEWkAbD6s=>b; z_*tLxeXGC1zTdX;zNEk5r5D@Whwa-N>Z|{7ukW{b_wDo={klg!q^SA!?D_RY^(S-u z7(a!hzit0Mq`%>&H{0F6?cG`P=s);WSKG3i_WC4GpM1}$D*JD1>b&o%Lyz!X{uT!P zw?FMq{u(=dz1Du+$G)mR{uM>`?gst7iZ|7G-)fBdt()qyuc=h^xa7(!>%&?>4Dj@W z_xPO}?ttN%@F>*EItQ_LU$!ZUFb})2Q>Xi6%+UgCFo&nly!85?X!MtMJloYVnR0d5 z<5dSYJ`-vu z-WE06eAkezE)YNZdGc7cN|Y6K3pi(2kKpI9)QUw z_=%jMX#+VgJ?bB$D8d;o8`Hn+BiGpe9E}gk;;QRfeU$VXI-1K<^arOHn3HTz^y zvQh4HzeiX3Id>l{YPa;N0rpdSfH4`OzN}`wiRmGWvcL1jFCMOc=3;i@O5G87M29+nyzgn-%rbU`^Crk zU<47Og!w+l&bh7;BXga}u-tsKiiXcbdOL(o?!#sOE?zf$(G6IRx*zGm5>Z)fc{ZC$1ws^q8s&PqniXAKc^OxN9V8Aqj_< zUySnce z9{_O`2kxYWG;ij-CIVUB@s<_^1ACodore~`{;w|g(4<^#W<2>ka32?^_+n<9Wd$V$ zb}#aG284yT!9K_@_A1&mK#x>*qdpUBNRVhQ%%E)0o=<>mtq|ErMEOS2jl%uEz_rnX zZA*dX0*b4*&%Q3_sB?+dSJm_!BL+^}-#Al%gWTcOH53u?F9WF04ZE(T`YeElRG^BZ z(b?R3Dh??^dO-rd1mD}yKy9E7wwXyLCB(AT4&oP!Gw77JBF5S+0uWr}e~#a2@(>SO`f*A*AJ)^V3Xt7K`FuuO zl1nms%#oxdqx1sqQ2h#6`}&K7yK*e2F%fsy#>9|o5f1MboZRg=^hFcs@-M^$K$owu zErHqS61j8o8956Ixb_!HS4L*nFabMl`DeU@nYgR&t6>}gAi6d2|lfDs9H*gf%P5S#~n6_RcW5ez~l3d zIkJX|5{O=adDRuh*`zih;LF6R^#ty5oD(~K1n@n+Lc4In=~5gPe$~cGv6gi=2p6YR z7xS2%BjBgeNIft=g_|Zf7OQ1sRVrp=9K-;_bsXVsiaY)PCg|uH)$QCNUK62yn9BU| z6i;ej9A{wO_0^shwDYz36u4!t(=ABKCp(6JVvnv)wyIe^ zyXo4tnRA%iRm)S!H(a26HyKukA~cZT4e$J~-xDHEnK9Ek^XQ;)=l5ebHk<)si zT>O!i=FFy<7UUeok#Yz6m+kzJqriTvQpsXk{fuGuuM0H_SQ>vjhoL(NPaxK2DlZQ_X|cX@S!O z3JYq>Lb31`)3HUc_lnE(%($_3p1{dW<(CDGl#0)n8E?4vLtkmG(N7Ak?|5DUdBv0= z+@^?dd|<&L6wp?#DD3A)9=&-AJf>e34eNKA3_zFeu2xj=BX3r(i=H-2YWc9F@m+2z zUyx;Q#WaRNvHY!cd>2+*!`DFMeYUMTATb`$j7lKW8O{7WPtLc0q5H+E>lOwIHuvR$ zRFih)Fn3=y@~$Zt^UFky;{+@;&Lig>k>Lf?oXt)Re_|`M7CxK$+1_Q49*NQ^ipVN% z_E(bSd(xI|na!r6--8o-$2v()yNQRu<>NH9WU%nK^dCYXKADiDT^{)?3PnA_xyYG6 zSrM(f%{p;0G)T4GOd4qI5q>gF*G>es!8bdNuz0993zr%=ZX|zzvBCvJ;(EF+2!O!J zH@{~D=MyS~S6XizF9fOU1#F&o^@O#f$A`D|$e@0}&or4{fY8YV*FPq9H8{L&)$E$P z6>JoZ%=yY2=Q>$^WF5*3e_C;->A~$P_lz5lSir6Xt$!#r=)9O-N5MA1t5MVeR)kJ` z0Wb&L!dNFFYTHo)?E)vK0sw#+9DzlgQQX07G@OSz)@@}kqN;?^a*q$SX>Xx~`h=L> z^l$zfzpI$L&+YS206OBw_KTG$s>1-4yY~UUB?86up8>pjM1JF#e>99>HHAD%mMK>O zwe=PY+!?6F9}Ry?U&|@b-Z-wZulsZ-eFz}6qki9nhxTqsSwS7N&8aL*zCj=Ra4s_w zySP16g?V;+c;?s_ACgkWw}>E`F+(zV*Qu~M8kUOp11NMvt^GGxl+{jnlOkx=$A7Ev zc-v}R$xW%2&Cc_MdhUUga%2aaM0pyTDZ$T`B?u#3$XW04Nmny^k}Mtbs`07IM6ASL za#I}6l$psjTTyK=VW%Ca+=l9LhRaodja!6Hp8BvAgxqI`jFxcBF6Q^T(ITLhJ0fy# z9JlXw+|^TjI)V#we~6JtKDUfu2RBAR^zzLbr~*H&kLg|Jsk=#lSca@GcLBgaa9-S( zx5%yWj?QJ(201S->!S{Q1?f5b%sB1E)HC`Mp!PuU=KQUj8Fa`(>9oJ%ehs5K51(e> zM!Gc{SK`aU8Ik$=Vzn>u$j`HohFO+gUm7?Qr>TfRTPK+Y^p2WZ8~9b{m*5f{e;>f1y$DjTn9VNve?1z25z`fvrZfNfl z-lKTn)R;~t4%o^RqqkEJ^PnOIGOa&@P&EUH-(AqgS#k;ExT5*kd_<4Ic5?wjart)G zJL9k`vQ6!Rp%PuqV0>(Lry41^J#wc{1m1Ca?A&fG5PnCt)$q^Jioept0zL#c}3AT?iP%!;?MJYOlL}qCB|W0r5*^sMKUsyp(hFDnq$qCfu{AIk;J)-PUn4m zkM1ADswE+uVu#|<<<>~fT|^cKy2S){wd<|Q>jeK3QoNO6n(_>>7m4&Xl7Dy~RoDun zB4;-xY0N%7EE9MiPWM+!R4!a=Ft!4j?sLzeXe{Z008z7HC{&;!mMZO7+FvRs0t>k) zdUB)VB7Yx*3&VU635jVbi15K4fPEMidT>OBC;g8p=0OS8XCUhn z!wC*0%!S-_KNLwk-Ls`-riygMrcxoL@`6ql{46~?;&FxGWt7zqXYy@_P+E?a z-TS+ZI31bXx34v13HAz_p(I@N#q#;n>VGHfh0teUCz7SN^#q@|m~JV3B|an1&s&#(8q^5WLcVH*0)=-k>u^VA;k`V2+nlZ!y#>GK0L}!aXzN( zO&0#Z7Y!@$CFzs);--|esIa&V=cYD`dK^@x+#~G#uIm;rEBFXg`m&Ikkg>{#&-TBw z<<<`g!*LG&8R@is2vEi_V3|D22M!wR3oLYN~v{!;7}u~@l~-Hm5$i}AI4w9U~YOV5E<(_()mp(rL7#D`h7zrfk4nTFNzdfpk?-n1MGeO8&t!Ux}g| zdDR`}MB6<*dXzyBUX*|V;E3*#I(Zf{<1z3xN#mnQn*ckdRf~hnd&W^jLj4UV{|GsB zptn>3DPc4$qWxN_$dyrZl~gvCXb)4*yz6X*OOfcsg`U~dQSwR)?pWt*V4-cpu7T7U zmP}qUvuhPXfEo|2rI4_d>ZLN7%~1x3myg4c*rNOw=@bM3WnhQoHcD&*P?VD441k+17h@1YMN(wtO_EdK1X$Yr}? z{>bvAN9ge=;%TbD;qw3yo4f6aM=W3I=o14xEuM4JOOwAzFEf3r&~S|N5o+?2UYE>S z&Pf2s>{jCDFr-RXHMf=w2za{&4wzy!@4qqkW}6UoXe2r)b=2*lW=MX{px(qHn}gs+ zUh*dEBb-MEoye>6`-+IMDqnd?FxyZ+@U!%`-I;O;VCJ=}<)=``y`4#^T*Capz#{J= z2;iQWz^z5l&Pc~aO{pqJuiTbAKG88#1pDTOwwX~cMs+@4dEVntZnPh*8R0akp*GIy zMUz4G@s%Eyy`JKW<7=P%l*`xhH7sSis46eCQVtcuEU!=;L=4D-|Cs4Hy`xzg*o_tFIH zfz{mF2zdaeqR4U(cI5@G??Y!NDU@U6ljpU>s`mnmP67+4wxzliW4_2mE%8y({5TJL z*hR6CH6*(t;M2(0+(3$WvJt?Mg*{heERxfMIVF!0J&ERw0bzLw`vAdCvVzmG7);9q zh&_Lq-;m;B49c4G1>xX~jTbp2(S@ksPG^wmqv`qqhnG8{t2dtfIAy;><`Uo~d7(Ic zs0uMG#9Q;(&ra-2UkDgH9JTi@eVqGMkLSb*Qb!SpT8mL{8)HUeg#KK-@W9$4Ga>wF z?4Jdjt;;uyVa$}Gp+W{|hhWXo#5jN5Rp(jP(+O^sLVK6#cn)DUVJe(ka%aI$Fdjo` zFM;(S8*~mo2%?p`odc6k8ybeT*^t>8XT|FwWBPc)?8!No>J8mzV|_W(ih=rM@?|zN zwKU5(LKc)l6}%4=3O2MYx2G0QS4i0X(2!MjfynVcG%Xf9$emr+N>G338;xaxDGDy} zy4E*~WA5ps`Ios9c*UT%(r;;2;U>D->^YC5O{r}p`F@g1eZ%ii%xiP6w|~JEhCt3N za+N4%(CuY%J|Yjd|6jGy69V-XVG*aZ=M6^9_a^@#biWqZ_5=H-c>fretj8<0AqL~Q zLVG9-0W@AQ-L_tyFZw*8u_sp>j`bY9Wb#KcXf{LpJ4r(LFH@D^XK!60B12sR#n02y zJ5177f7nXk!4SLlK=xXblNnqg6|b6fTt|2=b*pQiLJwCeIeZo}^st-!< z@=!{^yz<9@PFM#RQVM)}tkjxcMDsw}_&x6ll2$y5_j}lmh~_0sq?16F&RRTF+<+Sj zVc;C|E7amb`BF4dM2E6`=tP8{CZ^wMfTXx^bG|x}P#@W?&fd4xS_3cLoP&i%O1lhZ z-vzN-2^r|R1x=~F$PtTA@p}!jZL*~h7rcR5a)gaCbB%{D0X2@nc+*!4fU}^2D6+C` z#}Q`Zlsv8F1!(*iiJFj=GX6uAio-9INBsmT6whP{)__gk)2+yn{9tzN6x|V>j5;)% zZ4RcRozOP@1GZ8iPc3jfB^zPYp(4-X9n>WrjKn;pI!^CWiWC;LLbso_wWYY=&h(EeC#%xleo^n(=Y26L<=9my)`^({u zkZU024mGaw41L)8iLJ%CUvDkrp*1@ARI4tacuqzW%FTDIK-ikmE+ozUv{c)`YP5R0>ml7yw@34K!dnMDQXt@@YB_)fsJ032T03 z@J@iP65P7sqe(VhT^T>=^Sj6qab*Yx1sK~r(>{LdwnDSdj_viic`e;E0TC9QEZ{=@ zP4tpD=(~_w3xiXC^rCgxa9%J=QLi{j>*t@N4^v%!-`ZbyB*8{e{q=D`%`C#fSxb7f zB)9}F%;=ztoLHdT8T=p}BsIU~ZiRqkc_3*!GJMzcWURlIM2}=87;vkn@1zf}Qu=}$ zVCm9Wx7&*HR7iW)!JmHU_LPiyjhk3ewMds^_sMb%unX#+>!b~)tHlJ%#zcMZb`tv}bo!I^Gu|4^TV7@Mxl;ySq8g@F>h0*3i1j@x zjk|VQF&_@~6SJU^l6E4c_&1+b@eQIRw6vtSVipj}l)Tx1!A4E^Q+Lgbm7jl59%x@h zIa4?pfBAA8^8oD-ehXhCZ1fC^urvXm*(r^)Gi(}68|bGy*9(sLvIzQy8lGdvYlZ8I z4cuxyrnSeNBuNUbAx7m817g9jb+68jCE)R&%Jg8#a5H$=mht@l{=8l@bZ(RH@Y*2b z-gcqWsSZHN`AazI^F;?waik+}I=Yx&y_57ge+G(MPy}*~-P4~758fE5$W1{(&4Rn)w#WBF-w2zxh|b&1n@E@!N%_`*vtt!x!b1bkW3<&Hy-2RFX{$o!aG1P z2UvYH{`1|sh-5yGDiZ$r-8_O*d)~BTA`dSnojxL9Azwqd5#4>0NHO<0xD8f`Gf`AR z%jX5Y>*}u8ZMXZ*%7?c1(!VABt!2wUsgh;hEJrWye$2IpdyoWfs?&G6PtmHIwz!dD zJv)y?htpKOmI-e?*rF>oFce91geWdPL7*3wd70}dUs^G?3W2FwOyfzHcv)sgNV%DH z{@<{u%hhNN2w0*6aQqKD`#leN23(AoWvX;M_OC(!CM=Kv|8ZFSdAp*Lw3q}}m#(5$ zosy+U=Jed$gfBcUVO4E=%!Bxm3JJuu8+De9PLUeT?Y6O8DJ$F5^#4t9y0fpyy?HgR zeyWk6dq@ctmM2u1BcN9yU=j}7k4JP(+)o4>^YYQ9NJ(P*l^7VLd}}+M>0}iZuKkk6(qG-`hYFkW6Z1MYjRvss!jecUjSoLH?Xm1 z3QjD6-+dt`NnT7HSL9cV%0$zP#cbvISW04PBv28nYd$WWOU<&wTRajFxrk(zO?M|F zfjQ+3@eKUC(1hK)zB<O6`Fo2J)`Tf5o5 z7b}Y7)JcJuqq#HP1)so4LPX6b01z~h?|3hxuV=0yN4f4i^IT!lK^~(EahJ|{4)ccN z6a>O1PTlwJzM`(Euhx*ZY?C3K8|ju;FcGI6HoHhWfDQ{iZ%MUjV2? z{38}}(1QORKqn+U)@i4pa-gCNdX9vuLRdMmg?UkxJ*HOh=@c?n%sgqlndhAK*n=9w z53>+h54?5)B;m^Vf-IetAZ!b{&9LvH;Ly>@`>k=C`Sb_(6cmL75ix)Bc~!BU3An6l z*Z~3@%6X$hS8*?1H#1g#&dn|d5NF`Zt6&r}wiL2mw?Smp09;K@sfWU*k^#P9)pd8z zz0t;2DHD~{;Anf_1ZGv3Um7Zr%bH@+NE;$H)iuLz&s6k|f9K9$OeR#yqH3#YrABXRkh_$dgYfb@&|i+ z9%#7gTeW2=Lyt)D7PRMpWfKvnEF&ShBip7GI;oLIB%T?(19nbGg0UZXF2aTFTbGVL&MTysPNlABkV0vrr6y2ZI5~r^S5}Yb)Go@rw|2-BO z@>L==64ouibWxf^TqoSq+apMqw&}EqjS8NMO()Alvyv-FKc?s1KPNz^%}tw#c!4-j zxtae;&STGg%gtC{t7c9^GXA!43s@IM8S$-nJ?V2KpAGUKnw*w~^HP|t>&7fjV|@au z@YxWw;Vcfk*AOt~QU0agLJVZ)LF8Si(ktfh9k?utcK63KcvQKtYT9O+#FHUiC~_cf z$m}aCA;1}Z6I$UO71F2CdOOoAT#3pCX64#cb+S4(UC4&XZof8274#eZcv<72sWAek zNNDASFv8m?ZSY*%_`EQ$g*J-H_9Sb*2dffXZ(~ikglup)TDQEcv|&(9gSb2vgnpNH zmbmaJHfXXQ@!v&VS*m;%XoQ$O=$_2Zn}byZS?JJ>l{l8+B={9 zYa?esUVE%IS|rmjq0QC^&8O|}`X>rg-yNo9QKlaR9=aN ztKCz0TAP>^JTtPVXhFb~$b(D~D~4A+uv%8(df34Do_B!sBNfCE^QNj`{mqAs`n>2P zQwm(+21c*XAK?N+i8cnlnHQVNkUhdSf~L2oVt`B6g?Y-6R{Wme45&R23p3&9lDbT> z(hS55}!gb3y3cNdVqUFTC6*D!hph|w88)b6&CVxD$v5I~pcU>7kqErVvNLu|a zTx{Gu|8Q7jgEg-4hsfa$#Y81)m`rR2_X8(fxh1#+QkJ#fszlZhFd^>b9Pm5suE22; z9g`a+WydEjdACmgaFdVSjC|kF94%qo;z+qFSsn4adu!kP?9i7?>CcgoLx#uJd#7DrYu4IGkLlBjz4v4ag)B z$q_z*>oHu%baf4InX*zDVkp>qGfB3iQfP30(<>q&6Ubd7qs{Wx&6&#lGFv}cb}Dhc zN!Ubi=%%h4FnJZaUlyF3#%e#HA6q5~Z#il7lbzf4LO1YvPMh39$ zG?untZDSIq55;u~E?Q#kg6LAInrJ#W^H|A2NBWAld8bt(SoFeOYrNnF)KIr_MMVss z$4lwz75805;Ssn9NY{2jYuN{lGR+x1nPlN0Mq7@4qDzz<4HC>0!8Cl>6}i|YvSReB zz~B;5;d9DZXK0@c$ok2;)NN zMmiac?cj}Q0*`!HL4_K0?H(4JtT3NJAn)@*;^u48q+yb22XrdoRILNX?gwII==a{J z34(O8NJ{78Aqx%(5gxiNPYxW;uNtB!PN2a%Xu4ymA#tOGrmYE>xh|boXsTZ_M&cT> zHT?O5Los;95m~DipPFX-TUhJv1!P!+KH`D_RF3iSolz@lslqSat%;(BDWYShNi^hB zcLsIVc_1SY`95~<>4ETo7euH9HR?O-qGm-UXDA0kd!9LH5uYDv> z0KhqHLx-7-?v}2qD=HI;uZ7dqn7Fw4@$x8^POW_^F-!wNfLF7dW9crfc=?47qMQk; z9gFPxST(1*a$g1Vw(|6_tWi>*#+-98tRa)GefStk#d7HIlF+Qyp6n@j|5^h(_99JD z7cZ$@hcC0INyD-ReuDw30D3G|$14@Ts_2*6t>kO#@WLhp&>ejQs`k36T#hLM&O3Ws z)Hu>nmE)2Gm%biAqAiYnQ~GD;bJT@?0VN_Zf{+VW;OXgB044u>iF;{AoYbM%FL?!@ zr>57?gna~wS4({q30YHvX;gW}@HVnkZ2cVCxpqIrGZPl4Ugfk}U?2xCv2xfgk=Qbi zUVNO^-#+Xx`|R?T#)wmiNe2p61g7j&40XMG{6=YI+{ zHxwFi_!b4-1fS?V?(wzKrBktYR#xBCi96+ zlNKB4W({~SA8p<1uE8Zv>NGZku=F%2r)?ieYmKa$Z{%ol6(LF8!>23OpgcLSZU$nH zZW!P{6rah5cAxvmUfNXFmm9|P($@9yan9{$ak|OtlZ3N3Vi{U0$HjAqH`tp*R&xlP z$20?{t84{^`F$3EB|3s1nD=Tg-pPxpfWio4_DTLrE9*+Y%D);kK(Lh1C;70pFb6qu zX*eVDt7MuJ9Uvc*hOay&mW^*H%myA9Hfg$jt6ZY7`5dtwpTCMz7{mjZ`Y2qV|0Ybq zc#?GMTS#OhFj+crZWgL8fAkSUCgmBCK^JNcbes1RS!8o|;pNqip%hk=Zk#W11uP73 z$@=m>n+}a$5QIATInhf?$S8_onJ;pgC2kOv2c?qB=pRJsD~pdc;(k)pa4I1Pd4~J? zPsI*~{j`CzddJJC1j-hUb1jefTMJ6Ba*(${7(CgrCM}Bp6MQ19{Jism0dn(&6bWOz zi9Yw6jc~=g(N~rk(^wGGB@qFFubXi)zr*#G0=vV%mT0|?UN?^}tM%*T=h zgyi5W8oyzW($deBHLKMIi~t+7Fp<9;(G4Tl^25)B!k}-Wi3i8oS6Ftn6BZWnxc@Ce z(H+mHBs1rMRiiCwvfF{?f-Bm-rk0AqB#o^P@(fdIp(^+@arE$FYnW&i%1$j>$!y*s zA-k3oOI!87n`t{xbxsQ@ih0Lzr1aSLyuZ^ z&IJ>Vh=%5OVFU)07s^QqEWwq1KuekTdU@j19r5wGWmzC==W1H03b zI|$T?kMw+Nw2Kcm_l|ZxS#M0(NiREETk-R3iTV?0hKYl_)OGx=0ZYd?|a_6^ZA#$)NNC3n!ggpQ9^MAhd7L!Y8Kw$)B6zj8$3|tGwzyHd45{ zYlm?}Gi=iRr$1It=>ClybU=8AEu7!*0*rJX0ZjN|fv}u(2Q`B}%mR!niVC;6N?XW4 zZ-%H7QxkrTKof-2M||Qno;Jb(H(h!br_b6^@m* zy@8ep{;fi$I&u)h3vSMKuI$kJTXk2}3$O|1mRcIQ++F9GV;kAfStOzG=%utLb>A-i zf}h5EF?6P$3W@5Y>t0OWDVVtwIH^w@ouyo(J_2$89HoL25fWb{yyKoj4Yz2*U-h(4#SPx1lOt5P758^`>pJ!pCQ1g9MWQpf zI>XBnY?H7k>${mx1rP$LM7brKoqz}+KD4W%nohy%Y^9!$i|;bkn6R^)0BikXsZvAS zD{(O;2sI}ia2Q72OfT*kjSezNVZ0yHYh$t?_w0o?@)FVr^T#LwOR@(>Ba}^^M^(Me zSK=HuaR@YE_t2m9#eweS9UFcwy5J>w3N%0S4OjuQ2?3n)TRGN0@C#9>WAC^vz-L6% z;cOu?2i4!L`#$Xbm#5JbQG`;!ka6<(+;5$sOEqK0Mf+SI!u-uSfV&LV_>#$^s3~Ue zaAU_HmQlAER(_GJ?-7!2%1lQDfp?i*+yNXNghwj7KvadXG^*;N>OfzB`K%mTormp) zapn8$4YGeMQouP69IHQbURY`S>z;8SllNUTeC+=+X1Fo+lVCS~JlxF-+Tx&qj8Q4W zH)l4uLW42SJIYXd}k=AevJhwNAvHM*$Yo!hX z!bQR2j?5KE4i$NAR7yyarg`-LfApTka94HTVI~~oI?IDIUq%gpIRM0a96$#fv~Z@o3yjmRBh9 z)(Y`l-e-Gfi(TR;_%2`Hv`$Y%Lcru8-piAVjo^$!xbt=iV4|F?Fbvq90rFFYS?`25 zuwc6Slh}i!VekE-Pc9L>uwt2Q;q9&`8&#hrc}h#ynoe1^Vl#3N-)52+E($%V?8KjH zq8Ge3ob=i@0Hl|Bp&!RFoS>g1X`)obA-4)Jh z4AS@iWvHAalaBNLw(x9DvS2J&3Afz?qW?`n{>8MrqD*reX&>8gAWT3I7jJspi~(q1G=T+C#OhswCE^+5{Sq!((1P;F zHbI21R0a80I7iy?^B*ROp|So~f9tO(I@IOzDdoRsJiwg`zL1petAqA#Lx3m#WB@tp zmYbq1ijATlZPx4p7&L0ix%HWIC9|}x!3+$GJt=y!sMUa$uKE&*6||qU_wYuq@{`9Z zqql?#GELqRUW*87ID`ox(SafWe*h>1t#ZJ*+vmx$Et#FyAjimF|3Q-tP0R!z`vNM5 z!AvpKZe_LE^6jN{k%e2!D+X*kK*-s%n)}m&90@Z7;|JmThN{7~2^4}iUP()7;W?Pbq_pE`PSRcYv^#(iZs=>4;@2$ru$ay^dXUN6bDM}1ile*!&3l`Pc?o6!AiRdaSd>rc;Dyfq?@YhJ+x!Tx@b z&gde0PjuFGoD44ad+X-M{|Iy#3ZYz2Oq)J|IQb_Qp2g9$_)S8&{rHAkDn-v4a?C*g zTjWCA6F81g&9I}2l$4uxxGRqGWqWfb!4K60c_VPSHhdT5w!@u${+h8Tlkr=ib+YRtFVlz!%OgQFO= zo859JD%r)Q&x8TP-p?=i6}&yv4OU4-*wT}GcrNP#^B+76YfnTY2}iL#gj~`>pLV%; z(cNV;#XvP(nZsd#vGQ1Guk6HHLfl160t>ripYw?pF>~@1{?BVFR$P6rTApFg9%X=w z%!(oB^toV`i^?Llb5zpM3I+btOgKP7U_rqyxtQc-{*XEZi=V4p)DwoP0Yi{v>0oj{ zmaFsTmL5Qb#LmZ22R*3dKZS)A@?_+?I{KqFQyw;!S&4&GBd#Qw=UXTCGpw)VZX(Ph z=bklai3qMH!q31Tn+ft#w9T3W8|R`=$&2&&Y8b$&T-(k+wCTP8X?|`vjRPQUJ(Q`J zOar_^b9Q9f@!mRj8t=;!?6gvFpX1LoR3vK(nLUmUbC31Vk>llB))z%ch)o_v=AJL| zX1?MY(;It~lL|Z8>kCS&VnQ|<#yg+Lg9qG}Qefgu<~tv`Q+Y!0(NZxlUXnVKu9W8p zKS_Dwlq&=RWCqhcqXlcxlN)2WEmVl!7hcuLZG*^suEk{SMYp%hOmy?*n4SM{|4&G< zl=du2h)PTOBGsTrrrBMs<=7n|4R*gn#Ow1yvyIMOSeGEqJP*XttH1~_#_sF|^_7vQ zrKFcNRQ)D%Q30v?va{+ZhnsdYQaNSvBA&B8BUlt7p15X+8cnP+1x zH+*8!fkt^Asy*}8kk+5jAy?9fmEW^ThXi}AssTGqPvJ>Newlm5Vldk?^`+iD&2;2& zF6{j>og`Xi5~_egcLg26c74SP>f6Ws7|G{G#k+Ba4+`N@w{1Y4VTXoJY;{$CH#ewgqG5^YJ8|+ zmnm@#A=S$){X^LLR}7KVDWSfAFvn~)wObD6s=H9z={<`Or(d_%>B30vDJe(koYMJD zrAgjfEdrLTUVOisN-K!Bk%49IUN|+R=~uNm#&~fJ+0stbGSgr|ldsanJD(I>{$p;j zk^bEI{7`v2edg`obY}r79!x1~+e28=FA*r_bP{krBasF{hqyjr?Qg{VJVBG&h=k-6 zLx%BA=BcXLp{(GUB}cLdYE|8cU|V5Cu^TW6u87dPB0w?e4+*puh{-5E-FuLO4~EE9 zzMGb;ns9RIgI#%{3(<52WO*t~GTtoe_y`ZL$F1{U9(nPfw|DSHa3dMQ;5^`FP&uE$ zlWswH$3wYxwOO*AvXsw`4^3MkU=Nkc@9HmBXF>|xi9lI0oz5->vr}0aIZBYOqWONj zoeoEBVp9c8(Y&~kM}=Xn*>Ha$h1>L_$MI^I$c_5fvwWJj1HeQL#r8y7xLXNBO2tY( zqd>lkP&C8T^f*{7`up?Wajvy!klKi~0rx#`6cSIlU!-?W_4_xoL{6QE3cpw&uN7e; zVQO*4Ic#`q8ItFPzTGUj!vxM{U}-x_aL3cga$n%lA|)N&(~D}kO8Gu zXDB>moSAc`$&Rp{_pYNbu2Zvk5OWbRoyi8QteM88{Y;@K-ZM zGp!!s$iz|%4fkgD4gnnANR+aDtC}si(Mj~SE$4eF)c;QB^U)4%{;&^kb~i}MaDJ~< z7l5aT{fl`PBV<*#mZZLnjC-E(H5qA<*@`}r6)U+abEi-f)g;-2QZCBnOaC7`?E=$O z!OZ_0GuFXl@BnVf482B$QLwiq1z~M1j)hgAX-DXEN<4((s`qqY*?aQd?+eg~>Q z`MEs{;@j+D%1n!CHK$O}r&Il}K_y+RU@|uK%h7n0{JS{1R1uy+UY*~Fq<>;XR-@kE zFYP@S&MZIeupOKzXC4~8Qy(?Zsx)QVr{OdBqs^cFyDGN_^unSTIs+p7DAB?zG;P(z z47_?b+c{_xd5SSYVQkoasFJKfW0KmlNReY;{sTjHJ}M0wH`-2^i*etz4UQ%cZ==!m zq@XFm|99tmg$J@j@?AXrenq!`WHo(P{zL8}6<}(qL%LLrWBn22WV{Ux1{x=k&bfwP zqJH*hvL@p`y}|Y+9L3q1hl%vPRV2vu`T@V490z@tK0|NKO~Wq9vGUW+xTf1bS&Z$a z$dqMo%R8sH?StNM&O0f-fm?HVGy_hPINo4MX+t zuV8n-6rh%gPI}J`?W04ot#Bb-Bxc4}=#ErN2lNT?seGl_f?_A=cBUabmDkQNV%?I# zfvfb)pu*lAlW^Z5l)c`r7(YT~vRX|Ok~L0WU=9_D`~vqwKelym*`v7xu96kgKfzI~ z7=3?N14*L*lZQciaH=>`d}MWSu9B`c0TQ?bj`NFv4HWr)Di0gRC-geEMc8uxI!4rut4-TWH=0gt5c%|rnejj7167Na&lqtZxYHnk?PxmL| zlw>3My`be~GbF8=jcWld1;l0;HmYsH2=Ms*ueLA$ZQV(Q^JgLck`Otvg`!Rp_!GRE z@K4O^LdE%1^)_A|RiBZRaR6UiJdqOH2cC#L)7GZpLQNRGtPTHSF4mX|2Yb;5Qm@Qw zg8w*#5`sSeN0&nDEk03tkDwRMOn7>5n}oN$MIBH0u#`fmehg!~+(CCiazG8dd4`@m z=vsGcw4Hw4Y8BdZ^w^=Z+)8mG{1b=xXyNf<8)hPWPeo`mDr&Bb@Grc+V-jVfab71l z@;h%=0Vg#z+_1A(Wc-qz@@kF<-vQsI(sX#tTiOkBWffBa5{i*D^;yjKq+`S&Q|+TV zy4(AZZ@C?m~Oj;e-1^n82_jv3j^W|EGz45Hj=;HD6ak^7~%p|jXYDeVV10t2HR zVCsr*o4O4tf?eqggpm*gwYW?rFgWSY*R5IG8u>E`|!;QJ~ ztBSbyW6Qly#uBd(%(`oqjwvuOF|vN8%lXdIlqs%RhkCLDc_1mlQBn>Yi~+D8frt|I z-xRX2!^lTxGHV{RX_SSu#^;MVRQ5On_|guSOCVmEVp;D7>fsR;b}}3F-ppLMRs&-C z54EfDedm2P7aD67k;WhOZ>!A+yjvDxg4XQl?J70-rcl~VerVoy(^Dc5n1I@ED7pE8 zw%cZy{J`xoZs2xjHYG{?u=s93>&6c*WYriGPiuz|1u~9 z-zEJOValTvuphI&dxJ)sf76^-hFGZYpUQlxqR@C>&~1(!$%_jZeQht+{*}j|_d1#b z?CITG6dxnd7_EMRP<@Dy1>6?IAvDh#^IOag5+8&0JK7dva=aOn4jz69dyst#CcPoG zQ?SLC2LBh-4v1Ea{-S#WW~VcmB9ldJFC~e)Tagh*9s8qn`d7uv#*7ld%9UuU;;BL0 zR=R{Q^b1w!ULLfF#yw%vDqL3BZ%W2Jbo$&M_zHvHTLMq1)6H|iU2KN;Umvg}JIYC4 zJy|cHHk6OU-t-^@TQqk5y-3iQp?J<^tY%GYZ$w>{UvAM?8WpjsczHJjDRS&7w5lk* z26R@QU?u70OH|sMr&oaOFt-#ZW1@nU)SN}ZA}IwE7V#n2h0ml7E;uUfHcI3ep&tCRwL!MRzk{!Jo<7?C1cv zSlf=|zJiFlwaJklapT3W{MwBQ ztn`u1J`{#P*NjwO9e|UFJoy1o_uD0mwg`#PgG5l2rfeR#&`8P6iHf^kR%x~EXHwh- zq03!H&apM>8uutCe6Qo7pYZTbTo~9360$dpfg)I<3*l}iQX}j{r7fLMj={)(W}C>6 z%}t~l8ew@W3RE5eSF4L}{G*&)zm+I9R1DQOE+mD{z>{bq*ioXd411^tfkjxkQI6ha zx;j?vO;;<{b;PL8rV+b-!tY&&hc(m-PVkyRr*<;+8_XseS!yhsK?c@KUEh>OTAFo6 zn@ds7kg|wq2z(Nb=6MKVzg9-tF54gLeFF$L#4)V16P3PM2+qoRR5Te(Yl>O;$~R0% zX=MAjJq0%d(S2t_cV-%6kBfuhPf??}Ht^5P^Rc66_0cN3>1l6kNZ6*o1u)X@hyYx} zCO6i3UD;bN(3Tap{od*JhYG6sM5Pww)2&z;qjFNE72AWvx>P6`)@pV&cKyfZ4N=d~ zDsn{sRpPsw0CEXFM~R0LdNqS2qvM0ZJaaav|+V$we+H&4oiN$ zWe;!pf2BcL|957rLN#&n4`(Q6p#^Bd>h$IPqd%Y)bIVRXQI1ytEWnKpJhOE4!B`1| zQh`kkD;}P~vV{QJbFm~)zD9vfs_DjL+}H_BUj&|}M%i=HC0i4|qa-lQyTN}8!yobe ztoPMh^XJ+BTSETb2S0A7f44{1_Uh;DqwlLhC(qG~>ae)})^FROzwOe0+ehD3YF}1@ z_tj;r`T8;YXn)(QAGcX=s=eX;t-rR+|2FUaw4d#=58I``?YI{DwDb1Tzqd~Bt5QF0 znD{@Mp7EY`aE4xQRx`_n4B#ic{j5d-I?-(KG7AC56;lUxhEL*>4LDxO0q&ST?r6;r z(n+6}%^j0Blh1tjlZo#TGw|Gg-=ahS9#FNR8o|8>P)kl}l+46@*yQY0VkUAMcH#R! z^M(>*G3nQJZ0Sx6LRcV?BX!M9GZHxRYyC^ZIRYR|Q3(j;F&8yrE~x~#y+K)sf~g`@ z`TWt4-8!%p*2j4fib|YD5XeYc9 zw(tvb<0dxvmF5^K2Hop|Jaguik2r%ngSQv)^7Z+rP5>w6!t8c6C5FbsB~&K}7u0eh zUbc~!?;y>}o_Tu9C7fn2GiM4sN6TOP8S8)xD5&rd2-dDPLG2=DE^)L)T%pZyyJOZi zXrsMapmE!Tx(hR<@dfet+6zRHOb=9(Q^%2&grl=aj^HdgZ5Ow_F^0dHgC8dC1ffgm z;Mh;biKw%nLhS+B`(@61id;^q>8;LA5qu2=|1&if(yO?JNOEQUTXopaZn6Ap50kXbaxpQ;B(3w<%ALGn75A zz#HsF%jLiUkbKp>=*ydNh+dKiS}K`Sr>k|h(p%Hr{-OS4TWp`L7!Y5Diad*LIVfmS z*|WBubDlGzKl)9wM+o)UMd-~;b}OGr{>RnzS72D-D<-W33W$LTKCJ7FnqM!bzf^Wmzn92$=Y=@ncFVv z*Z)I55PDROq|xqT825DyKXzMF<EoRTX%SnntyM{{1YP#gD9wEcB>`2TYIF{ClR-I36<4j z^|WHXx}A4;1>{c^n+s~Kbz7kvpO=DDD((R!QVXq?W46mGdB_6qp9XtNz~0>Go|=SrAF##jz$z@{Nx#(i&Kh!eqlVf7sL1OFj{lnf|e21$;p z0>-U-)5%`L+Oij}3J;#f zF$%0oT!2n8HfhfUb^<^W(|p4RYTAA(+UfXf2y8cGhhnqyJb=40QnJL~ol!EWyc4%0 z--;b~fz24xmQ!J7 zz(*d6>hVP_s4M6V1~R)-U7$_dvdPidVYWb*qW9KcT$9c#6@%XGTZLX#-y_$DQ*`Su z#tV51WCGYDlq)sH$0zk6$S=uG3VxJn!2O->b&tvKk59;RLR-bguB3I0ZSRm8^Bx#; za<^45vsv=CAh>VSQ|$K)fOd^5iM#_c9?<2=n*BDs`Wu|~R@la(H@PYbV*ZIXvx^oX zdB_Bqa@trdy`d47AClh4YqdmBTHoZ$@4#!{__%U>Zo zw0vKb^_HQil)m<{ScdeiWqv0EZ2*!bC8SV|UaF{SD89&s#-3I?bVF@j^A&-XV9_^C z|3y*85g`sjAc_ONvVa&8(s15IhRM&%oT)r#Ye(7M77{I-wS*ESuFO_l|6~?O=vqP? zT9!TjUtz#+==h5i16&Cro(*3V*QsZ3E66bRer4+AE{-Ar$3cg>WSlEAe0qVBRg{i= zA~Pw$5>!;h`_{u`<@IXJ5SyjCO=KGa9W-{gT140K4zdkm{m@#bex}S-s%{Mq7(MHk zJJdiTU%$-~g+TklC*b7Dp19w#Br$M~066zPfJnkk+#|#_OJr83^wTw;4le3-A}UKz zVY7tgus8k2W2nbXZfE*Ius_~2`6SC9AV4O)@&^r;;pDhUp67d0kVf*A11&uCHShRG zgcsHW_K+B^TYg3duK{sBX2UZRGS+y$@~y6k4_`e8T7KIX3T(ripdq5Ixo<}2E8xtJ z)MBnMP>iH6R8B)ZiN$l#qnVNhlLR&iY$}OfPqPmmQSUEh)-ccQa6){_2g!lLBC7_w z{PVhd-Ki0tAh5TP(xJGsscELdG<4UQNy>3Azb`PXT2)U{#qBG z6b+h*o2p=*B_K^b5huNi^o?9MTCPNl++OF`pZZ-=r0S5v@M3Lj^W3 z+J+#Bhq!E>Z#4{Z>VKVOf+?$2em4t*(gkq0~ zU5`2DvO|}|AscvzrpkI%{?4ROkd@tufPg4<^=EY)TNTNWK^tiP!CUWr(2IV}+DvTPGngr6T~v z8XWUt;0mb=I(N9-*$?aNDo;l*DM}8-bxz%Y1K_M_YigP^r%|Ss!@n~c?3^K9+P5dn z4zb!tSW=}Hd7DRPhnYfHNHu1!qvZbWaZ6X+46j5N@~`WcyJYi-ngoK~W~$cWqP2pI zeba1=`qbR0I1=y%G20GonTU1_zU5go3#x;hxI<=5z>>R$^DdmOeBbas*D>X5gY;W& zK2yD_F@L22+;0AZimts^FsQie7^dNK$HM61jT(zQf`9tP6l=TgzD6 zT#idc0!EKaqI)JTqF6$w{=s&b#9ttK{Q0Wwnkf-~^|(_sPy%*{W}4jZhC3Oci0N6@ zORT_JtSz&M>M}TMHl9L>T%@g8F7|2c)1j(U0zYWVxiK;@_;?LRMJF|1aD1qzIL$zmMwGUT5sULz=<~XVAz8c(F_G(?7Ou zO!OxS5y%HclmpKhyzjIdt3x0ufScgdSHs?P&&uuSpS3qnyWtav9_|Ai#;||t*%@0s znZqa8Uh(zNsbfSv4Yn@BZ~EZ&2zNBoJ|c{)SB68EZ=;Y9q8-T+^UClSRf%6AR$ROj zEUn1{mb41_iz)juW4vIGt>6i(3~L?&^a-w+sfUhh`&-`!mMSr(Jb-z8%lIwF5yx6l zDYch_3a7LDN?|4>1E5gi&@0-!nl+~F@W5hq9M1(d0FBuDNP&nds=5m$3m6P^sGTWY zz=R=-$oTw*Y!V9~_fv%>VD%pF?bzfvzqLek1>>*h%PcB{N4PWrh;TyM>GDH%R$5d_ z@L285dzDPZamT(w-NnrUZxdr10+%s-FZGL9kRKtz+rmBJ$=_CG4HHgwP?~>gt7^#> zfsfau4rXvmU&${Pdk?gI3$#_6zfLR`QtT4vsv?~7-0gIvecM&4`DymHQ_{918cSQTzWUd57O2wxl zRkT zP58jK@NDHfQnnT!4^F1Fo{RIrSL1|QL&!t`L5Nm1lSd(setSz=2nw>#n8AlfjJ&95 z56(Swt~BvKSx9`+u6OjUppS}-{@!4^-bDg=5+=GFbm+l|#fe$eXfp}-1HS9H3MB64 zjx+4HJ$dN5jdSeRbt4Vy%aM3Du5{_2Bp)U#^pGp!>^RG#nk-;#(@HK^yazCYa;+pD zWPYIzJWt!vwfqEuG>4?(-0$?Z)B4|+3(6eXh;-EWwjH%F4^8BNWJMRLK`zW%mOZuK zvX@$+&AQF~!trYVAfwXA5#p3YYlIv-+{1oY2xHP^opIj%`Ee2ASzK~pQ+m9_&0(X7 zQoCa$_sgI$jjd4`(FrboYIrQveK-Gsv5e4-tRMmsIIPqi6s6XK6RF`=0`h0@1skl) zUqo@)D@j&p-};E%F@{RecrXUrq0bQQbk`%3EorAgSBsqw@dpn@ocA6J`n`jDd{`=g zZ27dkQkP2s{r9Fv7qFRu(I0pPd1Rnv|9^NSlGLb|&iRT>H}OL8K+G{sFmJ0PJ~Vmd zFO-D!iA#k=o2vq(3-{;XdTswtI$#6dgkk}iK#4rx>?QTrp|6jx$@w7()2>Z(+h$9^ z;4KNr)Cw*OR}5;SJdHzrN3qsh^tUm1Z4n?K6l}qfnirn@y&(K7y4}rPWC8x zNfAqiR(gZ~&5kAI^{r>X!HPo%Pz)1RFQG1xS#K?*${XYrl{c_vy z$}2S5i~UbM#K)UbXDTlov`>LbtK$A!*I!IL&Zvo@DMKdJ61R=!cfjcbe9IY@I=+u} zzEYLtv2c_5{@3vahLbbJoR2b~Xdv#u#HBu({zy$Kw+ngZE1eAbHwQ+vF`;qLsxkgS zr|nd^EV03ST$;mS+AXuyjFlA@Z4hV`lc$ehZWNsizTo&=%=(B_DYp#%1x;lhb5H|o z^R5$~!hnSf@3tKX<%q;*n&_koE;dC?1Ai7l5H+`v}tJuL%v4Yf5ovdOoxH zxV{a^JoiYNa^45jc5EkBlDZJ3oG3#eF5@A_gJkOOhF|bm2f_DJdT-+~@%Rt-jYBBuI(^4Pq>k`H`4Ap8~oquA` ziD+a>C^ejid?&r<%>nl-7@`@;#5M#qW9IJ7@7Xx8IvW+?qxY@n8PeyKAS{g+HEM(? zAi!O+a!uZuOVpNR0t(%#%Mrd!C(zgR^dX#J^2l_(Uf|;!x2c_t1WS7*HfanqGfG9S zKiw_TgcZ>IfMiQ}A-B*qoK_87*)6cm{yK?HAUXHF}HLRq8!5?)|6*$%hp*}SK0crw-Jk&Cw&oY{y6 zi9;etwdsZuEzHM14n{AM7dIh%*l8qMOOwTUeeY}De0e~#2hJj8C%b8p{;{P29`O3u z;1o-d=D1q`{b1Y@B@SnI9y_Fk%3MNJViPni9}3x}5#(sd)z3&nA_|qg%c8HurVY3` zja1{6uu3W%SUHM$YzXS01gH9^xCm=;WzHx=l@;A3rys+<{Iiwz8Uz7H4Y=}3Qrlpk zKhE^5saW5jf%an^AuA0HSOQ}! zm)>;Qx){5B4I8M=T!&l~U2g#_tm7}~vw~fkXNN{Z29y0f&6^fSl`(hpe zc)Yvn9(U_}zHyxvy~vW@L!t*1^?Bkciz>~SzsKk&BvgEHq~FYFa8rExol?)3d&A-o z&=!{jRkQ3-lTF>&?6?w}lef-AWBs6$+l>!QTE*$}RacFvzJybe4Y`tWKIeLiUqah> z3oeJKLH&kN@M=Hs3_r;A26Uy~0BQp|?I@hn4=6_3g?AGGi~B7UohM4?B4X#zq!5wQ z4^M!cc&G^9ErI_(n-`(UslPT7$9}n~eZ>q$`0z5>@#JiG46Q1H&U(8&4O?hb8;xt3 zHl{f6EI9gVJ0pR|;F{SyV2I=OiZzOP*XUBst|QhEAS3t9#7k*>_f5-oAvDo8aaN2? zk(hzH94&#fgro^IF%J^sO)qp0u+NdSiyr8nhagXGbu{1~jlT~L8-D)?tOoD`ddFbk3El@~D*t&du;{7p&zN|k~GG?K~_Q!3VD<6Ot`{|ax-k(DZl2H_ zo(Z;LlRV-AutPA_FoB(4QQF;U_b!|s)Kf)OvsXc7RBejo2{MEiRKYt<2?{ksEJQP= zv4)-~^U%;#&Pbn7oAa7UC$<6~Q8V9ob*pB+3E8rb^{mEQdc16+QE6Z8dD2T%*6F3d zJ>CKhUh2A2)&8LWh=g!^QR{t##U^;+6Be*JBUs=Wtl3!+Fn_+jaK}Yk3&^l}3k|o{ z(iHr)bKSC4IFSQ$)EByZio}kCs$NBPfAk^`0rCdlX2}Wxi}G^{(xqlmS0z6*rG_s6 zzDjD6Lzp_%T0&oGsSkSSQO>dJ;GA-m*1m6;mgEkGt3M*kj%}Y{x=3}iEbisoq=)sf z+uDi^3V6BWlWH0yI6NN65OaQoE0x$@HTX+i8&$}Axo|}EL48<9J6(PKYpXywjgznl z+~&nZ@f+DFGpGVW2eUD|hYE_6^p#aJK{F=yHs+I?%V4nHC0Edu*BNaEX>qkJUUTjS zO8N%ZNdu5p^LLmnNx!n`Twgj;q|F;eCP@l`+<2C7U-MUx^C%J-0y}N0wp5@D1SDlJ zAEkCWq>MH>Cb@0uaVna<^uT@Q>EU!2ZCNNLSW<;0fiM2PN%2EjnKvi9&K5Pvya%-h zf}|s~356o5{}pm5et?tRt>Dua+Z`l2KN={qh@d95*G>tVBpN4-^@m)rr!fg|kZsH^ z5Veu!%u6`T{vnqAAN^klVbNe3?C02}|5Q~_3rzF}^!a4XIpaQcZagu-r^U9xrmo@5 z@OyCZXZpa#ZMsgsS4@?OG(AAtR&Lq9+Wcccgb|1xUy}tRZkY$p`5u>S$%Q$3)t!Nc zY5!X>kM#Z1Gx&Lb^r7Svg;n$xEwrmwGWMLNV6S=!s!!f15TY%*MCz`s1IgcLUr!`XYi&^W4uacC40 z6@1yRlhYmM$k*TMyxLpj82LAaxn#%dmfSd=p*!aOxg?fx6pe;w>qppQj4kQX18V3R zeu?*%BRJ5qF7lqAbrHnh_GsDXAUj`!`#~=R{V5VLvFu_M$mZ1ACtM)Mef-oVURaI- zJUzo0Sr33^=IRotogc-u*JxYmF^r_-M&bu#xaGY|WL(B-8hS2;|6#~!NcCey!1$;M zq>;b^k?n;D$m#m?v~FuI3v3u@`=s*m0dfj_Lu>Fnx4iE;2((B^sZHRH6AJ;Qj4?xs zG1}hlvcx%Dd2seNlpgG9>9wQISRCkTtPAw@KBdIj zw8zzA#vNeB?s6voTI>w0WskD2@GIN-86Lv@pJEt;2pGq#5w4}k3Q$ek1m*f}Ti{os ztr&okRYo7-Erw0cm5bRQ6Nq{9sd_~oVF-TG2owh{l$Q`VmmVbIch&}vYGM^BwfVt) zHY=d0CK8&L)H~7OAX#Od!?14mww7^g;!zN>j(yN|*Ku+U!ze@kBm|w0Eyvu@(QBWRPAQe%Y=`Ou;eG^1K$JH1lf=R}e#qv* ztgY%~H93zeyp~xf+?|9dt`qoi<|e7&u*rr|YonE2rrv#>_<$oYOqjhqX|8NtL)T|} z7EeUW_|lnoA$b0ASVhw3Up$Jpk4CFVE^=1d+$NTdG!C{G)~0v7?Bvs_$L~NFa^O>} zv~gEwz>X%G#aFcyNCrhv=x6q}#YyeIpvq*9y##`Y9_cDM^ve05fuLH+kr zjD0yqp;D)*ZTMwi!!-C~;Wh>C5wa*DX3Zt1k__t~ytH&>G@g316ww27-6tWaI}PZX zQYqc1)~k7Vw2V7BY;8S}sCpgIfP882uEjO5lW-z?kHUsHMJmx-M^fTDlSU z^a>x7G+!`T7-Cnh)2d4L~epT*hA_Eqms$bV=jl zk%y^8`sGM6bj#q{H~|Go?8T)#|zZwD|J>6YszR@zO4Rv2DiK;)Y;Kw>6ZONot<1CD7%i5jhI5z5e zQY;wb0uhrSb;w|w+2V?LUtu%z{P2d)SurIE#*Vbdv6llh86!g*DA39ud6wU0pswG|0{IKP4l>X zc3)HViE=>OT|krMwe1XWEnOXME=Wm(*Ab8*L@oaF^)f3G`x#{%8VX8>pC(OdEQPHK zU=*Fcm#tV08_}(mx;iw3QKq%4rX-#sFEAzs)%B0uOTz1>4zVo>b{mhe-8i1$W9Q$L zA;>u*S@%W84S=b+Wt8QZ0$A$;z7Oe zs#0lzI$hI5x9fy;wBp-ym(}bw{%K`H#klT|?^b$Sz`jMB_>7~`$;w}dU-A~1dBUlF|6T0n4rW?^5WbCm zvwqCkpt`EN?#g4ZH|I?rci+7I!Hq4u!KhHQ5=o3zSJS(9e~q&TH&G-+*0CBxdwag} z$qQ80F?+J!qhqd)%Jc-kJEu@649_U%gN=;xrKf; z&%p#>Qe$4t?{VK+H&2-He-o7}7jyE%cN}6F8T`$HZp*|d zL6n^Zx5E&YbBwykm{OgTTCmJVUx+7dHQST(pNlD=J2sep!XG)pj1kDM%#a7V%ejJ< z&#Vz$hIS`Rxw2LjSE$4mjxOSSZ5-<8CFcgj!Z3moCqr#h5gA=9fVMgiaG)dmj_@Br zLQButxc3PZ?qcqYy4 - - - - CodeXen Popup - - - - - - - - - -
- - - - diff --git a/browser/finder/index.html b/browser/finder/index.html index e69de29b..c8ac50d1 100644 --- a/browser/finder/index.html +++ b/browser/finder/index.html @@ -0,0 +1,39 @@ + + + + + CodeXen Popup + + + + + + + + + +
+ + + + diff --git a/browser/finder/index.jsx b/browser/finder/index.jsx index 7de3859a..d3668aa8 100644 --- a/browser/finder/index.jsx +++ b/browser/finder/index.jsx @@ -3,7 +3,7 @@ var remote = require('remote') var hideFinder = remote.getGlobal('hideFinder') var clipboard = require('clipboard') -var React = require('react/addons') +var React = require('react') var ArticleFilter = require('../main/Mixins/ArticleFilter') diff --git a/browser/index.html b/browser/index.html deleted file mode 100644 index cbb53cad..00000000 --- a/browser/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - -
Go Main - Go Popup - - diff --git a/browser/main/Components/AboutModal.jsx b/browser/main/Components/AboutModal.jsx index d1f1a3eb..030700c0 100644 --- a/browser/main/Components/AboutModal.jsx +++ b/browser/main/Components/AboutModal.jsx @@ -1,4 +1,4 @@ -var React = require('react/addons') +var React = require('react') var ExternalLink = require('../Mixins/ExternalLink') var KeyCaster = require('../Mixins/KeyCaster') diff --git a/browser/main/Components/AddMemberModal.jsx b/browser/main/Components/AddMemberModal.jsx index f79ce647..9a173f1a 100644 --- a/browser/main/Components/AddMemberModal.jsx +++ b/browser/main/Components/AddMemberModal.jsx @@ -1,4 +1,4 @@ -var React = require('react/addons') +var React = require('react') var Select = require('react-select') var LinkedState = require('../Mixins/LinkedState') diff --git a/browser/main/Components/ArticleDetail.jsx b/browser/main/Components/ArticleDetail.jsx new file mode 100644 index 00000000..4cb67b75 --- /dev/null +++ b/browser/main/Components/ArticleDetail.jsx @@ -0,0 +1,209 @@ +var React = require('react') +var moment = require('moment') +var _ = require('lodash') + +var CodeEditor = require('./CodeEditor') +var MarkdownPreview = require('./MarkdownPreview') +var ModeIcon = require('./ModeIcon') +var Select = require('react-select') + +var Modal = require('../Mixins/Modal') +var ForceUpdate = require('../Mixins/ForceUpdate') +var LinkedState = require('../Mixins/LinkedState') + +var aceModes = require('../../../modules/ace-modes') + +var modeOptions = aceModes.map(function (mode) { + return { + label: mode, + value: mode + } +}) + +module.exports = React.createClass({ + mixins: [ForceUpdate(60000), Modal, LinkedState], + propTypes: { + currentArticle: React.PropTypes.object, + showOnlyWithTag: React.PropTypes.func, + planet: React.PropTypes.object, + switchDetailMode: React.PropTypes.func, + user: React.PropTypes.shape({ + id: React.PropTypes.number, + name: React.PropTypes.string, + Folders: React.PropTypes.array + }), + article: React.PropTypes.object, + saveCurrentArticle: React.PropTypes.func, + detailMode: React.PropTypes.string + }, + getInitialState: function () { + var article = this.props.currentArticle != null ? { + id: this.props.currentArticle.id, + title: this.props.currentArticle.title, + content: this.props.currentArticle.CurrentRevision.title, + tags: this.props.currentArticle.Tags.map(function (tag) { + return tag.name + }), + mode: this.props.currentArticle.mode, + status: this.props.currentArticle.status + } : null + // console.log('init staet') + // console.log(article) + return { + isEditModalOpen: false, + article: article + } + }, + componentWillReceiveProps: function (nextProps) { + if (nextProps.detailMode === 'edit') { + var article = { + id: nextProps.currentArticle.id, + title: nextProps.currentArticle.title, + content: nextProps.currentArticle.CurrentRevision.content, + tags: nextProps.currentArticle.Tags.map(function (tag) { + return tag.name + }), + mode: nextProps.currentArticle.mode, + FolderId: nextProps.currentArticle.FolderId, + status: nextProps.currentArticle.status + } + this.setState({article: article}) + } + }, + openDeleteModal: function () { + if (this.props.article == null) return + }, + handleFolderIdChange: function (FolderId) { + this.state.article.FolderId = FolderId + this.setState({article: this.state.article}) + }, + handleTagsChange: function (tag, tags) { + tags = _.uniq(tags, function (tag) { + return tag.value + }) + + this.state.article.tags = tags.map(function (tag) { + return tag.value + }) + this.setState({article: this.state.article}) + }, + handleModeChange: function (mode) { + this.state.article.mode = mode + this.setState({article: this.state.article}) + }, + handleContentChange: function (e, value) { + var article = this.state.article + article.content = value + this.setState({article: article}) + }, + saveArticle: function () { + if (this.state.article.mode === '') { + return this.refs.mode.focus() + } + if (this.state.article.FolderId === '') { + return this.refs.folder.focus() + } + this.props.saveCurrentArticle(this.state.article) + }, + render: function () { + if (this.props.currentArticle == null) { + return ( +
+ Nothing selected +
+ ) + } + + if (this.props.detailMode === 'show') { + return this.renderViewer() + } + if (this.state.article == null) { + return ( +
+ Nothing selected +
+ ) + } + return this.renderEditor() + }, + renderEditor: function () { + var article = this.state.article + + var folderOptions = this.props.user.Folders.map(function (folder) { + return { + label: folder.name, + value: folder.id + } + }) + + return ( +
+
+
+ +
+
+ + +
+
+
+
+
+
+ +
+ +
+
+ + +
+ ) + } +}) diff --git a/browser/main/Components/UserNavigator.jsx b/browser/main/Components/UserNavigator.jsx new file mode 100644 index 00000000..ef6c8993 --- /dev/null +++ b/browser/main/Components/UserNavigator.jsx @@ -0,0 +1,53 @@ +var React = require('react') +var _ = require('lodash') + +module.exports = React.createClass({ + propTypes: { + createNewArticle: React.PropTypes.func, + search: React.PropTypes.string, + user: React.PropTypes.object + }, + render: function () { + var user = this.props.user + + var folders = _.isArray(user.Folders) ? user.Folders.map(function (folder) { + var isActive = this.props.search.match(new RegExp('in:' + folder.name)) + return ( + + ) + }.bind(this)) : null + + var members = _.isArray(user.Members) ? user.Members.map(function (member) { + return + }) : null + + return ( +
+
+
{user.profileName}
+
{user.name}
+
+
+ +
+ +
+ +
+
+
+ Folders + +
+ + {folders} +
+ + {user.userType === 'team' ? ( +
{members}
+ ) : null} +
+
+ ) + } +}) diff --git a/browser/main/Containers/HomeContainer.jsx b/browser/main/Containers/HomeContainer.jsx deleted file mode 100644 index 32e5fad0..00000000 --- a/browser/main/Containers/HomeContainer.jsx +++ /dev/null @@ -1,41 +0,0 @@ -/* global localStorage */ - -var React = require('react/addons') -var ReactRouter = require('react-router') -var RouteHandler = ReactRouter.RouteHandler -var State = ReactRouter.State -var Navigation = ReactRouter.Navigation - -var AuthFilter = require('../Mixins/AuthFilter') -var KeyCaster = require('../Mixins/KeyCaster') - -var HomeNavigator = require('../Components/HomeNavigator') - -module.exports = React.createClass({ - mixins: [AuthFilter.OnlyUser, State, Navigation, KeyCaster('homeContainer')], - componentDidMount: function () { - if (this.isActive('homeEmpty')) { - var user = JSON.parse(localStorage.getItem('currentUser')) - if (user.Planets != null && user.Planets.length > 0) { - this.transitionTo('planet', {userName: user.name, planetName: user.Planets[0].name}) - return - } - this.transitionTo('userHome', {userName: user.name}) - } - }, - onKeyCast: function (e) { - switch (e.status) { - case 'switchPlanet': - this.refs.navigator.switchPlanetByIndex(e.data) - break - } - }, - render: function () { - return ( -
- - -
- ) - } -}) diff --git a/browser/main/Containers/LoginContainer.js b/browser/main/Containers/LoginContainer.js new file mode 100644 index 00000000..dbde65aa --- /dev/null +++ b/browser/main/Containers/LoginContainer.js @@ -0,0 +1,92 @@ +var Hq = require('../Services/Hq') +var socket = require('../Services/socket') + +import React, { PropTypes } from 'react' +import { Link } from 'react-router' +import linkState from '../helpers/linkState' + +export default class LoginPage extends React.Component { + constructor (props) { + super(props) + + this.state = { + user: {}, + isSending: false, + error: null + } + this.linkState = linkState + } + + handleSubmit (e) { + e.preventDefault() + this.setState({ + isSending: true, + error: null + }, function () { + console.log(this.state.user) + Hq.login(this.state.user) + .then(function (res) { + localStorage.setItem('token', res.body.token) + localStorage.setItem('currentUser', JSON.stringify(res.body.user)) + + try { + this.props.history.pushState('home') + } catch(e) { + console.error(e) + } + }.bind(this)) + .catch(function (err) { + console.error(err) + if (err.response == null) { + return this.setState({ + error: {name: 'CunnectionRefused', message: 'API server doesn\'t respond. Check your internet connection.'}, + isSending: false + }) + } + + var res = err.response + + // Connection Failed or Whatever + this.setState({ + error: err.response.body, + isSending: false + }) + }.bind(this)) + }) + } + + render () { + return ( +
+ + + + +
this.handleSubmit(e)}> +
+ +
+
+ +
+ + {this.state.isSending ? ( +

Logging in...

+ ) : null} + + {this.state.error != null ?

{this.state.error.message}

: null} + +
+ +
+
+
+ ) + } +} + +LoginPage.propTypes = { + history: PropTypes.shape({ + pushState: PropTypes.func + }) +} diff --git a/browser/main/Containers/LoginContainer.jsx b/browser/main/Containers/LoginContainer.jsx deleted file mode 100644 index a1c01a1e..00000000 --- a/browser/main/Containers/LoginContainer.jsx +++ /dev/null @@ -1,108 +0,0 @@ -/* global localStorage */ -var React = require('react/addons') -var ReactRouter = require('react-router') -var Link = ReactRouter.Link - -var AuthFilter = require('../Mixins/AuthFilter') -var LinkedState = require('../Mixins/LinkedState') -var Hq = require('../Services/Hq') -var socket = require('../Services/socket') - -module.exports = React.createClass({ - mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest], - getInitialState: function () { - return { - user: {}, - authenticationFailed: false, - connectionFailed: false, - isSending: false - } - }, - onListen: function (res) { - if (res.status === 'failedToLogIn') { - if (res.data.status === 401) { - // Wrong E-mail or Password - this.setState({ - authenticationFailed: true, - connectionFailed: false, - isSending: false - }) - return - } - // Connection Failed or Whatever - this.setState({ - authenticationFailed: false, - connectionFailed: true, - isSending: false - }) - return - } - }, - handleSubmit: function (e) { - this.setState({ - authenticationFailed: false, - connectionFailed: false, - isSending: true - }, function () { - Hq.login(this.state.user) - .then(function (res) { - localStorage.setItem('token', res.body.token) - localStorage.setItem('currentUser', JSON.stringify(res.body.user)) - socket.reconnect() - - this.transitionTo('userHome', {userName: res.body.user.name}) - }.bind(this)) - .catch(function (err) { - if (err.status === 401) { - this.setState({ - authenticationFailed: true, - connectionFailed: false, - isSending: false - }) - return - } - this.setState({ - authenticationFailed: false, - connectionFailed: true, - isSending: false - }) - }.bind(this)) - }) - - e.preventDefault() - }, - render: function () { - return ( -
- - - - -
-
- -
-
- -
- - {this.state.isSending ? ( -

Logging in...

- ) : null} - - {this.state.connectionFailed ? ( -

Please try again.

- ) : null} - - {this.state.authenticationFailed ? ( -

Wrong E-mail or Password.

- ) : null} - -
- -
-
-
- ) - } -}) diff --git a/browser/main/Containers/MainContainer.js b/browser/main/Containers/MainContainer.js new file mode 100644 index 00000000..4cba559d --- /dev/null +++ b/browser/main/Containers/MainContainer.js @@ -0,0 +1,45 @@ +var ipc = require('ipc') +import React, { PropTypes } from 'react' + +var ContactModal = require('../Components/ContactModal') + +export default class MainContainer extends React.Component { + // mixins: [Modal], + constructor (props) { + super(props) + this.state = {updateAvailable: false} + } + + componentDidMount () { + ipc.on('update-available', function (message) { + this.setState({updateAvailable: true}) + }.bind(this)) + } + + updateApp () { + ipc.send('update-app', 'Deal with it.') + } + + openContactModal () { + this.openModal(ContactModal) + } + + render () { + return ( +
+ {this.state.updateAvailable ? ( + + ) : null} + + {this.props.children} +
+ ) + } +} + +MainContainer.propTypes = { + children: PropTypes.element +} diff --git a/browser/main/Containers/MainContainer.jsx b/browser/main/Containers/MainContainer.jsx deleted file mode 100644 index 544c8173..00000000 --- a/browser/main/Containers/MainContainer.jsx +++ /dev/null @@ -1,107 +0,0 @@ -/* global localStorage */ - -var ipc = require('ipc') - -var React = require('react/addons') -var ReactRouter = require('react-router') -var RouteHandler = ReactRouter.RouteHandler -var Navigation = ReactRouter.Navigation -var State = ReactRouter.State - -var Hq = require('../Services/Hq') -var socket = require('../Services/socket') - -var Modal = require('../Mixins/Modal') - -var UserStore = require('../Stores/UserStore') - -var ContactModal = require('../Components/ContactModal') - -function fetchPlanet (userName, planetName) { - return Hq.fetchPlanet(userName, planetName) - .then(function (res) { - var planet = res.body - - planet.Codes.forEach(function (code) { - code.type = 'code' - }) - - planet.Notes.forEach(function (note) { - note.type = 'note' - }) - - localStorage.setItem('planet-' + planet.id, JSON.stringify(planet)) - - return planet - }) - .catch(function (err) { - console.error(err) - }) -} - -module.exports = React.createClass({ - mixins: [State, Navigation, Modal], - getInitialState: function () { - return { - updateAvailable: false - } - }, - componentDidMount: function () { - ipc.on('update-available', function (message) { - this.setState({updateAvailable: true}) - }.bind(this)) - - if (this.isActive('root')) { - if (localStorage.getItem('currentUser') == null) { - this.transitionTo('login') - return - } else { - this.transitionTo('home') - } - } - - Hq.getUser() - .then(function (res) { - var user = res.body - UserStore.Actions.update(user) - - user.Planets.forEach(function (planet) { - fetchPlanet(user.name, planet.name) - }) - user.Teams.forEach(function (team) { - team.Planets.forEach(function (planet) { - fetchPlanet(team.name, planet.name) - }) - }) - }) - .catch(function (err) { - if (err.status === 401) { - console.log('Not logged in yet') - localStorage.removeItem('currentUser') - this.transitionTo('login') - return - } - console.error(err) - }.bind(this)) - }, - updateApp: function () { - ipc.send('update-app', 'Deal with it.') - }, - openContactModal: function () { - this.openModal(ContactModal) - }, - render: function () { - return ( -
- {this.state.updateAvailable ? ( - - ) : null} - - -
- ) - } -}) diff --git a/browser/main/Containers/PlanetContainer.jsx b/browser/main/Containers/PlanetContainer.js similarity index 99% rename from browser/main/Containers/PlanetContainer.jsx rename to browser/main/Containers/PlanetContainer.js index 8abc9a73..ecd1270e 100644 --- a/browser/main/Containers/PlanetContainer.jsx +++ b/browser/main/Containers/PlanetContainer.js @@ -1,6 +1,5 @@ /* global localStorage*/ -'strict' -var React = require('react/addons') +var React = require('react') var ReactRouter = require('react-router') var Reflux = require('reflux') diff --git a/browser/main/Containers/SignupContainer.js b/browser/main/Containers/SignupContainer.js new file mode 100644 index 00000000..2e35d58d --- /dev/null +++ b/browser/main/Containers/SignupContainer.js @@ -0,0 +1,98 @@ +import React, { PropTypes } from 'react' +import { Link } from 'react-router' +import linkState from '../helpers/linkState' +import openExternal from '../helpers/openExternal' + +var Hq = require('../Services/Hq') + +export default class SignupContainer extends React.Component { + constructor (props) { + super(props) + this.state = { + user: {}, + connectionFailed: false, + emailConflicted: false, + nameConflicted: false, + validationFailed: false, + isSending: false, + error: null + } + this.linkState = linkState + this.openExternal = openExternal + } + + handleSubmit (e) { + this.setState({ + isSending: true, + error: null + }, function () { + Hq.signup(this.state.user) + .then(res => { + localStorage.setItem('token', res.body.token) + localStorage.setItem('currentUser', JSON.stringify(res.body.user)) + + this.props.history.pushState('userHome', {userId: res.body.user.id}) + }) + .catch(function (err) { + console.error(err) + if (err.response == null) { + return this.setState({ + error: {name: 'CunnectionRefused', message: 'API server doesn\'t respond. Check your internet connection.'}, + isSending: false + }) + } + + // Connection Failed or Whatever + this.setState({ + error: err.response.body, + isSending: false + }) + }.bind(this)) + }) + + e.preventDefault() + } + + render () { + return ( +
+ + + + +
this.handleSubmit(e)}> +
+ +
+
+ +
+
+ +
+
+ +
+ + {this.state.isSending ? ( +

Signing up...

+ ) : null} + + {this.state.error != null ?

{this.state.error.message}

: null} + +
+ +
+
+ +

会員登録することで、当サイトの利用規約及びCookieの使用を含むデータに関するポリシーに同意するものとします。

+
+ ) + } +} + +SignupContainer.propTypes = { + history: PropTypes.shape({ + pushState: PropTypes.func + }) +} diff --git a/browser/main/Containers/SignupContainer.jsx b/browser/main/Containers/SignupContainer.jsx deleted file mode 100644 index 114dbc27..00000000 --- a/browser/main/Containers/SignupContainer.jsx +++ /dev/null @@ -1,139 +0,0 @@ -/* global localStorage */ - -var React = require('react/addons') -var ReactRouter = require('react-router') -var Link = ReactRouter.Link - -var AuthFilter = require('../Mixins/AuthFilter') -var LinkedState = require('../Mixins/LinkedState') -var ExternalLink = require('../Mixins/ExternalLink') -var Hq = require('../Services/Hq') -var socket = require('../Services/socket') - -module.exports = React.createClass({ - mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest, ExternalLink], - getInitialState: function () { - return { - user: {}, - connectionFailed: false, - emailConflicted: false, - nameConflicted: false, - validationFailed: false, - isSending: false - } - }, - handleSubmit: function (e) { - this.setState({ - connectionFailed: false, - emailConflicted: false, - nameConflicted: false, - validationFailed: false, - isSending: true - }, function () { - Hq.signup(this.state.user) - .then(function (res) { - localStorage.setItem('token', res.body.token) - localStorage.setItem('currentUser', JSON.stringify(res.body.user)) - socket.reconnect() - - this.transitionTo('userHome', {userName: res.body.user.name}) - }.bind(this)) - .catch(function (err) { - console.error(err) - var res = err.response - if (err.status === 409) { - // Confliction - var emailConflicted = res.body.errors[0].path === 'email' - var nameConflicted = res.body.errors[0].path === 'name' - - this.setState({ - connectionFailed: false, - emailConflicted: emailConflicted, - nameConflicted: nameConflicted, - validationFailed: false, - isSending: false - }) - return - } - - if (err.status === 422) { - // Validation Failed - this.setState({ - connectionFailed: false, - emailConflicted: false, - nameConflicted: false, - validationFailed: { - errors: res.body.errors.map(function (error) { - return error.path - }) - }, - isSending: false - }) - return - } - - // Connection Failed or Whatever - this.setState({ - connectionFailed: true, - emailConflicted: false, - nameConflicted: false, - validationFailed: false, - isSending: false - }) - return - }.bind(this)) - }) - - e.preventDefault() - }, - render: function () { - return ( -
- - - - -
-
- -
-
- -
-
- -
-
- -
- - {this.state.isSending ? ( -

Signing up...

- ) : null} - - {this.state.connectionFailed ? ( -

Please try again.

- ) : null} - - {this.state.emailConflicted ? ( -

E-mail already exists.

- ) : null} - - {this.state.nameConflicted ? ( -

Username already exists.

- ) : null} - - {this.state.validationFailed ? ( -

Please fill every field correctly: {this.state.validationFailed.errors.join(', ')}

- ) : null} - -
- -
-
- -

会員登録することで、当サイトの利用規約及びCookieの使用を含むデータに関するポリシーに同意するものとします。

-
- ) - } -}) diff --git a/browser/main/Containers/UserContainer.jsx b/browser/main/Containers/UserContainer.jsx deleted file mode 100644 index c0ef398b..00000000 --- a/browser/main/Containers/UserContainer.jsx +++ /dev/null @@ -1,367 +0,0 @@ -/* global localStorage */ - -var React = require('react/addons') -var ReactRouter = require('react-router') -var Navigation = ReactRouter.Navigation -var State = ReactRouter.State -var RouteHandler = ReactRouter.RouteHandler -var Link = ReactRouter.Link -var Reflux = require('reflux') - -var LinkedState = require('../Mixins/LinkedState') -var Modal = require('../Mixins/Modal') -var Helper = require('../Mixins/Helper') - -var Hq = require('../Services/Hq') - -var ProfileImage = require('../Components/ProfileImage') -var EditProfileModal = require('../Components/EditProfileModal') -var TeamSettingsModal = require('../Components/TeamSettingsModal') -var PlanetCreateModal = require('../Components/PlanetCreateModal') -var AddMemberModal = require('../Components/AddMemberModal') -var TeamCreateModal = require('../Components/TeamCreateModal') - -var UserStore = require('../Stores/UserStore') -var PlanetStore = require('../Stores/PlanetStore') - -module.exports = React.createClass({ - mixins: [LinkedState, State, Navigation, Modal, Reflux.listenTo(UserStore, 'onUserChange'), Reflux.listenTo(PlanetStore, 'onPlanetChange'), Helper], - propTypes: { - params: React.PropTypes.shape({ - userName: React.PropTypes.string, - planetName: React.PropTypes.string - }) - }, - getInitialState: function () { - return { - user: null - } - }, - componentDidMount: function () { - this.fetchUser() - }, - componentWillReceiveProps: function (nextProps) { - if (this.state.user == null) { - this.fetchUser(nextProps.params.userName) - return - } - - if (nextProps.params.userName !== this.state.user.name) { - this.setState({ - user: null - }, function () { - this.fetchUser(nextProps.params.userName) - }) - } - }, - onUserChange: function (res) { - if (this.state.user == null) return - - var member - switch (res.status) { - case 'userUpdated': - if (this.state.user.id === res.data.id) { - this.setState({user: res.data}) - } - break - case 'memberAdded': - member = res.data - if (this.state.user.userType === 'team' && member.TeamMember.TeamId === this.state.user.id) { - this.state.user.Members = this.updateItemToTargetArray(member, this.state.user.Members) - - this.setState({user: this.state.user}) - } - break - case 'memberRemoved': - member = res.data - if (this.state.user.userType === 'team' && member.TeamMember.TeamId === this.state.user.id) { - this.state.user.Members = this.deleteItemFromTargetArray(member, this.state.user.Members) - - this.setState({user: this.state.user}) - } - break - } - }, - onPlanetChange: function (res) { - if (this.state.user == null) return - - var currentUser, planet, isOwner, team - switch (res.status) { - case 'updated': - // if state.user is currentUser, planet will be fetched by UserStore - currentUser = JSON.parse(localStorage.getItem('currentUser')) - if (currentUser.id === this.state.user.id) return - - planet = res.data - isOwner = planet.Owner.id === this.state.user.id - if (isOwner) { - this.state.user.Planets = this.updateItemToTargetArray(planet, this.state.user.Planets) - this.setState({user: this.state.user}) - return - } - // check if team of user has this planet - team = null - this.state.user.userType !== 'team' && this.state.user.Teams.some(function (_team) { - if (planet.Owner.id === _team.id) { - team = _team - return true - } - return false - }) - if (team != null) { - team.Planets = this.updateItemToTargetArray(planet, team.Planets) - this.setState({user: this.state.user}) - return - } - - break - case 'destroyed': - // if state.user is currentUser, planet will be fetched by UserStore - currentUser = JSON.parse(localStorage.getItem('currentUser')) - if (currentUser.id === this.state.user.id) return - - planet = res.data - isOwner = planet.Owner.id === this.state.user.id - if (isOwner) { - this.state.user.Planets = this.deleteItemFromTargetArray(planet, this.state.user.Planets) - this.setState({user: this.state.user}) - return - } - // check if team of user has this planet - team = null - this.state.user.userType !== 'team' && this.state.user.Teams.some(function (_team) { - if (planet.Owner.id === _team.id) { - team = _team - return true - } - return false - }) - if (team != null) { - team.Planets = this.deleteItemFromTargetArray(planet, team.Planets) - this.setState({user: this.state.user}) - return - } - break - } - }, - fetchUser: function (userName) { - if (userName == null) userName = this.props.params.userName - - Hq.fetchUser(userName) - .then(function (res) { - this.setState({user: res.body}) - }.bind(this)) - .catch(function (err) { - console.error(err) - }) - }, - openEditProfileModal: function () { - this.openModal(EditProfileModal, {user: this.state.user}) - }, - openTeamSettingsModal: function () { - this.openModal(TeamSettingsModal, {team: this.state.user}) - }, - openAddUserModal: function () { - this.openModal(AddMemberModal, {team: this.state.user}) - }, - openTeamCreateModal: function () { - this.openModal(TeamCreateModal, {user: this.state.user}) - }, - openPlanetCreateModalWithOwnerName: function (name) { - return function () { - this.openModal(PlanetCreateModal, {ownerName: name}) - }.bind(this) - }, - render: function () { - var user = this.state.user - - var currentUser = JSON.parse(localStorage.getItem('currentUser')) - - if (this.isActive('userHome')) { - if (user == null) { - return ( -
- User Loading... -
- ) - } else if (user.userType === 'team') { - return this.renderTeamHome(currentUser) - } else { - return this.renderUserHome(currentUser) - } - } else if (this.isActive('planet') && user != null && user.userType === 'team') { - var members = user.Members.map(function (member) { - return ( -
  • - -
    -
    {member.profileName}
    -
    @{member.name}
    -
    -
  • - ) - }) - return ( -
    - -
    -
    Members
    -
      - {members} -
    -
    -
    - ) - } else { - return ( -
    - -
    - ) - } - }, - renderTeamHome: function (currentUser) { - var user = this.state.user - - var isOwner = user.Members == null ? false : user.Members.some(function (member) { - return member.id === currentUser.id && member.TeamMember.role === 'owner' - }) - - var userPlanets = user.Planets.map(function (planet) { - return ( -
  • - {user.name}/{planet.name} -  {!planet.public ? () : null} -
  • - ) - }) - - var members = user.Members == null ? [] : user.Members.map(function (member) { - return ( -
  • - - -
    -
    {member.profileName} ({member.TeamMember.role})
    -
    @{member.name}
    -
    - -
    -
  • - ) - }) - return ( -
    -
    - -
    -
    {user.profileName}
    -
    {user.name}
    -
    - - {isOwner ? () : null} -
    -
    -
    {members.length} {members.length > 1 ? 'Members' : 'Member'}
    -
      - {members} - {isOwner ? (
    • ) : null} -
    -
    -
    -
    {userPlanets.length} {userPlanets.length > 0 ? 'Planets' : 'Planet'}
    -
    -
      - {userPlanets} - {isOwner ? (
    • ) : null} -
    -
    -
    -
    - ) - }, - renderUserHome: function (currentUser) { - var user = this.state.user - - var isOwner = currentUser.id === user.id - - var userPlanets = user.Planets.map(function (planet) { - return ( -
  • - {user.name}/{planet.name} -  {!planet.public ? () : null} -
  • - ) - }) - - var teams = user.Teams == null ? [] : user.Teams.map(function (team) { - return ( -
  • - -
    -
    {team.profileName}
    -
    @{team.name}
    -
    - -
  • - ) - }) - - var teamPlanets = user.Teams == null ? [] : user.Teams.map(function (team) { - var planets = (team.Planets == null ? [] : team.Planets).map(function (planet) { - return ( -
  • - {team.name}/{planet.name} -  {!planet.public ? () : null} -
  • - ) - }) - return ( -
    -
    {team.profileName} @{team.name}
    -
      - {planets} - {isOwner ? (
    • ) : null} -
    -
    - ) - }.bind(this)) - - var planetCount = userPlanets.length + user.Teams.reduce(function (sum, team) { - return sum + (team.Planets != null ? team.Planets.length : 0) - }, 0) - - return ( -
    -
    - -
    -
    {user.profileName}
    -
    {user.name}
    -
    - - {isOwner ? ( - ) : null} -
    -
    -
    {teams.length} {teams.length > 1 ? 'Teams' : 'Team'}
    -
      - {teams} - {isOwner ? (
    • ) : null} -
    -
    -
    -
    {planetCount} {planetCount > 1 ? 'Planets' : 'Planet'}
    -
    -
    {user.profileName} @{user.name}
    -
      - {userPlanets} - {isOwner ? (
    • ) : null} -
    -
    - {teamPlanets} -
    -
    - ) - } -}) diff --git a/browser/main/HomeContainer/Components/ArticleDetail.js b/browser/main/HomeContainer/Components/ArticleDetail.js new file mode 100644 index 00000000..f53a69c8 --- /dev/null +++ b/browser/main/HomeContainer/Components/ArticleDetail.js @@ -0,0 +1,9 @@ +import React, { PropTypes } from 'react' + +export default class ArticleDetail extends React.Component { + render () { + return ( +
    + ) + } +} diff --git a/browser/main/HomeContainer/Components/ArticleList.js b/browser/main/HomeContainer/Components/ArticleList.js new file mode 100644 index 00000000..ef0f0042 --- /dev/null +++ b/browser/main/HomeContainer/Components/ArticleList.js @@ -0,0 +1,11 @@ +import React, { PropTypes } from 'react' + +class ArticleList extends React.Component { + render() { + return ( +
    + ) + } +} + +export default ArticleList diff --git a/browser/main/HomeContainer/Components/ArticleNavigator.js b/browser/main/HomeContainer/Components/ArticleNavigator.js new file mode 100644 index 00000000..3c03d534 --- /dev/null +++ b/browser/main/HomeContainer/Components/ArticleNavigator.js @@ -0,0 +1,12 @@ +import React, { PropTypes } from 'react' + +class ArticleNavigator extends React.Component { + render () { + return ( +
    +
    + ) + } +} + +export default ArticleNavigator diff --git a/browser/main/HomeContainer/Components/UserNavigator.js b/browser/main/HomeContainer/Components/UserNavigator.js new file mode 100644 index 00000000..6e212893 --- /dev/null +++ b/browser/main/HomeContainer/Components/UserNavigator.js @@ -0,0 +1,33 @@ +import React, { Component, PropTypes } from 'react' +import { Link } from 'react-router' + +export default class UserNavigator extends Component { + + renderUserList () { + var users = this.props.users.map(user => ( +
  • + +
    {user.name}
    + +
  • + )) + + return ( +
    + {users} +
    + ) + } + + render () { + return ( +
    + {this.renderUserList()} +
    + ) + } +} + +UserNavigator.propTypes = { + users: PropTypes.array +} diff --git a/browser/main/HomeContainer/actions.js b/browser/main/HomeContainer/actions.js new file mode 100644 index 00000000..d208a0ef --- /dev/null +++ b/browser/main/HomeContainer/actions.js @@ -0,0 +1,10 @@ +function updateUser (user) { + return { + type: 'USER_UPDATE', + data: user + } +} + +module.exports = { + updateUser: updateUser +} diff --git a/browser/main/HomeContainer/index.js b/browser/main/HomeContainer/index.js new file mode 100644 index 00000000..0e0be732 --- /dev/null +++ b/browser/main/HomeContainer/index.js @@ -0,0 +1,50 @@ +import React from 'react' +// import { connect } from 'react-redux' +// import actionss.... +import UserNavigator from './Components/UserNavigator' +import ArticleNavigator from './Components/ArticleNavigator' +import ArticleList from './Components/ArticleList' +import ArticleDetail from './Components/ArticleDetail' + +// var AuthFilter = require('../Mixins/AuthFilter') +// var KeyCaster = require('../Mixins/KeyCaster') + +class HomeContainer extends React.Component { + componentDidMount () { + // if (!this.isActive('user')) { + // console.log('redirect to user home') + // var user = JSON.parse(localStorage.getItem('currentUser')) + // this.transitionTo('userHome', {userId: user.id}) + // } + } + render () { + let users = [ + { + id: 1, + name: 'me', + email: 'fll@eme.com' + }, + { + id: 2, + name: 'me', + email: 'fll@eme.com' + } + ] + return ( +
    + + + + +
    + ) + } +} + +// function remap (state) { +// console.log('mapped') +// console.log(state) +// return {} +// } + +export default HomeContainer diff --git a/browser/main/HomeContainer/reducer.js b/browser/main/HomeContainer/reducer.js new file mode 100644 index 00000000..78224524 --- /dev/null +++ b/browser/main/HomeContainer/reducer.js @@ -0,0 +1,15 @@ +import {combineReducers} from 'redux' + +const initialCurrentUser = JSON.parse(localStorage.getItem('currentUser')) + +function currentUser (state, action) { + switch (action.type) { + + default: + return initialCurrentUser + } +} + +export default combineReducers({ + currentUser +}) diff --git a/browser/main/Mixins/AuthFilter.js b/browser/main/Mixins/AuthFilter.js index 22629fc9..3903302b 100644 --- a/browser/main/Mixins/AuthFilter.js +++ b/browser/main/Mixins/AuthFilter.js @@ -4,12 +4,12 @@ var mixin = {} mixin.OnlyGuest = { componentDidMount: function () { - var currentUser = localStorage.getItem('currentUser') + var currentUser = JSON.parse(localStorage.getItem('currentUser')) if (currentUser == null) { return } - this.transitionTo('userHome', {userName: currentUser.name}) + this.transitionTo('homeDefault') } } diff --git a/browser/main/Mixins/Markdown.js b/browser/main/Mixins/Markdown.js index 6d26080e..4a59c3d9 100644 --- a/browser/main/Mixins/Markdown.js +++ b/browser/main/Mixins/Markdown.js @@ -6,6 +6,7 @@ var md = markdownit({ var Markdown = { markdown: function (content) { + if (content == null) content = '' return md.render(content) } } diff --git a/browser/main/Mixins/Modal.jsx b/browser/main/Mixins/Modal.jsx index 1a14f5c1..3367eda7 100644 --- a/browser/main/Mixins/Modal.jsx +++ b/browser/main/Mixins/Modal.jsx @@ -1,4 +1,4 @@ -var React = require('react/addons') +import React from 'react' var ModalBase = React.createClass({ getInitialState: function () { return { diff --git a/browser/main/Mixins/LinkedState.js b/browser/main/Mixins/linkState.js similarity index 75% rename from browser/main/Mixins/LinkedState.js rename to browser/main/Mixins/linkState.js index 57fc6ea6..6b2be4a0 100644 --- a/browser/main/Mixins/LinkedState.js +++ b/browser/main/Mixins/linkState.js @@ -21,11 +21,9 @@ function setPartialState (component, path, value) { updateIn(component.state, path, value)) } -module.exports = { - linkState: function (path) { - return { - value: getIn(this.state, path), - requestChange: setPartialState.bind(null, this, path) - } +export default function linkState (path) { + return { + value: getIn(this.state, path), + requestChange: setPartialState.bind(null, this, path) } } diff --git a/browser/main/Services/Hq.js b/browser/main/Services/Hq.js index 500e5922..5953ef8f 100644 --- a/browser/main/Services/Hq.js +++ b/browser/main/Services/Hq.js @@ -7,12 +7,12 @@ module.exports = { // Auth login: function (input) { return request - .post(apiUrl + 'auth') + .post(apiUrl + 'auth/login') .send(input) }, signup: function (input) { return request - .post(apiUrl + 'auth/signup') + .post(apiUrl + 'auth/register') .send(input) }, getUser: function () { @@ -30,124 +30,36 @@ module.exports = { }) .send(input) }, - - // Resources - fetchUser: function (userName) { + fetchArticles: function (userId) { return request - .get(apiUrl + 'resources/' + userName) + .get(apiUrl + 'teams/' + userId +'/articles') .set({ Authorization: 'Bearer ' + localStorage.getItem('token') }) }, - updateUser: function (userName, input) { + fetchArticlesByFolderId: function (folderId) { return request - .put(apiUrl + 'resources/' + userName) + .get(apiUrl + 'folders/' + folderId +'/articles') + .set({ + Authorization: 'Bearer ' + localStorage.getItem('token') + }) + }, + createArticle: function (input) { + return request + .post(apiUrl + 'folders/' + input.FolderId + '/articles') .set({ Authorization: 'Bearer ' + localStorage.getItem('token') }) .send(input) }, - createTeam: function (userName, input) { + updateArticle: function (articleId, input) { return request - .post(apiUrl + 'resources/' + userName + '/teams') + .put(apiUrl + 'articles/' + articleId) .set({ Authorization: 'Bearer ' + localStorage.getItem('token') }) .send(input) }, - addMember: function (userName, input) { - return request - .post(apiUrl + 'resources/' + userName + '/members') - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - }, - removeMember: function (userName, input) { - return request - .del(apiUrl + 'resources/' + userName + '/members') - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - }, - createPlanet: function (userName, input) { - return request - .post(apiUrl + 'resources/' + userName + '/planets') - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - }, - fetchPlanet: function (userName, planetName) { - return request - .get(apiUrl + 'resources/' + userName + '/planets/' + planetName) - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - }, - updatePlanet: function (userName, planetName, input) { - return request - .put(apiUrl + 'resources/' + userName + '/planets/' + planetName) - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - }, - destroyPlanet: function (userName, planetName) { - return request - .del(apiUrl + 'resources/' + userName + '/planets/' + planetName) - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - }, - createCode: function (userName, planetName, input) { - return request - .post(apiUrl + 'resources/' + userName + '/planets/' + planetName + '/codes') - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - }, - updateCode: function (userName, planetName, localId, input) { - return request - .put(apiUrl + 'resources/' + userName + '/planets/' + planetName + '/codes/' + localId) - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - }, - destroyCode: function (userName, planetName, localId) { - return request - .del(apiUrl + 'resources/' + userName + '/planets/' + planetName + '/codes/' + localId) - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - }, - createNote: function (userName, planetName, input) { - return request - .post(apiUrl + 'resources/' + userName + '/planets/' + planetName + '/notes') - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - }, - updateNote: function (userName, planetName, localId, input) { - return request - .put(apiUrl + 'resources/' + userName + '/planets/' + planetName + '/notes/' + localId) - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - }, - destroyNote: function (userName, planetName, localId) { - return request - .del(apiUrl + 'resources/' + userName + '/planets/' + planetName + '/notes/' + localId) - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - }, - // Search searchTag: function (tagName) { return request diff --git a/browser/main/Services/socket.js b/browser/main/Services/socket.js index 39d65f0d..2e285324 100644 --- a/browser/main/Services/socket.js +++ b/browser/main/Services/socket.js @@ -1,64 +1,17 @@ /* global localStorage */ var config = require('../../../config') -var UserStore = require('../Stores/UserStore') -var PlanetStore = require('../Stores/PlanetStore') var io = require('socket.io-client')(config.apiUrl) io.on('connected', function (data) { console.log('connected by WS') - reconnect() }) io.on('userUpdated', function (data) { console.log('userUpdated') - UserStore.Actions.update(data) }) -// Planet -io.on('planetUpdated', function (data) { - console.log('planetUpdated') - PlanetStore.Actions.update(data) -}) - -io.on('planetDestroyed', function (data) { - console.log('planetDestroyed') - PlanetStore.Actions.destroy(data) -}) - -// Article -io.on('codeUpdated', function (data) { - console.log('codeUpdated') - PlanetStore.Actions.updateCode(data) -}) -io.on('codeDestroyed', function (data) { - console.log('codeDestroyed') - PlanetStore.Actions.destroyCode(data) -}) -io.on('noteUpdated', function (data) { - console.log('noteUpdated') - PlanetStore.Actions.updateNote(data) -}) -io.on('noteDestroyed', function (data) { - console.log('noteDestroyed') - PlanetStore.Actions.destroyNote(data) -}) - -var reconnect = function (currentUser) { - if (currentUser == null) currentUser = JSON.parse(localStorage.getItem('currentUser')) - if (currentUser != null) { - var rooms = ['user:' + currentUser.id].concat(currentUser.Teams.map(function (team) { - return 'user:' + team.id - })) - - io.emit('room:sync', {rooms: rooms}) - } else { - io.emit('room:sync', {rooms: []}) - } -} - module.exports = { - io: io, - reconnect: reconnect + io: io } diff --git a/browser/main/Stores/AuthStore.js b/browser/main/Stores/AuthStore.js deleted file mode 100644 index 5f64f310..00000000 --- a/browser/main/Stores/AuthStore.js +++ /dev/null @@ -1,131 +0,0 @@ -/* global localStorage */ -var Reflux = require('reflux') -var request = require('superagent') - -var apiUrl = require('../../../config').apiUrl - -var AuthStore = Reflux.createStore({ - init: function () { - }, - // Reflux Store - login: function (input) { - request - .post(apiUrl + 'auth/login') - .send(input) - .set('Accept', 'application/json') - .end(function (err, res) { - if (err) { - console.error(err) - this.trigger({ - status: 'failedToLogIn', - data: res - }) - return - } - - var user = res.body.user - localStorage.setItem('token', res.body.token) - localStorage.setItem('user', JSON.stringify(res.body.user)) - - this.trigger({ - status: 'loggedIn', - data: user - }) - }.bind(this)) - }, - register: function (input) { - request - .post(apiUrl + 'auth/signup') - .send(input) - .set('Accept', 'application/json') - .end(function (err, res) { - if (err) { - console.error(res) - this.trigger({ - status: 'failedToRegister', - data: res - }) - return - } - - var user = res.body.user - localStorage.setItem('token', res.body.token) - localStorage.setItem('user', JSON.stringify(res.body.user)) - - this.trigger({ - status: 'registered', - data: user - }) - }.bind(this)) - }, - refreshUser: function () { - request - .get(apiUrl + 'auth/user') - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .end(function (err, res) { - if (err) { - console.error(err) - if (res.status === 401 || res.status === 403) { - AuthActions.logout() - } - return - } - - var user = res.body - localStorage.setItem('user', JSON.stringify(user)) - - this.trigger({ - status: 'userRefreshed', - data: user - }) - }.bind(this)) - }, - logout: function () { - localStorage.removeItem('token') - localStorage.removeItem('currentUser') - - this.trigger({ - status: 'loggedOut' - }) - }, - updateProfile: function (input) { - request - .put(apiUrl + 'auth/user') - .set({ - Authorization: 'Bearer ' + localStorage.getItem('token') - }) - .send(input) - .end(function (err, res) { - if (err) { - console.error(err) - this.trigger({ - status: 'userProfileUpdatingFailed', - data: err - }) - return - } - - var user = res.body - localStorage.setItem('user', JSON.stringify(user)) - - this.trigger({ - status: 'userProfileUpdated', - data: user - }) - }.bind(this)) - }, - // Methods - check: function () { - if (localStorage.getItem('token')) return true - return false - }, - getUser: function () { - var userJSON = localStorage.getItem('currentUser') - if (userJSON == null) return null - return JSON.parse(userJSON) - } -}) - -module.exports = AuthStore diff --git a/browser/main/Stores/PlanetStore.js b/browser/main/Stores/PlanetStore.js deleted file mode 100644 index 6b33cdcf..00000000 --- a/browser/main/Stores/PlanetStore.js +++ /dev/null @@ -1,179 +0,0 @@ -/* global localStorage */ - -var Reflux = require('reflux') - -var UserStore = require('./UserStore') - -var Helper = require('../Mixins/Helper') - -var actions = Reflux.createActions([ - 'update', - 'destroy', - 'updateCode', - 'destroyCode', - 'updateNote', - 'destroyNote' -]) - -module.exports = Reflux.createStore({ - mixins: [Helper], - listenables: [actions], - Actions: actions, - /* - Planet must be updated like below - Planet - Codes - Tags - User - Notes - Tags - User - Owner - */ - onUpdate: function (planet) { - // Copy the planet object - var aPlanet = Object.assign({}, planet) - delete aPlanet.Codes - delete aPlanet.Notes - delete aPlanet.Owner - - // Check if the planet should be updated to currentUser - var currentUser = JSON.parse(localStorage.getItem('currentUser')) - - var currentUserMustBeUpdated = false - - var ownedByCurrentUser = currentUser.id === aPlanet.OwnerId - if (ownedByCurrentUser) { - currentUser.Planets = this.updateItemToTargetArray(aPlanet, currentUser.Planets) - currentUserMustBeUpdated = true - } else { - var team = null - if (currentUser.Teams.some(function (_team) { - if (_team.id === aPlanet.OwnerId) { - team = _team - return true - } - return false - })) { - team.Planets = this.updateItemToTargetArray(aPlanet, team.Planets) - currentUserMustBeUpdated = true - } - } - - // Update currentUser - if (currentUserMustBeUpdated) { - UserStore.Actions.update(currentUser) - } - - planet.Codes.forEach(function (code) { - code.type = 'code' - }) - - planet.Notes.forEach(function (note) { - note.type = 'note' - }) - - // Update the planet - localStorage.setItem('planet-' + planet.id, JSON.stringify(planet)) - - this.trigger({ - status: 'updated', - data: planet - }) - }, - onDestroy: function (planet) { - // Check if the planet should be updated to currentUser - var currentUser = JSON.parse(localStorage.getItem('currentUser')) - - var ownedByCurrentUser = currentUser.id === planet.OwnerId - - if (ownedByCurrentUser) { - currentUser.Planets = this.deleteItemFromTargetArray(planet, currentUser.Planets) - } - - if (!ownedByCurrentUser) { - var team = null - currentUser.Teams.some(function (_team) { - if (_team.id === planet.OwnerId) { - team = _team - return true - } - return - }) - - if (team) { - team.Planets = this.deleteItemFromTargetArray(planet, team.Planets) - } - } - - // Update currentUser - localStorage.setItem('currentUser', JSON.stringify(currentUser)) - UserStore.Actions.update(currentUser) - - // Update the planet - localStorage.setItem('planet-' + planet.id, JSON.stringify(planet)) - - this.trigger({ - status: 'destroyed', - data: planet - }) - }, - onUpdateCode: function (code) { - code.type = 'code' - - var planet = JSON.parse(localStorage.getItem('planet-' + code.PlanetId)) - if (planet != null) { - planet.Codes = this.updateItemToTargetArray(code, planet.Codes) - - localStorage.setItem('planet-' + code.PlanetId, JSON.stringify(planet)) - } - - this.trigger({ - status: 'codeUpdated', - data: code - }) - }, - onDestroyCode: function (code) { - var planet = JSON.parse(localStorage.getItem('planet-' + code.PlanetId)) - if (planet != null) { - planet.Codes = this.deleteItemFromTargetArray(code, planet.Codes) - - localStorage.setItem('planet-' + code.PlanetId, JSON.stringify(planet)) - } - code.type = 'code' - - this.trigger({ - status: 'codeDestroyed', - data: code - }) - }, - onUpdateNote: function (note) { - note.type = 'note' - - var planet = JSON.parse(localStorage.getItem('planet-' + note.PlanetId)) - if (planet != null) { - planet.Notes = this.updateItemToTargetArray(note, planet.Notes) - - localStorage.setItem('planet-' + note.PlanetId, JSON.stringify(planet)) - } - - this.trigger({ - status: 'noteUpdated', - data: note - }) - }, - onDestroyNote: function (note) { - var planet = JSON.parse(localStorage.getItem('planet-' + note.PlanetId)) - if (planet != null) { - planet.Notes = this.deleteItemFromTargetArray(note, planet.Notes) - - localStorage.setItem('planet-' + note.PlanetId, JSON.stringify(planet)) - } - note.type = 'note' - - this.trigger({ - status: 'noteDestroyed', - data: note - }) - } -}) diff --git a/browser/main/Stores/UserStore.js b/browser/main/Stores/UserStore.js deleted file mode 100644 index 0fd92fdd..00000000 --- a/browser/main/Stores/UserStore.js +++ /dev/null @@ -1,58 +0,0 @@ -/* global localStorage */ - -var Reflux = require('reflux') - -var actions = Reflux.createActions([ - 'update', - 'destroy' -]) - -module.exports = Reflux.createStore({ - listenables: [actions], - onUpdate: function (user) { - if (this.socket == null) this.socket = require('../Services/socket') - - var currentUser = JSON.parse(localStorage.getItem('currentUser')) - if (currentUser.id === user.id) { - localStorage.setItem('currentUser', JSON.stringify(user)) - - this.socket.reconnect(user) - } - - if (user.userType === 'team') { - var isMyTeam = user.Members.some(function (member) { - if (currentUser.id === member.id) { - return true - } - return false - }) - - if (isMyTeam) { - var isNew = !currentUser.Teams.some(function (team, index) { - if (user.id === team.id) { - currentUser.Teams.splice(index, 1, user) - return true - } - return false - }) - - if (isNew) { - currentUser.Teams.push(user) - } - localStorage.setItem('currentUser', JSON.stringify(currentUser)) - } - } - - this.trigger({ - status: 'userUpdated', - data: user - }) - }, - onDestroy: function (user) { - this.trigger({ - status: 'userDestroyed', - data: user - }) - }, - Actions: actions -}) diff --git a/browser/main/helpers/linkState.js b/browser/main/helpers/linkState.js new file mode 100644 index 00000000..6b2be4a0 --- /dev/null +++ b/browser/main/helpers/linkState.js @@ -0,0 +1,29 @@ +function getIn (object, path) { + var stack = path.split('.') + while (stack.length > 1) { + object = object[stack.shift()] + } + return object[stack.shift()] +} + +function updateIn (object, path, value) { + var current = object + var stack = path.split('.') + while (stack.length > 1) { + current = current[stack.shift()] + } + current[stack.shift()] = value + return object +} + +function setPartialState (component, path, value) { + component.setState( + updateIn(component.state, path, value)) +} + +export default function linkState (path) { + return { + value: getIn(this.state, path), + requestChange: setPartialState.bind(null, this, path) + } +} diff --git a/browser/main/helpers/openExternal.js b/browser/main/helpers/openExternal.js new file mode 100644 index 00000000..f8223159 --- /dev/null +++ b/browser/main/helpers/openExternal.js @@ -0,0 +1,6 @@ +var shell = require('shell') + +export default function (e) { + shell.openExternal(e.currentTarget.href) + e.preventDefault() +} diff --git a/browser/main/index.electron.html b/browser/main/index.electron.html deleted file mode 100644 index 04fe21fa..00000000 --- a/browser/main/index.electron.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - -
    - -
    Loading...
    -
    - -
    - - - - - - diff --git a/browser/main/index.html b/browser/main/index.html index 243ec598..da8f0ce9 100644 --- a/browser/main/index.html +++ b/browser/main/index.html @@ -1,56 +1,64 @@ - CodeXen + + - + + + - - - - - - - - + #loadingCover{ + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + box-sizing: border-box; + padding: 65px 0; + font-family: sans-serif; + } + #loadingCover img{ + display: block; + margin: 75px auto 5px; + width: 160px; + height: 160px; + } + #loadingCover .message{ + font-size: 30px; + text-align: center; + line-height: 1.6; + font-weight: 100; + color: #888; + } + +
    + +
    Loading...
    +
    +
    - - - + + + diff --git a/browser/main/index.js b/browser/main/index.js new file mode 100644 index 00000000..78e7dfa4 --- /dev/null +++ b/browser/main/index.js @@ -0,0 +1,29 @@ +import React from 'react' +import { Router, Route, IndexRoute } from 'react-router' +import MainContainer from './Containers/MainContainer' +import LoginContainer from './Containers/LoginContainer' +import SignupContainer from './Containers/SignupContainer' +import HomeContainer from './HomeContainer' + +function onlyUser (state, replaceState) { + var currentUser = JSON.parse(localStorage.getItem('currentUser')) + if (currentUser == null) replaceState('login', '/login') +} + +let routes = ( + + + + + + + + + +) + +let el = document.getElementById('content') +React.render({routes}, el, function () { + let loadingCover = document.getElementById('loadingCover') + loadingCover.parentNode.removeChild(loadingCover) +}) diff --git a/browser/main/index.jsx b/browser/main/index.jsx deleted file mode 100644 index 126f1648..00000000 --- a/browser/main/index.jsx +++ /dev/null @@ -1,46 +0,0 @@ -var React = require('react/addons') - -var ReactRouter = require('react-router') -var Route = ReactRouter.Route -var DefaultRoute = ReactRouter.DefaultRoute - -var MainContainer = require('./Containers/MainContainer') - -var LoginContainer = require('./Containers/LoginContainer') -var SignupContainer = require('./Containers/SignupContainer') - -var HomeContainer = require('./Containers/HomeContainer') -var UserContainer = require('./Containers/UserContainer') - -var PlanetContainer = require('./Containers/PlanetContainer') - -var routes = ( - - - - - - - - - - - - - - - - - - -) -var loadingCover = document.getElementById('loadingCover') - -ReactRouter.run(routes, ReactRouter.HashLocation, function (Root) { - React.render(, document.getElementById('content')) - - if (loadingCover != null) { - loadingCover.parentNode.removeChild(loadingCover) - loadingCover = null - } -}) diff --git a/browser/main/style.js b/browser/main/style.js deleted file mode 100644 index dd1009a9..00000000 --- a/browser/main/style.js +++ /dev/null @@ -1,2 +0,0 @@ -require('../styles/main/index.styl') -require('react-select/dist/default.css') diff --git a/browser/styles/main/components/ArticleDetail.styl b/browser/styles/main/components/ArticleDetail.styl new file mode 100644 index 00000000..1e069f7c --- /dev/null +++ b/browser/styles/main/components/ArticleDetail.styl @@ -0,0 +1,169 @@ +noTagsColor = #999 + +.ArticleDetail + absolute right bottom + top 60px + left 250px + padding 10px + * + -webkit-user-select all + .detailInfo + height 70px + width 100% + transition 0.1s + font-size 12px + position relative + .left + absolute top left bottom + right 120px + .right + absolute top right + .detailBody + absolute left right bottom + top 70px + overflow-x hidden + overflow-y auto + .detailPanel + absolute top + left 10px + right 10px + bottom 10px + background-color white + border-radius 5px + border solid 1px borderColor + &>.header + absolute top left right + height 60px + .MarkdownPreview + absolute left right bottom + top 60px + marked() + box-sizing border-box + padding 5px 15px + border-top solid 1px borderColor + overflow-y auto + .CodeEditor + absolute left right bottom + top 60px + border-top solid 1px borderColor + min-height 300px + border-bottom-left-radius 5px + border-bottom-right-radius 5px + &.edit + .detailInfo + .left + .Select + .Select-control + border none + background-color transparent + .folder.Select + width 150px + .Select-control + &:hover + background-color darken(white, 5%) + &.is-focused + .Select-control + background-color white + .tags.Select + .Select-control + white-space nowrap + overflow-x auto + position relative + .Select-arrow-zone, .Select-arrow + display none + .right + button + cursor pointer + height 33px + width 55px + margin-left 5px + font-size 14px + color inactiveTextColor + background-color darken(white, 5%) + border solid 1px borderColor + border-radius 5px + &:hover + background-color white + &.primary + border none + background-color brandColor + color white + &:hover + color white + background-color lighten(brandColor, 10%) + .detailBody + .detailPanel + &>.header + .mode + absolute top bottom right + display block + height 33px + margin-top 12px + width 120px + margin-right 15px + .title + absolute left top bottom + right 120px + padding 0 15px + input + width 100% + border none + background-color transparent + line-height 60px + font-size 32px + font-weight bold + outline none + &.show + .detailInfo + .left + right 99px + .info + padding 5px + overflow ellipsis + .tags + padding 10px 10px 5px + color articleItemColor + a + background-color brandColor + color white + border-radius 2px + padding 1.5px 5px + margin 2px + font-size 10px + opacity 0.8 + &:hover + opacity 1 + span.noTags + color noTagsColor + .right + button + cursor pointer + height 33px + width 33px + border none + font-size 18px + color inactiveTextColor + background-color transparent + padding 0 + &:hover + color inherit + .detailBody + .detailPanel + &>.header + .mode + display block + line-height 60px + width 45px + height 60px + font-size 18px + text-align center + .title + absolute top bottom + left 45px + right 15px + font-size 32px + line-height 60px + font-weight bold + white-space nowrap + overflow-x auto + overflow-y hidden diff --git a/browser/styles/main/components/ArticleList.styl b/browser/styles/main/components/ArticleList.styl new file mode 100644 index 00000000..9a209e12 --- /dev/null +++ b/browser/styles/main/components/ArticleList.styl @@ -0,0 +1,69 @@ +articleItemHoverBgColor = darken(white, 5%) +articleItemColor = #777 + +.ArticleList + absolute left bottom + top 60px + width 250px + border-right solid 1px highlightenBorderColor + &>ul + absolute top bottom left right + overflow-y auto + noSelect() + li + .articleItem + border solid 2px transparent + position relative + height 88px + width 100% + cursor pointer + transition 0.1s + background-color white + padding 0 10px + font-size 12px + .top + clearfix() + line-height 20px + padding 5px 0 + color articleItemColor + .profileImage + vertical-align middle + .updatedAt + float right + line-height 20px + .middle + clearfix() + padding 3px 0 7px + font-size 16px + .mode + float left + font-size 12px + line-height 16px + .title + float left + overflow ellipsis + padding 0 5px + .bottom + padding 5px 0 + overflow-x auto + white-space nowrap + .tags + color articleItemColor + a + background-color brandColor + color white + border-radius 2px + padding 1.5px 5px + margin 2px + font-size 10px + opacity 0.8 + &:hover + opacity 1 + &:hover, &.hover + background-color articleItemHoverBgColor + &:active, &.active + background-color white + &:active, &.active + border-color brandBorderColor + .divider + border-bottom solid 1px borderColor diff --git a/browser/styles/main/components/Select.styl b/browser/styles/main/components/Select.styl index 08265706..57cecb4f 100644 --- a/browser/styles/main/components/Select.styl +++ b/browser/styles/main/components/Select.styl @@ -23,7 +23,7 @@ transition: all 200ms ease; } .Select-control:hover { - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06); + // box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06); } .is-searchable.is-open > .Select-control { cursor: text; @@ -42,8 +42,8 @@ cursor: text; } .is-focused:not(.is-open) > .Select-control { - border-color: #0088cc #0099e6 #0099e6; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 0 5px -1px rgba(0, 136, 204, 0.5); + // border-color: #0088cc #0099e6 #0099e6; + // box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 0 5px -1px rgba(0, 136, 204, 0.5); } .Select-placeholder { color: #aaaaaa; @@ -196,10 +196,10 @@ padding: 3px 0; } .Select-item { - background-color: #f2f9fc; + background-color: brandColor; border-radius: 2px; - border: 1px solid #c9e6f2; - color: #0088cc; + // border: 1px solid #c9e6f2; + color: white; display: inline-block; font-size: 1em; margin: 2px; @@ -216,20 +216,19 @@ padding: 3px 5px; } .Select-item-label .Select-item-label__a { - color: #0088cc; - cursor: pointer; + color: white; + cursor: white; } .Select-item-icon { cursor: pointer; border-bottom-left-radius: 2px; border-top-left-radius: 2px; - border-right: 1px solid #c9e6f2; + border-right: 1px solid darken(brandColor, 10%) padding: 2px 5px 4px; } .Select-item-icon:hover, .Select-item-icon:focus { - background-color: #ddeff7; - color: #0077b3; + background-color: lighten(brandColor, 10%) } .Select-item-icon:active { background-color: #c9e6f2; diff --git a/browser/styles/main/components/TopBar.styl b/browser/styles/main/components/TopBar.styl new file mode 100644 index 00000000..2f8f9f87 --- /dev/null +++ b/browser/styles/main/components/TopBar.styl @@ -0,0 +1,43 @@ +.TopBar + absolute top left right + height 60px + border-bottom solid 1px borderColor + noSelect() + .left + float left + .search + position absolute + top 13.5px + left 15px + height 33px + i.fa + position absolute + line-height 33px + z-index 1 + width 33px + text-align center + input.searchInput + absolute top left + background-color white + borderInput() + width 350px + padding-left 30px + border-radius 16.5px + font-size 14px + height 33px + line-height 33px + outline none + &:focus + border-color brandColor + .right + float right + .logo + &>img + margin-top 7px + margin-right 15px + .tooltip + tooltip() + right 5px + &:hover + .tooltip + opacity 1.0 diff --git a/browser/styles/main/containers/HomeContainer.styl b/browser/styles/main/containers/HomeContainer.styl new file mode 100644 index 00000000..8e3bfa32 --- /dev/null +++ b/browser/styles/main/containers/HomeContainer.styl @@ -0,0 +1,153 @@ +homeNavigatorBgColor = #1B1C1C +homeNavigatorColor = #DDD +userAnchorColor = #979797 +userAnchorBgColor = #BEBEBE +userAnchorActiveColor = textColor +userAnchorActiveBgColor = white + +.HomeContainer + .HomeNavigator + noSelect() + background-color homeNavigatorBgColor + absolute left top bottom + width 60px + text-align center + box-sizing border-box + // must be moved + // .profilePopup + // position fixed + // left 35px + // top 35px + // z-index popupZIndex + // width 200px + // background-color backgroundColor + // box-shadow popupShadow + // border-radius 10px + // padding 10px 0 0px + // &.close + // display none + // .profileGroup + // margin-bottom 10px + // .profileGroupLabel + // text-align left + // height 1em + // padding 0 15px + // span + // position absolute + // z-index 2 + // background-color backgroundColor + // padding-right 5px + // color inactiveTextColor + // font-size 0.8em + // &::before + // content '' + // position absolute + // display block + // z-index 1 + // height 0.5em + // width 175px + // border-bottom solid 1px borderColor + // .profileGroupList + // li + // clearfix() + // &:hover + // background-color hoverBackgroundColor + // .userName + // width 155px + // padding 10px 15px + // text-align left + // display block + // text-decoration none + // cursor pointer + // .createNewTeam + // btnStripDefault() + // width 100% + // padding 10px 20px + // font-size 1em + // cursor pointer + // text-align left + // .controlGroup + // list-style none + // border-top solid 1px borderColor + // padding 10px 0 + // li + // &:hover + // background-color hoverBackgroundColor + // button + // btnStripDefault() + // width 100% + // padding 10px 20px + // font-size 1em + // cursor pointer + // text-align left + ul.userList + margin-top 25px + &>li + .shortCut + margin-top 5px + font-size 0.8em + color homeNavigatorColor + a + display block + width 44px + height 44px + margin 0 auto + text-align center + background-color userAnchorBgColor + text-decoration none + color userAnchorColor + line-height 44px + font-size 1.1em + cursor pointer + circle() + img + width 44px + height 44px + transition 0.1s + &:hover, &.active + background-color userAnchorActiveBgColor + color userAnchorActiveColor + .userTooltip + position absolute + z-index popupZIndex + background-color transparentify(invBackgroundColor, 80%) + color invTextColor + padding 10px + line-height 1em + border-radius 5px + margin-top -52px + margin-left 52px + white-space nowrap + opacity 0 + transition 0.1s + pointer-events none + &:hover .userTooltip + opacity 1 + button.newTeamButton + display block + margin 0 auto + width 30px + height 30px + circle() + border solid 1px lightButtonColor + color lightButtonColor + text-align center + background-image none + background-color transparent + box-sizing border-box + absolute left bottom right + bottom 15px + &:hover, &.hover, &:focus, &.focus + border-color darken(lightButtonColor, 50%) + color darken(lightButtonColor, 50%) + &:active, &.active + border-color darken(brandBorderColor, 10%) + background-color brandColor + color white + .tooltip + tooltip() + margin-top -22px + margin-left 33px + font-size 14px + &:hover .tooltip + opacity 1 diff --git a/browser/styles/main/containers/LoginContainer.styl b/browser/styles/main/containers/LoginContainer.styl index c190cf44..aa35c41a 100644 --- a/browser/styles/main/containers/LoginContainer.styl +++ b/browser/styles/main/containers/LoginContainer.styl @@ -1,6 +1,6 @@ .LoginContainer, .SignupContainer margin 0 auto - padding 25px 15px + padding 105px 15px box-sizing border-box color inactiveTextColor .logo @@ -58,17 +58,24 @@ .alertInfo, .alertError margin-top 15px margin-bottom 15px - height 44px - padding 5px - border-radius 10px - line-height 44px + padding 10px + border-radius 5px + line-height 1.6 text-align center .alertInfo alertInfo() .alertError alertError() - div.form-group:last-child - margin-top 15px + div.formField + input + stripInput() + height 33px + width 100% + margin-bottom 10px + text-align center + font-size 1.1em + &:last-child + margin-top 15px button.logInButton btnPrimary() height 44px diff --git a/browser/styles/main/containers/UserContainer.styl b/browser/styles/main/containers/UserContainer.styl index 0bfc021c..e8b17cea 100644 --- a/browser/styles/main/containers/UserContainer.styl +++ b/browser/styles/main/containers/UserContainer.styl @@ -1,310 +1,123 @@ -.HomeContainer - .HomeNavigator - noSelect() - background-color planetNavBgColor - absolute left top bottom - width 55px - text-align center - box-sizing border-box - border-right solid 1px borderColor - .profileButton - display block - width 55px - height 55px - border-bottom solid 1px borderColor - overflow hidden - background-color black - margin 0 - padding 0 - cursor pointer - box-sizing border-box - border none - img - transition 0.1s - opacity 0.9 - &.vivid.active, &.focus, &:focus, &.hover, &:hover - img - opacity 1 - .profilePopup - position fixed - left 35px - top 35px - z-index popupZIndex - width 200px - background-color backgroundColor - box-shadow popupShadow - border-radius 10px - padding 10px 0 0px - &.close - display none - .profileGroup - margin-bottom 10px - .profileGroupLabel - text-align left - height 1em - padding 0 15px - span - position absolute - z-index 2 - background-color backgroundColor - padding-right 5px - color inactiveTextColor - font-size 0.8em - &::before - content '' - position absolute - display block - z-index 1 - height 0.5em - width 175px - border-bottom solid 1px borderColor - .profileGroupList - li - clearfix() - &:hover - background-color hoverBackgroundColor - .userName - width 155px - padding 10px 15px - text-align left - display block - text-decoration none - cursor pointer - .createNewTeam - btnStripDefault() - width 100% - padding 10px 20px - font-size 1em - cursor pointer - text-align left - .controlGroup - list-style none - border-top solid 1px borderColor - padding 10px 0 - li - &:hover - background-color hoverBackgroundColor - button - btnStripDefault() - width 100% - padding 10px 20px - font-size 1em - cursor pointer - text-align left +userNavigatorWidth = 200px +userNavigatorBgColor = #333 +userNavigatorColor = #DDD +userNavigatorProfileNameColor = brandColor +userNavigatorBorderColor = #666 - ul.planetList>li - margin 15px 0 - .shortCut - margin-top 5px - color lighten(textColor, 5%) - font-size 0.8em - &.active - a - background-color planetAnchorActiveBgColor - color planetAnchorActiveColor - a - display block - width 44px - height 44px - margin 0 auto - text-align center - background-color planetAnchorBgColor - text-decoration none - color planetAnchorColor - line-height 44px - font-size 1.1em - cursor pointer - circle() - transition 0.1s - &:hover, &:active - background-color white - .planetTooltip - position absolute - z-index popupZIndex - background-color transparentify(invBackgroundColor, 80%) - color invTextColor - padding 10px - line-height 1em - border-radius 5px - margin-top -41px - margin-left 52px - white-space nowrap - opacity 0 - transition 0.1s - pointer-events none - &:hover .planetTooltip - opacity 1 - img - circle() - width 55px - height 55px - button.newPlanet - display block - margin 0 auto - width 30px - height 30px - circle() - border solid 1px lightButtonColor - color lightButtonColor - text-align center - font-size 1 - background-image none - background-color transparent +userContentBgColor = #E6E6E6 + +.UserContainer + absolute top bottom right + left 60px + .content + absolute top bottom right + left userNavigatorWidth + background-color userContentBgColor + .UserNavigator + absolute left top bottom + width userNavigatorWidth + background-color userNavigatorBgColor + color userNavigatorColor + noSelect() + &>.profile + height 60px + padding 10px 15px 0 box-sizing border-box - absolute left bottom right - bottom 15px - &:hover, &.hover, &:focus, &.focus - border-color darken(lightButtonColor, 50%) - color darken(lightButtonColor, 50%) - &:active, &.active - border-color darken(brandBorderColor, 10%) + position relative + border-bottom solid 1px userNavigatorBorderColor + cursor pointer + &>.profileName + color userNavigatorProfileNameColor + font-size 22px + cursor pointer + transition 0.1s + &>.name + padding 5px 10px + font-size 14px + color userNavigatorColor + cursor pointer + transition 0.1s + &>.dropdownIcon + position absolute + top 20px + right 25px + float right + width 20px + height 20px + line-height 20px + font-size 8px + border solid 1px userNavigatorColor + border-radius 12.5px + text-align center + transition 0.1s + &:hover + &>.profileName + color lighten(brandColor, 10%) + &>.name + color white + &>.dropdownIcon + border-color white + &:active + &>.dropdownIcon + background-color brandColor + border-color brandColor + &>.control + padding 15px 15px + &>.newPostButton background-color brandColor color white - .tooltip - tooltip() - margin-top -22px - margin-left 33px - &:hover .tooltip - opacity 1 - .UserContainer - absolute top bottom right - left 55px - .memberPopup - absolute left - top 235px - z-index 1 - padding 0 15px 10px - width 200px - .label - padding 10px 0 - font-size 0.9em - border-bottom solid 1px borderColor - margin-bottom 15px - .members - li - padding 0 10px - margin-bottom 15px - clearfix() - .memberImage - float left - margin-right 7px - circle() - .memberInfo - float left - .memberProfileName - margin-bottom 5px - font-size 1.05em - .memberName - margin-left 5px - font-size 0.9em - color inactiveTextColor - a:hover .memberProfileName, a:hover .memberName - text-decoration underline - .userProfile - absolute top left right - padding 15px - border-bottom solid 1px borderColor - height 125px - clearfix() - .userPhoto - circle() - float left - margin 5px 15px 15px - .userInfo - float left - margin-top 15px - .userProfileName - font-size 1.5em - color brandColor - margin-bottom 10px - .userName - font-size 1.1em - .editProfileButton - float right - btnDefault() - margin-top 25px - padding 10px 15px + height 44px + width 100% + border none border-radius 5px - .teamList, .memberList - absolute left bottom - top 125px - width 200px - padding 15px - border-right solid 1px borderColor - overflow-y auto - .teamLabel, .memberLabel - font-size 1.2em - margin-bottom 15px - .teams - li - padding 0 10px - margin-bottom 15px - clearfix() - .teamInfo - float left - .teamProfileName - margin-bottom 5px - font-size 1.05em - .teamName - margin-left 5px - font-size 0.9em - color inactiveTextColor - a:hover .teamProfileName, a:hover .teamName - text-decoration underline + font-size 16px + font-weight 600 + transition 0.1s + &:hover + background-color lighten(brandColor, 10%) + &>.menu + absolute left right bottom + top 134px + padding 15px 0 + overflow auto + &>.menuGruop + &>.label + border-bottom 1px solid userNavigatorBorderColor + padding 10px 15px + font-size 18px margin-bottom 10px - font-size 1.1em - .createTeamButton, .addMemberButton - btnStripDefault() - .members - li - padding 0 10px - margin-bottom 15px - clearfix() - .memberImage - float left - margin-right 7px - circle() - .memberInfo - float left - .memberProfileName - margin-bottom 5px - font-size 1.05em - .memberRole - font-size 0.9em - color inactiveTextColor - .memberName - margin-left 5px - font-size 0.9em - color inactiveTextColor - .createTeamButton, .addMemberButton - btnStripDefault() - a:hover .memberProfileName, a:hover .memberName - text-decoration underline - .planetList - absolute right bottom - top 125px - left 200px - padding 15px - overflow-y auto - .planetLabel - font-size 1.2em - margin-bottom 15px - .planetGroup - margin-left 15px - .planetGroupLabel - font-size 1.1em - margin-bottom 15px - small - font-size 0.8em - color inactiveTextColor - .planets - margin-left 15px - li - a - font-size 1.1em - text-decoration none - &:hover - text-decoration underline - margin-bottom 10px - .createPlanetButton - btnStripDefault() + &>.plusButton + float right + width 20px + height 20px + margin-top -2.5px + margin-right -5px + line-height 15px + font-size 8px + border solid 1px userNavigatorColor + border-radius 10px + background-color transparent + text-align center + color userNavigatorColor + &:hover + border-color white + color white + &:active + background-color brandColor + border-color brandColor + &>.folders + .folderButton + padding 10px 25px + width 100% + background-color transparent + border none + font-size 14px + color userNavigatorColor + transition 0.1s + text-align left + &:hover + background-color transparentify(white, 20%) + color white + &.active + background-color brandColor + color white diff --git a/browser/styles/main/index.css b/browser/styles/main/index.css new file mode 100644 index 00000000..e9146a6e --- /dev/null +++ b/browser/styles/main/index.css @@ -0,0 +1,3733 @@ +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-weight: inherit; + font-style: inherit; + font-family: inherit; + font-size: 100%; + vertical-align: baseline; +} +body { + line-height: 1; + color: #000; + background: #fff; +} +ol, +ul { + list-style: none; +} +table { + border-collapse: separate; + border-spacing: 0; + vertical-align: middle; +} +caption, +th, +td { + text-align: left; + font-weight: normal; + vertical-align: middle; +} +a img { + border: none; +} +.btn-primary, +.btn-default { + border-style: solid; + border-width: 1px; + background-image: none; + height: 44px; + padding: 0 15px; + -webkit-border-radius: 5px; + border-radius: 5px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + font-size: 1em; + font-family: 'Lato'; + font-weight: 400; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + cursor: pointer; + margin: 0 5px; +} +.btn-block { + display: block; + width: 100%; + margin: 0 auto; +} +.btn-square { + display: inline-block; + width: 44px; + padding: 0; + border-width: 1px; +} +.btn-sm { + height: 32px; + -webkit-border-radius: 16px; + border-radius: 16px; +} +.btn-sm.btn-square { + width: 32px; +} +.btn-primary { + border-color: #3fb399; + background-color: transparent; + color: #2bac8f; +} +.btn-primary:hover, +.btn-primary.hover, +.btn-primary:focus, +.btn-primary.focus { + border-color: #2c7d6b; + color: #1e7864; +} +.btn-primary:active, +.btn-primary.active { + background-color: #2bac8f; + color: #fff; +} +.btn-default { + border-color: #898989; + background-color: transparent; + color: #898989; +} +.btn-default:hover, +.btn-default.hover, +.btn-default:focus, +.btn-default.focus { + border-color: #454545; + color: #454545; +} +.btn-default:active, +.btn-default.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.ModalBase { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 1000; +} +.ModalBase.hide { + display: none; +} +.ModalBase .modalBack { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-color: rgba(255,255,255,0.65); + z-index: 1001; +} +.ModalBase .modal { + position: relative; + width: 650px; + margin: 50px auto 0; + z-index: 1002; + -webkit-box-shadow: 0 0 5px 0 #888; + box-shadow: 0 0 5px 0 #888; + background-color: #fff; + -webkit-border-radius: 10px; + border-radius: 10px; + padding: 15px; +} +.ModalBase .modal .modal-header { + border-bottom: solid 1px #d0d0d0; + margin-bottom: 10px; +} +.ModalBase .modal .modal-header h1 { + padding: 10px 0 15px; + font-size: 1.5em; +} +.ModalBase .modal .modal-body p { + margin-bottom: 10px; +} +.ModalBase .modal .modal-footer { + zoom: 1; + border-top: solid 1px #d0d0d0; + padding-top: 10px; +} +.ModalBase .modal .modal-footer:before, +.ModalBase .modal .modal-footer:after { + content: ""; + display: table; +} +.ModalBase .modal .modal-footer:after { + clear: both; +} +.ModalBase .modal .modal-footer .modal-control { + float: right; +} +.ModalBase .sideNavModal { + height: 500px; +} +.ModalBase .sideNavModal .leftPane { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 175px; + padding: 20px; + border-right: solid 1px #d0d0d0; +} +.ModalBase .sideNavModal .leftPane .modalLabel { + font-size: 1.5em; + margin-top: 25px; + margin-bottom: 35px; + color: #2bac8f; +} +.ModalBase .sideNavModal .leftPane .tabList button { + border: none; + background-color: transparent; + color: #898989; + display: block; + width: 100%; + font-size: 1.1em; + padding: 10px 5px; + margin-bottom: 15px; + text-align: left; +} +.ModalBase .sideNavModal .leftPane .tabList button:hover, +.ModalBase .sideNavModal .leftPane .tabList button.hover, +.ModalBase .sideNavModal .leftPane .tabList button:focus, +.ModalBase .sideNavModal .leftPane .tabList button.focus { + color: #454545; +} +.ModalBase .sideNavModal .leftPane .tabList button:active, +.ModalBase .sideNavModal .leftPane .tabList button.active { + color: #2bac8f; +} +.ModalBase .sideNavModal .rightPane { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 175px; + padding: 15px; + overflow-y: auto; +} +.ModalBase .sideNavModal .tab { + padding-top: 45px; +} +.ModalBase .sideNavModal .tab .formField { + position: relative; + zoom: 1; + margin-bottom: 15px; +} +.ModalBase .sideNavModal .tab .formField:before, +.ModalBase .sideNavModal .tab .formField:after { + content: ""; + display: table; +} +.ModalBase .sideNavModal .tab .formField:after { + clear: both; +} +.ModalBase .sideNavModal .tab .formField label { + width: 30%; + display: block; + line-height: 33px; + float: left; +} +.ModalBase .sideNavModal .tab .formField input { + width: 70%; + display: block; + border: solid 1px #d0d0d0; + padding: 5px 15px; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + height: 33px; + font-size: 1em; + -webkit-border-radius: 5px; + border-radius: 5px; + float: left; +} +.ModalBase .sideNavModal .tab .formField input:focus, +.ModalBase .sideNavModal .tab .formField input.focus { + border-color: #3fb399; + outline: none; +} +.ModalBase .sideNavModal .tab .formRadioField { + margin-bottom: 15px; +} +.ModalBase .sideNavModal .tab .formRadioField input { + margin-left: 25px; +} +.ModalBase .sideNavModal .tab .formConfirm { + position: relative; + zoom: 1; + margin-bottom: 15px; +} +.ModalBase .sideNavModal .tab .formConfirm:before, +.ModalBase .sideNavModal .tab .formConfirm:after { + content: ""; + display: table; +} +.ModalBase .sideNavModal .tab .formConfirm:after { + clear: both; +} +.ModalBase .sideNavModal .tab .formConfirm button { + float: right; + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + padding: 10px 15px; + -webkit-border-radius: 5px; + border-radius: 5px; + font-size: 1em; + margin-left: 5px; +} +.ModalBase .sideNavModal .tab .formConfirm button:hover, +.ModalBase .sideNavModal .tab .formConfirm button.hover, +.ModalBase .sideNavModal .tab .formConfirm button:focus, +.ModalBase .sideNavModal .tab .formConfirm button.focus { + border-color: #454545; + color: #454545; +} +.ModalBase .sideNavModal .tab .formConfirm button:active, +.ModalBase .sideNavModal .tab .formConfirm button.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.ModalBase .sideNavModal .tab .formConfirm button:disabled, +.ModalBase .sideNavModal .tab .formConfirm button.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .sideNavModal .tab .formConfirm .alertInfo, +.ModalBase .sideNavModal .tab .formConfirm .alertSuccess, +.ModalBase .sideNavModal .tab .formConfirm .alertError { + float: right; + padding: 12px 10px; + -webkit-border-radius: 5px; + border-radius: 5px; + width: 320px; + font-size: 1em; + overflow-x: hidden; + white-space: nowrap; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.ModalBase .sideNavModal .tab .formConfirm .alertInfo.hide, +.ModalBase .sideNavModal .tab .formConfirm .alertSuccess.hide, +.ModalBase .sideNavModal .tab .formConfirm .alertError.hide { + width: 0; + padding: 12px 0; +} +.ModalBase .sideNavModal .tab .formConfirm .alertInfo { + background-color: #d9edf7; + color: #34708e; +} +.ModalBase .sideNavModal .tab .formConfirm .alertSuccess { + background-color: #e0f0d9; + color: #3e753f; +} +.ModalBase .sideNavModal .tab .formConfirm .alertError { + background-color: #f2dede; + color: #a64444; +} +.ModalBase .PreferencesModal .settingsTab .categoryLabel { + font-size: 1.5em; + margin-bottom: 25px; +} +.ModalBase .PreferencesModal .settingsTab .example hr { + border-top: none; + border-bottom: solid 1px #d0d0d0; + margin: 15px 0; +} +.ModalBase .PreferencesModal .settingsTab .example h1 { + font-size: 2em; + border-bottom: solid 2px #d0d0d0; + margin: 0.33em auto 0.67em; +} +.ModalBase .PreferencesModal .settingsTab .example h2 { + font-size: 1.5em; + margin: 0.42em auto 0.83em; +} +.ModalBase .PreferencesModal .settingsTab .example h3 { + font-size: 1.17em; + margin: 0.5em auto 1em; +} +.ModalBase .PreferencesModal .settingsTab .example h4 { + font-size: 1em; + margin: 0.67em auto 1.33em; +} +.ModalBase .PreferencesModal .settingsTab .example h5 { + font-size: 0.83em; + margin: 0.84em auto 1.67em; +} +.ModalBase .PreferencesModal .settingsTab .example h6 { + font-size: 0.67em; + margin: 1.16em auto 2.33em; +} +.ModalBase .PreferencesModal .settingsTab .example h1, +.ModalBase .PreferencesModal .settingsTab .example h2, +.ModalBase .PreferencesModal .settingsTab .example h3, +.ModalBase .PreferencesModal .settingsTab .example h4, +.ModalBase .PreferencesModal .settingsTab .example h5, +.ModalBase .PreferencesModal .settingsTab .example h6 { + font-weight: 700; + line-height: 1.8em; +} +.ModalBase .PreferencesModal .settingsTab .example p { + line-height: 1.8em; + margin: 15px 0 25px; +} +.ModalBase .PreferencesModal .settingsTab .example img { + max-width: 100%; +} +.ModalBase .PreferencesModal .settingsTab .example strong { + font-weight: bold; +} +.ModalBase .PreferencesModal .settingsTab .example em { + font-style: italic; +} +.ModalBase .PreferencesModal .settingsTab .example s { + text-decoration: line-through; +} +.ModalBase .PreferencesModal .settingsTab .example blockquote { + border-left: solid 4px #3fb399; + margin: 15px 0 25px; + padding: 0 25px; +} +.ModalBase .PreferencesModal .settingsTab .example ul { + list-style-type: disc; + padding-left: 35px; + margin-bottom: 35px; +} +.ModalBase .PreferencesModal .settingsTab .example ul li { + display: list-item; + margin: 15px 0; +} +.ModalBase .PreferencesModal .settingsTab .example ul>li>ul { + list-style-type: circle; +} +.ModalBase .PreferencesModal .settingsTab .example ul>li>ul>li>ul { + list-style-type: square; +} +.ModalBase .PreferencesModal .settingsTab .example ol { + list-style-type: decimal; + padding-left: 35px; + margin-bottom: 35px; +} +.ModalBase .PreferencesModal .settingsTab .example ol li { + display: list-item; + margin: 15px 0; +} +.ModalBase .PreferencesModal .settingsTab .example code { + font-family: monospace; + padding: 2px 4px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 4px; + border-radius: 4px; + font-size: 0.9em; + color: #000; + text-decoration: none; + background-color: #f6f6f6; +} +.ModalBase .PreferencesModal .settingsTab .example pre { + padding: 5px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 5px; + border-radius: 5px; + overflow-x: auto; + margin: 15px 0 25px; + background-color: #f6f6f6; +} +.ModalBase .PreferencesModal .settingsTab .example pre>code { + padding: 0; + border: none; + -webkit-border-radius: 0; + border-radius: 0; + color: #000; +} +.ModalBase .PreferencesModal .settingsTab .example table { + width: 100%; + margin: 15px 0 25px; +} +.ModalBase .PreferencesModal .settingsTab .example table thead tr { + background-color: #fff; +} +.ModalBase .PreferencesModal .settingsTab .example table thead th { + border-style: solid; + padding: 15px 5px; + border-width: 1px 0 2px 1px; + border-color: #d0d0d0; +} +.ModalBase .PreferencesModal .settingsTab .example table thead th:last-child { + border-right: solid 1px #d0d0d0; +} +.ModalBase .PreferencesModal .settingsTab .example table tbody tr:nth-child(2n + 1) { + background-color: #f9f9f9; +} +.ModalBase .PreferencesModal .settingsTab .example table tbody tr:nth-child(2n) { + background-color: #fff; +} +.ModalBase .PreferencesModal .settingsTab .example table tbody td { + border-style: solid; + padding: 15px 5px; + border-width: 0 0 1px 1px; + border-color: #d0d0d0; +} +.ModalBase .PreferencesModal .settingsTab .example table tbody td:last-child { + border-right: solid 1px #d0d0d0; +} +.ModalBase .PreferencesModal .aboutTab { + padding-top: 30px; +} +.ModalBase .PreferencesModal .aboutTab .about1 { + margin-bottom: 25px; +} +.ModalBase .PreferencesModal .aboutTab .about1 .logo { + display: block; + margin: 0 auto; +} +.ModalBase .PreferencesModal .aboutTab .about1 .appInfo { + font-size: 1.5em; + text-align: center; +} +.ModalBase .PreferencesModal .aboutTab .about2 { + width: 200px; + margin: 0 auto; +} +.ModalBase .PreferencesModal .aboutTab .about2 .externalLabel { + font-size: 1.2em; + margin-bottom: 15px; +} +.ModalBase .PreferencesModal .aboutTab .about2 .externalList li { + margin-bottom: 15px; +} +.ModalBase .PlanetSettingModal .planetDeleteTab { + padding-top: 65px; +} +.ModalBase .PlanetSettingModal .planetDeleteTab p { + margin-bottom: 25px; +} +.ModalBase .PlanetSettingModal .planetDeleteTab p strong { + color: #2bac8f; + font-size: 1.1em; +} +.ModalBase .PlanetSettingModal .planetDeleteTab input { + border: solid 1px #d0d0d0; + padding: 5px 15px; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + margin-right: 5px; + height: 33px; + font-size: 1em; + -webkit-border-radius: 10px; + border-radius: 10px; +} +.ModalBase .PlanetSettingModal .planetDeleteTab input:focus, +.ModalBase .PlanetSettingModal .planetDeleteTab input.focus { + border-color: #3fb399; + outline: none; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm { + position: relative; + zoom: 1; + margin-bottom: 15px; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm:before, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm:after { + content: ""; + display: table; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm:after { + clear: both; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button { + float: right; + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + padding: 10px 15px; + -webkit-border-radius: 5px; + border-radius: 5px; + font-size: 1em; + margin-left: 5px; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button:hover, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button.hover, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button:focus, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button.focus { + border-color: #454545; + color: #454545; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button:active, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button:disabled, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm button.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertInfo, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertSuccess, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertError { + float: right; + padding: 12px 10px; + -webkit-border-radius: 5px; + border-radius: 5px; + width: 320px; + font-size: 1em; + overflow-x: hidden; + white-space: nowrap; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertInfo.hide, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertSuccess.hide, +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertError.hide { + width: 0; + padding: 12px 0; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertInfo { + background-color: #d9edf7; + color: #34708e; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertSuccess { + background-color: #e0f0d9; + color: #3e753f; +} +.ModalBase .PlanetSettingModal .planetDeleteTab .formConfirm .alertError { + background-color: #f2dede; + color: #a64444; +} +.ModalBase .TeamSettingsModal .membersTab .memberTable { + width: 100%; + margin-bottom: 25px; +} +.ModalBase .TeamSettingsModal .membersTab .memberTable th { + border-bottom: solid 2px #d0d0d0; +} +.ModalBase .TeamSettingsModal .membersTab .memberTable td { + border-bottom: solid 1px #d0d0d0; + height: 38px; +} +.ModalBase .TeamSettingsModal .membersTab .memberTable td button { + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + padding: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} +.ModalBase .TeamSettingsModal .membersTab .memberTable td button:hover, +.ModalBase .TeamSettingsModal .membersTab .memberTable td button.hover, +.ModalBase .TeamSettingsModal .membersTab .memberTable td button:focus, +.ModalBase .TeamSettingsModal .membersTab .memberTable td button.focus { + border-color: #454545; + color: #454545; +} +.ModalBase .TeamSettingsModal .membersTab .memberTable td button:active, +.ModalBase .TeamSettingsModal .membersTab .memberTable td button.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.ModalBase .TeamSettingsModal .membersTab .memberTable td button:disabled, +.ModalBase .TeamSettingsModal .membersTab .memberTable td button.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .TeamSettingsModal .membersTab .memberTable td .roleSelect { + height: 33px; + border: solid 1px #d0d0d0; + background-color: #fff; +} +.ModalBase .TeamSettingsModal .membersTab .memberTable th, +.ModalBase .TeamSettingsModal .membersTab .memberTable td { + padding: 5px 0; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formLabel { + margin-bottom: 5px; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup { + zoom: 1; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup:before, +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup:after { + content: ""; + display: table; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup:after { + clear: both; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .userNameSelect { + display: block; + width: 200px; + margin-right: 5px; + float: left; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .roleSelect { + display: block; + height: 33px; + border: solid 1px #d0d0d0; + background-color: #fff; + float: left; + margin-right: 5px; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton { + display: block; + height: 33px; + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + -webkit-border-radius: 5px; + border-radius: 5px; + float: left; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton:hover, +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton.hover, +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton:focus, +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton.focus { + border-color: #454545; + color: #454545; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton:active, +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton:disabled, +.ModalBase .TeamSettingsModal .membersTab .addMemberForm .formGroup .confirmButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .LaunchModal .modal-tab { + text-align: center; + margin-bottom: 10px; +} +.ModalBase .LaunchModal .modal-tab .btn-primary, +.ModalBase .LaunchModal .modal-tab .btn-default { + margin: 0; + -webkit-border-radius: 0; + border-radius: 0; + border-width: 1px; + width: 150px; + -webkit-border-radius: 0; + border-radius: 0; +} +.ModalBase .LaunchModal .modal-tab .btn-primary:nth-child(1), +.ModalBase .LaunchModal .modal-tab .btn-default:nth-child(1) { + border-right: solid 1px #d0d0d0; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; +} +.ModalBase .LaunchModal .modal-tab .btn-primary:nth-child(2), +.ModalBase .LaunchModal .modal-tab .btn-default:nth-child(2) { + border-left: none; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} +.ModalBase .Select .Select-control { + border-color: #d0d0d0; +} +.ModalBase .Select.is-focused .Select-control { + border-color: #3fb399; +} +.ModalBase .Select .Select-menu-outer { + border-color: #d0d0d0; +} +.ModalBase .ace_editor { + -webkit-border-radius: 5px; + border-radius: 5px; + border: solid 1px #d0d0d0; +} +.ModalBase .CodeForm .form-group, +.ModalBase .NoteForm .form-group { + margin-bottom: 10px; +} +.ModalBase .CodeForm textarea.codeDescription { + height: 75px; + font-size: 0.9em; + margin-bottom: 10px; +} +.ModalBase .CodeForm .modeSelect.Select { + display: inline-block; + width: 200px; + height: 37px; +} +.ModalBase .CodeForm .modeSelect.Select .Select-control { + height: 37px; +} +.ModalBase .CodeForm .ace_editor { + height: 258px; +} +.ModalBase .NoteForm .ace_editor { + height: 358px; +} +.ModalBase .NoteForm .previewMode { + position: absolute; + top: 0; + right: 0; + font-size: 0.8em; + line-height: 24px; + padding: 5 15px; + background-color: rgba(0,0,0,0.2); + color: #fff; + border-top-right-radius: 5px; +} +.ModalBase .marked { + height: 360px; + overflow-x: hidden; + overflow-y: auto; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 5px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 5px; + border-radius: 5px; +} +.ModalBase .marked hr { + border-top: none; + border-bottom: solid 1px #d0d0d0; + margin: 15px 0; +} +.ModalBase .marked h1 { + font-size: 2em; + border-bottom: solid 2px #d0d0d0; + margin: 0.33em auto 0.67em; +} +.ModalBase .marked h2 { + font-size: 1.5em; + margin: 0.42em auto 0.83em; +} +.ModalBase .marked h3 { + font-size: 1.17em; + margin: 0.5em auto 1em; +} +.ModalBase .marked h4 { + font-size: 1em; + margin: 0.67em auto 1.33em; +} +.ModalBase .marked h5 { + font-size: 0.83em; + margin: 0.84em auto 1.67em; +} +.ModalBase .marked h6 { + font-size: 0.67em; + margin: 1.16em auto 2.33em; +} +.ModalBase .marked h1, +.ModalBase .marked h2, +.ModalBase .marked h3, +.ModalBase .marked h4, +.ModalBase .marked h5, +.ModalBase .marked h6 { + font-weight: 700; + line-height: 1.8em; +} +.ModalBase .marked p { + line-height: 1.8em; + margin: 15px 0 25px; +} +.ModalBase .marked img { + max-width: 100%; +} +.ModalBase .marked strong { + font-weight: bold; +} +.ModalBase .marked em { + font-style: italic; +} +.ModalBase .marked s { + text-decoration: line-through; +} +.ModalBase .marked blockquote { + border-left: solid 4px #3fb399; + margin: 15px 0 25px; + padding: 0 25px; +} +.ModalBase .marked ul { + list-style-type: disc; + padding-left: 35px; + margin-bottom: 35px; +} +.ModalBase .marked ul li { + display: list-item; + margin: 15px 0; +} +.ModalBase .marked ul>li>ul { + list-style-type: circle; +} +.ModalBase .marked ul>li>ul>li>ul { + list-style-type: square; +} +.ModalBase .marked ol { + list-style-type: decimal; + padding-left: 35px; + margin-bottom: 35px; +} +.ModalBase .marked ol li { + display: list-item; + margin: 15px 0; +} +.ModalBase .marked code { + font-family: monospace; + padding: 2px 4px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 4px; + border-radius: 4px; + font-size: 0.9em; + color: #000; + text-decoration: none; + background-color: #f6f6f6; +} +.ModalBase .marked pre { + padding: 5px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 5px; + border-radius: 5px; + overflow-x: auto; + margin: 15px 0 25px; + background-color: #f6f6f6; +} +.ModalBase .marked pre>code { + padding: 0; + border: none; + -webkit-border-radius: 0; + border-radius: 0; + color: #000; +} +.ModalBase .marked table { + width: 100%; + margin: 15px 0 25px; +} +.ModalBase .marked table thead tr { + background-color: #fff; +} +.ModalBase .marked table thead th { + border-style: solid; + padding: 15px 5px; + border-width: 1px 0 2px 1px; + border-color: #d0d0d0; +} +.ModalBase .marked table thead th:last-child { + border-right: solid 1px #d0d0d0; +} +.ModalBase .marked table tbody tr:nth-child(2n + 1) { + background-color: #f9f9f9; +} +.ModalBase .marked table tbody tr:nth-child(2n) { + background-color: #fff; +} +.ModalBase .marked table tbody td { + border-style: solid; + padding: 15px 5px; + border-width: 0 0 1px 1px; + border-color: #d0d0d0; +} +.ModalBase .marked table tbody td:last-child { + border-right: solid 1px #d0d0d0; +} +.ModalBase .PlanetCreateModal.modal, +.ModalBase .TeamCreateModal.modal, +.ModalBase .AddMemberModal.modal { + padding: 60px 0; +} +.ModalBase .PlanetCreateModal.modal .nameInput, +.ModalBase .TeamCreateModal.modal .nameInput, +.ModalBase .AddMemberModal.modal .nameInput { + width: 80%; + font-size: 1.3em; + margin: 25px auto 15px; + text-align: center; +} +.ModalBase .PlanetCreateModal.modal .userNameSelect, +.ModalBase .TeamCreateModal.modal .userNameSelect, +.ModalBase .AddMemberModal.modal .userNameSelect { + width: 80%; + font-size: 1.3em; + margin: 35px auto; + text-align: center; +} +.ModalBase .PlanetCreateModal.modal .formField, +.ModalBase .TeamCreateModal.modal .formField, +.ModalBase .AddMemberModal.modal .formField { + text-align: center; + margin: 0 auto 25px; +} +.ModalBase .PlanetCreateModal.modal .formField select, +.ModalBase .TeamCreateModal.modal .formField select, +.ModalBase .AddMemberModal.modal .formField select { + display: inline-block; + width: 150px; + height: 33px; + border: solid 1px #d0d0d0; + background-color: #fff; + padding: 0 10px; + margin: 0 15px; +} +.ModalBase .PlanetCreateModal.modal .submitButton, +.ModalBase .TeamCreateModal.modal .submitButton, +.ModalBase .AddMemberModal.modal .submitButton { + display: block; + margin: 0 auto; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 55px; + height: 55px; + -webkit-border-radius: 50%; + border-radius: 50%; + overflow: hidden; + border-style: solid; + border-width: 1px; + border-color: #3fb399; + background-color: transparent; + color: #2bac8f; +} +.ModalBase .PlanetCreateModal.modal .submitButton:hover, +.ModalBase .TeamCreateModal.modal .submitButton:hover, +.ModalBase .AddMemberModal.modal .submitButton:hover, +.ModalBase .PlanetCreateModal.modal .submitButton.hover, +.ModalBase .TeamCreateModal.modal .submitButton.hover, +.ModalBase .AddMemberModal.modal .submitButton.hover, +.ModalBase .PlanetCreateModal.modal .submitButton:focus, +.ModalBase .TeamCreateModal.modal .submitButton:focus, +.ModalBase .AddMemberModal.modal .submitButton:focus, +.ModalBase .PlanetCreateModal.modal .submitButton.focus, +.ModalBase .TeamCreateModal.modal .submitButton.focus, +.ModalBase .AddMemberModal.modal .submitButton.focus { + border-color: #2c7d6b; + color: #1e7864; +} +.ModalBase .PlanetCreateModal.modal .submitButton:active, +.ModalBase .TeamCreateModal.modal .submitButton:active, +.ModalBase .AddMemberModal.modal .submitButton:active, +.ModalBase .PlanetCreateModal.modal .submitButton.active, +.ModalBase .TeamCreateModal.modal .submitButton.active, +.ModalBase .AddMemberModal.modal .submitButton.active { + background-color: #2bac8f; + color: #fff; +} +.ModalBase .PlanetCreateModal.modal .submitButton:disabled, +.ModalBase .TeamCreateModal.modal .submitButton:disabled, +.ModalBase .AddMemberModal.modal .submitButton:disabled, +.ModalBase .PlanetCreateModal.modal .submitButton.disabled, +.ModalBase .TeamCreateModal.modal .submitButton.disabled, +.ModalBase .AddMemberModal.modal .submitButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .PlanetCreateModal.modal .errorAlert, +.ModalBase .TeamCreateModal.modal .errorAlert, +.ModalBase .AddMemberModal.modal .errorAlert { + background-color: #f2dede; + color: #a64444; + padding: 12px 10px; + -webkit-border-radius: 5px; + border-radius: 5px; + text-align: center; + display: block; + width: 360px; + margin: 0 auto 15px; +} +.ModalBase .ContactModal { + padding: 15px; +} +.ModalBase .ContactModal .contactForm .formField { + width: 100%; + margin-bottom: 10px; +} +.ModalBase .ContactModal .contactForm .formField input, +.ModalBase .ContactModal .contactForm .formField textarea { + display: block; + width: 100%; + border: solid 1px #d0d0d0; + padding: 5px 15px; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + -webkit-border-radius: 5px; + border-radius: 5px; +} +.ModalBase .ContactModal .contactForm .formField input:focus, +.ModalBase .ContactModal .contactForm .formField textarea:focus, +.ModalBase .ContactModal .contactForm .formField input.focus, +.ModalBase .ContactModal .contactForm .formField textarea.focus { + border-color: #3fb399; + outline: none; +} +.ModalBase .ContactModal .contactForm .formField input { + height: 33px; + font-size: 1em; +} +.ModalBase .ContactModal .contactForm .formField textarea { + height: 175px; + font-size: 1em; +} +.ModalBase .ContactModal .contactForm .formControl { + zoom: 1; +} +.ModalBase .ContactModal .contactForm .formControl:before, +.ModalBase .ContactModal .contactForm .formControl:after { + content: ""; + display: table; +} +.ModalBase .ContactModal .contactForm .formControl:after { + clear: both; +} +.ModalBase .ContactModal .contactForm .formControl button { + float: right; + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + height: 44px; + padding: 0 15px; + -webkit-border-radius: 5px; + border-radius: 5px; + margin-left: 5px; + font-size: 1em; +} +.ModalBase .ContactModal .contactForm .formControl button:hover, +.ModalBase .ContactModal .contactForm .formControl button.hover, +.ModalBase .ContactModal .contactForm .formControl button:focus, +.ModalBase .ContactModal .contactForm .formControl button.focus { + border-color: #454545; + color: #454545; +} +.ModalBase .ContactModal .contactForm .formControl button:active, +.ModalBase .ContactModal .contactForm .formControl button.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.ModalBase .ContactModal .contactForm .formControl button:disabled, +.ModalBase .ContactModal .contactForm .formControl button.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .ContactModal .contactForm .formControl button.sendButton { + border-style: solid; + border-width: 1px; + border-color: #3fb399; + background-color: transparent; + color: #2bac8f; +} +.ModalBase .ContactModal .contactForm .formControl button.sendButton:hover, +.ModalBase .ContactModal .contactForm .formControl button.sendButton.hover, +.ModalBase .ContactModal .contactForm .formControl button.sendButton:focus, +.ModalBase .ContactModal .contactForm .formControl button.sendButton.focus { + border-color: #2c7d6b; + color: #1e7864; +} +.ModalBase .ContactModal .contactForm .formControl button.sendButton:active, +.ModalBase .ContactModal .contactForm .formControl button.sendButton.active { + background-color: #2bac8f; + color: #fff; +} +.ModalBase .ContactModal .contactForm .formControl button.sendButton:disabled, +.ModalBase .ContactModal .contactForm .formControl button.sendButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .ContactModal .confirmation .confirmationMessage { + padding: 35px 0; + text-align: center; + font-size: 1.1em; +} +.ModalBase .ContactModal .confirmation .doneButton { + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + height: 44px; + padding: 0 35px; + -webkit-border-radius: 5px; + border-radius: 5px; + display: block; + margin: 0 auto 25px; +} +.ModalBase .ContactModal .confirmation .doneButton:hover, +.ModalBase .ContactModal .confirmation .doneButton.hover, +.ModalBase .ContactModal .confirmation .doneButton:focus, +.ModalBase .ContactModal .confirmation .doneButton.focus { + border-color: #454545; + color: #454545; +} +.ModalBase .ContactModal .confirmation .doneButton:active, +.ModalBase .ContactModal .confirmation .doneButton.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.ModalBase .ContactModal .confirmation .doneButton:disabled, +.ModalBase .ContactModal .confirmation .doneButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .LogoutModal { + padding: 65px 0 45px; + width: 350px; +} +.ModalBase .LogoutModal .messageLabel { + text-align: center; + font-size: 1.1em; + margin-bottom: 35px; +} +.ModalBase .LogoutModal .formControl { + text-align: center; +} +.ModalBase .LogoutModal .formControl button { + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + -webkit-border-radius: 5px; + border-radius: 5px; + height: 44px; + margin: 15px 5px; + padding: 0 15px; +} +.ModalBase .LogoutModal .formControl button:hover, +.ModalBase .LogoutModal .formControl button.hover, +.ModalBase .LogoutModal .formControl button:focus, +.ModalBase .LogoutModal .formControl button.focus { + border-color: #454545; + color: #454545; +} +.ModalBase .LogoutModal .formControl button:active, +.ModalBase .LogoutModal .formControl button.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.ModalBase .LogoutModal .formControl button:disabled, +.ModalBase .LogoutModal .formControl button.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ModalBase .LogoutModal .formControl button.logoutButton { + border-style: solid; + border-width: 1px; + border-color: #3fb399; + background-color: transparent; + color: #2bac8f; +} +.ModalBase .LogoutModal .formControl button.logoutButton:hover, +.ModalBase .LogoutModal .formControl button.logoutButton.hover, +.ModalBase .LogoutModal .formControl button.logoutButton:focus, +.ModalBase .LogoutModal .formControl button.logoutButton.focus { + border-color: #2c7d6b; + color: #1e7864; +} +.ModalBase .LogoutModal .formControl button.logoutButton:active, +.ModalBase .LogoutModal .formControl button.logoutButton.active { + background-color: #2bac8f; + color: #fff; +} +.ModalBase .LogoutModal .formControl button.logoutButton:disabled, +.ModalBase .LogoutModal .formControl button.logoutButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.ArticleDetail { + position: absolute; + right: 0; + bottom: 0; + top: 60px; + left: 250px; + padding: 10px; +} +.ArticleDetail * { + -webkit-user-select: all; +} +.ArticleDetail .detailInfo { + height: 70px; + width: 100%; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + font-size: 12px; + position: relative; +} +.ArticleDetail .detailInfo .left { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 120px; +} +.ArticleDetail .detailInfo .right { + position: absolute; + top: 0; + right: 0; +} +.ArticleDetail .detailBody { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 70px; + overflow-x: hidden; + overflow-y: auto; +} +.ArticleDetail .detailBody .detailPanel { + position: absolute; + top: 0; + left: 10px; + right: 10px; + bottom: 10px; + background-color: #fff; + -webkit-border-radius: 5px; + border-radius: 5px; + border: solid 1px #d0d0d0; +} +.ArticleDetail .detailBody .detailPanel>.header { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 60px; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 60px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 5px 15px; + border-top: solid 1px #d0d0d0; + overflow-y: auto; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview hr { + border-top: none; + border-bottom: solid 1px #d0d0d0; + margin: 15px 0; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h1 { + font-size: 2em; + border-bottom: solid 2px #d0d0d0; + margin: 0.33em auto 0.67em; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h2 { + font-size: 1.5em; + margin: 0.42em auto 0.83em; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h3 { + font-size: 1.17em; + margin: 0.5em auto 1em; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h4 { + font-size: 1em; + margin: 0.67em auto 1.33em; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h5 { + font-size: 0.83em; + margin: 0.84em auto 1.67em; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h6 { + font-size: 0.67em; + margin: 1.16em auto 2.33em; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h1, +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h2, +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h3, +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h4, +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h5, +.ArticleDetail .detailBody .detailPanel .MarkdownPreview h6 { + font-weight: 700; + line-height: 1.8em; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview p { + line-height: 1.8em; + margin: 15px 0 25px; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview img { + max-width: 100%; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview strong { + font-weight: bold; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview em { + font-style: italic; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview s { + text-decoration: line-through; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview blockquote { + border-left: solid 4px #3fb399; + margin: 15px 0 25px; + padding: 0 25px; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview ul { + list-style-type: disc; + padding-left: 35px; + margin-bottom: 35px; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview ul li { + display: list-item; + margin: 15px 0; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview ul>li>ul { + list-style-type: circle; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview ul>li>ul>li>ul { + list-style-type: square; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview ol { + list-style-type: decimal; + padding-left: 35px; + margin-bottom: 35px; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview ol li { + display: list-item; + margin: 15px 0; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview code { + font-family: monospace; + padding: 2px 4px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 4px; + border-radius: 4px; + font-size: 0.9em; + color: #000; + text-decoration: none; + background-color: #f6f6f6; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview pre { + padding: 5px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 5px; + border-radius: 5px; + overflow-x: auto; + margin: 15px 0 25px; + background-color: #f6f6f6; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview pre>code { + padding: 0; + border: none; + -webkit-border-radius: 0; + border-radius: 0; + color: #000; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview table { + width: 100%; + margin: 15px 0 25px; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview table thead tr { + background-color: #fff; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview table thead th { + border-style: solid; + padding: 15px 5px; + border-width: 1px 0 2px 1px; + border-color: #d0d0d0; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview table thead th:last-child { + border-right: solid 1px #d0d0d0; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview table tbody tr:nth-child(2n + 1) { + background-color: #f9f9f9; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview table tbody tr:nth-child(2n) { + background-color: #fff; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview table tbody td { + border-style: solid; + padding: 15px 5px; + border-width: 0 0 1px 1px; + border-color: #d0d0d0; +} +.ArticleDetail .detailBody .detailPanel .MarkdownPreview table tbody td:last-child { + border-right: solid 1px #d0d0d0; +} +.ArticleDetail .detailBody .detailPanel .CodeEditor { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 60px; + border-top: solid 1px #d0d0d0; + min-height: 300px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} +.ArticleDetail.edit .detailInfo .left .Select .Select-control { + border: none; + background-color: transparent; +} +.ArticleDetail.edit .detailInfo .left .folder.Select { + width: 150px; +} +.ArticleDetail.edit .detailInfo .left .folder.Select .Select-control:hover { + background-color: #f2f2f2; +} +.ArticleDetail.edit .detailInfo .left .folder.Select.is-focused .Select-control { + background-color: #fff; +} +.ArticleDetail.edit .detailInfo .left .tags.Select .Select-control { + white-space: nowrap; + overflow-x: auto; + position: relative; +} +.ArticleDetail.edit .detailInfo .left .tags.Select .Select-control .Select-arrow-zone, +.ArticleDetail.edit .detailInfo .left .tags.Select .Select-control .Select-arrow { + display: none; +} +.ArticleDetail.edit .detailInfo .right button { + cursor: pointer; + height: 33px; + width: 55px; + margin-left: 5px; + font-size: 14px; + color: #888; + background-color: #f2f2f2; + border: solid 1px #d0d0d0; + -webkit-border-radius: 5px; + border-radius: 5px; +} +.ArticleDetail.edit .detailInfo .right button:hover { + background-color: #fff; +} +.ArticleDetail.edit .detailInfo .right button.primary { + border: none; + background-color: #2bac8f; + color: #fff; +} +.ArticleDetail.edit .detailInfo .right button.primary:hover { + color: #fff; + background-color: #31c4a3; +} +.ArticleDetail.edit .detailBody .detailPanel>.header .mode { + position: absolute; + top: 0; + bottom: 0; + right: 0; + display: block; + height: 33px; + margin-top: 12px; + width: 120px; + margin-right: 15px; +} +.ArticleDetail.edit .detailBody .detailPanel>.header .title { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 120px; + padding: 0 15px; +} +.ArticleDetail.edit .detailBody .detailPanel>.header .title input { + width: 100%; + border: none; + background-color: transparent; + line-height: 60px; + font-size: 32px; + font-weight: bold; + outline: none; +} +.ArticleDetail.show .detailInfo .left { + right: 99px; +} +.ArticleDetail.show .detailInfo .left .info { + padding: 5px; + white-space: nowrap; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.ArticleDetail.show .detailInfo .left .tags { + padding: 10px 10px 5px; + color: articleItemColor; +} +.ArticleDetail.show .detailInfo .left .tags a { + background-color: #2bac8f; + color: #fff; + -webkit-border-radius: 2px; + border-radius: 2px; + padding: 1.5px 5px; + margin: 2px; + font-size: 10px; + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); +} +.ArticleDetail.show .detailInfo .left .tags a:hover { + opacity: 1; + -ms-filter: none; + filter: none; +} +.ArticleDetail.show .detailInfo .left .tags span.noTags { + color: #999; +} +.ArticleDetail.show .detailInfo .right button { + cursor: pointer; + height: 33px; + width: 33px; + border: none; + font-size: 18px; + color: #888; + background-color: transparent; + padding: 0; +} +.ArticleDetail.show .detailInfo .right button:hover { + color: inherit; +} +.ArticleDetail.show .detailBody .detailPanel>.header .mode { + display: block; + line-height: 60px; + width: 45px; + height: 60px; + font-size: 18px; + text-align: center; +} +.ArticleDetail.show .detailBody .detailPanel>.header .title { + position: absolute; + top: 0; + bottom: 0; + left: 45px; + right: 15px; + font-size: 32px; + line-height: 60px; + font-weight: bold; + white-space: nowrap; + overflow-x: auto; + overflow-y: hidden; +} +.ArticleList { + position: absolute; + left: 0; + bottom: 0; + top: 60px; + width: 250px; + border-right: solid 1px #a6a6a6; +} +.ArticleList>ul { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + overflow-y: auto; + -webkit-user-select: none; + cursor: default; +} +.ArticleList>ul li .articleItem { + border: solid 2px transparent; + position: relative; + height: 88px; + width: 100%; + cursor: pointer; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + background-color: #fff; + padding: 0 10px; + font-size: 12px; +} +.ArticleList>ul li .articleItem .top { + zoom: 1; + line-height: 20px; + padding: 5px 0; + color: #777; +} +.ArticleList>ul li .articleItem .top:before, +.ArticleList>ul li .articleItem .top:after { + content: ""; + display: table; +} +.ArticleList>ul li .articleItem .top:after { + clear: both; +} +.ArticleList>ul li .articleItem .top .profileImage { + vertical-align: middle; +} +.ArticleList>ul li .articleItem .top .updatedAt { + float: right; + line-height: 20px; +} +.ArticleList>ul li .articleItem .middle { + zoom: 1; + padding: 3px 0 7px; + font-size: 16px; +} +.ArticleList>ul li .articleItem .middle:before, +.ArticleList>ul li .articleItem .middle:after { + content: ""; + display: table; +} +.ArticleList>ul li .articleItem .middle:after { + clear: both; +} +.ArticleList>ul li .articleItem .middle .mode { + float: left; + font-size: 12px; + line-height: 16px; +} +.ArticleList>ul li .articleItem .middle .title { + float: left; + white-space: nowrap; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + padding: 0 5px; +} +.ArticleList>ul li .articleItem .bottom { + padding: 5px 0; + overflow-x: auto; + white-space: nowrap; +} +.ArticleList>ul li .articleItem .bottom .tags { + color: #777; +} +.ArticleList>ul li .articleItem .bottom .tags a { + background-color: #2bac8f; + color: #fff; + -webkit-border-radius: 2px; + border-radius: 2px; + padding: 1.5px 5px; + margin: 2px; + font-size: 10px; + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); +} +.ArticleList>ul li .articleItem .bottom .tags a:hover { + opacity: 1; + -ms-filter: none; + filter: none; +} +.ArticleList>ul li .articleItem:hover, +.ArticleList>ul li .articleItem.hover { + background-color: #f2f2f2; +} +.ArticleList>ul li .articleItem:hover:active, +.ArticleList>ul li .articleItem.hover:active, +.ArticleList>ul li .articleItem:hover.active, +.ArticleList>ul li .articleItem.hover.active { + background-color: #fff; +} +.ArticleList>ul li .articleItem:active, +.ArticleList>ul li .articleItem.active { + border-color: #3fb399; +} +.ArticleList>ul li .divider { + border-bottom: solid 1px #d0d0d0; +} +.Select { + position: relative; +} +.Select-control { + position: relative; + overflow: hidden; + background-color: #fff; + border: 1px solid #ccc; + border-color: #d9d9d9 #ccc #b3b3b3; + -webkit-border-radius: 4px; + border-radius: 4px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: #333; + cursor: default; + outline: none; + padding: 8px 52px 8px 10px; + -webkit-transition: all 200ms ease; + -moz-transition: all 200ms ease; + -o-transition: all 200ms ease; + -ms-transition: all 200ms ease; + transition: all 200ms ease; +} +.is-searchable.is-open > .Select-control { + cursor: text; +} +.is-open > .Select-control { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + background: #fff; + border-color: #b3b3b3 #ccc #d9d9d9; +} +.is-open > .Select-control > .Select-arrow { + border-color: transparent transparent #999; + border-width: 0 5px 5px; +} +.is-searchable.is-focused:not(.is-open) > .Select-control { + cursor: text; +} +.Select-placeholder { + color: #aaa; + padding: 8px 52px 8px 10px; + position: absolute; + top: 0; + left: 0; + right: -15px; + max-width: 100%; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.has-value > .Select-control > .Select-placeholder { + color: #333; +} +.Select-input > input { + cursor: default; + background: none transparent; + -webkit-box-shadow: none; + box-shadow: none; + height: auto; + border: 0 none; + font-family: inherit; + font-size: inherit; + margin: 0; + padding: 0; + outline: none; + display: inline-block; + -webkit-appearance: none; +} +.is-focused .Select-input > input { + cursor: text; +} +.Select-control:not(.is-searchable) > .Select-input { + outline: none; +} +.Select-loading { + -webkit-animation: Select-animation-spin 400ms infinite linear; + -o-animation: Select-animation-spin 400ms infinite linear; + -webkit-animation: Select-animation-spin 400ms infinite linear; + -moz-animation: Select-animation-spin 400ms infinite linear; + -o-animation: Select-animation-spin 400ms infinite linear; + -ms-animation: Select-animation-spin 400ms infinite linear; + animation: Select-animation-spin 400ms infinite linear; + width: 16px; + height: 16px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-border-radius: 50%; + border-radius: 50%; + border: 2px solid #ccc; + border-right-color: #333; + display: inline-block; + position: relative; + margin-top: -8px; + position: absolute; + right: 30px; + top: 50%; +} +.has-value > .Select-control > .Select-loading { + right: 46px; +} +.Select-clear { + color: #999; + cursor: pointer; + display: inline-block; + font-size: 16px; + padding: 6px 10px; + position: absolute; + right: 17px; + top: 0; +} +.Select-clear:hover { + color: #c0392b; +} +.Select-clear > span { + font-size: 1.1em; +} +.Select-arrow-zone { + content: " "; + display: block; + position: absolute; + right: 0; + top: 0; + bottom: 0; + width: 30px; + cursor: pointer; +} +.Select-arrow { + border-color: #999 transparent transparent; + border-style: solid; + border-width: 5px 5px 0; + content: " "; + display: block; + height: 0; + margin-top: -ceil(2.5px); + position: absolute; + right: 10px; + top: 14px; + width: 0; + cursor: pointer; +} +.Select-menu-outer { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + background-color: #fff; + border: 1px solid #ccc; + border-top-color: #e6e6e6; + -webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.06); + box-shadow: 0 1px 0 rgba(0,0,0,0.06); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-top: -1px; + max-height: 200px; + position: absolute; + top: 100%; + width: 100%; + z-index: 1000; + -webkit-overflow-scrolling: touch; +} +.Select-menu { + max-height: 198px; + overflow-y: auto; +} +.Select-option { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: #666; + cursor: pointer; + display: block; + padding: 8px 10px; +} +.Select-option:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.Select-option.is-focused { + background-color: #f2f9fc; + color: #333; +} +.Select-option.is-disabled { + color: #ccc; + cursor: not-allowed; +} +.Select-noresults { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: #999; + cursor: default; + display: block; + padding: 8px 10px; +} +.Select.is-multi .Select-control { + padding: 2px 52px 2px 3px; +} +.Select.is-multi .Select-input { + vertical-align: middle; + border: 1px solid transparent; + margin: 2px; + padding: 3px 0; +} +.Select-item { + background-color: #2bac8f; + -webkit-border-radius: 2px; + border-radius: 2px; + color: #fff; + display: inline-block; + font-size: 1em; + margin: 2px; +} +.Select-item-icon, +.Select-item-label { + display: inline-block; + vertical-align: middle; +} +.Select-item-label { + cursor: default; + border-bottom-right-radius: 2px; + border-top-right-radius: 2px; + padding: 3px 5px; +} +.Select-item-label .Select-item-label__a { + color: #fff; + cursor: #fff; +} +.Select-item-icon { + cursor: pointer; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; + border-right: 1px solid #279b81; + padding: 2px 5px 4px; +} +.Select-item-icon:hover, +.Select-item-icon:focus { + background-color: #31c4a3; +} +.Select-item-icon:active { + background-color: #c9e6f2; +} +.Select.is-multi.is-disabled .Select-item { + background-color: #f2f2f2; + border: 1px solid #d9d9d9; + color: #888; +} +.Select.is-multi.is-disabled .Select-item-icon { + cursor: not-allowed; + border-right: 1px solid #d9d9d9; +} +.Select.is-multi.is-disabled .Select-item-icon:hover, +.Select.is-multi.is-disabled .Select-item-icon:focus, +.Select.is-multi.is-disabled .Select-item-icon:active { + background-color: #f2f2f2; +} +@-webkit-keyframes Select-animation-spin { + to { + -webkit-transform: rotate(1turn); + } +} +@-moz-keyframes Select-animation-spin { + to { + -webkit-transform: rotate(1turn); + -moz-transform: rotate(1turn); + -o-transform: rotate(1turn); + -ms-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@-webkit-keyframes Select-animation-spin { + to { + -webkit-transform: rotate(1turn); + -moz-transform: rotate(1turn); + -o-transform: rotate(1turn); + -ms-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@-o-keyframes Select-animation-spin { + to { + -webkit-transform: rotate(1turn); + -moz-transform: rotate(1turn); + -o-transform: rotate(1turn); + -ms-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@keyframes Select-animation-spin { + to { + -webkit-transform: rotate(1turn); + -moz-transform: rotate(1turn); + -o-transform: rotate(1turn); + -ms-transform: rotate(1turn); + transform: rotate(1turn); + } +} +.TopBar { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 60px; + border-bottom: solid 1px #d0d0d0; + -webkit-user-select: none; + cursor: default; +} +.TopBar .left { + float: left; +} +.TopBar .left .search { + position: absolute; + top: 13.5px; + left: 15px; + height: 33px; +} +.TopBar .left .search i.fa { + position: absolute; + line-height: 33px; + z-index: 1; + width: 33px; + text-align: center; +} +.TopBar .left .search input.searchInput { + position: absolute; + top: 0; + left: 0; + background-color: #fff; + border: solid 1px #d0d0d0; + padding: 5px 15px; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + width: 350px; + padding-left: 30px; + -webkit-border-radius: 16.5px; + border-radius: 16.5px; + font-size: 14px; + height: 33px; + line-height: 33px; + outline: none; +} +.TopBar .left .search input.searchInput:focus, +.TopBar .left .search input.searchInput.focus { + border-color: #3fb399; + outline: none; +} +.TopBar .left .search input.searchInput:focus { + border-color: #2bac8f; +} +.TopBar .right { + float: right; +} +.TopBar .right .logo>img { + margin-top: 7px; + margin-right: 15px; +} +.TopBar .right .logo .tooltip { + position: fixed; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + font-size: 12px; + line-height: 12px; + -webkit-border-radius: 5px; + border-radius: 5px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; + right: 5px; +} +.TopBar .right .logo:hover .tooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} +.HomeContainer .HomeNavigator { + -webkit-user-select: none; + cursor: default; + background-color: #1b1c1c; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 60px; + text-align: center; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.HomeContainer .HomeNavigator ul.userList { + margin-top: 25px; +} +.HomeContainer .HomeNavigator ul.userList>li .shortCut { + margin-top: 5px; + font-size: 0.8em; + color: #ddd; +} +.HomeContainer .HomeNavigator ul.userList>li a { + display: block; + width: 44px; + height: 44px; + margin: 0 auto; + text-align: center; + background-color: #bebebe; + text-decoration: none; + color: #979797; + line-height: 44px; + font-size: 1.1em; + cursor: pointer; + -webkit-border-radius: 50%; + border-radius: 50%; + overflow: hidden; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.HomeContainer .HomeNavigator ul.userList>li a img { + width: 44px; + height: 44px; +} +.HomeContainer .HomeNavigator ul.userList>li a:hover, +.HomeContainer .HomeNavigator ul.userList>li a.active { + background-color: #fff; + color: #4d4d4d; +} +.HomeContainer .HomeNavigator ul.userList>li a .userTooltip { + position: absolute; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + line-height: 1em; + -webkit-border-radius: 5px; + border-radius: 5px; + margin-top: -52px; + margin-left: 52px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; +} +.HomeContainer .HomeNavigator ul.userList>li a:hover .userTooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} +.HomeContainer .HomeNavigator button.newTeamButton { + display: block; + margin: 0 auto; + width: 30px; + height: 30px; + -webkit-border-radius: 50%; + border-radius: 50%; + overflow: hidden; + border: solid 1px #898989; + color: #898989; + text-align: center; + background-image: none; + background-color: transparent; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + left: 0; + bottom: 0; + right: 0; + bottom: 15px; +} +.HomeContainer .HomeNavigator button.newTeamButton:hover, +.HomeContainer .HomeNavigator button.newTeamButton.hover, +.HomeContainer .HomeNavigator button.newTeamButton:focus, +.HomeContainer .HomeNavigator button.newTeamButton.focus { + border-color: #454545; + color: #454545; +} +.HomeContainer .HomeNavigator button.newTeamButton:active, +.HomeContainer .HomeNavigator button.newTeamButton.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.HomeContainer .HomeNavigator button.newTeamButton .tooltip { + position: fixed; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + font-size: 12px; + line-height: 12px; + -webkit-border-radius: 5px; + border-radius: 5px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; + margin-top: -22px; + margin-left: 33px; + font-size: 14px; +} +.HomeContainer .HomeNavigator button.newTeamButton:hover .tooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} +.LoginContainer, +.SignupContainer { + margin: 0 auto; + padding: 105px 15px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: #888; +} +.LoginContainer .logo, +.SignupContainer .logo { + width: 150px; + height: 150px; + display: block; + margin: 0 auto; +} +.LoginContainer .authNavigator, +.SignupContainer .authNavigator { + margin: 15px 0 25px; +} +.LoginContainer .authNavigator a, +.SignupContainer .authNavigator a { + font-size: 1.5em; + text-decoration: none; + color: #888; +} +.LoginContainer .authNavigator a:hover, +.SignupContainer .authNavigator a:hover, +.LoginContainer .authNavigator a.hover, +.SignupContainer .authNavigator a.hover, +.LoginContainer .authNavigator a:active, +.SignupContainer .authNavigator a:active, +.LoginContainer .authNavigator a.active, +.SignupContainer .authNavigator a.active { + color: #2bac8f; +} +.LoginContainer .socialControl, +.SignupContainer .socialControl { + text-align: center; + margin: 25px 0; +} +.LoginContainer .socialControl p, +.SignupContainer .socialControl p { + margin-bottom: 25px; +} +.LoginContainer .socialControl .facebookBtn, +.SignupContainer .socialControl .facebookBtn, +.LoginContainer .socialControl .githubBtn, +.SignupContainer .socialControl .githubBtn { + margin: 0 45px; + width: 50px; + height: 50px; + line-height: 50px; + font-size: 25px; + text-align: center; + background-image: none; + color: #fff; + border: none; + -webkit-border-radius: 25px; + border-radius: 25px; + cursor: pointer; +} +.LoginContainer .socialControl .facebookBtn, +.SignupContainer .socialControl .facebookBtn { + background-color: #3b5998; +} +.LoginContainer .socialControl .facebookBtn:hover, +.SignupContainer .socialControl .facebookBtn:hover, +.LoginContainer .socialControl .facebookBtn.hover, +.SignupContainer .socialControl .facebookBtn.hover { + background-color: #5d7dc0; +} +.LoginContainer .socialControl .githubBtn, +.SignupContainer .socialControl .githubBtn { + background-color: #201f1f; + font-size: 30px; + line-height: 30px; +} +.LoginContainer .socialControl .githubBtn:hover, +.SignupContainer .socialControl .githubBtn:hover, +.LoginContainer .socialControl .githubBtn.hover, +.SignupContainer .socialControl .githubBtn.hover { + background-color: #595656; +} +.LoginContainer .divider .dividerLabel, +.SignupContainer .divider .dividerLabel { + text-align: center; + position: relative; + top: -27px; + font-size: 1.3em; + background-color: #fff; + margin: 0 auto; + width: 50px; +} +.LoginContainer form, +.SignupContainer form { + width: 400px; + margin: 0 auto 45px; +} +.LoginContainer form .alertInfo, +.SignupContainer form .alertInfo, +.LoginContainer form .alertError, +.SignupContainer form .alertError { + margin-top: 15px; + margin-bottom: 15px; + padding: 10px; + -webkit-border-radius: 5px; + border-radius: 5px; + line-height: 1.6; + text-align: center; +} +.LoginContainer form .alertInfo, +.SignupContainer form .alertInfo { + background-color: #d9edf7; + color: #34708e; +} +.LoginContainer form .alertError, +.SignupContainer form .alertError { + background-color: #f2dede; + color: #a64444; +} +.LoginContainer form div.formField input, +.SignupContainer form div.formField input { + border: none; + border-bottom: 1px solid #d0d0d0; + padding: 5px 15px; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + height: 33px; + width: 100%; + margin-bottom: 10px; + text-align: center; + font-size: 1.1em; +} +.LoginContainer form div.formField input:focus, +.SignupContainer form div.formField input:focus, +.LoginContainer form div.formField input.focus, +.SignupContainer form div.formField input.focus { + border-bottom: 1px solid #3fb399; + outline: none; +} +.LoginContainer form div.formField:last-child, +.SignupContainer form div.formField:last-child { + margin-top: 15px; +} +.LoginContainer form div.formField button.logInButton, +.SignupContainer form div.formField button.logInButton { + border-style: solid; + border-width: 1px; + border-color: #3fb399; + background-color: transparent; + color: #2bac8f; + height: 44px; + -webkit-border-radius: 22px; + border-radius: 22px; + display: block; + width: 200px; + font-size: 1em; + margin: 0 auto; +} +.LoginContainer form div.formField button.logInButton:hover, +.SignupContainer form div.formField button.logInButton:hover, +.LoginContainer form div.formField button.logInButton.hover, +.SignupContainer form div.formField button.logInButton.hover, +.LoginContainer form div.formField button.logInButton:focus, +.SignupContainer form div.formField button.logInButton:focus, +.LoginContainer form div.formField button.logInButton.focus, +.SignupContainer form div.formField button.logInButton.focus { + border-color: #2c7d6b; + color: #1e7864; +} +.LoginContainer form div.formField button.logInButton:active, +.SignupContainer form div.formField button.logInButton:active, +.LoginContainer form div.formField button.logInButton.active, +.SignupContainer form div.formField button.logInButton.active { + background-color: #2bac8f; + color: #fff; +} +.LoginContainer form div.formField button.logInButton:disabled, +.SignupContainer form div.formField button.logInButton:disabled, +.LoginContainer form div.formField button.logInButton.disabled, +.SignupContainer form div.formField button.logInButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.LoginContainer p.alert, +.SignupContainer p.alert { + text-align: center; + font-size: 0.8em; +} +.PlanetContainer { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 0; +} +.PlanetContainer .tags { + white-space: nowrap; + overflow-x: auto; +} +.PlanetContainer .tags a { + margin: 0 2px; + text-decoration: underline; + cursor: pointer; + font-size: 0.95em; +} +.PlanetContainer .tags a.noTag { + color: #888; + font-size: 0.8em; +} +.PlanetHeader { + position: absolute; + left: 0; + right: 0; + top: 0; + overflow-y: hidden; + height: 55px; + background-color: #fff; + border-bottom: solid 1px #d0d0d0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 5px 15px; + zoom: 1; +} +.PlanetHeader:before, +.PlanetHeader:after { + content: ""; + display: table; +} +.PlanetHeader:after { + clear: both; +} +.PlanetHeader .headerLabel { + -webkit-user-select: none; + cursor: default; + position: absolute; + top: 0; + left: 0; + bottom: 0; + overflow: hidden; + display: inline-block; + width: 200px; +} +.PlanetHeader .headerLabel .userName { + position: absolute; + left: 15px; + top: 30px; + width: 140px; + font-size: 1em; + color: #4d4d4d; + text-decoration: none; +} +.PlanetHeader .headerLabel .userName:hover { + color: #454545; + text-decoration: underline; +} +.PlanetHeader .headerLabel .planetName { + position: absolute; + top: 5px; + left: 10px; + width: 145px; + font-size: 1.6em; + color: #2bac8f; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.PlanetHeader .headerLabel .planetName:hover { + color: #2c7d6b; +} +.PlanetHeader .headerLabel .private { + position: absolute; + top: 12px; + right: 38px; + width: 33px; + height: 33px; + line-height: 33px; + text-align: center; + color: inactiveColor; +} +.PlanetHeader .headerLabel .private:hover { + color: #4d4d4d; +} +.PlanetHeader .headerLabel .private .tooltip { + position: fixed; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + font-size: 12px; + line-height: 12px; + -webkit-border-radius: 5px; + border-radius: 5px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; + margin-left: -30px; +} +.PlanetHeader .headerLabel .private:hover .tooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} +.PlanetHeader .headerLabel .planetSettingButton { + position: absolute; + top: 15px; + right: 5px; + font-size: 0.8em; + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-border-radius: 50%; + border-radius: 50%; + overflow: hidden; + width: 26px; + height: 26px; + text-align: center; + cursor: pointer; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.PlanetHeader .headerLabel .planetSettingButton:hover, +.PlanetHeader .headerLabel .planetSettingButton.hover, +.PlanetHeader .headerLabel .planetSettingButton:focus, +.PlanetHeader .headerLabel .planetSettingButton.focus { + border-color: #454545; + color: #454545; +} +.PlanetHeader .headerLabel .planetSettingButton:active, +.PlanetHeader .headerLabel .planetSettingButton.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.PlanetHeader .headerLabel .planetSettingButton:disabled, +.PlanetHeader .headerLabel .planetSettingButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.PlanetHeader .headerLabel .planetSettingButton:focus, +.PlanetHeader .headerLabel .planetSettingButton.focus { + outline: none; +} +.PlanetHeader .headerLabel .planetSettingButton .tooltip { + position: fixed; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + font-size: 12px; + line-height: 12px; + -webkit-border-radius: 5px; + border-radius: 5px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; + margin-top: 11px; + margin-left: -36px; +} +.PlanetHeader .headerLabel .planetSettingButton:hover .tooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} +.PlanetHeader .headerControl { + -webkit-user-select: none; + cursor: default; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 200px; +} +.PlanetHeader .headerControl .searchInput { + display: block; + position: absolute; + top: 12px; + left: 0; +} +.PlanetHeader .headerControl .searchInput input { + padding-left: 32px; + width: 300px; +} +.PlanetHeader .headerControl .searchInput .fa { + position: absolute; + top: 8px; + left: 12px; + color: #888; +} +.PlanetHeader .headerControl .refreshButton { + display: block; + position: absolute; + top: 15px; + right: 55px; + width: 26px; + height: 26px; + font-size: 0.8em; + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + -webkit-border-radius: 50%; + border-radius: 50%; + overflow: hidden; + text-align: center; + cursor: pointer; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.PlanetHeader .headerControl .refreshButton:hover, +.PlanetHeader .headerControl .refreshButton.hover, +.PlanetHeader .headerControl .refreshButton:focus, +.PlanetHeader .headerControl .refreshButton.focus { + border-color: #454545; + color: #454545; +} +.PlanetHeader .headerControl .refreshButton:active, +.PlanetHeader .headerControl .refreshButton.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.PlanetHeader .headerControl .refreshButton:disabled, +.PlanetHeader .headerControl .refreshButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.PlanetHeader .headerControl .refreshButton:focus, +.PlanetHeader .headerControl .refreshButton.focus { + outline: none; +} +.PlanetHeader .headerControl .refreshButton .tooltip { + position: fixed; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + font-size: 12px; + line-height: 12px; + -webkit-border-radius: 5px; + border-radius: 5px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; + margin-top: 11px; + margin-left: -39px; +} +.PlanetHeader .headerControl .refreshButton:hover .tooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} +.PlanetHeader .headerControl .logo { + display: block; + position: absolute; + top: 4px; + right: 10px; + cursor: pointer; +} +.PlanetHeader .headerControl .logo img { + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + opacity: 0.9; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=90)"; + filter: alpha(opacity=90); +} +.PlanetHeader .headerControl .logo:hover img, +.PlanetHeader .headerControl .logo:hover .tooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} +.PlanetHeader .headerControl .logo .tooltip { + position: fixed; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + font-size: 12px; + line-height: 12px; + -webkit-border-radius: 5px; + border-radius: 5px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; + margin-top: -5px; + margin-left: -67px; +} +.PlanetNavigator { + position: absolute; + bottom: 0; + left: 0; + -webkit-user-select: none; + cursor: default; + top: 55px; + width: 200px; + border-right: solid 1px #a6a6a6; + padding: 10px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.PlanetNavigator .launchButton { + -webkit-border-radius: 22px; + border-radius: 22px; + font-size: 1.1em; +} +.PlanetNavigator nav a { + display: block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 15px 15px; + margin: 10px 0; + -webkit-border-radius: 10px; + border-radius: 10px; + text-decoration: none; + background-color: transparent; + color: #4d4d4d; + cursor: pointer; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + border: none; +} +.PlanetNavigator nav a:hover, +.PlanetNavigator nav a.hover, +.PlanetNavigator nav a:focus, +.PlanetNavigator nav a.focus { + border-color: #454545; + color: #454545; +} +.PlanetNavigator nav a:active, +.PlanetNavigator nav a.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.PlanetNavigator nav a:disabled, +.PlanetNavigator nav a.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.PlanetArticleList { + position: absolute; + bottom: 0; + right: 0; + left: 200px; + top: 55px; + width: 275px; + border-right: solid 1px #a6a6a6; +} +.PlanetArticleList>ul { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + overflow-y: auto; +} +.PlanetArticleList>ul li .articleItem { + -webkit-user-select: none; + cursor: default; + border: solid 2px transparent; + position: relative; + height: 94px; + width: 100%; + cursor: pointer; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.PlanetArticleList>ul li .articleItem .itemLeft { + position: absolute; + top: 4px; + bottom: 4px; + width: 38px; + padding: 3px 0 3px 3px; + text-align: center; +} +.PlanetArticleList>ul li .articleItem .itemLeft .profileImage { + margin-bottom: 5px; + -webkit-border-radius: 50%; + border-radius: 50%; + overflow: hidden; +} +.PlanetArticleList>ul li .articleItem .itemLeft .fa { + line-height: 25px; +} +.PlanetArticleList>ul li .articleItem .itemRight { + position: absolute; + top: 4px; + bottom: 4px; + right: 2px; + left: 40px; + overflow-x: hidden; + padding: 3px 10px 3px 3px; +} +.PlanetArticleList>ul li .articleItem .itemRight .itemInfo { + margin: 5px 0 13px; + color: #7a7a7a; + font-size: 0.7em; +} +.PlanetArticleList>ul li .articleItem .itemRight .itemInfo .userProfileName { + color: #2bac8f; + font-size: 1.2em; +} +.PlanetArticleList>ul li .articleItem .itemRight .description { + line-height: 120%; + margin-bottom: 10px; + font-size: 1em; + overflow-x: hidden; + white-space: nowrap; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.PlanetArticleList>ul li .articleItem .itemRight .tags { + position: absolute; + bottom: 5px; + font-size: 0.9em; +} +.PlanetArticleList>ul li .articleItem:hover, +.PlanetArticleList>ul li .articleItem.hover { + background-color: rgba(0,0,0,0.04); +} +.PlanetArticleList>ul li .articleItem:hover:active, +.PlanetArticleList>ul li .articleItem.hover:active, +.PlanetArticleList>ul li .articleItem:hover.active, +.PlanetArticleList>ul li .articleItem.hover.active { + background-color: #fff; +} +.PlanetArticleList>ul li .articleItem:active, +.PlanetArticleList>ul li .articleItem.active { + border-color: #3fb399; +} +.PlanetArticleList>ul li .divider { + border-bottom: solid 1px #d0d0d0; +} +.PlanetArticleDetail { + position: absolute; + right: 0; + bottom: 0; + top: 55px; + left: 475px; +} +.PlanetArticleDetail .detailHeader { + border: solid 2px transparent; + position: relative; + height: 105px; + width: 100%; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.PlanetArticleDetail .detailHeader .itemLeft { + position: absolute; + top: 7px; + bottom: 4px; + width: 38px; + padding: 3px 0 3px 3px; + text-align: center; +} +.PlanetArticleDetail .detailHeader .itemLeft .profileImage { + margin-bottom: 5px; + -webkit-border-radius: 50%; + border-radius: 50%; + overflow: hidden; +} +.PlanetArticleDetail .detailHeader .itemLeft .fa { + line-height: 25px; +} +.PlanetArticleDetail .detailHeader .itemRight { + position: absolute; + top: 7px; + bottom: 4px; + right: 2px; + left: 40px; + overflow-x: hidden; + padding: 3px 10px 3px 3px; +} +.PlanetArticleDetail .detailHeader .itemRight .itemInfo { + margin: 5px 0 13px; + color: #7a7a7a; + font-size: 0.7em; +} +.PlanetArticleDetail .detailHeader .itemRight .itemInfo .userProfileName { + color: #2bac8f; + font-size: 1.2em; +} +.PlanetArticleDetail .detailHeader .itemRight .description { + line-height: 120%; + margin-bottom: 10px; + font-size: 1em; + overflow-x: auto; + white-space: nowrap; +} +.PlanetArticleDetail .detailHeader .itemRight .tags { + position: absolute; + bottom: 5px; + font-size: 0.9em; +} +.PlanetArticleDetail .detailHeader .itemControl { + position: absolute; + z-index: 1; + top: 2px; + right: 2px; +} +.PlanetArticleDetail .detailHeader .itemControl .deleteButton, +.PlanetArticleDetail .detailHeader .itemControl .editButton { + border-style: solid; + border-width: 1px; + border-color: #898989; + background-color: transparent; + color: #898989; + text-align: center; + width: 33px; + height: 33px; + -webkit-border-radius: 16.5px; + border-radius: 16.5px; + font-size: 15px; + margin: 0 3px; +} +.PlanetArticleDetail .detailHeader .itemControl .deleteButton:hover, +.PlanetArticleDetail .detailHeader .itemControl .editButton:hover, +.PlanetArticleDetail .detailHeader .itemControl .deleteButton.hover, +.PlanetArticleDetail .detailHeader .itemControl .editButton.hover, +.PlanetArticleDetail .detailHeader .itemControl .deleteButton:focus, +.PlanetArticleDetail .detailHeader .itemControl .editButton:focus, +.PlanetArticleDetail .detailHeader .itemControl .deleteButton.focus, +.PlanetArticleDetail .detailHeader .itemControl .editButton.focus { + border-color: #454545; + color: #454545; +} +.PlanetArticleDetail .detailHeader .itemControl .deleteButton:active, +.PlanetArticleDetail .detailHeader .itemControl .editButton:active, +.PlanetArticleDetail .detailHeader .itemControl .deleteButton.active, +.PlanetArticleDetail .detailHeader .itemControl .editButton.active { + border-color: #39a18a; + background-color: #2bac8f; + color: #fff; +} +.PlanetArticleDetail .detailHeader .itemControl .deleteButton:disabled, +.PlanetArticleDetail .detailHeader .itemControl .editButton:disabled, +.PlanetArticleDetail .detailHeader .itemControl .deleteButton.disabled, +.PlanetArticleDetail .detailHeader .itemControl .editButton.disabled { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); +} +.PlanetArticleDetail .detailHeader .itemControl .deleteButton .tooltip, +.PlanetArticleDetail .detailHeader .itemControl .editButton .tooltip { + position: fixed; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + font-size: 12px; + line-height: 12px; + -webkit-border-radius: 5px; + border-radius: 5px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; + margin-top: 10px; +} +.PlanetArticleDetail .detailHeader .itemControl .deleteButton:hover .tooltip, +.PlanetArticleDetail .detailHeader .itemControl .editButton:hover .tooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} +.PlanetArticleDetail .detailHeader .itemControl .editButton .tooltip { + margin-left: -12px; +} +.PlanetArticleDetail .detailHeader .itemControl .deleteButton .tooltip { + margin-left: -26px; +} +.PlanetArticleDetail .detailBody { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 105px; +} +.PlanetArticleDetail .detailBody .content { + position: absolute; + top: 5px; + bottom: 5px; + left: 2px; + right: 2px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 5px; + border-top: solid 1px #d0d0d0; +} +.PlanetArticleDetail.noteDetail .detailBody .content { + overflow-x: hidden; + overflow-y: auto; +} +.PlanetArticleDetail.noteDetail .detailBody .content hr { + border-top: none; + border-bottom: solid 1px #d0d0d0; + margin: 15px 0; +} +.PlanetArticleDetail.noteDetail .detailBody .content h1 { + font-size: 2em; + border-bottom: solid 2px #d0d0d0; + margin: 0.33em auto 0.67em; +} +.PlanetArticleDetail.noteDetail .detailBody .content h2 { + font-size: 1.5em; + margin: 0.42em auto 0.83em; +} +.PlanetArticleDetail.noteDetail .detailBody .content h3 { + font-size: 1.17em; + margin: 0.5em auto 1em; +} +.PlanetArticleDetail.noteDetail .detailBody .content h4 { + font-size: 1em; + margin: 0.67em auto 1.33em; +} +.PlanetArticleDetail.noteDetail .detailBody .content h5 { + font-size: 0.83em; + margin: 0.84em auto 1.67em; +} +.PlanetArticleDetail.noteDetail .detailBody .content h6 { + font-size: 0.67em; + margin: 1.16em auto 2.33em; +} +.PlanetArticleDetail.noteDetail .detailBody .content h1, +.PlanetArticleDetail.noteDetail .detailBody .content h2, +.PlanetArticleDetail.noteDetail .detailBody .content h3, +.PlanetArticleDetail.noteDetail .detailBody .content h4, +.PlanetArticleDetail.noteDetail .detailBody .content h5, +.PlanetArticleDetail.noteDetail .detailBody .content h6 { + font-weight: 700; + line-height: 1.8em; +} +.PlanetArticleDetail.noteDetail .detailBody .content p { + line-height: 1.8em; + margin: 15px 0 25px; +} +.PlanetArticleDetail.noteDetail .detailBody .content img { + max-width: 100%; +} +.PlanetArticleDetail.noteDetail .detailBody .content strong { + font-weight: bold; +} +.PlanetArticleDetail.noteDetail .detailBody .content em { + font-style: italic; +} +.PlanetArticleDetail.noteDetail .detailBody .content s { + text-decoration: line-through; +} +.PlanetArticleDetail.noteDetail .detailBody .content blockquote { + border-left: solid 4px #3fb399; + margin: 15px 0 25px; + padding: 0 25px; +} +.PlanetArticleDetail.noteDetail .detailBody .content ul { + list-style-type: disc; + padding-left: 35px; + margin-bottom: 35px; +} +.PlanetArticleDetail.noteDetail .detailBody .content ul li { + display: list-item; + margin: 15px 0; +} +.PlanetArticleDetail.noteDetail .detailBody .content ul>li>ul { + list-style-type: circle; +} +.PlanetArticleDetail.noteDetail .detailBody .content ul>li>ul>li>ul { + list-style-type: square; +} +.PlanetArticleDetail.noteDetail .detailBody .content ol { + list-style-type: decimal; + padding-left: 35px; + margin-bottom: 35px; +} +.PlanetArticleDetail.noteDetail .detailBody .content ol li { + display: list-item; + margin: 15px 0; +} +.PlanetArticleDetail.noteDetail .detailBody .content code { + font-family: monospace; + padding: 2px 4px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 4px; + border-radius: 4px; + font-size: 0.9em; + color: #000; + text-decoration: none; + background-color: #f6f6f6; +} +.PlanetArticleDetail.noteDetail .detailBody .content pre { + padding: 5px; + border: solid 1px #d0d0d0; + -webkit-border-radius: 5px; + border-radius: 5px; + overflow-x: auto; + margin: 15px 0 25px; + background-color: #f6f6f6; +} +.PlanetArticleDetail.noteDetail .detailBody .content pre>code { + padding: 0; + border: none; + -webkit-border-radius: 0; + border-radius: 0; + color: #000; +} +.PlanetArticleDetail.noteDetail .detailBody .content table { + width: 100%; + margin: 15px 0 25px; +} +.PlanetArticleDetail.noteDetail .detailBody .content table thead tr { + background-color: #fff; +} +.PlanetArticleDetail.noteDetail .detailBody .content table thead th { + border-style: solid; + padding: 15px 5px; + border-width: 1px 0 2px 1px; + border-color: #d0d0d0; +} +.PlanetArticleDetail.noteDetail .detailBody .content table thead th:last-child { + border-right: solid 1px #d0d0d0; +} +.PlanetArticleDetail.noteDetail .detailBody .content table tbody tr:nth-child(2n + 1) { + background-color: #f9f9f9; +} +.PlanetArticleDetail.noteDetail .detailBody .content table tbody tr:nth-child(2n) { + background-color: #fff; +} +.PlanetArticleDetail.noteDetail .detailBody .content table tbody td { + border-style: solid; + padding: 15px 5px; + border-width: 0 0 1px 1px; + border-color: #d0d0d0; +} +.PlanetArticleDetail.noteDetail .detailBody .content table tbody td:last-child { + border-right: solid 1px #d0d0d0; +} +.PlanetArticleDetail.codeDetail .detailBody .content .ace_editor { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} +.UserContainer { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 60px; +} +.UserContainer .content { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 200px; + background-color: #e6e6e6; +} +.UserContainer .UserNavigator { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 200px; + background-color: #333; + color: #ddd; + -webkit-user-select: none; + cursor: default; +} +.UserContainer .UserNavigator>.profile { + height: 60px; + padding: 10px 15px 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + position: relative; + border-bottom: solid 1px #666; + cursor: pointer; +} +.UserContainer .UserNavigator>.profile>.profileName { + color: #2bac8f; + font-size: 22px; + cursor: pointer; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.UserContainer .UserNavigator>.profile>.name { + padding: 5px 10px; + font-size: 14px; + color: #ddd; + cursor: pointer; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.UserContainer .UserNavigator>.profile>.dropdownIcon { + position: absolute; + top: 20px; + right: 25px; + float: right; + width: 20px; + height: 20px; + line-height: 20px; + font-size: 8px; + border: solid 1px #ddd; + -webkit-border-radius: 12.5px; + border-radius: 12.5px; + text-align: center; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.UserContainer .UserNavigator>.profile:hover>.profileName { + color: #31c4a3; +} +.UserContainer .UserNavigator>.profile:hover>.name { + color: #fff; +} +.UserContainer .UserNavigator>.profile:hover>.dropdownIcon { + border-color: #fff; +} +.UserContainer .UserNavigator>.profile:hover:active>.dropdownIcon { + background-color: #2bac8f; + border-color: #2bac8f; +} +.UserContainer .UserNavigator>.control { + padding: 15px 15px; +} +.UserContainer .UserNavigator>.control>.newPostButton { + background-color: #2bac8f; + color: #fff; + height: 44px; + width: 100%; + border: none; + -webkit-border-radius: 5px; + border-radius: 5px; + font-size: 16px; + font-weight: 600; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; +} +.UserContainer .UserNavigator>.control>.newPostButton:hover { + background-color: #31c4a3; +} +.UserContainer .UserNavigator>.menu { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 134px; + padding: 15px 0; + overflow: auto; +} +.UserContainer .UserNavigator>.menu>.menuGruop>.label { + border-bottom: 1px solid #666; + padding: 10px 15px; + font-size: 18px; + margin-bottom: 10px; +} +.UserContainer .UserNavigator>.menu>.menuGruop>.label>.plusButton { + float: right; + width: 20px; + height: 20px; + margin-top: -2.5px; + margin-right: -5px; + line-height: 15px; + font-size: 8px; + border: solid 1px #ddd; + -webkit-border-radius: 10px; + border-radius: 10px; + background-color: transparent; + text-align: center; + color: #ddd; +} +.UserContainer .UserNavigator>.menu>.menuGruop>.label>.plusButton:hover { + border-color: #fff; + color: #fff; +} +.UserContainer .UserNavigator>.menu>.menuGruop>.label>.plusButton:hover:active { + background-color: #2bac8f; + border-color: #2bac8f; +} +.UserContainer .UserNavigator>.menu>.folders .folderButton { + padding: 10px 25px; + width: 100%; + background-color: transparent; + border: none; + font-size: 14px; + color: #ddd; + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + text-align: left; +} +.UserContainer .UserNavigator>.menu>.folders .folderButton:hover { + background-color: rgba(255,255,255,0.2); + color: #fff; +} +.UserContainer .UserNavigator>.menu>.folders .folderButton.active { + background-color: #2bac8f; + color: #fff; +} +* { + -webkit-app-region: no-drag; + -webkit-user-select: none; +} +html, +body { + width: 100%; + height: 100%; + overflow: hidden; +} +body { + font-family: "Lato"; + color: #4d4d4d; + font-size: 14px; + font-weight: 400; +} +button, +input, +select { + font-family: "Lato"; +} +div, +span, +a, +button, +input, +textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +a { + color: #2bac8f; +} +a:hover { + color: #25927a; +} +a:visited { + color: #2bac8f; +} +hr { + border-top: none; + border-bottom: solid 1px #d0d0d0; + margin: 15px 0; +} +button { + font-weight: 400; + cursor: pointer; +} +button:focus, +button.focus { + outline: none; +} +.noSelect { + -webkit-user-select: none; + cursor: default; +} +.text-center { + text-align: center; +} +.form-group { + margin-bottom: 15px; +} +.form-group>label { + display: block; + margin-bottom: 5px; +} +.block-input, +.inline-input { + border: solid 1px #d0d0d0; + padding: 0 10px; + font-size: 1em; + height: 33px; + -webkit-border-radius: 5px; + border-radius: 5px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.block-input:focus, +.inline-input:focus, +.block-input.focus, +.inline-input.focus { + border: solid 1px #3fb399; + outline: none; +} +.block-input.circleInput, +.inline-input.circleInput { + -webkit-border-radius: 16.5px; + border-radius: 16.5px; +} +.block-input { + display: block; + width: 100%; +} +.inline-input { + display: inline-block; + margin-right: 5px; +} +.relative { + position: relative; +} +textarea.block-input { + resize: vertical; + height: 125px; + -webkit-border-radius: 5px; + border-radius: 5px; + padding: 5px 10px; +} +#content { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.Main .appUpdateButton { + position: fixed; + z-index: 2000; + bottom: 5px; + right: 53px; + padding: 10px 15px; + border: none; + -webkit-border-radius: 5px; + border-radius: 5px; + background-color: #2bac8f; + color: #fff; + opacity: 0.7; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); +} +.Main .appUpdateButton:hover { + opacity: 1; + -ms-filter: none; + filter: none; + background-color: #31c4a3; +} +.Main .contactButton { + position: fixed; + z-index: 2000; + bottom: 5px; + right: 5px; + padding: 10px 15px; + border: none; + -webkit-border-radius: 5px; + border-radius: 5px; + background-color: #2bac8f; + color: #fff; + opacity: 0.7; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); +} +.Main .contactButton:hover { + opacity: 1; + -ms-filter: none; + filter: none; + background-color: #31c4a3; +} +.Main .contactButton .tooltip { + position: fixed; + z-index: 500; + background-color: rgba(31,31,31,0.8); + color: #fff; + padding: 10px; + font-size: 12px; + line-height: 12px; + -webkit-border-radius: 5px; + border-radius: 5px; + white-space: nowrap; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: 0.1s; + -moz-transition: 0.1s; + -o-transition: 0.1s; + -ms-transition: 0.1s; + transition: 0.1s; + pointer-events: none; + margin-top: -22px; + margin-left: -97px; +} +.Main .contactButton:hover .tooltip { + opacity: 1; + -ms-filter: none; + filter: none; +} diff --git a/browser/styles/main/index.styl b/browser/styles/main/index.styl index e0175c3b..81c0dbd2 100644 --- a/browser/styles/main/index.styl +++ b/browser/styles/main/index.styl @@ -8,6 +8,7 @@ global-reset() * -webkit-app-region no-drag + -webkit-user-select none html, body width 100% @@ -19,24 +20,12 @@ body color textColor font-size fontSize font-weight 400 -button +button, input, select font-family "Lato" div, span, a, button, input, textarea box-sizing border-box -h1 - font-size 2em -h2 - font-size 1.5em -h3 - font-size 1.17em -h4 - font-size 1em -h5 - font-size 0.83em -h6 - font-size 0.67em a color brandColor &:hover @@ -55,6 +44,9 @@ button &:focus, &.focus outline none +.noSelect + noSelect() + .text-center text-align center @@ -64,13 +56,6 @@ button display block margin-bottom 5px -.stripInput - stripInput() - display block - width 100% - font-size 1em - height 33px - .block-input, .inline-input border solid 1px borderColor padding 0 10px @@ -110,19 +95,29 @@ textarea.block-input z-index 2000 bottom 5px right 53px - btnPrimary() padding 10px 15px + border none border-radius 5px - background-color backgroundColor + background-color brandColor + color white + opacity 0.7 + &:hover + opacity 1 + background-color lighten(brandColor, 10%) .contactButton position fixed z-index 2000 bottom 5px right 5px - btnPrimary() padding 10px 15px + border none border-radius 5px - background-color backgroundColor + background-color brandColor + color white + opacity 0.7 + &:hover + opacity 1 + background-color lighten(brandColor, 10%) .tooltip tooltip() margin-top -22px diff --git a/browser/styles/mixins/marked.styl b/browser/styles/mixins/marked.styl index acc4e7f0..1dcf1947 100644 --- a/browser/styles/mixins/marked.styl +++ b/browser/styles/mixins/marked.styl @@ -6,28 +6,28 @@ marked() h1 font-size 2em border-bottom solid 2px borderColor - margin 0.67em auto + margin 0.33em auto 0.67em h2 font-size 1.5em - margin 0.83em auto + margin 0.42em auto 0.83em h3 font-size 1.17em - margin 1em auto + margin 0.5em auto 1em h4 font-size 1em - margin 1.33em auto + margin 0.67em auto 1.33em h5 font-size 0.83em - margin 1.67em auto + margin 0.84em auto 1.67em h6 font-size 0.67em - margin 2.33em auto + margin 1.16em auto 2.33em h1, h2, h3, h4, h5, h6 font-weight 700 line-height 1.8em p line-height 1.8em - margin-bottom 25px + margin 15px 0 25px img max-width 100% strong @@ -38,12 +38,12 @@ marked() text-decoration line-through blockquote border-left solid 4px brandBorderColor - margin 15px 0 15px + margin 15px 0 25px padding 0 25px ul list-style-type disc padding-left 35px - margin-bottom 25px + margin-bottom 35px li display list-item margin 15px 0 @@ -54,7 +54,7 @@ marked() ol list-style-type decimal padding-left 35px - margin-bottom 25px + margin-bottom 35px li display list-item margin 15px 0 @@ -72,7 +72,7 @@ marked() border solid 1px borderColor border-radius 5px overflow-x auto - margin-bottom 25px + margin 15px 0 25px background-color #F6F6F6 &>code padding 0 diff --git a/browser/styles/mixins/util.styl b/browser/styles/mixins/util.styl index c6913cf1..1e0b61b6 100644 --- a/browser/styles/mixins/util.styl +++ b/browser/styles/mixins/util.styl @@ -3,5 +3,4 @@ borderBox() noSelect() -webkit-user-select none - -webkit-app-region drag - + cursor default diff --git a/browser/styles/vars.styl b/browser/styles/vars.styl index ebe54635..c8747771 100644 --- a/browser/styles/vars.styl +++ b/browser/styles/vars.styl @@ -1,4 +1,4 @@ -borderColor = #E8E8E8 +borderColor = #D0D0D0 highlightenBorderColor = darken(borderColor, 20%) invBorderColor = #404849 brandBorderColor = #3FB399 @@ -24,12 +24,6 @@ btnHighlightenColor = #000 brandColor = #2BAC8F -planetNavBgColor = #ECECEC -planetAnchorColor = #979797 -planetAnchorBgColor = #BEBEBE -planetAnchorActiveColor = textColor -planetAnchorActiveBgColor = white - popupShadow = 0 0 5px 0 #888 modalBackColor = transparentify(white, 65%) diff --git a/config.js b/config.js index 0ce393d9..7d3ed42b 100644 --- a/config.js +++ b/config.js @@ -1,5 +1,5 @@ module.exports = { // apiUrl: 'https://api.b00st.io/' - apiUrl: 'https://api2.b00st.io/' - // apiUrl: 'http://localhost:8000/' + // apiUrl: 'https://api2.b00st.io/' + apiUrl: 'http://localhost:8000/' } diff --git a/finder-window.js b/finder-window.js index d71dda6f..1038456a 100644 --- a/finder-window.js +++ b/finder-window.js @@ -6,16 +6,16 @@ var finderWindow = new BrowserWindow({ show: false, frame: false, resizable: false, + 'zoom-factor': 1.0, 'always-on-top': true, 'web-preferences': { - 'zoom-factor': 1.0, 'overlay-scrollbars': true, 'skip-taskbar': true }, 'standard-window': false }) -finderWindow.loadUrl('file://' + __dirname + '/browser/finder/index.electron.html') +finderWindow.loadUrl('file://' + __dirname + '/browser/finder/index.html') finderWindow.on('blur', function () { finderWindow.hide() diff --git a/lib/key-gen.js b/lib/key-gen.js new file mode 100644 index 00000000..4cc04385 --- /dev/null +++ b/lib/key-gen.js @@ -0,0 +1,7 @@ +var crypto = require('crypto') + +module.exports = function () { + var shasum = crypto.createHash('sha1') + shasum.update(((new Date()).getTime()).toString()) + return shasum.digest('hex') +} diff --git a/main-window.js b/main-window.js index e4038f22..b2a5b56d 100644 --- a/main-window.js +++ b/main-window.js @@ -3,15 +3,14 @@ var BrowserWindow = require('browser-window') var mainWindow = new BrowserWindow({ width: 1080, height: 720, - // frame: false, + 'zoom-factor': 1.0, 'web-preferences': { - 'zoom-factor': 1.0, 'overlay-scrollbars': true }, 'standard-window': false }) -mainWindow.loadUrl('file://' + __dirname + '/browser/main/index.electron.html') +mainWindow.loadUrl('file://' + __dirname + '/browser/main/index.html') mainWindow.setVisibleOnAllWorkspaces(true) diff --git a/package.json b/package.json index ea620ac1..a60ff850 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,16 @@ { "name": "boost", - "version": "0.3.1", + "version": "0.4.0", "description": "Boost App", "main": "main.js", "scripts": { "start": "electron ./main.js", - "web": "npm run serve | npm run dev", - "serve": "./node_modules/.bin/http-server ./browser -p 8080", - "dev": "webpack-dev-server --progress --colors --port 8090" + "build": "electron-packager ./ Boost $npm_package_config_platform $npm_package_config_version $npm_package_config_ignore --overwrite" + }, + "config": { + "version": "--version=0.33.0 --app-version=$npm_package_version --app-bundle-id=com.maisin.boost", + "platform": "--platform=darwin --arch=x64 --prune --icon=app.icns", + "ignore": "--ignore=Boost-darwin-x64 --ignore=node_modules/devicon/icons --ignore=submodules\/ace\/(?!src-min)|submodules\/ace\/(?=src-min-noconflict)" }, "repository": { "type": "git", @@ -31,38 +34,38 @@ }, "homepage": "https://github.com/Rokt33r/codexen-app#readme", "dependencies": { + "babel-core": "^5.8.25", + "devicon": "^2.0.0", "font-awesome": "^4.3.0", "fs-jetpack": "^0.7.0", + "lodash": "^3.10.1", "markdown-it": "^4.3.1", "md5": "^2.0.0", "moment": "^2.10.3", - "nib": "^1.1.0", - "node-jsx": "^0.13.3", "node-notifier": "^4.2.3", "react": "^0.13.3", - "react-router": "^0.13.3", - "react-select": "^0.5.4", + "react-redux": "^3.1.0", + "react-router": "^1.0.0-rc1", + "react-select": "^0.6.10", + "redux": "^3.0.2", "reflux": "^0.2.8", - "stylus": "^0.52.0", + "socket.io-client": "^1.3.6", "superagent": "^1.2.0", "superagent-promise": "^1.0.3", "titlebar": "^1.3.0" }, "devDependencies": { - "css-loader": "^0.15.1", - "http-server": "^0.8.0", - "jsx-loader": "^0.13.2", - "node-libs-browser": "^0.5.2", - "style-loader": "^0.12.3", - "stylus-loader": "^1.2.1", - "webpack": "^1.10.0", - "webpack-dev-server": "^1.10.1" + "electron-packager": "^5.1.0", + "electron-prebuilt": "^0.33.6", + "nib": "^1.1.0", + "standard": "^5.3.1", + "stylus": "^0.52.4" }, "standard": { "ignore": [ "/browser/ace/" ], - "global": [ + "globals": [ "localStorage" ] } diff --git a/submodules/ace b/submodules/ace new file mode 160000 index 00000000..b082bcb4 --- /dev/null +++ b/submodules/ace @@ -0,0 +1 @@ +Subproject commit b082bcb4bf2da27a8def3c438a33ebf0dffe5afe