mongodb远程服务器连接

mongo -uroot -p321 master.puppet.org:27017/admin

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABCCAIAAABilny8AAAgAElEQVR4nO1dd1wU1/a/M9hNMYktMU9jT1R6ExDBTrEhVlCjdKXD0nuzoCBNNIGYxBjzIthBOkvvKN0GLNUGbC+zZWZ/f8wu7MIumvbeS36cz/dzc+bOndvmfuece+5igHBCJkSOYEIhho0G+m4Y+yCGCQWoFPg4BEIeH+PyUYTLp9GZFCoNB5lCpdIYPD46XHL4QRTDH8c4HC6dwWKzET4fxRvljyks+ZTMXuHDRMd0Tx74AowvwASoUCDABAKMxxfwBSiPz+cgXAaTxWAyaTQag8nkIFwmm41wuQiXi6IohmEckSAMBoNKpVIoFBabxWAxwX/7RU/I/67IJOG78FD2Wh+zyhGugMni0BlsGp1Fo7NodCaVRh8mIQ4miyNa8WLwBBiXJ0C4fA7CY7ERDsITCLDhdt9CQjkjEg0KFaLvRkIBKuQLhHwByuMJeDw+l8dHuFwWi81gMBAOwuXxmEwWi82m0mhUGo3JYvN4PKFQyONxmUwmh8ulUKkMJoPH43EQhEKhTJBwQuTKW5asHELKe2QUCfmokMdHcToxmGwqjYFjFAkpVBqNzmAw2UwWwmJzWWyEzeEiXD5uIce2Pg55xu/bu5NQIDaDfAHKYnNYbA6bw6HTGRQKlcvjcXk8NpvDYrNZbA6ZQqHSaBwOwucLhEIhbgwZTObg0NDg0CCVRmMwmeOSkEgA4wmB+B9bC39MSKlGRqmkcYsQCbIHRCSMziUSgMzKJBshEiQeIqUaSVYx+nnZnZM/9XJHMrarckqNU2xMZwoJgFA4Zr2SUrcCoxTSeFZR+hFSylZCoSxLKECJnoCQjwp5gkIXGaN1yaDSKBQaJcMFuGQxWRyEy+cLsHxP4FkoRDEhWkDYmkIa1e4fJ+E4GFUhjy/gcBAWm0NnMgeGhobIZCaLSaPTGUwmi8VmMJlUGm1oaIjFYiEIwuVyhUIhn8en0+lUKpVMJrNYLBabzWSxxiXhyPsa9X7e7ZX/hSJ7NUksXqNUkoylLKvTpFQjAAgE2ctzLOlkD11qfkaIN3pZj354FEXHb0MoJBL+IAnx0copONJZIgEQiJgcEhaO+3H2HFOelGK0NYUkWuhySChAiR7AM5uN0EYsYYYzcLlPodIZzOeXt3oWjDCtwBOILgtHSChlbCW6uPVb0ggJx+Xh6E+JiHWYAMUkSYiK6cfl8VlsDpVGo9HpA4M4A1kIglAoFBqNzmSxGUwWm4Ow2WwOB+HyeGwOh8PhsNlsKpXKZrOYTCaHgzAYTCqN9r9IQlKqkfxP/nAH5PdAmjnDXZe14nEGEsdplUgAhNRUo7dYpjHzY5RKGpUp/U0wSiWNsXgStvRtJHyLmyL65Mjvt4xmR3FQKJuEhQSwNZWECbFCwgi1xvFCSalbgcgMYqTUrVtTO8SUKPAc6cLWlFRPQMjjCWjiPSG5KWHTpsTHbI4AHaHUVgJhq8yBSnQSRYUF36Z24rTpTN0KjL7tFDMQldtVmfZcgGICAcrno6gEFcXbQpTLF7A5HAqNRqZSBwYGKRQqg8mkUakUCoVCoVCpNA6C8Hh8DoIgCIJwuUwWi4GbSDYb4XI5CMJgMqg06sDAwP+iO/qHSCj61JPeyhsZXug7NCy7K29b9wSiNLOIBKNUkjRHpR3aP9cSyro5+pM0MqOyX/zWFBKGEQnDjqgsgzjGbJJStg5nklK2it3IERA9AaEAE/L5Ba7ALYNKozQnbhLXtuVyu6ghAlGSJwUEcT0SH4LRdBKxjvTtVuBZIO1VjuHhKIdWkoQ8Ph/h8nh8Pp8vwLeCqIQvymKzaTQalUYbHBp6/ebNwODg0NAQi8nk8Xg8Hg9BuDweH3c4aXQ6jU6nM5gsNhv3Qllszus3r1+/fk0mk0H05e9Kquve9ubGs4QS633EphCI+LscyRnDXrzY8K2Rz/Bopo9pQLxkRspK5I9epzItIV6lHFdQdENUu+x1P6ohGe2OXvmjSEggSHuqfyUJZTw4ioMj8zHsr461hFKXsggw1nEdLkNKMQIE4hhrQ/QEhAJUyGBmOwOXLBabx+PzBahAgGKYKCxUSCAQRK+ZkJIi58tKIMpglMgSEgrG7u7eIbqLokI+vuVjsbhcHsLl8fkCycAPX4DyeHwEQVgsFp3BwHn45s0bFouFoiiXy2VzOCw2m8vjcRCExWKzORw6g0Gj06lUKpvNodMZg0NDb968IZOHQPTl7y6k/vi21yqXhFLWhJSaShSOWeESLt8Y/0+KexK+neSSJqZKLE6pr7UkJUf5d+PtCceYURnhElGJ4XFLW83RD0j2Xub8CceQUNRdyVmSJKEckevejlPwbZ0REY9AEHkQohsiEhLlcOxtlrCQAESOq4RTOpaEeC1bLn/jOba6YatLSt06XNXbMFJ5AQEAo29JY3Z673DEgqIYhgn5AhTfyHG5PARBBAKBQIAKUEwgsTlEuDw6g0GhUshk8tDQEJPJRBCEyWQhCJfFZjOYTDaHg2IYj8fjcrkIwuVwEARBGAzGEJk8RCYPDQ1RqRQQffm74qpa4Vh5F3dUtv8mnTt6yQ9fSxeTiBjI9QpHboyqdFS4YXSY5B2io3KKjK4JiDxOaaszPFUEosxpkzSs0iQZGdEfsoRv36NLzdDYbwjecak6pEgolAZuCVNJ8s4wpBgo4ZRKLHTSt1vFzMWEGEYkAEKh2PPEhnMwUorELnBrCkkG97emkiROU0T1k1K3jmXgOwIV8vgCPl8gEAgQLpfH4/N4fIGALxCgCJcnSUIeT4BwuVQajUyhDA4NkclkOp1Oo9NpNDqdwWAwmXQGg8VmIwgXQbg8Ho/L5XEQLn5E8fL16xcvX75+85o2TmBG/o5F4qXL3ppJvfAxjBrOkGaOXBKO2t3JJaHELotIkG0I5e0j35GEI72Rzht2Lkev9LdZQskmfjMJ8ULiopKPy46AinPlxUeH65MjRuK1Przi8WmTaSQlDNeIUyokeg4HaUYsIW4hiQRAKMBIKVtF1m8kpioUYqTUrXjr2JhYkcQtKRIWEsDW1E6JTHnRlzHbSHw3iPJ4fB6Ph3C5HA7C4/MFAhS3bDwen88X4IFTLpfHYrNpdBqFSh0cGqJSaXgslMFg0Gh0nIQUKpVKo/EFAgRBWGw2m8Oh0elvBgZev3796tWrvv7+V69fjUdCebZFKPnq5VjCkWfHtYRvJ6Hk43ItofhyeDcqv+uy5N1ISCSIl6IUE0mpRkapxLGNvCsJR1qSy9+RKqQcDOlwj9Q45R6kjPmCyO3vcBYmXcPWVJKIIcKRqAkmwR9JkFKMRgiJ00li/yY2d0JMHKHBCgkAEAolY6pjSCjj6yA/yjJOAEYyE8OEKIrx8VgohmFCIYZhbDabTqezWGwuj0dnMIfIZCqNykEQBOHy+QIOwsWP44fI5IGBgTev3wwNDTEYDPwcgsVi4fEYOoNBodEoVCqFSqXR6VQ6bYhMfvPmDY1KpVKpL1+9HBwalEfCUUtX3p6QlGok8VYl9oSjGCKDR/JJKEUxCX2EBZKq9KZTfENudFSOEZC/MocrG/WkuGNEAr6VEpkzuWbkzyXhiNEf6xqLnRQZHcYPRGWOVi4JR2UU4lSUisrgDJSInY7sG0dMn8iEEsV+rFCICUdIKFZES0qqHnxPSEpNKRSFRkffGkO2zhQjSUv49p0kigkEKJfH5/H5AhRFUZTP53M4HDwqw+cL6AzG4NDgEHmIxWYjXC6DyaDR6Sw2G3dEqVQqjUqlUigMOp3DZuOxULFPyqTR6QODg28GBt4MDFBpNBqdRsMpSKFQqRQ6nS6HhKPNx3jRUaloiKiwvE0TGOVnyibhcHmxdRNdpUpbwpHjgLGh2j9jT0gkyD/FHyUyGpFhCUc7d9IVjB2+HJ9Qsr3Rrcgarai60d/FsdGpt5BQ7H6K7OHIhnCYCRKGjpRiNMxA0uioplEKSTYJCwkAAEIh/r0olKgfADBSQFpkxWw6xRZY5qmgLBIKeTw+gnC5PJ5AIEAQLoqifL5AgKL46QSHwyGTyUPkIQaTweVy8ZMJBpPJYDLJFAqNRmOzWAiHw+Fw6HQ6ncHALSTOQCqNymAyKVTK69evyRQyi81iMpkMBoPBYNCoVBpdzp5wzLn2mC/929flf0HedtYlr+eySThsd8YLUcnyBYcrfas7Kmk5x2z3ZI1vbDfHdG7UVnm8d4U/K3VEP+4QxCJmxSgiSBsoybujDjNIqVsJRBEzRRQSDUOiJCllq/jsQWKTKWNP+M6B0/FIiAkFApSHb/gEAoFAwOWKLphMFofD4fF4NBqNQiFzOBz8qJ3JYuEnhAODg2QKBT+FZzKZeAyGyWTRaDQqjTowOEilUskU8qvXrwcGBuh0Op1BZ7FYXC4XQRAalUYmkyd+wD0hv0dElBtOx/21txSE0rpQVs4fJtVvoB+K4btA3CMVX2ICgcgMcrk8Pp/P5XJpNCqLxeTx+RwOwkEQFpszRCYPDA4ODg3hP15jMBg0Op3NZvN4PA6Hw+aw6Qw6lUYjU8g0Go1CoZDJQxwOh8vl4ueHKIpiKMZkMCZIOCG/R0YfWrw7DyVL/ib2/onEk0hx4OcQKIrhZxH4HxlxOBz8eBD/a0AhhgmFQj6fj0c4aTQ6mUIZGBx8/fr1wMAAg8FAEATnGK4wWXh0lEKhUofIQwMDA2w2WyBA2RyERqfj3iyPx0NRdIKEE/KH5DcwUB5p/+MkHAUBinK5XHwHyOPx2RwOj8/nIAiVRqMz6GwOh8ViIwiCe6d4t7k8/Iye+vrNm2E/k8FgcBCEy+Xi7qv4B6JMGp0+ODhIo9H4Aj7uxNIZTAqFivuxCJc3QcIJ+aMi27jJczV/n/38y0wi7n/y+Xwej49iGJfLZbJYLDabLxBQqJQ3AwMMPMQp+sEnm83h4MEb/JCQSqUNDQ2RyWQymUyl0phMJpvD4YkPE/kCPr57pFAobDabgyA0Op1ModDpDPyvnKg0GoYJJ0g4IX+CjEcweeT8i0j4brXh3ENRDOcLvvHDDSCLxWay2Dwen8PhUCjkoaEhFovNQbhsDkKjM2h0OovFwn+GhvuuHARhMJii4wgmk8Vi8fl8FEVRDBMIBFwul8Fg0Ol0BEE4HITBZFKoNDKFQmcw2BwOk8lCuNwJEk7InyZvYdo4bPwzuDe6M+MWRjEhl8tDuFwen89mc3D24EcU+Ak7k8XmcBAOh0OlUqlUKh5ZoVKpZDKFwWRSaaKTQJb475Jw+iEchMfjYRiGoigqEPD5fA7CwUmI/2kFncGk0xk4YylUKoVKGZqIjk7Inytv5+FfQ0IZPXkHS4j/axQ8Hp/FYlFpNIFAwEEQ0U9bqDQ2m01nMCgUChdBxLEW0R8l0Wh0KpWG/2h7CD+sp9HpdAaHg6AoykEQHo+HG1gWm02lUYfIQ/gRIr4nHCKTyRTKwODA0NDQwKD8vyf8yrPgS/fc5U53l1hdW7grzDPm3943SEdTHn+d+uzYd+3HUp8d++751ynPD13qOPbdE23LUFubzebmNtev6y1dlpuS8tDBwUF5k4XPDZL/ra7g290Rd7vOZPVH3yOdz+mPy+1PyO1LzO+/VPgyueD15cL+hPz+xLzepIJXSQV9SYUvL+b1Xsx/EZ0ap2bv7HvjWRLxVdydQotN21UsfgxIuUdIKfBJvH1wi/7agykRmd3nfrlhprnL6+aLCzndCbl9CXk9CQV9F3J6EgpfxOX0JOT2JOR0JeT2xuf2xT/oicvui8/tisnpuXCnbIeNy95zteEJMUu1UyOzuy/k9MXmdMfm9F7I7onJ6o150BX7oDsmq+v8g+7YrK6Y7L6Ye6Rzmd3nbxZvUT5md+Xx2Yzu6Iyu6AfdZ+51nM7oirpLCr7ZHpLe7v9ru9cvz1yvPnb6/rFdaov1N4+PJDcdSGrac+HRjph643N1W8/UbTpVsyGyZkNkjWFEpWFEtWF4tUFEtUFEtX5Y1brQShz6YVXrQqvWhVbqhVbohVbphlTphVTphlTqBlfoBJevDS7XCS7XCS7XDarQCSxfG1SuE1SxNrB8bVC5dlC5VmCZVmCpZkCZVkCZVkCZtn+Ztn+pln+pRkCxZkCxpn+Rln+Jln+ppl+Jhl+Rhl+Rhi9R069Y069I07dI04eo4UvUwFO/QnVforoPUc27QN2nUM27QN2HiCuq3vlq3gWqXvlq3gU4VL3yVb3yVQl56l75aoR8Na98Va88FUKeGiEPz1cl5KkSclUJuaqeeaqeYp2Qq+KZo+KZo+yRo+KZp+KZq+KJ52SreGbjt1Q8s5U9spU9c5Q9c1Q9ctTEUHbPUvbIVvbIUnXPxqHinqXqnq3slqHi9kDZLUvZ7YGK2wNlt0wl1/vKbhk4lFwzlF3vK7vdU3bNUHbNVHLLwKHsel/F5b6K831l5/vKLveVXe4rOd9Tcr4nod9Vcr6n5HwHz1dyvqfodGeN0601TrcUnW6L4HhL0fHWGsdbaxxvKYqh5HhLyfGW4smbeKp4Ml3xZJriyXTFE+mKJ24qnkyTS8JVhIKvPHJXON1dav3zwp1hhNhffdK7vk59itMPT039ftE8EKBzOGT7MZOqKgU2e0Zm5vb4+COXLiV7eHoamBywjcsLutMVeqcr8m7X6Qet7u7nbSN/MvO7GXGvM+KbX/eeDDM/GXHs2/rkwpfJBX2nU5L3OYaaO4Y7XSqPz2xwctjzL731RnahQbeeubp467j8EJgUp2+0d8Mxm2Xzj3v/Wmpu7W6d8Cj6+r93a+z0vv0iMfe5T2iU+YlgsxNJAb8+SczvS8p9Ghx8ee+JEDP/q8E326Ov55jbB5k7xHl+3xp3p3SnrfP+83URCeeXqJ61irpg5hB6KLr8bFb3hexnQefizO1DdjvEuXxTez6n5/TVzGOuIWYnIr4+W+QcFb1ygZbu0VPWF0rcI9K9fmg9e7/z1L2O8LvtIbfag9Pb/X59Trj+1PWnx04/PLb9rtX627bDl5oPJjWZxz/aGVtvEl2/7Uzd5tN1G07VGEZVG0ZUGURUG0TUGETWrI+oXh9epR9epR9WpRdWuU5MQt3QCt3QSp3QCt3QKt3QSt2QKp3gCp3gCt3gSh0xtIMqtIMqtIPKtYLK1waWaweWawWWaQWUaot5qBVQpuFfgpNQw79IK6AUJ6Gmf7Gmf7GmX5EYRE0/oqZPkaYvUcO3SMOvWMO3SN23SN23EKefOC1U8ykYpp8kVL3z1X0K1MUkVCXkqXnlq3kVqHkVSFAxT5Ug1j1xKuaICTkKOaMgSUJVDxE/VT3EJPR4oOqepeKeqeL+QMX9gbJ7popblopblpLrPWXXTBEPXTOUXTOV3US0HE1CFxEDZULJ+f4wA8U8vKvodEfR6c4wD5Ucbys73laW4KTiyVtKYjZKkfBkOn4p3xISCr7yyFvudHeJ9fWFO8MJsb/4pHcc++7p8dSnVlfarb57tjPktoOHv5OT/bVrU6sqpwj40ygU2M19fnDwXg83p8iISFNjI9OT0cF3esLvkqLudZ3JKt82b6nqkYuHz2RHpF7X2eJo7n3xeECYgZ6F8y/t56+cX3fI/mDgJSt3L5UNbp5X6wk+Xy/ebGTuezH8RsUu55Dj31S72GzaF9928W623opTEfnP3a3PWflmn/r5upnGLp/bHaEB9mpWYVYBFw8dP6a+/ZvTOU/cPbw3mnsd9Us+Fn0n/N5DR6eUwwEX91vuVzyUeOZ2+U57J/NzNVGJETOXbN/knfS1O2GV6kHP9OdBp/w1j7of9Uu2sHdRMTgVkF531N1l/deRh30vnkyuIcQkqSwy2Hgy2SkpZ89GR4tT5efvPDrq5qOov0M7uND/ao5R0FW7K21u1544/fDY/rtm65S2o5daDl5sMo9v2Blbb3qu3uhM3eZTdRuiag2janAYRFYbRtYYRFavj6jWj8B5WLk+vHpdWNW6MNwwVumFVOiFVuqFVumFVuuGVOiGVOiElOsGV+kEV+qEVGoHV2gHl2sHl+sEVeoEVeoElq8NLNcKLNUOLNUKLNUKKtUMLNUKKNUMKNYKKNYKKNYOKNHyL9HyL9byL9LyL8ah7Ves5V+s5Vek5TtMy2JNv2INP6KGb5G6L1HDj6jhS9TwLdTwJar7Fmr4FKr7FGr4FuK0VPctUPctUPPJ1/QhangVqnsXqHvnqXnlq3vnq3sVqHsVqnnlj0HeMFQJuWpeeRIszVX1ylUj5OK6GiFHzTNXzTNX3TNX3TNXzTNbzTNLzTNbbYSWWaoeWaoeD1Q9slTcM8X6AxX3TGWPTBX3DFWPTFGOW6aKe6YyTlH3TBW3DBFcM1RdM1RdM1QkoOxyX6zfV3a9q+xyV9nlnrKLSFFyuavkfEfJ+baK811lp7vKzneUnO6oON9Rcbqj4nRbxfmOstNtZafbSo43lZ1uKTneVHa8reR4S8nxppJjugRujmMJiV955Cx3urfM6peFO8O9L/wacKvb+kqbzZWntj+023z/dKvLpTOno7Zvf7F8uUdIkMHAm1mbN89asmS5p4e7j7eXldUx/d123tfawu52R9zvPp3ZdTa7bPdiZavvupIKXgQF6a/0LkgivvymuNfN3WKtT4brvp3bAzK/LXl5Oa/FxXLDjpiyC1cvajg4Bd3tTr5fahIQ4fAz8ajaYa+7fQk/X1++MS46v+3E8QvHQ8tifkkz09rl/0v57jUHnX59cbmgPzmbuGvF2pPfZG48Sjh2qfEysfdi3ouLeW1BSbf3GasvWb5wmkZQxK3i3fYuh2JrTiXELNI4H/qgOyn3kaWJ0qFkosVm2wNnay7m9sQ/qDikqnc4qeaEu+uyJaZHThdGpT2Ju1dqpHrc4Wp7TEbH6V+aojO7Ir/50cLB1T4ha4ex9sJlBjo215x/fOzxyzPnq09O/tBmm/rk68stFheb9ic27op7uCP2kcm5R9vOPNx8qm7LqfqNp2o3RdVtOFW78VTthqjaDVG1hlG1GyJrDaNwZ7XaMKLaIKJ6fUSVfniVQXitflj1+vBq/fBq/bCq9eFV60Ir14VXrQut0Aut0gupWBdaOZzqBVfqhpTphZTphZTrhZTrhpTrhpTpBJXqBJfqBJXqBZbrBJTrBJbqBZXrBJbqBpbpBZbqBBbrBpboBpZpB5ToBJasDShdG1iyNrBEJ6BkbUCxtn+xtn/R2oDitQHFa/2L1/oXawcUa/sXafsXa/kTtfyLtPyIWn5ELb9CbX+iWC/S8ivU8ivU9CvU8iNq+RK1fAs1fQu1ffK1fPI1fQo1fQs0fAo0fPI1fAs0fPK1fAq0vPO1vPM0ffI0ffI0fPK0fES6lk++pneOlneulneupneOpneupleehneOlne+hneOlleeNiFHwytX0ytX0ytH0ytHc0TP1fTKUiNkaRFyNAk5mp45moRsDc9MDc8Hmp7ZGp5ZGh6ZWp4PND0yNT0yNT2GlUwN9wwN9wfi9IGGO56ToeF+T8PtgYb7fXW3++puGepu99Td7mq43VPH4XpPzfW2uttddbe7aq731F1x5Zaay21Vl9tqrnfUXO+qutxWdb2j5nxHxeW2uvNtNefb8i2hV9FXHrkrnO8ttbm+aFe4X/yvobe7HX5qP/FTu+O1jhPX2o3ckk+fjjI0JB09etDe3vLYsRQ/v8CZs+as0DJaqbVNe4d1UDop7E53xJ3usw/6zmf1xuRXmC9Xc/715WXiy4iIncscvo/Lf5la0ulsf8AwOM/bZo+R7dWkopephU12B43ME+vjf0zQOOkafI+UktdyzCXywJlMV+vNek5xjm726sssLEMTt/kn+d3pSrx5a6/2noC06gNa5kcuNV8qfnkp477xSmP3q0QTC+dDseXfFPbF3X8Wed5lkZ6x7+3+6ITwRdtPn75XseeE68HYR+cunl+he+VcYV9yYetxM2WLy6VWu+x2+WbFF7xIzCg0U95qm9oUe6chLqPOYtuu1arxEbdLTVSsnX56Fpf1LPQiMSLteVx2z/kHXdGZpNP3O8Nvk0JvPg+82en77+cePz9xudrq+MMT29TWY9+0HE5u3p/YsCf+kVnso50x9abRD03PPTQ699D43EPj6Hrj6Hqj6Dqjs3XbztZuPVu7+Uz11rO1W8/WbT1Tt+VM7ZbTtZtP12w5U7fldN2W07VbTtdsPlWzKapmc1TtpqiaTadqNkXVbIyq2BRVtSmqalNUzaaomo2RVRsiKzZFVW6MqtoUWb0xompjRMXG8MqN4ZUbwytGEFG+MRxHxcbwig3h5RvCKgzCygzDyg3Dyw3Cyw3DyjeElW0IKzUMLTUMLTMMLTMMKzUUXZYYhBYbhpQYhpQYiFBsGFJkEFZiEFJqEFJqGFK2XpRZvCGkxDCk2CC4WD+kyDC4yCC4yDCoyCCIaBBENAgmGgQX6QcWGgYVrQ8irg/EUbg+qNAgkLg+kGgQWLg+sFA/qNAgoMAgoMAgsHB9QIF+QIF+QMH6gML1AQXrAwoM/PPXBxToB+SvD8jX989ZH5CnH5C3zj9/nX/+uoB8Pb/s9f75+v65UvDLWeeXs843Z51vjp5fjr6vCOt9cvR9c/R9skWpT/Y6aej7Zq/zyVrnnaXnnbXO54Ge94N13tl6Pg/0vDP1vDP1fDL1fDLXeWeu887U887U9c7U9c7Q887Q8crQw+Gdoed9X8/rvq7XPT2vDF1ChlwSfulV9KVn7grn+0ut/714d3hgYtrpzD6PXzs8fyV5pfcRfu3c7fWtl5e3o2Py9V8OOzhkX7tWFRgUtkxjS8Cd3pC7PeEZfVH3+85lvYzJeRGb9yIhrzexoOzgcjWPtFffl75OvZO92VRPd6+LyeHjOy1DwjL7v7n5g6me8YYjrib7HDccPB+d8zL19i39A2aGB5zDsl4nXPpuh6mVqX/yfocAl+Ss0zFJB9zOE662XSl/een2zYNau0Me9F6ID9JU3L/N0mmLyYldLnculZAiz5zbbHzc5IVaWjUAACAASURBVJD7Pvdr4QkRqoaWxhYndmzfOHvD6eiMSvMTLofjH8Zejlmhe+VCSX9qyWPbPYqHrzTHfHthvfq+LYecNm0/senw92ey2kIio832OW4zO2Bk+2vMgwZr0x3a5l5WZ+8f2OxsFVN1Mb8vKb8/Lqc75kHX+Qc9p+93RdzpDL7Z7nfjGeHfTzx+fu589fGJ7x/bfNd67Jvmw5eaLC+2HEpq2pfQsD+hYW9Cw76Ehn3xDfsTmszjG/bGNZrHPdoT98gs7tGeuIY9cQ1mcQ1mcY/M4h7tvlC/J+6RWawIu2Mf4jCLfbQ7tn53bP2u2LrdsQ93x9Tvjn2063z9rpi6nTG1u87X7Dxfu/N8/c5zdTvP1+48V7fzXN3Oc7W7xMqOczU7zlXviK7eca52R3QNju3R1duja3ZEV+84V70jumZHdNWOs5U7zlbujK7cEV2942z19uiq7dFVO89WbT9bueNM5fYzldvPVIhRiRfefqZiB55zunz76Yodp8u3ny7bcbrc9HT59tMVpqcrTE9VmJwqMz1dZnq6zORUmcmp0u1RZaZRZaZR5aanSk1PlZmeKjM9VS5WykyiSkyjSk2jSk2jSkwjS0wii00ji0wjS02jik2jSkyjik0ji00ii4wjiowjikwii00ii0wiikwiik0ii01EmUXGEUUmEUXGEYXGEUTTcKJJRJFJONEknGgcVmgcTjQJJ5qEEU3DiSZhROOwQlH+CAqMw/KNwwqMwwqNQguNQguMwwqNwvKNQvO2heYbheUbheYbheYbheQah+SZhOSZhOQbheZtC8ndGpK3LSR3W0iucUiecXCucXCucUiucXCuUXCOUXCOcXCOXBKuIBBXuOctdbq3xPqXJWYRocnpccQ3QXd7rvmntivpP12j07Twy8effda7cnn3sqUUNRWKmkrHF19UfvBxu6JOh6JOh6JOp6JOl7Jul7Jut4put7JOt4pq8/T3nq7R61fT61dZ+/izD/IByAfg4TK1fjW9fjXtp3Nn5AOQD6Y3LFLuU1vXr6Ra/9H7BRDUtnpdv4p60wfvly5Q7FfT61fT7VNb90JNt19N74WaXu+aNU3vz25X0u1XVX0IQD4A+WDus9Vafap6fUqqDTNmFIBJVZ8s61ZUqZs8OQ+A0mkziLOWdSmqNS74vHmZRteKpRUfftmtqtunqt02573mlVq9quot06blA5APZrUsU+9RWdv+r8/LACiAFBpWaPWqaj+f/2GhwpTqT79s+mhB61K1HmWdHhW9HmXdbmWdLiUdkpIOSVGnY83a52u0n63WfrZK++lXWo+/0nr8pVbbSs2WlZqtK7SaV2jiaMKV5ZrNyzWbpKAhRxFdNi7XaFqmIZE5fKnRtFyjcdkw1GXqTSKoS9ySwFL1hmXqjUtF+ti7Erpa41L1hqVqDUvVmpaqNQ5jmXrjUrWmperDmU0S6fAjDUvVGsVKw1K1xiVqDUtEmaPQtFStcckwVPG0Qaw0LlFrWqrasES1YYmqZ9Aty8Qay/iaw3FVh+MqD8dVHY6rsrwgVuKqDsdVH75QZXmh+vCFassLlYcvVFpcqLQchdhKy9hKywtVFrEVlrGVFrEVFrEVlrFlYpRbxJRZxJRZxpZZxJZZxJRaxJRa4HpsmUVMqWVMGQ781qHzJaL0fKnF+RKL8yWHpCGXhJHXK8N+Kg1IyfW8kH7ILTrm+7s/1VKSiK+LXM8KAOACgEEKKID4APABEACAAiAQKRAKiSHORyExAIQCSFQeAigAKAQEEBBAAIVEJQWiwtDIU2JgQFRMAAAGRJfvBkjUxEhD0KgmRmp7W7WCUQVEI4LwZ0XzAEGikgASVSg9OgEAguEHJSaKLzlX4sFKQnavgIzpGtttuY8Pl5F8Ee9Q/ndA8i1L1i+QU/ItwwEQCoAAhgUA8ACIP53uff2xz/U232stvtdafK61+lxr9fm51edaq+/PIvhca/G+1oKnOLzEOb4/t/r81CwHTT4/NXnj+rUm35+avWXB52oTXhJXvK82ef3U6IWnuHK1yfvHRknIJaF9wHk7v3PHCVEWjgGmlifjf7ib8Zj173pqjc95PoCQadOr9bclQ9AlGCQDEVKnTuvYb9N50LbzoG3nIbsuEWy7LWy7Ley6LWx7Le16Le16D9v1Wtr2HbbtO2zXd9iuz9JOpEjp9qLU0r7P0q7P0r7f0m5EOSy+PGwvqtPSrtfSrm+4/sN2fZZ2vYft8XQ4U7Jwr6Vtr4Vtj6UtrvRa2vVY2PZa2PVY2PZY2PZY2vZY2PUMX0rptt0Wdt2HRIPqPmTbdciGdMim65At6aAt6aBtx0Hb9gM2zw/YPt9v83y/zbN9tk/32Tzea/N4r3XbXuvHe63bzK3b9lq3ipU2c+vWvTat5jZt5tatIti0mlu37rFuNbdp22Pdtse6bY+VRDoarSLYtO6xFj24Z7iqEbTssWrZY926x6p1j1XrHus2MyuRbiaRiu+KU2vpzGFYtZhbt5gPF7NqMbNqNbNqNTsuVkRoMbNqNTveanZcIlNSt5KVf7zVzKrF7FjrnmHdqmX38Raz46LUzKp19/EWiWqfbduP24Prl3Iu5PfF571IyO1NyOlNyB2Lvvjc3vjc3oQckRKfg6MnLrsnPqcH1yUgfZnbE4+fP+f2xOfiB9E9iTm9CSL0jEF3fFZXQnZ3QnZXfHZXXHZ3XHbXKMgl4bNnT9paW+rqa4n5hefjL6b++qDqhSD/Obst9AIfAOaceb9UdfvFfh8YdyUg9kpA7PcBMd+HJl0v6BQUdAoKSAIiCS3pQku6sNJutKxHUNYjKOvhV/Wi1b1oTR9a1YfW9Atq+gU1L9DqPrSmH61+gVa/QKvFynBObZ8UavrQavzxPrRarA+juhet6kOr+9AaaVT3oVW9guo+tKoXreoVVPcKKnsFlb18PK3qQSt70cpetKIHregRlPcIKnoE5b2C8h60vAct6xFUdAsqugUVPYKybkFZj6Csm1/Wg5Z18cu6BWXd/NJufkkXr4TEI5K4RZ0osVOQ38HPe87Pfs578Iyb9ZSf8YR37wnvXhvvdhv3dhv3Viv3VivvZgv3Jp628NJbuTdbeDjSW5D0ZnHazEtv5t1s5t6USmVAVLiJlz6sN3PTm7npzcgopDUjac1IehOS3oTcbELSmziy0cxJb0LSm7jpTdy0JiStiZ3WhKQ1ccSpLDSy3w2ctEaOhM6+0chOa2TfaGDdaGCLwcKR1jg6RwLsXx/RbzSybzSybzRyMrOe4CTM/aX810ZmegM7/SEj/SEj7REOujilpz1ipD3EwUx7RE97yEx7yEx7yEirZ6TV09Me0tPqZeEhLe0hfpchUh7S0+sZ6fX0dFx5SE+vZ6TV09PraWn19PR6eppIoaXV0/A0rZ52o55+o552Q6SLUrkkfPr0SVtrc319XWF+YWxC8tU7WW0U4cM3KOlUPA8A9px5dUPCuiGs9jVaN4DVD2B1b8TpIFY/gD0cxBqGsIYhrIksbBzCGslYIxlrIWMtZKyVjLVSsFYq1krB2qhYK0WEFjLWQhUXGMJahyQUSUjfbcFBFqdy0DwkSofRNCgDjYNYwxDWKFYaBrGGIaxpAGsaEN1tHMQaBrGGAaxhAGsQ648GsYeDWN0AVv8Gq3+N1b7Gql9hlS+xyldY1Uus/CVW/hIre4GVvsBKXmClL7DSfqzkBVbSPwZ974TiPqy4FyvulVKK8HwJpXhsSclLmXdHFFR0S+KySDLz96JIokVcL+pBfxewgh5BUS9G7MOKerGqig4BAHwAajOriT1YaQ9W0oUW4+iWSLvQ4m6suAst7sKKu9GSbvwSKxYXLulGi4fRJaFLZJaIi5V0S5WX/SwJLSahxZ1oMQktESvFnQJJjEPCpy2tLXV1tfl5BXFJyf++n9WFYE9paP/5eD4A7HnzniHCZ0ysnYG1M7BndOwpHXtGQ58z8BR9TkPb6Vg7HXtGx54z0A4G2k4XdDCwTgbWyUA7mdgwSBJ6JxMvIM5kjEYHnskcKdDBHH23g4F10KXBwNoZWAcTa2egHQysg4l2MNB2BvqcgbZLK+3SOc/p2HM69pyGPadhz+jYczr2jIY9paHPRoA9o6FPaegTOvqEhj6loY9p6GMa2kZD22hYK5XfRsNaKGgrFW2lYI0UtIWCNpPRFgrajOtUtHX4S0HBWihYExlroWCNZLSZjDVRsGYK1kT+89FMEeEtJSloEwVr+nP7QHkHXV6OdN8ayfwmCtZIRZso2JOGDh4APACeFlc30ITNVGETGWsko01kYRNF2EQRNpHHgDKiNJIxSf2vAdpIRmXekkvCJ0+eNLc219bVFOTlxyVdTMvM6kMxEg99ExfPB4A7bx5JIOwRCHu5mAgI1sfD+hCsh4vi6OOivVy0l4v2c9E+BO1D0H6uCH3cEX0EPLSfh77goi+42Asuhme+kICMR8Q1vyN6OYI+BO3jCIbRiwh6ESldEj0I2o2gPQiKK7KAdSNYF4J2czASB+3moCQOSuIIOjmCTg7awUE7OVgHG5UBzojezkHbOaIcXGmX1t8KUW3Dl3JaHCkp3fQ7NiGpjK3/3av6kyBo5wg6OdhzLvacg5LaOvA4TVdF9TOusJ0r7ECEHYiwnSNsR4TtuDIKiIQis8DvBoK1I5iMHBFGlx+HhI9bcBLmFyRcvHgzK/sVJuxD0cH4eD4AvHnzBlEhBRPSBEIaKqRjQhoqpGFCukBIw34b6L+x/J8Lqhi4TsGEFAllBOiYHGmQMSEZE1JQIRkVUlAhWTp/GHjOoKxbE/hNGMKEQ5iQggkH8Mv2DhQADAKDVdWD4nfxd5lk+SR8+rSltaW2rjY/ryDhYvLNrOzXmLAfxYbi4/kAIs+YYePhZUcg2Ll72Lt72Lm52zt72Hl62Lm527q527m62+HpWLjJvzWq2DiX71LsbR2wHduZ39Fncb6tWB8ZvvQtezdPO1c3ezcPOzcPOzcPWzdZjb5jB/6kPv+GW39gnn/DI+/YATd3O1d3G1c3W1c3ezdPWw9POzcPXytrfE8YbnHExt3DzoNg7+75P9TncWsbxxI+bWlpqa2vy8/LT7h48WZW1htM+ALDhuLjeQD0AgAWwuBrAB2F4aMK0FEIOgrDByAYguX/84ATMiLQf7sD/wyBAAAQBABYLD5E1YRhPPe/3LPfJOMFZlpa6iRIOCAUvsBQcnw8HyfhbhjchoEDBDnA4ASATsCgBUDQ32rw/wWZmJ8/U8QkhBaLf/CgCSn8c0j45OmTltbm2voRd/SVUNgnQCnx8QIA9QEAzGDgCwEYQBAMAAQBGKqAIfhvNfj/sMAQDCuIfYWJifpDAkEQJJpECABoMQxhEEAlLCEE/j4GYTwStjTX1dUW5OUPk7BXgFLi4/kA9AMAdsOQDwQBaNbcL+bMhBSAAlQOwwDCBcCQpEz5YM7nc99TkM4cLbDCR/P/9fHMcctA0NRZ8z6fM2P8MvCkKZ/MXzDrLaV+j8BSQ4AhWGHO4tVfLvl0xhQwZtCjn/xiral/WPghE70vPpkuWfL9Tz5ZMPfDybC4TgiaNvPTLxVXfvzhXzAA0QhEjU2b84WyirLyl4tmTpsMw6J8WKIYDEHQ9FlfrFilrKT4xbz3Rw1w8pTZKxVXzZv9PgRB0z9aMH/eh7BogmTPxJQP565YpaS05qtPP5oqXQaWP3Xy74gtIQTgxbCCEIaEMNCERCQcf639T8m40dGW5tq62oL8/PiLyekPsl4Khb0oOhQfzwfgBQBg9yRw9pP506evOxq0S3PO6uVLptdNhsZ+4GF4+qfzl2vucTJfM/vzVSsWvS/7YzB79mcz39943GeLyvw1Xy2cPEnWV2zSpJlz565Yd9h199KPFqxesmCm7Krmzv3XrLlGXzvpKy5QWf25PJMzZ/GCFf+aNxmIv6fyXWkIwBCAYAgWfX7xPNz+wwoqe9yDPSy/mgfDAChAsIwZwKfhX2p+IaH29g4h8Vd9TeeMFJs2a8P+gwc2fDUNBvj3G0Bg1mx999BgPd2VQNwzaMR0QpOmTF6trfghfkeUDCvjCQQANHuFvuICAGC8PsWjIRHutuFhtmv/NQeGwIhjA2AYAAAUFAD4QGmTq7unu7O9u9XGWaJlrwABCABo2kwle7+wHaZqAID5KqbHbPbM/wDCpwsAaHhehy3WewuVzS2sQi98Y2M4f+Q2BAEAw5CM/kMQLOqO/BHhNxdDkBACQghoit7A38cMgnEs4ZMnzS3NtbW1eXl5cYnJNzKy+lFhNx8diI/nA0hEwu8NPb0Ck66kpV4+63/Q8JP6KQCMCcxMnrra0jcxIeX6lfiw8CCjL6dDsKzgjeKWQL+Q5B9//Sb5nO8BrZnTJsmY+hkfah31TUz6/pcrscGB3huWTYdkxoHUdpwKibz8w/Xki+d9zRQVJimI15zorQMA5qnuPfXtxSvJ8VGRkX6OR9Z8Bk+aNOmj+Qu+9gkNDQ0JCfx6hcKkj1boOngG71KeNne5ui0h0nW3EgQpKMDwys1HA0PCw/wdrT2stynOe/9faw7a+xG83cPCfB32GsyDYAVZPvm87X6EbbNhAH+8cNWyeVOHJ2rWoi+dvU9qLJoGAIBmzF+/zyEwLMzfjeBhe1hDfxU0efrqXSfDwsLDQoIPGy6ZPHkS9ImKnV/w99d/iImMiIyI3KE8DYYVJs9Xs/IKCA0NifCzW/7FvCmTJ8t52xCkvDfSVg8CIhatOhJ2MTo8MdpFY+HsKTM+UTOxDvDytg0NcDhx9Ngxz8gIu5WQwntrNngFR0RFhHp+vf4D3FJO+0jdxMo/LCzIN8DZ4tDGnVoQgCZ98Pluq5NrVT8FQEHsJYpblegADICBQ7TNhs9gAEMAQABeqbfRPSAkLMzf1kxvroICDE/6fIWJa0R4aJjngQP2Ie7HleR9uP/xJHz67Flra2t9XV1+fkH8xeS0B9l9fCGJiw3EiS3hLgUQOF3lcNAPSV7OXnbaC99XqJA5cOiTL9cGnI70SzrnsHHxNAVY9vxMnqZjE34l2dvV7ajSZzMg0fZ6VE3wPOUN4WfDCIkxVrqfTpVb1fQtLme+uejn7rR/5ZxpMomqMPW9tWZbvjYxWDh79uyPZk1TgMCkGbahoRabVs6dM3exqb2/g8mMaTNW7Q90NJyuMGXax+uORdmsA2DSsnXmET62ixbMX6K2wet8nIPegpkLFE+evuh7QHvhspWHThI2fvmRzFmYNEMr8Nv4EJeDakvmfzRDAYh7tVDpoKvzzs9hCEDTVuh+7WxnuuKzT1ZpHEu6emGD7gowZdrCdZs3rVq1etVqv+jT21ZCkMK0ef/6/ESAg/rs2XPmzP1gKgwUJusdtXXeo7dm1Wp9c/v4WMJH06fg8yU95PfnzJs/T98y8qTx/Lmfzpn14RQFaNaCpau1jTwiYxKTE/2cdq5cpO8b/73bQdXtnpEB+zeuOxLloAVNef/jxcu/1Nvn+/3V5Li4AONFcxcpWrp4HFBaOPuLFWaxVy/tNVUFAALgAx0zJ9fDa9+fDAMA4UYd4H6hxCsEAOjbnbI2nA8AABD0+WoNTx8brVWfz1m4cpeDp5HeqqnvzXYICdmi+smcNdtjvv/RdfvyqZMUZM2ouLp/MAmfP3ve+vhxfX1dYUFhfGJyWmZ2DyJ8zuK/jhVbwl0KkK+CpvmmL6d/rGxovGrlvxQqIGisJQRgzqLP9bTWzJqvZb5XD4LkuX3w2n1blk2brbnZ+ItFc2A5AZ5PVyzWUV7x4QLdPWbaItdNhijo7duyZOb8dcZGn376Ee7ojC20apPW/nUq7wEgYukXu0NPGsJAQQGCp0z/cL+jp/psaKGp74kN0wEEIKV9IV/rADB70+5DK5QXwWASDGAFAENA4f3PV+8/fOCr+RD03mz9/XabFWfL7PnspWs+nTVLbduRgIQfgvcsEuVC0HJT90DH7Z8BCEz9QHOvg6nKJxAA0Ix5RsecdHWWT57+haljUGREUGCAb0zCxV1KMATB095772vPI8shAMEKEADgvZXHA6MjT4cHBgWHhYZEhNmrTJ8mWokS6certnuFBIdfSL19NT44ONzjyOaFH08ysnILPRufcMrN3NhgxVwY/ljVI+jkh58u2HjUzXzdsiV7Qx10oS+UtR19/M8m/xRobaCjuPD9KdDKXW6H9eYBAOApM7XNnbebqOHzq7TNLNBx0+yZEAD4xkxiMUAj/9G3PWOFu6PwFOXNVns2roCgyQoAWqS+8cgOw8+U9/t67wAAQBCkZhHssOlzeR4++MeTsLe3t7Ozs7WttaKi8tK3393IyO5iCZ8yBC9jhgMzk4APPlIFGIYmiQMzctqBYHxjBWRTYqQUjH9CxzlvFFU1foARgiBo3KpWb9L/2ljrg6lTvtDfYaS5fMZ7S918rZa8B0MAmjZjlaXb0fnToYU7fAg7PgPT5649EnDBcT0AM9SMLI/t1Zk+WQGGPlYyNDdWnz3j89XmFvu+nAeDmXP099vKI6GefXSsn6ODg71jWKid5iIYVoAhCEDQEh1rguOOBQCGFGYqG9kc2LpqBgDTZi+2CzhlqLvygyX7vIIs5k2DwEer3SKjd62BIQBPe+89a98Ta2YAaJGu5b7186H311ucPLDlS1gUEoRGzJB4MsT/gSDFPeFWOhIe49Sl6iaWTg7793vaH1VW+ETNPfDkrE8/33DUbY/u4iX7wu218ec+2+vtvX+/lbuT5aLPZy1bb2W1X/09ACbNnHXQ8/ze7TgJp2nttPax1v9kGhDPOfTBHM0DJ49sXLlgqqg5CABg4HDW2nA+ADCAFJbrbD2yV/+jKRAA01bp7jDapv7hgjWugdYLZ0IQDIzdztpvXDDeWwb/aBLu27dv7969u3fvNjYyNt6+65e72Z1M4VO64OV5icCMDwQAUAAQDMOToElQuYK8jxYEgCgCNh5zIBhn4bjHjRAAEKTwx6ua8aUeISIu+XLCqRD7tXNnTYZgpT2+iZcS4+ITEi98c3zrbAiCp646ePHKxYTkpLAziWk/XDy07tPpH8455BkQn5CUkPDNed+jaks/2OgY9/P1a4GHFBeZOFz9JT3Zb/+ns6aObe6D+Us0DI0dPdx2Giz7eJICgGAIwBAEPluh5e13fPUcCACF6Yu17YLPJycmJcXGf//dD4mJXp8uWW0RlJCYmJT4TWLy5X8n+h5YMQeCp763yT32u0sJST9EH/xq4UwInvnJAvuwqITEhISE+MREgtq0KXInZs3u4GNrJXbIk+au3uh+JjEpIdVm18p1FoE/37xxymnHBuf4bwMOGZ44d+Wss85iGICZhs5nkxKTz3sdWDh36tS5qw75RV9KTEy4EP/D5e8vfhu0dOFsMGXuJkvHbRtXT4IUYHH9n634+rvCX7y2qM4EEAAfaWx3OJMQ/1Na5o2rlxIT/TbPmzV19pID7lGJSYlxCUkXQlw0V8xUmDxV93BQ4qXE+Pj4S99est+04P9vYIbBYJDJ5P7+vtaW1u9/vPbr/awuRNjOQEfc0d0KkI8CBCAYKECic8LxifE/J8Mh4mGBYRgPskuWgYfj5xKP4SZbohb8MwPD8t/+tE8WbjLetvQTILWq3p+/45itidYXsFRtorMCIIoQSoSz5XVdop+/fR7EQxZXItnqcCmpwYlLwuIynyzTtDlptWIOwA+NR8yv9J4QEs/eyI5DYsh4xpQZ7y1euWrVqtVmziF7NOeO13Pwjybhq1evevt6nz1/VltT+03qlbTMrF6+sJMjeHMhXiCyhArABwbijRkEYFD+e1bA/xuBJCAlC776Sl918VS50Ye/h8xeoa+luRSIYjJyj2reRT76dOE+WxcnZ8cju3UgaLzfQv7DSfjy5cue3p6nz55WVVVdTrmS/iDrBSbs5qFD8fECAF5CAOyeBB7C4BoE/QyBaxB0DQYdAFL4O439PyyjAvd4HiR19+8u4274f1steD2wrEmTKvlPJmF//4uurq7HTx5XVVZfTk1Nz8p6jQp7BALy8C9m3lMAy2BoCTxpqQK0FIaXKsBfKCiMF1D5fy3DZ9MSqfgWJCPzbyijvy9/rC75we9RbfyDSVhf/7CqpqqomHj/3v1zsbE3s7JeolgXIhiIF7ujkAJQgIaPwSEAg0n/7cH8LQUSb8n+TstGlowM4c8YCQRGx3hlF/onk7CyqqqsrCw/P//WzVtnzp1Pf5DVy8PaWejr2GESTgKw5LxDAAYyzwknRCxj94T4uSks+6c/fzMRh6dEJuxPsIQw/o0fN1T+TyYhm82m0WmvXr953NZ29edf0jKzuhFh26Cw/3S8AMJJKPU79b/TmCfknyLDq24xAEIYCCGgKTKfkJyfU/1PijwS0hn0IfJQX39/a3Prlas/3bif/YSK1XYzO8LOo/gRBQyLf5sr/opDkgHACUzgLwUY+WECgBfj/xg0BDRh/AePfyvPQh4JyRTy6zdvunu6Gx41fvfDj/++l9X8hlf6ZPBZwGkUQP0AAOhjAG0AwASANQDSAEAPQNMBgP7CaZ/ABCQBAAAiv3UxBGEAYBJ/yiS6+7cQeSQcHBh88aK/s6PjYf3DlCs/XL+T1djLIDb2PvWJQCGIBYEUMCsFMkiFjVPh1amwegqsmwpPT4GhFAWQogBSxek7YviR3/TUH0HK7200Zczj/5ne/u5G/8Nd/SON/oY3AksoMPi3AoTBAIOB1t8x1CyPhK9fv+7v6336/GlNdW3SpW9/vp3V0M3Me9jZSggd/j8oYPjnB4IxAGEQEKcTmMB/BBAYXm8oBDBIvCcE4B/ijvb19ZFIpMeP24qIxVa2J67dfPCoi17Y2PMo/gp9/YbWhV9kA5ADgVwY5MEgFwK5EJwLg78L8v6Ckv87+Dv2+bePDsqF8YWHQ3S5EsZ/efSPCMz09PR0dHS0tLSUl1Vc+vbK1fSMh73MoraXxW2vn79iDsXM5AAAAR1JREFUObj5j/xYHwLSP9+fwAT+GxDJ34Z6IyKPhJ2dnc+eP3v46GF5aVlcYvK1m5mNvYyqDkoNid5F5jp5hf63Oz4hE/JPEXkkzHzwID4hvqamOi8vPy4x+Wp6ZutLTkM/t/kV+pKBufiG/7c7PiET8k8ReSS0trG2tbU5c/ZMdlb2uQuJV9My2l5yW94IHpOxNxzMPWCChBMyIX+SyCOhnZ29ja3tkSNHAgODomPif7xx//ErftsA+pyKDXIwj4Cw/3bHJ2RC/ikij4Q2NrZW1lbHvj7288/Xz5yL/eHGvbYXSOsA9pyKDSCYZ+CEJZyQCfmTRB4Jjx8/7uzsnJGRkZGRcepsDE7CljeCJxRsgIO5+09YwgmZkD9H/g9AWbDpl8T2WQAAAABJRU5ErkJggg==" alt="" />

基于libvcirt的虚拟化guest domain overview:

A guest domain may be transient, or persistent. A transient guest domain can only be managed while
it is running on the host and, when powered off, all trace of it will disappear. A persistent guest domain
has its configuration maintained in a data store on the host by the hypervisor, in an implementation
defined format. Thus when a persistent guest is powered off, it is still possible to manage its inactive
config. A transient guest can be turned into a persistent guest on the fly by defining a configuration for
it.

virDomainLookupByID,virDomainLookupByName,virDomainLokkupByUUID

Example:Fetching a domain object from ID

int domainID = 6;

virDomainPtr dom;

dom = virDomainLookupByID(conn,domainID);

example:fetching a domain object from Name

int domainName = "byRuiy";

virDomainPtr dom;

dom = virDomainLookupByName(conn,domainName);

example:fetching a domain object from an UUID

char *domainUUID = "byrui-1990-04-03-15055198367-5160-59158"

virDomainPtr dom

dom = virDomainLookupByUUIDString(conn,domainUUID);

virConnectListDomains

virConnectNumOfDomains

int i;

int numDomains;

int *activeDomains;

numDomains = virConnectNumOfDomains(conn);

activeDomains = virConnectListDomains(conn,activeDomains,numDomains);

printf("Active domain IDs:\n");

for(i = 0;i < numDomains;i++)

{

printf("%d \n",activeDomains[i]);

}

free(activeDomains);

Exampe:Listing active domais

there may be some persistent inactive domain configurations stored on the host.

virConnectListDefinedDomains

virConnectNumOfDefinedDomains

int i;

int numDomains;

char **inactiveDomains;

numDomains = virConnectNumOfDefinedDomains(conn);

inactiveDomains = malloc(sizeof(char *) * numDomains);

numDomains = virConnectListDomains(conn,inactiveDomains,numDomains);

printf("Inactive domain names:\n");

for (i = 0;i < numDomains;i++)

{

printf("%s \n",inactiveDomains[i]);

free(inactiveDomains[i]);

}

free(inactiveDomains);

the APIs for listing domains do not directly return the full virDomainPtr objects,since this may incur

virDomainPtr *allDomains;

int numDomains;

int numActiveDomains,numInactiveDomains;

char *inactiveDomains;

int *activeDomains;

numActiveDomains = virConnectNumOfDomains(conn);

numInactiveDomains = virConnectNumOfDefinedDomains(conn);

allDomains = malloc(sizeof(virDomainPtr) * numActiveDomains + numInactiveDomains);

inactiveDomains = malloc(sizeof(char *) * numDomains);

activeDomains = malloc(sizeof(int) * numDomains);

numActiveDomains = virConnectListDomains(conn,activeDomains,numActiveDomains);

numInactiveDomains = virConnectListDomains(conn,activeDomains,numActiveDomains);

numInactiveDomains = virConnectListDomains(conn,inactiveDomains,NumInactiveDomains);

for (i = 0;i < numActiveDomains;i++)

{

allDomains[numDomains] = virDomainLoopupByID(aciveDomains[i]);

numDomains++

}

基于libvirt虚拟化 Guest domains lifecycle c ontrol API overview;

libvirt can control the entire lifecycle of guest domains,guest domains can transition through several states throughout their

virDomainCreateXML create and immediately boot a new transient guest domain,when this guest domain shuts down,all trace of it will disappear

virDomainDefineXML store the configuration for a persisent guest domain

virDomainCreate boot a previously defined guest domain from its persistent configuration,

virDomainDefineXML command can be used to turn a previously booted transient guest domain into a persistent domain

booting a transient guest domain

to boot a transient guest domain,simply requires a connection to libvirt and a string containing the XML document describing the required

configuration,the following example assumes that conn is

virDomainPtr dom;

const char *xmlconfig = "<domain>...</domain>";

dom = virConnectCreateXML(conn,xmlconfig,0);

if (!dom) {

fprintf(stderr,"Domain creation failed");

return;

}

fprintf(stderr,"Guest %s has booted",virDomainName(dom));

virDomainFree(dom);

Defining and booting a persistent guest domain

virDomainPtr dom;

const char *xmlconfig  = "<domain>..</domain>";

dom = virConnectDefineXML(conn,xmlconfig,0);

if (!dom)

{

fprintf(stderr,"Domain definition failed");

return;

}

if (virDomainCreate(dom) < 0)

{

virDomainFree(dom);

fprintf(stderr,"Cannot boot guest");

New guest provisioning techniques

<domain type='kvm'>

<name>demo</name>

<graphics type='vnc' port='-1' listen='localhost'>

}

CMROM/ISO image provisioning

<os>

<type arch='x86_64' machine='pc'>hvm</type>

<boot dev='hd'/>

<boot dev='cdrom'/>

</os>

<disk type='file' device='cdrom'>

<source file='/var/lib/libvirt/images/rhel5-x86_64-dvd.iso'/>

<target dev='hdc' bus='ide'>

</disk>

const char *xml = "<domain>...</domain>";

virDomainPtr dom;

dom = virDomainDefineXML(conn,xml);

if (!dom)

{

fprintf(stderr,"Unable to define persistent guest configuration");

return;

}

if (virDomainCreate(dom) < 0)

{

fprintf(stderr,"Unable to boot guest configuration");

}

Paravirtualized (full virtualization)准虚拟化 technologies

Paravirtualization ()半虚拟化

<os>

<type arch='x86_64' machine='pc'>hvm</type>

<kernel>/var/lib/libvirt/boot/f11-x86_64-vmlinuz</kernel>

<initrd>/var/lib/libvirt/boot/f11-x86_64-initrd.img</initrd>

<cmdline>method=http://download.fedoraproject.org/pub/fedora/linux/releases/11/x86_64/osconsole=ttySo console=tty<cmdline>

</os>

host side bootloader xen paravirtualized

<bootloader>/usr/bin/pygrub</bootloader>

<os>

<type arch='x86_64' machine='pc'>xen</type>

</os>

BIOS boot setup fully virtualized guest

const char *xml = "<domain>...</domain>"
virDomainPtr dom;
dom = virDomainCreateXML(conn,xml);
if (!dom)
{
fprintf(stderr,"Unable to define persistent guest configuration \n");
return;
}
if (virDomainCreate(dom) < ) {
fprintf("stderr,"Unable to boot persistent guest \n"");
return;
}
fprintf(stderr,"Guest provisoning complete,OS is running \n");

stopping

a guest can be stopped by two methods

shutdown and destroy

virDomainPtr dom;
virDomainInfoPtr info;
const char *filename = "/var/lib/libvirt/save/demo-guest.img";
dom = virDomainLookupByName(conn,"demo-guest");
//id,uuid,name/第二个参数;
//virDomainPtr,virDomainLokkupByID,virDomainByName,virDomainByUUID
if (!dom)
{
fprintf(stderr,"Cannot find guest to be saved");
return;
}
if (virDomainGetInfo(dom,&info) < )
{
fprintf(stderr,"Cannot check guest state");
return;
}
if (info.state == VIR_DOMAIN_SHUTOFF)
{
fprintf(stderr,"Not saving guest that isn't running");
}
if (virDomainSave(dom,filename) < )
{
fprintf(stderr,"Unable to save guest to %s ",filename);
}
fprintf(stderr,"Guest state saved to %s",filename);

virDomainPtr dom;

int id;

const char *filename = "/var/lib/libvirt/save/demo-guest.img";

if ((id = virDomainRestore(conn,filename)) < 0)

{

fprintf(stderr,"Unable to restore guest from %s",filename);

}

dom = virDomainLookupByID(conn,id);

if (!dom) {

fprintf(stderr,"Cannot find guest that was restored");

return;

}

virDomainMigrate established hypervisor connection

domains are defined in libvirt using XML  Everything related only to the domain

monitoring performance

statistical metrics are available for monitoring the utilization rates of domains,

vCPUS,Vmemory,block devices ,netWork interfaces;

virNodeDevicePtr de= get virNodeDevicePtr for the PCI device
if (virNodeDeviceDettach(dev) < )
{
fprintf(stderr,"Device cannot be dettached from the host OS drivers \n");
return;
}
if (virNodeDeviceReset(dev) < )
{
fprintf(stderr,"Device cannot be safely reset without affecting other devices \n");
}

virInterfaceDefineXML virInterfaceGetXMLDesc

xml definition of an ethernet interface using DHCP

<interface type='ethernet' name='eth0'>

<start mode='onboot'/>

<mac address=''/>

<protocol family='ipv4'>

xml definition of an ethernet interface with static ip

<interface type='ethernet' name='eth0'>

<start mode='onboot'/>

<mac address=''>

<protocol family=''>

<ip address="" prefix="24"/>

<route gateway="">

</protocol>

</interface>

xml definition of a bridge device with eth0 and eth1 attached

<interface type="bridge" name="br0">

<start mode="onboot"/>

<mtu size="1500"/>

<protocol family="ipv4">

<dhcp/>

</protocol>

<bridge stp="off" delay="0.01">

<interface type="ethernet" name="eth0">

<mac address=""/>

</interface>

<interface type="ethernet" name="eth1"/>

</bridge>

</interface>

xml definition of a vlan interface associated with eth0

<interface type="value" name="eth0.042">

<start mode="onboot"/>

<protocol family="ipv4">

<dhcp peerdns="no"/>

</protocol>

<vlan tag="42">

<interface name="eth0"/>

</vlan>

</interface>

retrieving information about interfaces

enumerating interfaces

have a connection to a host,respresented by a virConnectPtr,determine the number of interface on the host with virConnectNumOfInterfaces

and virConnectNumOfDefinedInterfaces

a list of those interfaces names can be obtained with virConnectListInterfaces and virConnectListDefinedInterfaces

("defined"  interfaces are those that have been defined,but are currently inactive)

getting a list of active("up" interfaces on a host)

int numIfaces,i
char *ifaceNames;
numIfaces = virConnectNumOfInterfaces(conn);
ifaceNames = malloc(numIfaces * sizeof(char *));
numIfaces = virConnectListInterfaces(conn,names,ct);
printf("Active host interfaces:\n");
for(i = ;i < numIfaces;i++)
{
printf("%s \n",ifaceNames[i]);
free(ifaceNames[i]);
}
free(ifaceNames);

getting a list of inactive ("down") interfaces on a host

int numIfaces,i;
char *ifaceNames;
numIfaces = virConnectNumOfDefinedInterfaces(conn);
ifaceNames = malloc(numIfaces * sizeof(char *));//分配内存空间
numIfaces = virConnectListDefinedInterfaces(conn,names,ct);
printf("Inactive host interfaces:\n");
for (i = ;i < numIfaces;i++)
{
prientf("%s \n",ifaceNames[i]);
free(ifaceNames[i]);
}
free(faceNames);

altrnative method of enumerating interfaces

virNodeDevice

virNodeListDevices virNodeDeviceLookupByName virNodeDeviceGetXMLDesc

obtaining a virInterfacePtr for an interface

many operations require that you have a virInterfacePtr,but you may only have the name or MAC address of the interface

use virInterfaceLookupByName and virInterfaceLookupByMACString to get the virInterfacePtr

virInterfacePtr iface;

const char *name = "eth0";

iface = virInterfaceLookupByName(name);

if (iface)

{

/*  use the virInterfacePtr*/

virInterfaceFree(iface);

}

else

{

printf("Interface '%s' not found. \n",name);

}

virInterfacePtr iface;

const char *mac ="";

iface = virInterfaceLookupByMACString(mac);

if (iface) {

//use the virInterfacePtr;

virInterfaceFree(iface);

}

else

{

printf("No interface found with MAC address '%s'.\n",mac);

}

virInterfaceGetName virInterfaceMACString virInterfaxceGetXMLDesc

const char *name;

const char *mac;

name = virInterfaceGetName(iface);

mac = virInterfaceGetMACString(iface);

printf("Interface %s has MAC address %s",name,mac);

virInterfaceGetXMLDesc

const char *xml;

name = virInterfaceGetXMLDesc(iface,0);

printf("Interface configuration:\n%s \n",xml);

free(xml);

//xml is a char * containing the description

virInterfacePtr iface;

iface = virInterfaceDefineXML(xml,0);

if (!iface)

{

fprintf(stderr,"Failed to define interface. \n");

//other error handling

goto cleanup;

virInterfaceFree(iface);

cleanup;

}

virInterfacePtr iface;

char *xml = NULL;

iface = virInterfaceLookupByName("br0");

if (!iface)

{

printf("Interface br0 not found. \n");

}

else

{

xml = virInterfaceGetXMLDesc(iface,0);

virInterfaceUndefine(iface);

virInterfaceFree(iface);

}

//you must also free the buffer at xml when you're finished with it

activating/deactivating an interface

temporarily bring down eth2,then bring it back up

virInterfaqcePtr iface;
iface = virInterfaceLookupByName("eth2");
if (!iface){
printf("Interface eth2 not found. \n");
}
else{
if (virInterfaceDestroy(iface) != )
{
fprintf(stderr,"failed to destroy (deactive) interface eth2. \n");
}
else{
//
if (virInterfaceCreate(iface) != ){
fprintf(stderr,"failed to create (active) interface eth2. \n");
}
}
free(iface);
}

libvirtsAPI的更多相关文章

随机推荐

  1. TinyXml高速入门(一)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 对于xml文件,眼下我的工作仅仅是集中在配置文件和作为简单的信息文件来用,因此我不太喜欢使用msxml这样的重量级的x ...

  2. 用shape结合selector实现点击效果

    <span style="font-family:Arial, Helvetica, sans-serif;font-size:18px;background-color: rgb(2 ...

  3. Arduino 数码管LED屏驱动

    今天測试数码管LED屏驱动,用某产品的一个共阴极的LED屏,依据电路图做数码管LED屏的检測. 代码写得有些冗长,有好几种驱动的方法,这里仅仅是当中一种最直接的方案,抽出时间要做个更有效率的调用和驱动 ...

  4. Can a Tomcat docBase span multiple folders?--转

    Question: I apologize if this is a poor question, but I'm using Windows and looking to see if there' ...

  5. 小学生之浅谈Struts2与struts1的运行机制

    Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...

  6. HTML5中class选择器属性的解释

    设置有class属性值的元素,可以被css中的选择器调用,也可以在javascript中以getElementsByClassName()方法调用. 可以给各个元素添加class而且名称可以相同与id ...

  7. CriticalFinalizerObject的作用

    CriticalFinalizerObject 在从 CriticalFinalizerObject 类派生的类中,公共语言运行库 (CLR) 保证所有关键终止代码都有机会执行, 即使是在 CLR 强 ...

  8. 常用语句1【weber出品】

    1.查看控制文件位置: select * from v$controlfile show parameter control; 2.查询日志文件位置  select group#,status,mem ...

  9. php 设置报错等级

    定义和用法:    error_reporting() 设置 PHP 的报错级别并返回当前级别. 函数语法:    error_reporting(report_level) 如果参数 level 未 ...

  10. PHP 类型比较表

    以下的表格显示了 PHP 类型和比较运算符在松散和严格比较时的作用.该补充材料还和类型戏法的相关章节内容有关.同时,大量的用户注释和 » BlueShoes 的工作也给该材料提供了帮助. 在使用这些表 ...