diff --git a/.gitignore b/.gitignore
index 053d60d..1c58fb2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -100,3 +100,7 @@ ENV/
# mypy
.mypy_cache/
/.project
+
+
+# Database files (generated by code)
+DB/
diff --git a/PR.py b/PR.py
new file mode 100644
index 0000000..311d8f1
--- /dev/null
+++ b/PR.py
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Thu May 23 20:09:51 2019
+
+@author: jarl
+"""
+
+from sympy import symbols, Symbol, Function, solve, Eq, sympify, init_printing, Matrix, diff, summation, oo, exp, Sum, zeta
+
+
+init_printing()
+R, T_c, p_c, V_mc, C_a, C_b = symbols('R T_c p_c V_mc C_a C_b ')
+
+T, p, V_m, kappa, alfa, a, b = symbols('T p V_m, kappa alpha a b')
+
+V, n = symbols('V n')
+
+Z, Z_c, omega = symbols('Z Z_c omega')
+
+kappa_c = [0]*4
+for i in range(len(kappa_c)):
+ kappa_c[i] = Symbol("kappa_0c"+str(i))
+#kappa_c1, kappa_c2, kappa_c3, kappa_c4, omega = symbols('kappa_c1 kappa_c2 kappa_c3 kappa_c4 omega')
+
+
+
+#V_m = Z*R*T/p
+
+#C_a = 0.45724
+#C_b = 0.07780
+#R = 8.314
+#kappa_c1 = 0.37464
+#kappa_c2 = 1.54226
+#kappa_c3 = 0.26992
+
+
+
+
+
+#a = C_a *R**2*T_c**2 /p_c
+#b = C_b * R*T_c /p_c
+
+
+
+
+kappa_PR = kappa_c[0] + kappa_c[1] *omega + kappa_c[2] * omega**2
+alfa_PR = (1+ kappa*(1- (T/T_c)**(sympify(1)/2) ))**2
+
+
+
+
+kappa_0_PRSV1 =kappa_c[0] + kappa_c[1] *omega + kappa_c[2] * omega**2 + kappa_c[3] * omega**3
+kappa_1, kappa_2, kappa_3 = symbols("kappa_1 kappa_2 kappa_3")
+#kappa_PRSV1 = kappa_0_PRSV1 + kappa_1*(1 + (T/T_c)**(sympify(1)/2) ) * (0.7 - T/T_c )
+kappa_PRSV1 = kappa_0_PRSV1 + kappa_1*(1 + (T/T_c)**0.5 ) * (0.7 - T/T_c )
+
+#kappa_PRSV2 = kappa_0_PRSV1 + (kappa_1 + kappa_2*(kappa_3-T/T_c)*(1- (T/T_c)**(sympify(1)/2)) ) * (1 + (T/T_c)**(sympify(1)/2) ) * (0.7 - T/T_c )
+kappa_PRSV2 = kappa_0_PRSV1 + (kappa_1 + kappa_2*(kappa_3-T/T_c)*(1- (T/T_c)**0.5) ) * (1 + (T/T_c)**0.5 ) * (0.7 - T/T_c )
+
+
+
+
+Cubic_State = Eq(p, R*T/(V_m-b) - a*alfa/(V_m**2 +2*b*V_m - b**2))
+
+PR = Cubic_State.subs(alfa, alfa_PR.subs(kappa, kappa_PR) )
+PRSV1 = Cubic_State.subs(alfa, alfa_PR.subs(kappa, kappa_PRSV1) )
+PRSV2 = Cubic_State.subs(alfa, alfa_PR.subs(kappa, kappa_PRSV2))
+
+
+
+#PR_Z_c = Matrix( solve( PR.subs(p, p_c).subs(T, T_c).subs(V_m, Z_c*R*T_c/p_c ), Z_c) )
+#PR_V_c = Matrix( solve( PR.subs(p, p_c).subs(T, T_c), V_m ) )
+
+#V_m_c = PR_Z_c*R*T_c/p_c
+
+Critical_state_conds_PR = Matrix([ PR , Eq( diff(PR.rhs, V_m), 0) , Eq( diff(PR.rhs, V_m, 2), 0) ]).subs(p, p_c).subs(T, T_c).subs(V_m, V_mc) # .subs(V_m, Z_c*R*T_c/p_c )
+
+solve_ab = solve(Critical_state_conds_PR[1:], [a, b] )
+
+#PR_sol = PR.subs(a, solve_ab[0][0].evalf() ).subs(b, solve_ab[0][1].evalf() )
+PR_sol = PR.subs(a, solve_ab[0][0] ).subs(b, solve_ab[0][1] )
+
+
+
+V_m_atCrit = Matrix(solve(PR.subs(T, T_c).subs(p, p_c), V_m))
+V_m_atCrit = V_m_atCrit.subs(a, solve_ab[0][0] ).subs(b, solve_ab[0][1] )
+
+QA_Critical_Sate = Matrix( [ PR_sol, Eq( diff(PR_sol.rhs, V_m), 0), Eq( diff(PR_sol.rhs, V_m, 2), 0) ] ).subs(T, T_c).subs(V_m, V_mc).subs(p, p_c)
+V_cm_sol = solve(QA_Critical_Sate[0], V_mc)[0]
+
+
+#PR_sol2 = PR_sol.subs(V_mc, V_cm_sol )
+#V_m_CubicSol = solve(Cubic_State, V_m)[0].subs(alfa, alfa_PR.subs(kappa, kappa_PR) ).subs(a, solve_ab[0][0] ).subs(b, solve_ab[0][1] ).subs(V_mc, V_cm_sol )
+
+
+Van_der_Waals_EOS = Eq(p, R*T/(V_m - b) - a/V_m**2 )
+
+Redlich_Kwong_EOS = Eq(p, R*T/(V_m -b) - a/(T**0.5 * V_m * (V_m + b)))
+
+Soave_Redlich_Kwong_EOS = Redlich_Kwong_EOS.subs(a, a*alfa)
+
+
+
+n, s, k, z, alpha_Bose = symbols('n s k z alpha_Bose')
+#zeta = summation(1/(n**alpha_Bose), (n, 1, oo) )
+Li = summation(z**k/k**(alpha_Bose+1), (k, 1, oo) )
+
+
+Ideal_Bose_EOS = Eq(p*V_m, R*T* Li/zeta(alpha_Bose) * (T/T_c)**alpha_Bose)
+
+
+rho_0, rho, A, B, v_D, p_CJ, R_1, R_2, e_0, M_W = symbols("rho_0 rho A B v_D p_CJ R_1 R_2 e_0 M_W")
+
+Jones_Wilkins_Lee_EOS = Eq(p, A*( 1 - omega/R_1/V)*exp(-R_1*V)+B*(1-omega/R_2/V)*exp(-R_2*V) + omega*e_0/V )
+
+JWL_EOS_TNT = Jones_Wilkins_Lee_EOS.subs(V, rho_0/rho).subs(rho, M_W/V_m ).subs(rho_0, 1.63E3).subs(A, 373.8E9).subs(B, 3.747E9).subs(R_1, 4.15).subs(R_2, 0.9).subs(omega, 0.35).subs(e_0, 6E9)
+
+
+
+
+
+
+
diff --git a/PR_maple_vertif.mw b/PR_maple_vertif.mw
new file mode 100644
index 0000000..a746107
--- /dev/null
+++ b/PR_maple_vertif.mw
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbWlHRiQ2JVEicEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIj1GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EsMC4yNzc3Nzc4ZW1GJy8lJ3JzcGFjZUdGTC1JJm1mcmFjR0YkNigtRiM2Jy1GLDYlUSJSRidGL0YyLUY2Ni1RJyZzZG90O0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EmMC4wZW1GJy9GTkZlbi1GLDYlUSJURidGL0YyLyUrZXhlY3V0YWJsZUdGPUY5LUYjNictSSVtc3ViR0YkNiYtRiw2JVEiVkYnRi9GMi1GIzYlLUYsNiVRIm1GJ0YvRjJGL0YyLyUvc3Vic2NyaXB0c2hpZnRHUSIwRicvSSttc2VtYW50aWNzR0YkUSdhdG9taWNGJy1GNjYtUSgmbWludXM7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjIyMjIyMjJlbUYnL0ZORmNwLUYsNiVRImJGJ0YvRjJGL0YyLyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0ZdcS8lKWJldmVsbGVkR0Y9Rl9wLUZQNigtRiM2Jy1GLDYlUSJhRidGL0YyRlctRiw2JVEmYWxwaGFGJy9GMEY9RjlGam5GOS1GIzYuLUklbXN1cEdGJDYlRl5vLUYjNiYtSSNtbkdGJDYkUSIyRidGOS1GNjYtUSJ+RidGOUY7Rj5GQEZCRkRGRkZIRlpGZm5GL0YyLyUxc3VwZXJzY3JpcHRzaGlmdEdGW3AtRjY2LVEiK0YnRjlGO0Y+RkBGQkZERkZGSEZicEZkcEZkckZXRmVwRldGXm9GX3BGaHItRmByNiVGZXAtRiM2JUZkckYvRjJGW3NGL0YyRmhwRltxRl5xRmBxRmpuRjk=
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVElZGlmZkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2JC1GIzYqLUkmbWZyYWNHRiQ2KC1GIzYmLUYsNiVRIlJGJ0YvRjItSSNtb0dGJDYtUScmc2RvdDtGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRkovJSlzdHJldGNoeUdGSi8lKnN5bW1ldHJpY0dGSi8lKGxhcmdlb3BHRkovJS5tb3ZhYmxlbGltaXRzR0ZKLyUnYWNjZW50R0ZKLyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGWS1GLDYlUSJURidGL0YyRkYtRiM2Ji1JJW1zdWJHRiQ2Ji1GLDYlUSJWRidGL0YyLUYsNiVRIm1GJ0YvRjIvJS9zdWJzY3JpcHRzaGlmdEdRIjBGJy9JK21zZW1hbnRpY3NHRiRRJ2F0b21pY0YnLUZDNi1RKCZtaW51cztGJ0ZGRkhGS0ZNRk9GUUZTRlUvRlhRLDAuMjIyMjIyMmVtRicvRmVuRl5wLUYsNiVRImJGJ0YvRjJGRi8lLmxpbmV0aGlja25lc3NHUSIxRicvJStkZW5vbWFsaWduR1EnY2VudGVyRicvJSludW1hbGlnbkdGaHAvJSliZXZlbGxlZEdGSkZqby1GOzYoLUYjNiYtRiw2JVEiYUYnRi9GMkZCLUYsNiVRJmFscGhhRicvRjBGSkZGRkYtRiM2LS1JJW1zdXBHRiQ2JUZbby1GIzYlLUkjbW5HRiQ2JFEiMkYnRkYtRkM2LVEifkYnRkZGSEZLRk1GT0ZRRlNGVUZXRlpGRi8lMXN1cGVyc2NyaXB0c2hpZnRHRmZvLUZDNi1RIitGJ0ZGRkhGS0ZNRk9GUUZTRlVGXXBGX3BGX3JGQkZgcEZCRltvRmpvRmNyLUZbcjYlRmBwLUYjNiRGX3JGRkZmckZGRmNwRmZwRmlwRltxLUZDNi1RIixGJ0ZGRkgvRkxGMUZNRk9GUUZTRlVGVy9GZW5RLDAuMzMzMzMzM2VtRidGY3ItRlxvNiZGXm8tRiM2JUZhb0YvRjJGZG9GZ28vJStleGVjdXRhYmxlR0ZKRkZGRkZpc0ZG
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVElZGlmZkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2JC1GIzYoLUYsNiVRIiVGJ0YvRjItSSNtb0dGJDYtUSIsRicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRkUvJSpzeW1tZXRyaWNHRkUvJShsYXJnZW9wR0ZFLyUubW92YWJsZWxpbWl0c0dGRS8lJ2FjY2VudEdGRS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUY+Ni1RIn5GJ0ZBRkMvRkdGRUZIRkpGTEZORlBGUi9GVkZULUklbXN1YkdGJDYmLUYsNiVRIlZGJ0YvRjItRiM2JS1GLDYlUSJtRidGL0YyRi9GMi8lL3N1YnNjcmlwdHNoaWZ0R1EiMEYnL0krbXNlbWFudGljc0dGJFEnYXRvbWljRicvJStleGVjdXRhYmxlR0ZFRkFGQUZob0ZB
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVEmc29sdmVGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2Jy1GNjYmLUYjNjMtSSNtb0dGJDYtUSomdW1pbnVzMDtGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRkYvJSlzdHJldGNoeUdGRi8lKnN5bW1ldHJpY0dGRi8lKGxhcmdlb3BHRkYvJS5tb3ZhYmxlbGltaXRzR0ZGLyUnYWNjZW50R0ZGLyUnbHNwYWNlR1EsMC4yMjIyMjIyZW1GJy8lJ3JzcGFjZUdGVS1JJm1mcmFjR0YkNigtRiM2Ki1GLDYlUSJSRidGL0YyLUY/Ni1RMSZJbnZpc2libGVUaW1lcztGJ0ZCRkRGR0ZJRktGTUZPRlEvRlRRJjAuMGVtRicvRldGXm8tRiw2JVEiVEYnRi9GMi8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GJy8lK2V4ZWN1dGFibGVHRkYvJSlyZWFkb25seUdGMS8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYnRkItSSVtc3VwR0YkNiUtRjY2JC1GIzYqLUklbXN1YkdGJDYmLUYsNiVRIlZGJ0YvRjItRiw2JVEibUYnRi9GMi8lL3N1YnNjcmlwdHNoaWZ0R1EiMEYnL0krbXNlbWFudGljc0dGJFEnYXRvbWljRictRj82LVEoJm1pbnVzO0YnRkJGREZHRklGS0ZNRk9GUUZTRlYtRiw2JVEiYkYnRi9GMkZjb0Zmb0Zob0Zqb0ZCRkItSSNtbkdGJDYkUSIyRidGQi8lMXN1cGVyc2NyaXB0c2hpZnRHRl9xLyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0Zkci8lKWJldmVsbGVkR0ZGLUY/Ni1RJyZwbHVzO0YnRkJGREZHRklGS0ZNRk9GUUZTRlYtRlk2KC1GIzYsLUYsNiVRImFGJ0YvRjJGam4tRiw2JVEoJmFscGhhO0YnL0YwRkZGQkZqbi1GNjYkLUYjNiotRiM2KkZpcUZqbkZkcEZjb0Zmb0Zob0Zqb0ZCRmlyLUYjNipGaXFGam5GZnFGY29GZm9GaG9Gam9GQkZjb0Zmb0Zob0Zqb0ZCRkJGY29GZm9GaG9Gam9GQi1GXnA2JS1GNjYkLUYjNiwtRl5wNiVGZHBGaXFGXXJGaXItRiM2LEZpcUZqbkZkcEZqbkZmcUZjb0Zmb0Zob0Zqb0ZCRmNxLUZecDYlRmZxRmlxRl1yRmNvRmZvRmhvRmpvRkJGQkZpcUZdckZfckZickZlckZnci1GPzYtUSI9RidGQkZERkdGSUZLRk1GT0ZRL0ZUUSwwLjI3Nzc3NzhlbUYnL0ZXRl91LUZqcTYkRl9xRkItRj82LVEiLEYnRkJGRC9GSEYxRklGS0ZNRk9GUUZdby9GV1EsMC4zMzMzMzMzZW1GJy1GPzYtUSJ+RidGQkZERkdGSUZLRk1GT0ZRRl1vRl9vLUZZNigtRiM2LEZpcUZqbkZnbkZqbkZgb0Zjb0Zmb0Zob0Zqb0ZCLUZecDYlRmBwLUZqcTYkUSIzRidGQkZdckZfckZickZlckZnckZjcS1GWTYoLUYjNi5GaXFGam5GYHNGam5GY3NGam4tRl5wNiVGZ3NGaXFGXXJGY29GZm9GaG9Gam9GQi1GXnA2JUZhdEZidkZdckZfckZickZlckZnckZpci1GWTYoLUYjNixGaXFGam5GYHNGam5GY3NGY29GZm9GaG9Gam9GQkZfdEZfckZickZlckZnckZbdUZhdUZmb0ZCRkIvJSVvcGVuR1EifGZyRicvJSZjbG9zZUdRInxockYnRmN1LUY2NiYtRiM2J0Zgc0ZjdUZmcUZmb0ZCRkIvRmJ3USJbRicvRmV3USJdRidGZm9GQkZCRmZvRkI=
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVEmZXZhbGZGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2JS1GLDYlUSIlRidGL0YyLyUrZXhlY3V0YWJsZUdRJmZhbHNlRicvRjNRJ25vcm1hbEYnRkBGPUZA
+
+
+
+
+JSFH
+
+
+
\ No newline at end of file
diff --git a/PR_maple_vertif_MAS.bak b/PR_maple_vertif_MAS.bak
new file mode 100644
index 0000000..c346efc
--- /dev/null
+++ b/PR_maple_vertif_MAS.bak
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzY7LUkjbWlHRiQ2JVEidUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RIn5GJ0Y5RjtGPkZARkJGREZGRkgvRktRJjAuMGVtRicvRk5GUy1JI21uR0YkNiRRIjFGJ0Y5LUY2Ni1RIjtGJ0Y5RjsvRj9GMUZARkJGREZGRkhGUkZNRk8tSSVtc3ViR0YkNiYtRiw2JVEiQ0YnRi9GMi1GIzYlLUYsNiVRInlGJ0YvRjJGL0YyLyUvc3Vic2NyaXB0c2hpZnRHUSIwRicvSSttc2VtYW50aWNzR0YkUSdhdG9taWNGJ0ZPRjUtRlY2JFEkMC40RidGOUZZRk8tRmhuNiZGam4tRiM2JS1GLDYlUSJ6RidGL0YyRi9GMkZib0Zlb0Y1LUZWNiRRJTAuMDdGJ0Y5RllGTy1GLDYlUSJuRidGL0YyRk9GNUZPLUZWNiRRJDAuNUYnRjlGWS8lK2V4ZWN1dGFibGVHRj1GOQ==
+
+
+
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUklbXN1YkdGJDYmLUkjbWlHRiQ2JVEnJiM5NjM7RicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1GIzYlLUYvNiVRInlGJy9GM1EldHJ1ZUYnL0Y2USdpdGFsaWNGJ0Y9Rj8vJS9zdWJzY3JpcHRzaGlmdEdRIjBGJy9JK21zZW1hbnRpY3NHRiRRJ2F0b21pY0YnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGNS8lJmZlbmNlR0Y0LyUqc2VwYXJhdG9yR0Y0LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjQvJShsYXJnZW9wR0Y0LyUubW92YWJsZWxpbWl0c0dGNC8lJ2FjY2VudEdGNC8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRmVuLUklbXN1cEdGJDYlLUkobWZlbmNlZEdGJDYkLUYjNiktSSNtbkdGJDYkUSQwLjVGJ0Y1LUZINi1RJyZzZG90O0YnRjVGS0ZNRk9GUUZTRlVGVy9GWlEmMC4wZW1GJy9GZ25GaG8tRmluNiUtRiw2Ji1GLzYlUSJDRidGPUY/RjhGQUZELUYjNiUtRmFvNiRRIjJGJ0Y1Rj1GPy8lMXN1cGVyc2NyaXB0c2hpZnRHRkNGZG8tRmluNiUtRi82JVEiZEYnRj1GPy1GIzYnRmNwLUZINi1RKCZtaW51cztGJ0Y1RktGTUZPRlFGU0ZVRlcvRlpRLDAuMjIyMjIyMmVtRicvRmduRmNxLUYvNiVRIm5GJ0Y9Rj9GPUY/RmZwLyUrZXhlY3V0YWJsZUdGNEY1RjUtRiM2JUZgb0Y9Rj9GZnBGaHFGNQ==
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2I1EhRictRiM2Ji1JJW1zdWJHRiQ2Ji1GLDYlUSgmc2lnbWE7RicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1GIzYlLUYsNiVRInpGJy9GOFEldHJ1ZUYnL0Y7USdpdGFsaWNGJ0ZCRkQvJS9zdWJzY3JpcHRzaGlmdEdRIjBGJy9JK21zZW1hbnRpY3NHRiRRJ2F0b21pY0YnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGOi8lJmZlbmNlR0Y5LyUqc2VwYXJhdG9yR0Y5LyUpc3RyZXRjaHlHRjkvJSpzeW1tZXRyaWNHRjkvJShsYXJnZW9wR0Y5LyUubW92YWJsZWxpbWl0c0dGOS8lJ2FjY2VudEdGOS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRmpuLUklbXN1cEdGJDYlLUkobWZlbmNlZEdGJDYkLUYjNigtSSNtbkdGJDYkUSQwLjVGJ0Y6LUZNNi1RJyZzZG90O0YnRjpGUEZSRlRGVkZYRlpGZm4vRmluUSYwLjBlbUYnL0Zcb0ZdcC1GXm82JS1GMjYmLUYsNiVRIkNGJ0ZCRkRGPUZGRkktRiM2JC1GZm82JFEiMkYnRjpGOi8lMXN1cGVyc2NyaXB0c2hpZnRHRkhGaW8tRl5vNiUtRiw2JVEiZEYnRkJGRC1GIzYmRmhwLUZNNi1RKCZtaW51cztGJ0Y6RlBGUkZURlZGWEZaRmZuL0ZpblEsMC4yMjIyMjIyZW1GJy9GXG9GaHEtRiw2JVEibkYnRkJGREY6RltxRjpGOi1GIzYkRmVvRjpGW3FGOkYrLyUrZXhlY3V0YWJsZUdGOUY6
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYuLUklbXN1YkdGJDYmLUkjbWlHRiQ2JVEiUEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYlLUkjbW5HRiQ2JFEiMEYnL0Y2USdub3JtYWxGJ0YyRjUvJS9zdWJzY3JpcHRzaGlmdEdGPS9JK21zZW1hbnRpY3NHRiRRJ2F0b21pY0YnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGPi8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGSy8lKXN0cmV0Y2h5R0ZLLyUqc3ltbWV0cmljR0ZLLyUobGFyZ2VvcEdGSy8lLm1vdmFibGVsaW1pdHNHRksvJSdhY2NlbnRHRksvJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZaLUY7NiRRJTEwMDBGJ0Y+LUZGNi1RIjtGJ0Y+RkkvRk1GNEZORlBGUkZURlYvRllRJjAuMGVtRidGZW4tRkY2LVEifkYnRj5GSUZMRk5GUEZSRlRGVkZeby9GZm5GX28tRi82JVEiUkYnRjJGNUZgb0ZFRmBvLUkmbWZyYWNHRiQ2KC1GOzYkUSMyMEYnRj4tRiM2Jy1GOzYkUSMyNEYnRj4tRkY2LVEnJnNkb3Q7RidGPkZJRkxGTkZQRlJGVEZWRl5vRmNvLUY7NiRRJTM2MDBGJ0Y+RjJGNS8lLmxpbmV0aGlja25lc3NHUSIxRicvJStkZW5vbWFsaWduR1EnY2VudGVyRicvJSludW1hbGlnbkdGXXEvJSliZXZlbGxlZEdGSy8lK2V4ZWN1dGFibGVHRktGPg==
+
+
+
+
+
+JSFH
+
+
+
+JSFH
+
+
+
+JSFH
+
+
+
+JSFH
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYzLUklbXN1YkdGJDYmLUkjbWlHRiQ2JVEiRkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYlLUYvNiVRInBGJ0YyRjVGMkY1LyUvc3Vic2NyaXB0c2hpZnRHUSIwRicvSSttc2VtYW50aWNzR0YkUSdhdG9taWNGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnL0Y2USdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGSy8lKXN0cmV0Y2h5R0ZLLyUqc3ltbWV0cmljR0ZLLyUobGFyZ2VvcEdGSy8lLm1vdmFibGVsaW1pdHNHRksvJSdhY2NlbnRHRksvJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZaLUkjbW5HRiQ2JFEkMC41RidGRy1GRDYtUSI7RidGR0ZJL0ZNRjRGTkZQRlJGVEZWL0ZZUSYwLjBlbUYnRmVuLUZENi1RIn5GJ0ZHRklGTEZORlBGUkZURlZGX28vRmZuRmBvLUYsNiZGLi1GIzYlLUYvNiVRImJGJ0YyRjVGMkY1Rj1GQEZDRmduRltvRmFvLUYsNiYtRi82JVEnJiM5NTU7RicvRjNGS0ZHLUYjNiUtRi82JVEibEYnRjJGNUYyRjVGPUZARkMtRmhuNiRRJTEuMTZGJ0ZHLUZENi1RJyZzZG90O0YnRkdGSUZMRk5GUEZSRlRGVkZfb0Zkby1JJW1zdXBHRiQ2JS1GaG42JFEjMTBGJ0ZHLUYjNiYtRkQ2LVEqJnVtaW51czA7RidGR0ZJRkxGTkZQRlJGVEZWL0ZZUSwwLjIyMjIyMjJlbUYnL0ZmbkZpcS1GaG42JFEiOEYnRkdGMkY1LyUxc3VwZXJzY3JpcHRzaGlmdEdGPy8lK2V4ZWN1dGFibGVHRktGRw==
+
+
+
+
+
+
+JSFH
+
+
+
+JSFH
+
+
+
+JSFH
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYvLUklbXN1YkdGJDYmLUkjbWlHRiQ2JVEiUUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYlLUYvNiVRJHRhdUYnL0YzUSZmYWxzZUYnL0Y2USdub3JtYWxGJ0YyRjUvJS9zdWJzY3JpcHRzaGlmdEdRIjBGJy9JK21zZW1hbnRpY3NHRiRRJ2F0b21pY0YnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGPy8lJmZlbmNlR0Y+LyUqc2VwYXJhdG9yR0Y+LyUpc3RyZXRjaHlHRj4vJSpzeW1tZXRyaWNHRj4vJShsYXJnZW9wR0Y+LyUubW92YWJsZWxpbWl0c0dGPi8lJ2FjY2VudEdGPi8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRmVuLUYsNiYtRi82JVEiRkYnRjJGNS1GIzYlLUYvNiVRInBGJ0YyRjVGMkY1RkFGRC1GSDYtUScmc2RvdDtGJ0Y/RktGTUZPRlFGU0ZVRlcvRlpRJjAuMGVtRicvRmduRmZvLUYsNiZGam4tRiM2JS1GLzYlUSJiRidGMkY1RjJGNUZBRkRGYm8tSSZtZnJhY0dGJDYoLUYsNiYtRi82JVEicUYnRjJGNS1GIzYlLUYvNiVRInRGJ0YyRjVGMkY1RkFGRC1GIzYlLUYvNiVRIlBGJ0YyRjVGMkY1LyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0ZmcS8lKWJldmVsbGVkR0Y+RmJvLUZgcDYoLUYsNiYtRi82JVEnJiM5NTU7RidGPUY/LUYjNiUtRi82JVEibEYnRjJGNUYyRjVGQUZELUYjNidGXXItRkg2LVEiK0YnRj9GS0ZNRk9GUUZTRlVGVy9GWlEsMC4yMjIyMjIyZW1GJy9GZ25GXXMtRiw2JkZfci1GIzYlLUYvNiVRInJGJ0YyRjVGMkY1RkFGREYyRjVGYXFGZHFGZ3FGaXFGYm8tSShtZmVuY2VkR0YkNiQtRiM2KC1JI21uR0YkNiRGY3FGPy1GSDYtUSgmbWludXM7RidGP0ZLRk1GT0ZRRlNGVUZXRlxzRl5zLUYvNiVRJGV4cEYnRj1GPy1GZ3M2JC1GIzYoLUZINi1RKiZ1bWludXMwO0YnRj9GS0ZNRk9GUUZTRlVGV0Zcc0Zecy1GZ3M2JC1GIzYnRl1yRmlyRl9zLyUrZXhlY3V0YWJsZUdGPkY/Rj9GYm9GOkZfdUY/Rj9GX3VGP0Y/Rl91Rj8=
+
+
+
+
+JSFH
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUklbXN1YkdGJDYmLUkjbWlHRiQ2JVEiQUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GLzYlUSR0YXVGJy9GM1EmZmFsc2VGJy9GNlEnbm9ybWFsRicvJS9zdWJzY3JpcHRzaGlmdEdRIjBGJy9JK21zZW1hbnRpY3NHRiRRJ2F0b21pY0YnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RidGPS8lJmZlbmNlR0Y8LyUqc2VwYXJhdG9yR0Y8LyUpc3RyZXRjaHlHRjwvJSpzeW1tZXRyaWNHRjwvJShsYXJnZW9wR0Y8LyUubW92YWJsZWxpbWl0c0dGPC8lJ2FjY2VudEdGPC8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRlktSSZtZnJhY0dGJDYoLUYjNigtRi82JVEiUkYnRjJGNS1GRjYtUScmc2RvdDtGJ0Y9RklGS0ZNRk9GUUZTRlUvRlhRJjAuMGVtRicvRmVuRmJvLUYsNiYtRi82JVEiUUYnRjJGNUY4Rj9GQkZeby1GLDYmLUYvNiVRIlBGJ0YyRjUtRi82JUZBRjJGNUY/RkJGPS1GIzYqLUYvNiVRI3BpRidGO0Y9Rl5vLUYvNiVRInVGJ0YyRjVGXm8tRiw2Ji1GLzYlUSgmc2lnbWE7RidGO0Y9LUYvNiVRInlGJ0YyRjVGP0ZCRl5vLUYsNiZGanAtRi82JVEiekYnRjJGNUY/RkJGPS8lLmxpbmV0aGlja25lc3NHUSIxRicvJStkZW5vbWFsaWduR1EnY2VudGVyRicvJSludW1hbGlnbkdGanEvJSliZXZlbGxlZEdGPC1GLzYjUSFGJy8lK2V4ZWN1dGFibGVHRjxGPQ==
+
+
+
+
+JSFH
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYzLUkjbWlHRiQ2JVEnRG9zYWdlRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEifkYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZMLUY2Ni1RKiZjb2xvbmVxO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZTRjUtSSZtZnJhY0dGJDYoLUYjNictSSNtbkdGJDYkUSU4LjU0RidGOS1GNjYtUScmc2RvdDtGJ0Y5RjtGPkZARkJGREZGRkhGSkZNLUklbXN1cEdGJDYlLUZlbjYkUSMxMEYnRjktRiM2JS1GZW42JFEiMkYnRjlGL0YyLyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJy8lK2V4ZWN1dGFibGVHRj1GOS1GIzYlLUYsNiVRIm1GJ0YvRjJGL0YyLyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0ZlcC8lKWJldmVsbGVkR0Y9RmhuLUklbXN1YkdGJDYmLUYsNiVRIkFGJ0YvRjItRiM2JS1GLDYlUSR0YXVGJy9GMEY9RjlGL0YyLyUvc3Vic2NyaXB0c2hpZnRHRmhvL0krbXNlbWFudGljc0dGJFEnYXRvbWljRidGaG4tRiw2JVEkZl9hRidGL0YyRmhuLUZbcTYmLUYsNiVRIkVGJ0YvRjItRiM2JS1GLDYlUSRlZmZGJ0YvRjJGL0YyRmZxRmhxRmhuLUZbcTYmLUYsNiVRIlRGJ0YvRjItRiM2JS1GLDYlUSJlRidGL0YyRi9GMkZmcUZocUZobi1JKG1mZW5jZWRHRiQ2JC1GIzYoLUZlbjYkRmJwRjktRjY2LVEoJm1pbnVzO0YnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yMjIyMjIyZW1GJy9GTkZddC1GLDYlUSRleHBGJ0ZlcUY5LUZjczYkLUYjNiYtRjY2LVEqJnVtaW51czA7RidGOUY7Rj5GQEZCRkRGRkZIRlx0Rl50LUZWNigtRiM2Jy1GZW42JFEmMC42OTNGJ0Y5RmhuRmpyRmlvRjktRiM2JUZockYvRjJGYHBGY3BGZnBGaHBGaW9GOUY5RmlvRjlGOUZpb0Y5
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2JVEnRG9zYWdlRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLyUrZXhlY3V0YWJsZUdRJmZhbHNlRicvRjNRJ25vcm1hbEYn
+
+
+
+
+JSFH
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbW5HRiQ2JFElMC4wMUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1JI21vR0YkNi1RJyZzZG90O0YnRi8vJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRjgvJSlzdHJldGNoeUdGOC8lKnN5bW1ldHJpY0dGOC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGRy1GLDYkUSkxLjYwOTM0NEYnRi9GMi1JJW1zdXBHRiQ2JS1JKG1mZW5jZWRHRiQ2JC1GIzYnLUYsNiRRJTMwMDBGJ0YvRjItRiw2JFElMTAwMEYnRi8vJStleGVjdXRhYmxlR0Y4Ri9GLy1GIzYlLUYsNiRRJDAuNUYnRi8vJSdpdGFsaWNHUSV0cnVlRicvRjBRJ2l0YWxpY0YnLyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJ0ZlbkYv
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkmbWZyYWNHRiQ2KC1JI21uR0YkNiRRIjFGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictRiM2Ji1JI21pR0YkNiVRJXNxcnRGJy8lJ2l0YWxpY0dRJmZhbHNlRidGMi1JKG1mZW5jZWRHRiQ2JC1GIzYlLUYvNiRRJTEwMDBGJ0YyL0Y8USV0cnVlRicvRjNRJ2l0YWxpY0YnRjJGRkZILyUubGluZXRoaWNrbmVzc0dGMS8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0ZOLyUpYmV2ZWxsZWRHRj0tRjg2I1EhRicvJStleGVjdXRhYmxlR0Y9RjI=
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVEmZXZhbGZGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2JS1GLDYlUSIlRidGL0YyLyUrZXhlY3V0YWJsZUdRJmZhbHNlRicvRjNRJ25vcm1hbEYnRkBGPUZA
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVElc3FydEYnLyUnaXRhbGljR1EmZmFsc2VGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictSShtZmVuY2VkR0YkNiQtRiM2JS1JI21uR0YkNiRRJDEwMEYnRjIvJStleGVjdXRhYmxlR0YxRjJGMkY+RjI=
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbW5HRiQ2JFEnMC4zMTYyRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLUkjbW9HRiQ2LVEnJnNkb3Q7RidGLy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGOC8lKXN0cmV0Y2h5R0Y4LyUqc3ltbWV0cmljR0Y4LyUobGFyZ2VvcEdGOC8lLm1vdmFibGVsaW1pdHNHRjgvJSdhY2NlbnRHRjgvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZHLUkjbWlHRiQ2JVElc3FydEYnLyUnaXRhbGljR0Y4Ri8tSShtZmVuY2VkR0YkNiQtRiM2JS1GLDYkUSQxMDBGJ0YvLyUrZXhlY3V0YWJsZUdGOEYvRi9GWEYv
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkmbWZyYWNHRiQ2KC1JI21uR0YkNiRRIjFGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictRiM2Ji1JI21pR0YkNiVRJXNxcnRGJy8lJ2l0YWxpY0dRJmZhbHNlRidGMi1JKG1mZW5jZWRHRiQ2JC1GIzYlLUYvNiRRJTEwMDBGJ0YyL0Y8USV0cnVlRicvRjNRJ2l0YWxpY0YnRjJGRkZILyUubGluZXRoaWNrbmVzc0dGMS8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0ZOLyUpYmV2ZWxsZWRHRj0tSSNtb0dGJDYtUScmc2RvdDtGJ0YyLyUmZmVuY2VHRj0vJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGYW9GNy1GPzYkLUYjNiUtRi82JFEkMTAwRidGMi8lK2V4ZWN1dGFibGVHRj1GMkYyRltwRjI=
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVElZXZhbEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2JC1GIzYnLUYsNiVRIiVGJ0YvRjItSSNtb0dGJDYtUSIsRicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0YxLyUpc3RyZXRjaHlHRkUvJSpzeW1tZXRyaWNHRkUvJShsYXJnZW9wR0ZFLyUubW92YWJsZWxpbWl0c0dGRS8lJ2FjY2VudEdGRS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUkjbW5HRiQ2JFEkMTAwRidGQS8lK2V4ZWN1dGFibGVHRkVGQUZBRmZuRkE=
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVEmZXZhbGZGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2JS1JJm1mcmFjR0YkNigtRiM2Ji1GLDYlUSVzcXJ0RicvRjBRJmZhbHNlRicvRjNRJ25vcm1hbEYnLUY2NiQtRiM2JS1JI21uR0YkNiRRIzEwRidGRC8lK2V4ZWN1dGFibGVHRkNGREZERk5GRC1GIzYlRkpGL0YyLyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0ZXLyUpYmV2ZWxsZWRHRkNGTkZERkRGTkZE
+
+
+
+
+LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUklbXN1cEdGJDYlLUkobWZlbmNlZEdGJDYkLUYjNiUtSSZtZnJhY0dGJDYoLUkjbW5HRiQ2JFEiMUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1GIzYlLUY3NiRRIzEwRidGOi8lJ2l0YWxpY0dRJXRydWVGJy9GO1EnaXRhbGljRicvJS5saW5ldGhpY2tuZXNzR0Y5LyUrZGVub21hbGlnbkdRJ2NlbnRlckYnLyUpbnVtYWxpZ25HRksvJSliZXZlbGxlZEdRJmZhbHNlRicvJStleGVjdXRhYmxlR0ZQRjpGOi1GIzYlLUY0NihGNi1GIzYlLUY3NiRRJDEuNUYnRjpGQkZFRkdGSUZMRk5GQkZFLyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJ0ZRRjo=
+
+
+
+
+JSFH
+
+
+
\ No newline at end of file
diff --git a/Vizualization_data.py b/Vizualization_data.py
new file mode 100644
index 0000000..77039d1
--- /dev/null
+++ b/Vizualization_data.py
@@ -0,0 +1,52 @@
+thon# -*- coding: utf-8 -*-
+"""
+Created on Fri May 24 15:20:18 2019
+
+@author: jarl
+"""
+
+from matplotlib import pyplot as plt
+
+import numpy as np
+
+from sympy import Symbol
+
+import os
+
+import re
+
+import json
+
+PC_dir = './DB/Pure Component Properties (Several Properties)'
+
+json_df = {}
+T_c = []
+P_c = []
+V_m_c = []
+R = 8.314
+Z_c = 0.307401 # Symbol('Z_c')
+
+for fileName in os.listdir(PC_dir):
+ if fileName[-5:] == '.json':
+ #json_files.append(fileName)
+ pf = open(PC_dir + '//' + fileName, 'r')
+ json_df.update( {fileName[:-5] : json.load(pf) } )
+ pf.close()
+
+
+for key in json_df.keys():
+ content = json_df[key]
+ for prop in content.keys():
+ if prop == 'Critical Data':
+ for i in range(len(content[prop]['T [K]'])):
+ if ( re.match( '\d' , content[prop]['T [K]'][i]) and re.match( '\d' , content[prop]['P [kPa]'][i]) ):
+ T_c.append( float( content[prop]['T [K]'][i] ) )
+ P_c.append( float( content[prop]['P [kPa]'][i]) )
+ V_m_c.append( Z_c *R * T_c[-1] / P_c[-1] )
+ if prop == "Vapor Pressure" :
+ np.interp(0.7*)
+
+plt.figure()
+plt.scatter(P_c, T_c)
+
+
diff --git a/chemical_rate.py b/chemical_rate.py
new file mode 100644
index 0000000..aeccaab
--- /dev/null
+++ b/chemical_rate.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Jun 4 00:11:44 2019
+
+@author: jarl
+"""
+
+from sympy import Eq, Symbol, symbols, solve, nsolve, diff, exp, init_printing
+
+
+init_printing()
+
+kappa, k_B, T, h, DeltaG_react, R = symbols('kappa k_B T hbar DeltaG_react R')
+
+
+k = kappa*k_B*T/h*exp(-DeltaG_react/R/T)
+
+
+
+
diff --git a/downloader.py b/downloader.py
index e252cb6..294d253 100644
--- a/downloader.py
+++ b/downloader.py
@@ -4,6 +4,7 @@
import re
import time
import pdb
+import json
Head = testScrape.DDBST_DB_free(0)
@@ -41,10 +42,12 @@ def PCP_dwnld(verbose):
table.append(table_temp)
elif ChemName != Chem_n:
- createFile(ChemName+'_'+CAS_cur+'.tsv',dir_name,table,'\t')
+
+ createFile(str(ChemName)+'_'+str(CAS_cur)+'.tsv',dir_name,table,'\t')
+ createJsonFile(str(ChemName)+'_'+str(CAS_cur)+'.json',dir_name,table )
if verbose:
- print 'Pure component propeties downloaded: ' + ChemName + '; CAS: ' + CAS_cur
- print 'Compnent #' + str(subsNum) + ' of ' + Head[1][-1]
+ print ('Pure component propeties downloaded: ' + str(ChemName) + '; CAS: ' + str(CAS_cur) )
+ print ('Compnent #' + str(subsNum) + ' of ' + str(Head[1][-1] ))
subsNum += 1
@@ -60,8 +63,8 @@ def PCP_dwnld(verbose):
continue
# save the last entry
- createFile(ChemName+'_'+CAS_cur+'.tsv',dir_name,table,'\t')
-
+ createFile(str(ChemName)+'_'+str(CAS_cur)+'.tsv',dir_name,table,'\t')
+ createJsonFile(str(ChemName)+'_'+str(CAS_cur)+'.json',dir_name,table)
#return table
def createFile(fileName, filePath, contentMat, sepStr):
@@ -71,7 +74,8 @@ def createFile(fileName, filePath, contentMat, sepStr):
dirSplit = re.split('/',filePath)
lc = './'
for loc in dirSplit:
- dirLst = os.walk(lc).next()[1]
+ os.walk(lc)
+ dirLst = os.walk(lc).send(None)[1]
pathExsits = False
@@ -109,10 +113,367 @@ def createFile(fileName, filePath, contentMat, sepStr):
except:
fileStream.write('SOME_ERROR_OCCOURED_HERE'+sepStr)
- print 'createFile: error at writing file'
+ print ('createFile: error at writing file' )
fileStream.write('\n')
fileStream.close()
+
+def createJsonFile(fileName, filePath, contentMat):
+ # Task 1: create relevant directories for the intended path
+
+ dirSplit = re.split('/',filePath)
+ lc = './'
+ for loc in dirSplit:
+ os.walk(lc)
+ dirLst = os.walk(lc).send(None)[1]
+
+ pathExsits = False
+
+ for actDirs in dirLst:
+ if actDirs == loc:
+ pathExsits = True # path exsits
+ else:
+ continue
+
+ if pathExsits:
+ lc += loc +'/'
+ #elif pathExsits == False:
+ else:
+ lc += loc + '/'
+ try:
+ os.mkdir(lc)
+ except:
+ #print 'directory exists!'
+ #print 'loc = ' + loc
+ #print 'actDirs = ' + actDirs + '\n\n'
+ []
+ # Task 2 : export json structure to file
+ fileStream = open(filePath + '/' + fileName, 'w')
+ json_dict = {}
+ l = 1
+
+ if (contentMat[0][0][0] == 'Formula'): # i.e. pure substance data
+ for i in range(len(contentMat[0][0])):
+ json_dict.update({contentMat[0][0][i]: contentMat[0][1][i] })
+
+ for j in range (len(contentMat)):
+ temp_keys = []
+ temp_values = []
+ if (contentMat[j][0][0][0:3] == '$$$'):
+ main_key = contentMat[j][0][0][3:]
+ for k in range(len(contentMat[j+1][0])):
+ temp_keys.append( contentMat[j+1][0][k])
+ temp_values.append([])
+ l = 1
+ while (contentMat[j+1][l][0] != 'Number'):
+ temp_values[k].append( contentMat[j+1][l][k] )
+ l += 1
+
+ # find the references...
+ temp_keys.append('Reference')
+ temp_values.append([])
+ for p in range(l+1, len(contentMat[j+1])):
+ temp_values[-1].append([contentMat[j+1][p][0], contentMat[j+1][p][1] ])
+
+
+ temp_dict = {}
+ for u in range(len(temp_keys)):
+ temp_dict.update({ temp_keys[u] : temp_values[u] })
+ json_dict.update({main_key: temp_dict})
+
+ else:
+ continue
+
+
+
+
+ elif (contentMat[0][0][0][0:3] == '$$$' ): # i.e. we have mixture data
+ ## copy pased code :::
+ temp_keys = []
+ temp_values = []
+ temp_dict = {}
+ temp_dict2 = {}
+ i = 0
+ DatasetName_index = []
+ Component_header_index = []
+ Component_index = []
+ Constants_index = []
+ Table_head_index = []
+ Table_data_index = []
+ Author_index = []
+ #Constant_regex_pat = re.compile('[a-zA-Z]+')
+ #Table_head_regpat = re.compile('[a-z]{1, 99}\[[a-z]{1, 99}\]')
+# while ( i < len(contentMat[0])):
+# if (contentMat[0][i][0][:3] == '$$$'):
+# main_key = contentMat[0][0][0][3:]
+# i += 1
+# elif (contentMat[0][i][0] == 'No.'):
+# for j in range(len(contentMat[0][i])):
+# k=i + 1
+# temp_keys.append( contentMat[0][i][j])
+# temp_values
+# try:
+# while ( k < len(contentMat[0]) and int ( contentMat[0][k][0] ) > 0 ):
+# temp_values.append(contentMat[0][k][j])
+# k += 1
+# except:
+# ## component list is finished...
+#
+# temp_dict.update({temp_keys[0] : temp_values})
+#
+# temp_keys = []
+# temp_values = []
+# #while ( k < len(contentMat[0]) and int ( contentMat[0][k][0] ) ):
+# temp_dict2.update({'Components' : temp_dict })
+ ## extract constant values:
+
+ dataset_key = ''
+ dataset = {}
+ Source_set = []
+
+ Num_datadict = {}
+ Num_datadict_keys = []
+ Num_datadict_values = []
+
+ Mix_params_dict = {}
+ Mix_params_keys = []
+ Mix_params_values = []
+
+ const_dict = {}
+ const_keys = []
+ const_values = []
+
+
+ data_set_name = ''
+
+
+ for i in range(len(contentMat)):
+ for j in range(len(contentMat[i])):
+ if ( contentMat[i][j][0][0:3] == '$$$'): # find the title of the dataset
+ DatasetName_index.append([i, j])
+
+
+ if ( j > 0 or i > 0):
+ # update the json dict of previous data
+ for k in range(len(Mix_params_keys)):
+ Mix_params_dict.update({Mix_params_keys[k] : Mix_params_values[k] })
+
+ for k in range(len(const_keys)):
+ const_dict.update({const_keys[k]: const_values[k]})
+
+ for k in range(len(Num_datadict_keys)):
+ Num_datadict.update({Num_datadict_keys[k] : Num_datadict_values[k] })
+
+ if (len(Num_datadict_keys) < 0.1):
+ print("no datadict keys!")
+
+
+ dataset.update({"Constants": const_dict})
+ dataset.update({"Components": Mix_params_dict})
+ dataset.update({"Table": Num_datadict })
+ dataset.update({'Source' : Source_set})
+
+
+ json_dict.update({data_set_name : dataset})
+
+ # rinse and repeat :)
+ dataset = {}
+ Num_datadict = {}
+ Num_datadict_keys = []
+ Num_datadict_values = []
+
+ Mix_params_dict = {}
+ Mix_params_keys = []
+ Mix_params_values = []
+
+ const_dict = {}
+ const_keys = []
+ const_values = []
+
+
+
+
+
+ data_set_name = contentMat[i][j][0][3:]
+
+ else:
+ data_set_name = contentMat[i][j][0][3:]
+
+
+ elif(contentMat[i][j][0] == 'No.' and re.match( '\d{1,3}', contentMat[i][j+1][0] ) ): # find header of the component list
+ Component_header_index.append([i, j])
+ for k in range( len( contentMat[i][j])):
+ Mix_params_values.append([])
+ Mix_params_keys.append(contentMat[i][j][k])
+ elif( len( contentMat[i][j]) == 5 and re.match('^[a-zA-Z]', contentMat[i][j][1] ) and not re.match('^[a-zA-Z]{1,4}\d{0,2} \[.*?\]$', contentMat[i][j][0] ) ): # find component list entries
+ if( re.match('^\d', contentMat[i][j][2] ) and re.match('^\d{1,5}-\d{1,5}-\d{1,5}$', contentMat[i][j][3] ) ):
+ Component_index.append([i, j])
+ #Mix_params_keys.append(contentMat[i][j][0])
+ for k in range( len( contentMat[i][j])):
+ Mix_params_values[k].append(contentMat[i][j][k])
+
+
+
+
+
+ elif ( re.match( '^[a-zA-Z]{4,99}', contentMat[i][j][0] ) and len(contentMat[i][j]) == 3 and re.match( '^\d{0,99}.\d{0,99}', contentMat[i][j][1] ) and not re.match("\[", contentMat[i][j][0]) and contentMat[i][j][0] != 'Excess Volume [cm3/mol]' and contentMat[i][j][0] != 'Density [g/cm3]' ): # find contant value for the dataset:
+ if contentMat[i][j][1] != '':
+ #Constants_index.append([i, j])
+ const_keys.append(contentMat[i][j][0])
+ const_values.append(contentMat[i][j][1:])
+
+ elif ( re.match('[a-zA-Z]{1,25}\d{0,2} \[.*?\]$', contentMat[i][j][0] ) or contentMat[i][j][0] == 'Excess Heat Capacity [J/mol*K]' or contentMat[i][j][0] == 'Heat Capacity [J/mol*K]' or contentMat[i][j][0] == 'Excess Volume [cm3/mol]' or contentMat[i][j][0] == 'Excess Volume [cm3/mol]' ): #elif ( re.match( '^[a-zA-Z]{0,99} \[[a-zA-Z]{0,99}\]$' , contentMat[i][j][0] ) ): # find table heading
+ # the table headings
+ Table_head_index.append([i, j])
+ for k in range(len(contentMat[i][j])):
+ Num_datadict_keys.append(contentMat[i][j][k])
+ #Num_datadict.update({Num_datadict_keys , []})
+ Num_datadict_values.append([])
+ elif ( len(contentMat[i][j]) == len(Num_datadict_keys) and not re.match('^Source$' , contentMat[i][j][0]) ): #elif ( re.match( '^\d{0,9}.\d{0,9}$' , contentMat[i][j][0] ) or contentMat[i][j][0] == '^' ): # find numerical table entries
+ Table_data_index.append([i, j])
+ for k in range(len(Num_datadict_keys)):
+ #Num_datadict.update({ Num_datadict_keys[k] : Num_datadict[ Num_datadict_keys[k] ].append(contentMat[i][j][k]) } )
+ Num_datadict_values[k].append(contentMat[i][j][k])
+ elif (re.match('^Source$' , contentMat[i][j][0]) ):
+ Author_index.append([i, j])
+ elif (re.match('^[a-zA-Z]{1,999999}', contentMat[i][j][0]) and len(contentMat[i][j][0]) > 23 ):
+ Source_set.append(contentMat[i][j][0])
+
+
+ # save the last entries
+ for k in range(len(Mix_params_keys)):
+ Mix_params_dict.update({Mix_params_keys[k] : Mix_params_values[k] })
+
+ for k in range(len(const_keys)):
+ const_dict.update({const_keys[k]: const_values[k]})
+
+ for k in range(len(Num_datadict_keys)):
+ Num_datadict.update({Num_datadict_keys[k] : Num_datadict_values[k] })
+
+ if (len(Num_datadict_keys) < 0.1):
+ print("no datadict keys!")
+ #if (len(Num_datadict_values[0]) < 0.1):
+ # print("no values??")
+
+ dataset.update({"Constants": const_dict})
+ dataset.update({"Components": Mix_params_dict})
+ dataset.update({"Table": Num_datadict })
+ dataset.update({'Source' : Source_set})
+
+
+
+ json_dict.update({data_set_name : dataset})
+
+ elif (contentMat[0][0][0][0:3] == 'No.' ): # i.e. we have mixture data
+ ## copy pased code :::
+ temp_keys = []
+ temp_values = []
+ temp_dict = {}
+ temp_dict2 = {}
+ i = 0
+ DatasetName_index = []
+ Component_header_index = []
+ Component_index = []
+ Constants_index = []
+ Table_head_index = []
+ Table_data_index = []
+ Author_index = []
+
+ dataset_key = ''
+ dataset = {}
+ Source_set = []
+
+ Num_datadict = {}
+ Num_datadict_keys = []
+ Num_datadict_values = []
+
+ Mix_params_dict = {}
+ Mix_params_keys = []
+ Mix_params_values = []
+
+ const_dict = {}
+ const_keys = []
+ const_values = []
+
+
+ data_set_name = ''
+
+
+ for i in range(len(contentMat)):
+ for j in range(len(contentMat[i])):
+ if(contentMat[i][j][0] == 'No.' and re.match( '\d{1,3}', contentMat[i][j+1][0] ) ): # find header of the component list
+ Component_header_index.append([i, j])
+ for k in range( len( contentMat[i][j])):
+ Mix_params_values.append([])
+ Mix_params_keys.append(contentMat[i][j][k])
+ elif( len( contentMat[i][j]) == 5 and re.match('^[a-zA-Z]', contentMat[i][j][1] ) and not re.match('^[a-zA-Z]{1,4}\d{0,2} \[.*?\]$', contentMat[i][j][0] ) ): # find component list entries
+ if( re.match('^\d', contentMat[i][j][2] ) and re.match('^\d{1,5}-\d{1,5}-\d{1,5}$', contentMat[i][j][3] ) ):
+ Component_index.append([i, j])
+ #Mix_params_keys.append(contentMat[i][j][0])
+ for k in range( len( contentMat[i][j])):
+ Mix_params_values[k].append(contentMat[i][j][k])
+
+
+
+
+
+ elif ( re.match( '^[a-zA-Z]{4,99}', contentMat[i][j][0] ) and len(contentMat[i][j]) == 3 and re.match( '^\d{0,99}.\d{0,99}', contentMat[i][j][1] ) ): # find contant value for the dataset:
+ if contentMat[i][j][1] != '':
+ #Constants_index.append([i, j])
+ const_keys.append(contentMat[i][j][0])
+ const_values.append(contentMat[i][j][1:])
+
+ elif ( re.match('^[a-zA-Z]{1,90}\d{0,2} \[.*?\]$', contentMat[i][j][0] ) or contentMat[i][j][0] == "Azeotropic Type" ): #elif ( re.match( '^[a-zA-Z]{0,99} \[[a-zA-Z]{0,99}\]$' , contentMat[i][j][0] ) ): # find table heading
+ # the table headings
+ Table_head_index.append([i, j])
+ for k in range(len(contentMat[i][j])):
+ Num_datadict_keys.append(contentMat[i][j][k])
+ #Num_datadict.update({Num_datadict_keys , []})
+ Num_datadict_values.append([])
+ elif ( len(contentMat[i][j]) == len(Num_datadict_keys) and not re.match('^Source$' , contentMat[i][j][0]) ): #elif ( re.match( '^\d{0,9}.\d{0,9}$' , contentMat[i][j][0] ) or contentMat[i][j][0] == '^' ): # find numerical table entries
+ Table_data_index.append([i, j])
+ for k in range(len(Num_datadict_keys)):
+ #Num_datadict.update({ Num_datadict_keys[k] : Num_datadict[ Num_datadict_keys[k] ].append(contentMat[i][j][k]) } )
+ Num_datadict_values[k].append(contentMat[i][j][k])
+ elif (re.match('^Source$' , contentMat[i][j][0]) ):
+ Author_index.append([i, j])
+ elif (re.match('^[a-zA-Z]{1,999999}', contentMat[i][j][0]) and len(contentMat[i][j][0]) > 23 ):
+ Source_set.append(contentMat[i][j][0])
+
+
+ # save the last entries
+ for k in range(len(Mix_params_keys)):
+ Mix_params_dict.update({Mix_params_keys[k] : Mix_params_values[k] })
+
+ for k in range(len(const_keys)):
+ const_dict.update({const_keys[k]: const_values[k]})
+
+ for k in range(len(Num_datadict_keys)):
+ Num_datadict.update({Num_datadict_keys[k] : Num_datadict_values[k] })
+
+ if (len(Num_datadict_keys) < 0.1):
+ print("no datadict keys!")
+ #if (len(Num_datadict_values[0]) < 0.1):
+ # print("no values??")
+
+ dataset.update({"Constants": const_dict})
+ dataset.update({"Components": Mix_params_dict})
+ dataset.update({"Table": Num_datadict })
+ dataset.update({'Source' : Source_set})
+
+
+ json_dict = dataset
+
+
+
+
+ #json.load
+ #json.
+ #json.dump(json_dict, fileStream)
+ fileStream.write(json.dumps(json_dict, indent=4, sort_keys=True) )
+
+
+ fileStream.close()
def mixPropDB_dwnld(url, name, verbose):
DB_elems = testScrape.DB(url)
@@ -129,8 +490,8 @@ def mixPropDB_dwnld(url, name, verbose):
try:
content = testScrape.DDBST_table(url)
except:
- print 'Some error occured for url: ' + url + ' \n broken???'
- print 'Skipped ' + str(counter) + ' of ' + str(total_elems) + ' element'
+ print ('Some error occured for url: ' + url + ' \n broken???')
+ print ('Skipped ' + str(counter) + ' of ' + str(total_elems) + ' element')
counter += 1
continue
@@ -152,19 +513,18 @@ def mixPropDB_dwnld(url, name, verbose):
inter += 1
- fileTitle += '.tsv'
-
- createFile(fileTitle, path, [content], '\t')
+ createFile(fileTitle + '.tsv', path, [content], '\t')
+ createJsonFile(fileTitle + '.json', path, [content])
if verbose:
- print 'Status of Database: ' + name
- print str(counter) + ' of ' + str(total_elems) + ' items downloaded'
+ print ('Status of Database: ' + name)
+ print (str(counter) + ' of ' + str(total_elems) + ' items downloaded')
counter += 1
#time.sleep(10)
def AllDB_dwnl(verbose):
- for line in Head[2:-1]:
+ for line in Head[2:-1]:#Head[2:-1]:
urlIndex = line[0]; curDir = line[1]
if len(urlIndex) == 2:
DB_names = [line[2], line[3]]
@@ -198,9 +558,9 @@ def slimDB(DBelements):
def main(verbose):
- PCP_dwnld(verbose)
+ #PCP_dwnld(verbose)
AllDB_dwnl(verbose)
- print 'DDBST free database downloaded to ./DB'
+ print ('DDBST free database downloaded to ./DB')
if __name__ == '__main__':
diff --git a/testScrape.py b/testScrape.py
index 6d3c0fb..e07988d 100644
--- a/testScrape.py
+++ b/testScrape.py
@@ -1,6 +1,4 @@
-import urllib2
import requests
-
import re
from bs4 import BeautifulSoup
@@ -23,6 +21,7 @@ def DDBST_table(DDBST_url):
soup = BeautifulSoup(page, 'html.parser')
tab = []
+ soup.getText
for rel_item in soup.find_all(['table','h3']):
if re.search('Data Set',rel_item.get_text() ):
tab.append(['$$$'+rel_item.get_text()] )
@@ -36,10 +35,14 @@ def DDBST_table(DDBST_url):
for elem in line.find_all(['th','td']):
# string without whitespace before of after characters
# added utf-8 formating to include unusual letters i.e. german letters ect..
- item = elem.get_text().strip().encode('utf-8')
+ item = elem.get_text().strip('\t').strip(' ')
+
try:
- fetchline.append(item)
+ if (item != '\xa0'):
+ fetchline.append(item)
+ else:
+ fetchline.append('')
except:
fetchline.append('PARSING_ERROR_HERE')
@@ -49,7 +52,7 @@ def DDBST_table(DDBST_url):
return tab
def DDBST_DB_free(prnt):
- page = urllib2.urlopen(page_main)
+ page = requests.get(page_main).text
soup = BeautifulSoup(page, 'html.parser')
tab = soup.find_all('table')[0]
res = ['url']
@@ -66,7 +69,7 @@ def DDBST_DB_free(prnt):
qlist = [li]
for elem in line.find_all(['a','td','th']):
- qlist.append( elem.get_text() )
+ qlist.append( str( elem.get_text() ) )
res.append(qlist)
# end for
@@ -79,7 +82,7 @@ def DDBST_DB_free(prnt):
def All_links(url):
''' fetches all possible urls from href tags'''
- page = urllib2.urlopen(url)
+ page = requests.get(url).text
soup = BeautifulSoup(page, 'html.parser')
h = []
for link in soup.find_all('a'):
@@ -102,8 +105,8 @@ def DB(DDBST_url):
ret_elem = []
for link in soup.find_all('p')[3:-1]:
#pdb.set_trace()
- header = link.find('a').get('href')
- name = link.find('a').getText()
+ header = str( link.find('a').get('href') )
+ name = str ( link.find('a').getText() )
#wspace_iter = [m.start(0) for m in re.finditer(' ', header)]
#if wspace_iter: