{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [], "source": [ "%matplotlib inline\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "import sys\n", "sys.path.append(\"../\")\n", "from aif360.algorithms.inprocessing import GerryFairClassifier\n", "from aif360.algorithms.inprocessing.gerryfair.clean import array_to_tuple\n", "from aif360.algorithms.inprocessing.gerryfair.auditor import Auditor\n", "from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions import load_preproc_data_adult\n", "from sklearn import svm\n", "from sklearn import tree\n", "from sklearn.kernel_ridge import KernelRidge\n", "from sklearn import linear_model\n", "from aif360.metrics import BinaryLabelDatasetMetric\n", "from IPython.display import Image\n", "import pickle\n", "import matplotlib.pyplot as plt\n", "\n", "# load data set\n", "data_set = load_preproc_data_adult(sub_samp=1000, balance=True)\n", "max_iterations = 500" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**instantiate, fit, and predict** \n", "\n", "\n", "We first demonstrate how to instantiate a `GerryFairClassifier`, `train` it with respect to rich subgroup fairness, and `predict` the label of a new example. We remark that when we set the `print_flag = True` at each iteration of the algorithm we print the error, fairness violation, and violated group size of most recent model. The error is the classification error of the classifier. At each round the Learner tries to find a classifier that minimizes the classification error plus a weighted sum of the fairness disparities on all the groups that the Auditor has found up until that point. By contrast the Auditor tries to find the group at each round with the greatest rich subgroup disparity with respect to the Learner's model. We define `violated group size` as the size (as a fraction of the dataset size) of this group, and the `fairness violation` as the `violated group size` times the difference in the statistical rate (FP or FN rate) on the group vs. the whole population. \n", "\n", "In the example below we set `max_iterations=500` which is an order of magnitude less than the time to convergence observed in [the rich subgroup fairness empirical paper](https://arxiv.org/abs/1808.08166), but advise that this can be highly dataset dependent. Our target $\\gamma$-disparity is $\\gamma = .005$, our statistical rate is false positive rate or `FP`, and our cost-sensitive classification oracle is linear regression (more on that below). \n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iteration: 1, error: 0.263, fairness violation: 0.028780000000000007, violated group size: 0.217\n", "iteration: 2, error: 0.3815, fairness violation: 0.014390000000000003, violated group size: 0.217\n", "iteration: 3, error: 0.42099999999999993, fairness violation: 0.009593333333333339, violated group size: 0.283\n", "iteration: 4, error: 0.44075, fairness violation: 0.007195000000000002, violated group size: 0.217\n", "iteration: 5, error: 0.45260000000000006, fairness violation: 0.005756000000000001, violated group size: 0.217\n", "iteration: 6, error: 0.4605000000000001, fairness violation: 0.004796666666666668, violated group size: 0.283\n", "iteration: 7, error: 0.4661428571428572, fairness violation: 0.004111428571428572, violated group size: 0.217\n", "iteration: 8, error: 0.470375, fairness violation: 0.0035975000000000017, violated group size: 0.217\n", "iteration: 9, error: 0.4691111111111112, fairness violation: 0.0033906666666666677, violated group size: 0.283\n", "iteration: 10, error: 0.4681, fairness violation: 0.003225200000000001, violated group size: 0.283\n", "iteration: 11, error: 0.4672727272727271, fairness violation: 0.0030898181818181836, violated group size: 0.283\n", "iteration: 12, error: 0.4665833333333333, fairness violation: 0.0029769999999999996, violated group size: 0.217\n", "iteration: 13, error: 0.466, fairness violation: 0.0028815384615384627, violated group size: 0.283\n", "iteration: 14, error: 0.4655000000000001, fairness violation: 0.0027997142857142865, violated group size: 0.217\n", "iteration: 15, error: 0.46506666666666674, fairness violation: 0.002728800000000001, violated group size: 0.217\n", "iteration: 16, error: 0.4646875, fairness violation: 0.0026667500000000007, violated group size: 0.217\n", "iteration: 17, error: 0.4643529411764707, fairness violation: 0.002612000000000001, violated group size: 0.283\n", "iteration: 18, error: 0.46405555555555567, fairness violation: 0.002563333333333334, violated group size: 0.217\n", "iteration: 19, error: 0.4637894736842106, fairness violation: 0.0025197894736842096, violated group size: 0.217\n", "iteration: 20, error: 0.46354999999999996, fairness violation: 0.0024806000000000008, violated group size: 0.283\n", "iteration: 21, error: 0.4633333333333334, fairness violation: 0.0024451428571428584, violated group size: 0.217\n", "iteration: 22, error: 0.4631363636363638, fairness violation: 0.0024129090909090914, violated group size: 0.283\n", "iteration: 23, error: 0.46295652173913054, fairness violation: 0.002383478260869566, violated group size: 0.217\n", "iteration: 24, error: 0.4627916666666667, fairness violation: 0.002356500000000001, violated group size: 0.283\n", "iteration: 25, error: 0.4626400000000001, fairness violation: 0.0023316800000000018, violated group size: 0.283\n", "iteration: 26, error: 0.4625000000000001, fairness violation: 0.0023087692307692314, violated group size: 0.217\n", "iteration: 27, error: 0.4623703703703705, fairness violation: 0.0022875555555555557, violated group size: 0.217\n", "iteration: 28, error: 0.46224999999999994, fairness violation: 0.0022678571428571426, violated group size: 0.217\n", "iteration: 29, error: 0.46213793103448264, fairness violation: 0.0022495172413793106, violated group size: 0.217\n", "iteration: 30, error: 0.46203333333333335, fairness violation: 0.0022324000000000003, violated group size: 0.217\n", "iteration: 31, error: 0.46193548387096783, fairness violation: 0.0022163870967741935, violated group size: 0.217\n", "iteration: 32, error: 0.46184375, fairness violation: 0.0022013749999999993, violated group size: 0.217\n", "iteration: 33, error: 0.459969696969697, fairness violation: 0.0023319393939393944, violated group size: 0.283\n", "iteration: 34, error: 0.4582058823529412, fairness violation: 0.002454823529411765, violated group size: 0.217\n", "iteration: 35, error: 0.45654285714285714, fairness violation: 0.0025706857142857144, violated group size: 0.217\n", "iteration: 36, error: 0.4549722222222221, fairness violation: 0.0026801111111111114, violated group size: 0.283\n", "iteration: 37, error: 0.4534864864864866, fairness violation: 0.0027836216216216214, violated group size: 0.283\n", "iteration: 38, error: 0.45207894736842097, fairness violation: 0.0028816842105263162, violated group size: 0.283\n", "iteration: 39, error: 0.4507435897435898, fairness violation: 0.0029747179487179492, violated group size: 0.217\n", "iteration: 40, error: 0.44947499999999996, fairness violation: 0.0030631000000000005, violated group size: 0.217\n", "iteration: 41, error: 0.44826829268292684, fairness violation: 0.0031471707317073175, violated group size: 0.283\n", "iteration: 42, error: 0.4471190476190476, fairness violation: 0.0032272380952380955, violated group size: 0.217\n", "iteration: 43, error: 0.44602325581395347, fairness violation: 0.0033035813953488386, violated group size: 0.283\n", "iteration: 44, error: 0.44497727272727267, fairness violation: 0.0033764545454545453, violated group size: 0.283\n", "iteration: 45, error: 0.4439777777777778, fairness violation: 0.003446088888888888, violated group size: 0.217\n", "iteration: 46, error: 0.44302173913043474, fairness violation: 0.0035126956521739122, violated group size: 0.217\n", "iteration: 47, error: 0.44210638297872346, fairness violation: 0.0035764680851063826, violated group size: 0.217\n", "iteration: 48, error: 0.4412291666666666, fairness violation: 0.003637583333333332, violated group size: 0.217\n", "iteration: 49, error: 0.4403877551020407, fairness violation: 0.0036962040816326523, violated group size: 0.217\n", "iteration: 50, error: 0.4395600000000001, fairness violation: 0.0037524800000000003, violated group size: 0.217\n", "iteration: 51, error: 0.43876470588235295, fairness violation: 0.0038065490196078425, violated group size: 0.217\n", "iteration: 52, error: 0.438, fairness violation: 0.003858538461538461, violated group size: 0.283\n", "iteration: 53, error: 0.4372641509433963, fairness violation: 0.003908566037735848, violated group size: 0.217\n", "iteration: 54, error: 0.4365555555555556, fairness violation: 0.003956740740740741, violated group size: 0.283\n", "iteration: 55, error: 0.4358181818181819, fairness violation: 0.004003163636363636, violated group size: 0.217\n", "iteration: 56, error: 0.4351071428571429, fairness violation: 0.004047928571428571, violated group size: 0.217\n", "iteration: 57, error: 0.4344736842105262, fairness violation: 0.004091122807017543, violated group size: 0.217\n", "iteration: 58, error: 0.43381034482758624, fairness violation: 0.004132827586206895, violated group size: 0.217\n", "iteration: 59, error: 0.4331694915254237, fairness violation: 0.0041731186440677965, violated group size: 0.283\n", "iteration: 60, error: 0.43254999999999993, fairness violation: 0.004212066666666666, violated group size: 0.217\n", "iteration: 61, error: 0.4319508196721312, fairness violation: 0.004249737704918031, violated group size: 0.217\n", "iteration: 62, error: 0.4313709677419356, fairness violation: 0.004286193548387096, violated group size: 0.217\n", "iteration: 63, error: 0.43080952380952386, fairness violation: 0.004321492063492062, violated group size: 0.283\n", "iteration: 64, error: 0.430265625, fairness violation: 0.004355687499999999, violated group size: 0.283\n", "iteration: 65, error: 0.4297384615384615, fairness violation: 0.004388830769230769, violated group size: 0.283\n", "iteration: 66, error: 0.42922727272727274, fairness violation: 0.004420969696969697, violated group size: 0.217\n", "iteration: 67, error: 0.42873134328358203, fairness violation: 0.004452149253731343, violated group size: 0.217\n", "iteration: 68, error: 0.42824999999999996, fairness violation: 0.0044824117647058815, violated group size: 0.283\n", "iteration: 69, error: 0.42778260869565227, fairness violation: 0.004511797101449274, violated group size: 0.217\n", "iteration: 70, error: 0.42732857142857145, fairness violation: 0.004540342857142856, violated group size: 0.283\n", "iteration: 71, error: 0.42688732394366197, fairness violation: 0.004568084507042252, violated group size: 0.217\n", "iteration: 72, error: 0.4264583333333332, fairness violation: 0.004595055555555555, violated group size: 0.283\n", "iteration: 73, error: 0.42604109589041106, fairness violation: 0.004621287671232876, violated group size: 0.217\n", "iteration: 74, error: 0.4256351351351351, fairness violation: 0.0046468108108108095, violated group size: 0.283\n", "iteration: 75, error: 0.42524, fairness violation: 0.004671653333333331, violated group size: 0.217\n", "iteration: 76, error: 0.4248552631578947, fairness violation: 0.004695842105263155, violated group size: 0.217\n", "iteration: 77, error: 0.42448051948051946, fairness violation: 0.004719402597402596, violated group size: 0.217\n", "iteration: 78, error: 0.4239871794871795, fairness violation: 0.00475905128205128, violated group size: 0.217\n", "iteration: 79, error: 0.42363291139240505, fairness violation: 0.004781215189873418, violated group size: 0.283\n", "iteration: 80, error: 0.42328750000000015, fairness violation: 0.004802824999999999, violated group size: 0.283\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "iteration: 81, error: 0.4229506172839506, fairness violation: 0.004823901234567901, violated group size: 0.283\n", "iteration: 82, error: 0.4226219512195123, fairness violation: 0.004844463414634145, violated group size: 0.217\n", "iteration: 83, error: 0.4221807228915662, fairness violation: 0.004880216867469879, violated group size: 0.217\n", "iteration: 84, error: 0.42175, fairness violation: 0.004915119047619047, violated group size: 0.217\n", "iteration: 85, error: 0.4214470588235294, fairness violation: 0.004933882352941174, violated group size: 0.217\n", "iteration: 86, error: 0.4210348837209302, fairness violation: 0.004967348837209301, violated group size: 0.217\n", "iteration: 87, error: 0.420632183908046, fairness violation: 0.005000045977011494, violated group size: 0.283\n", "iteration: 88, error: 0.42035227272727277, fairness violation: 0.0050172045454545434, violated group size: 0.217\n", "iteration: 89, error: 0.4200786516853933, fairness violation: 0.005033977528089887, violated group size: 0.217\n", "iteration: 90, error: 0.4198111111111112, fairness violation: 0.005050377777777776, violated group size: 0.283\n", "iteration: 91, error: 0.4195824175824176, fairness violation: 0.0050664175824175805, violated group size: 0.217\n", "iteration: 92, error: 0.4193695652173913, fairness violation: 0.005082108695652173, violated group size: 0.217\n", "iteration: 93, error: 0.41916129032258065, fairness violation: 0.005097462365591397, violated group size: 0.217\n", "iteration: 94, error: 0.41895744680851066, fairness violation: 0.005112489361702126, violated group size: 0.217\n", "iteration: 95, error: 0.41875789473684216, fairness violation: 0.005127199999999998, violated group size: 0.217\n", "iteration: 96, error: 0.41856250000000006, fairness violation: 0.005141604166666665, violated group size: 0.283\n", "iteration: 97, error: 0.418979381443299, fairness violation: 0.005106494845360823, violated group size: 0.217\n", "iteration: 98, error: 0.41938775510204085, fairness violation: 0.005072102040816325, violated group size: 0.217\n", "iteration: 99, error: 0.4197878787878788, fairness violation: 0.0050384040404040376, violated group size: 0.217\n", "iteration: 100, error: 0.42018000000000005, fairness violation: 0.0050053799999999985, violated group size: 0.217\n", "iteration: 101, error: 0.42056435643564366, fairness violation: 0.004973009900990098, violated group size: 0.217\n", "iteration: 102, error: 0.42094117647058826, fairness violation: 0.00494127450980392, violated group size: 0.217\n", "iteration: 103, error: 0.4213106796116506, fairness violation: 0.004910155339805824, violated group size: 0.217\n", "iteration: 104, error: 0.4216730769230769, fairness violation: 0.004879634615384614, violated group size: 0.217\n", "iteration: 105, error: 0.4220285714285715, fairness violation: 0.004849695238095237, violated group size: 0.217\n", "iteration: 106, error: 0.4223773584905662, fairness violation: 0.004820320754716981, violated group size: 0.283\n", "iteration: 107, error: 0.42271962616822434, fairness violation: 0.004791495327102803, violated group size: 0.217\n", "iteration: 108, error: 0.4230555555555556, fairness violation: 0.0047632037037037035, violated group size: 0.217\n", "iteration: 109, error: 0.4233853211009175, fairness violation: 0.00473543119266055, violated group size: 0.217\n", "iteration: 110, error: 0.4237090909090908, fairness violation: 0.004708163636363636, violated group size: 0.217\n", "iteration: 111, error: 0.424027027027027, fairness violation: 0.004681387387387387, violated group size: 0.283\n", "iteration: 112, error: 0.42433928571428586, fairness violation: 0.004655089285714286, violated group size: 0.283\n", "iteration: 113, error: 0.4241238938053097, fairness violation: 0.004671504424778761, violated group size: 0.217\n", "iteration: 114, error: 0.42442982456140343, fairness violation: 0.004645754385964912, violated group size: 0.283\n", "iteration: 115, error: 0.42473043478260875, fairness violation: 0.0046204521739130425, violated group size: 0.283\n", "iteration: 116, error: 0.42502586206896553, fairness violation: 0.0045955862068965524, violated group size: 0.283\n", "iteration: 117, error: 0.42481196581196584, fairness violation: 0.004611948717948717, violated group size: 0.217\n", "iteration: 118, error: 0.4251016949152542, fairness violation: 0.004587576271186439, violated group size: 0.217\n", "iteration: 119, error: 0.42489075630252104, fairness violation: 0.004603731092436974, violated group size: 0.217\n", "iteration: 120, error: 0.4251750000000001, fairness violation: 0.0045798333333333325, violated group size: 0.217\n", "iteration: 121, error: 0.4249669421487604, fairness violation: 0.004595785123966942, violated group size: 0.283\n", "iteration: 122, error: 0.4247622950819671, fairness violation: 0.0046114754098360656, violated group size: 0.217\n", "iteration: 123, error: 0.42456097560975614, fairness violation: 0.00462691056910569, violated group size: 0.217\n", "iteration: 124, error: 0.42436290322580644, fairness violation: 0.004642096774193548, violated group size: 0.217\n", "iteration: 125, error: 0.4241680000000001, fairness violation: 0.00465704, violated group size: 0.217\n", "iteration: 126, error: 0.4239761904761905, fairness violation: 0.004671746031746031, violated group size: 0.217\n", "iteration: 127, error: 0.42425196850393704, fairness violation: 0.004648629921259842, violated group size: 0.217\n", "iteration: 128, error: 0.4240625, fairness violation: 0.004663171874999999, violated group size: 0.217\n", "iteration: 129, error: 0.4238759689922481, fairness violation: 0.004677488372093024, violated group size: 0.283\n", "iteration: 130, error: 0.42369230769230776, fairness violation: 0.004691584615384614, violated group size: 0.217\n", "iteration: 131, error: 0.42351145038167937, fairness violation: 0.004705465648854962, violated group size: 0.217\n", "iteration: 132, error: 0.4233333333333333, fairness violation: 0.004719136363636364, violated group size: 0.283\n", "iteration: 133, error: 0.423157894736842, fairness violation: 0.0047326015037594, violated group size: 0.217\n", "iteration: 134, error: 0.4229850746268656, fairness violation: 0.004745865671641791, violated group size: 0.217\n", "iteration: 135, error: 0.42281481481481475, fairness violation: 0.004758933333333335, violated group size: 0.283\n", "iteration: 136, error: 0.4226470588235294, fairness violation: 0.004771808823529411, violated group size: 0.217\n", "iteration: 137, error: 0.42248175182481745, fairness violation: 0.004784496350364964, violated group size: 0.283\n", "iteration: 138, error: 0.42231884057971014, fairness violation: 0.004797000000000002, violated group size: 0.283\n", "iteration: 139, error: 0.42215827338129497, fairness violation: 0.004809323741007196, violated group size: 0.283\n", "iteration: 140, error: 0.42200000000000004, fairness violation: 0.004821471428571429, violated group size: 0.217\n", "iteration: 141, error: 0.4218439716312057, fairness violation: 0.0048334468085106394, violated group size: 0.217\n", "iteration: 142, error: 0.42169014084507045, fairness violation: 0.004845253521126761, violated group size: 0.283\n", "iteration: 143, error: 0.4215384615384616, fairness violation: 0.004856895104895106, violated group size: 0.283\n", "iteration: 144, error: 0.4213888888888888, fairness violation: 0.004868375, violated group size: 0.217\n", "iteration: 145, error: 0.42124137931034483, fairness violation: 0.004879696551724138, violated group size: 0.217\n", "iteration: 146, error: 0.4210958904109589, fairness violation: 0.00489086301369863, violated group size: 0.217\n", "iteration: 147, error: 0.4209523809523809, fairness violation: 0.004901877551020409, violated group size: 0.217\n", "iteration: 148, error: 0.42081081081081084, fairness violation: 0.004912743243243244, violated group size: 0.217\n", "iteration: 149, error: 0.42067114093959734, fairness violation: 0.004923463087248323, violated group size: 0.283\n", "iteration: 150, error: 0.4205333333333334, fairness violation: 0.004934040000000001, violated group size: 0.217\n", "iteration: 151, error: 0.4203973509933776, fairness violation: 0.004944476821192053, violated group size: 0.217\n", "iteration: 152, error: 0.4202631578947368, fairness violation: 0.0049547763157894754, violated group size: 0.283\n", "iteration: 153, error: 0.4201307189542483, fairness violation: 0.00496494117647059, violated group size: 0.283\n", "iteration: 154, error: 0.42, fairness violation: 0.004974974025974027, violated group size: 0.283\n", "iteration: 155, error: 0.4198709677419355, fairness violation: 0.0049848774193548395, violated group size: 0.217\n", "iteration: 156, error: 0.4197435897435898, fairness violation: 0.004994653846153847, violated group size: 0.217\n", "iteration: 157, error: 0.4196178343949045, fairness violation: 0.0050043057324840766, violated group size: 0.217\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "iteration: 158, error: 0.4194936708860761, fairness violation: 0.005013835443037975, violated group size: 0.217\n", "iteration: 159, error: 0.41937106918239, fairness violation: 0.005023245283018869, violated group size: 0.283\n", "iteration: 160, error: 0.41925000000000007, fairness violation: 0.0050325375, violated group size: 0.217\n", "iteration: 161, error: 0.4191304347826087, fairness violation: 0.005041714285714285, violated group size: 0.217\n", "iteration: 162, error: 0.41901234567901235, fairness violation: 0.005050777777777778, violated group size: 0.283\n", "iteration: 163, error: 0.41889570552147243, fairness violation: 0.005059730061349694, violated group size: 0.283\n", "iteration: 164, error: 0.4191402439024391, fairness violation: 0.005039463414634148, violated group size: 0.283\n", "iteration: 165, error: 0.41938181818181824, fairness violation: 0.005019442424242424, violated group size: 0.217\n", "iteration: 166, error: 0.4192650602409639, fairness violation: 0.005028421686746988, violated group size: 0.217\n", "iteration: 167, error: 0.41950299401197605, fairness violation: 0.005008706586826348, violated group size: 0.217\n", "iteration: 168, error: 0.41973809523809513, fairness violation: 0.004989226190476189, violated group size: 0.217\n", "iteration: 169, error: 0.41997041420118336, fairness violation: 0.0049699763313609474, violated group size: 0.283\n", "iteration: 170, error: 0.4202, fairness violation: 0.00495095294117647, violated group size: 0.283\n", "iteration: 171, error: 0.4204269005847953, fairness violation: 0.004932152046783625, violated group size: 0.217\n", "iteration: 172, error: 0.42065116279069764, fairness violation: 0.00491356976744186, violated group size: 0.217\n", "iteration: 173, error: 0.4208728323699421, fairness violation: 0.004895202312138728, violated group size: 0.217\n", "iteration: 174, error: 0.42109195402298855, fairness violation: 0.004877045977011494, violated group size: 0.217\n", "iteration: 175, error: 0.4213085714285715, fairness violation: 0.004859097142857142, violated group size: 0.217\n", "iteration: 176, error: 0.42152272727272727, fairness violation: 0.0048413522727272715, violated group size: 0.217\n", "iteration: 177, error: 0.42173446327683617, fairness violation: 0.00482380790960452, violated group size: 0.217\n", "iteration: 178, error: 0.42161235955056187, fairness violation: 0.004833280898876404, violated group size: 0.217\n", "iteration: 179, error: 0.42182122905027924, fairness violation: 0.004815977653631285, violated group size: 0.217\n", "iteration: 180, error: 0.4220277777777778, fairness violation: 0.004798866666666665, violated group size: 0.217\n", "iteration: 181, error: 0.42223204419889504, fairness violation: 0.004781944751381214, violated group size: 0.283\n", "iteration: 182, error: 0.4224340659340659, fairness violation: 0.004765208791208789, violated group size: 0.217\n", "iteration: 183, error: 0.4226338797814208, fairness violation: 0.004748655737704917, violated group size: 0.217\n", "iteration: 184, error: 0.4228315217391304, fairness violation: 0.004732282608695651, violated group size: 0.217\n", "iteration: 185, error: 0.4230270270270271, fairness violation: 0.004716086486486487, violated group size: 0.217\n", "iteration: 186, error: 0.4229032258064515, fairness violation: 0.0047257311827957, violated group size: 0.283\n", "iteration: 187, error: 0.4230962566844919, fairness violation: 0.0047097433155080205, violated group size: 0.217\n", "iteration: 188, error: 0.4229734042553191, fairness violation: 0.00471931914893617, violated group size: 0.283\n", "iteration: 189, error: 0.4231640211640213, fairness violation: 0.004703534391534391, violated group size: 0.217\n", "iteration: 190, error: 0.42304210526315794, fairness violation: 0.004713042105263158, violated group size: 0.217\n", "iteration: 191, error: 0.4232303664921467, fairness violation: 0.004697455497382198, violated group size: 0.217\n", "iteration: 192, error: 0.42310937499999995, fairness violation: 0.004706895833333333, violated group size: 0.217\n", "iteration: 193, error: 0.42329533678756476, fairness violation: 0.004691502590673575, violated group size: 0.283\n", "iteration: 194, error: 0.4231752577319588, fairness violation: 0.004700876288659792, violated group size: 0.217\n", "iteration: 195, error: 0.4230564102564103, fairness violation: 0.004710153846153845, violated group size: 0.217\n", "iteration: 196, error: 0.4229387755102041, fairness violation: 0.004719336734693878, violated group size: 0.283\n", "iteration: 197, error: 0.4228223350253807, fairness violation: 0.004728426395939086, violated group size: 0.283\n", "iteration: 198, error: 0.4227070707070707, fairness violation: 0.004737424242424242, violated group size: 0.217\n", "iteration: 199, error: 0.4228894472361809, fairness violation: 0.004722341708542713, violated group size: 0.217\n", "iteration: 200, error: 0.42277499999999996, fairness violation: 0.004731279999999999, violated group size: 0.217\n", "iteration: 201, error: 0.4226616915422886, fairness violation: 0.004740129353233829, violated group size: 0.217\n", "iteration: 202, error: 0.4225495049504951, fairness violation: 0.00474889108910891, violated group size: 0.217\n", "iteration: 203, error: 0.42243842364532025, fairness violation: 0.004757566502463053, violated group size: 0.283\n", "iteration: 204, error: 0.42232843137254905, fairness violation: 0.004766156862745097, violated group size: 0.283\n", "iteration: 205, error: 0.422219512195122, fairness violation: 0.004774663414634145, violated group size: 0.217\n", "iteration: 206, error: 0.422111650485437, fairness violation: 0.004783087378640775, violated group size: 0.217\n", "iteration: 207, error: 0.4220048309178744, fairness violation: 0.00479142995169082, violated group size: 0.217\n", "iteration: 208, error: 0.4218990384615385, fairness violation: 0.004799692307692306, violated group size: 0.217\n", "iteration: 209, error: 0.42179425837320567, fairness violation: 0.004807875598086124, violated group size: 0.217\n", "iteration: 210, error: 0.4216904761904762, fairness violation: 0.004815980952380952, violated group size: 0.217\n", "iteration: 211, error: 0.42158767772511846, fairness violation: 0.0048240094786729856, violated group size: 0.217\n", "iteration: 212, error: 0.42148584905660386, fairness violation: 0.004831962264150944, violated group size: 0.217\n", "iteration: 213, error: 0.4213849765258215, fairness violation: 0.004839840375586855, violated group size: 0.283\n", "iteration: 214, error: 0.421285046728972, fairness violation: 0.0048476448598130835, violated group size: 0.217\n", "iteration: 215, error: 0.42118604651162794, fairness violation: 0.004855376744186045, violated group size: 0.217\n", "iteration: 216, error: 0.4210879629629629, fairness violation: 0.004863037037037037, violated group size: 0.283\n", "iteration: 217, error: 0.42099078341013824, fairness violation: 0.004870626728110601, violated group size: 0.283\n", "iteration: 218, error: 0.42089449541284396, fairness violation: 0.004878146788990825, violated group size: 0.217\n", "iteration: 219, error: 0.42079908675799094, fairness violation: 0.004885598173515983, violated group size: 0.283\n", "iteration: 220, error: 0.4207045454545455, fairness violation: 0.004892981818181818, violated group size: 0.283\n", "iteration: 221, error: 0.4206108597285068, fairness violation: 0.004900298642533936, violated group size: 0.283\n", "iteration: 222, error: 0.4205180180180179, fairness violation: 0.004907549549549549, violated group size: 0.217\n", "iteration: 223, error: 0.4204260089686098, fairness violation: 0.004914735426008968, violated group size: 0.217\n", "iteration: 224, error: 0.4203348214285714, fairness violation: 0.004921857142857143, violated group size: 0.283\n", "iteration: 225, error: 0.4202444444444444, fairness violation: 0.004928915555555555, violated group size: 0.217\n", "iteration: 226, error: 0.42015486725663725, fairness violation: 0.004935911504424777, violated group size: 0.217\n", "iteration: 227, error: 0.4200660792951542, fairness violation: 0.004942845814977973, violated group size: 0.217\n", "iteration: 228, error: 0.4199780701754386, fairness violation: 0.004949719298245614, violated group size: 0.217\n", "iteration: 229, error: 0.4198908296943231, fairness violation: 0.004956532751091703, violated group size: 0.283\n", "iteration: 230, error: 0.419804347826087, fairness violation: 0.004963286956521739, violated group size: 0.283\n", "iteration: 231, error: 0.4197186147186147, fairness violation: 0.004969982683982686, violated group size: 0.283\n", "iteration: 232, error: 0.4196336206896552, fairness violation: 0.004976620689655175, violated group size: 0.283\n", "iteration: 233, error: 0.419549356223176, fairness violation: 0.004983201716738197, violated group size: 0.283\n", "iteration: 234, error: 0.419465811965812, fairness violation: 0.0049897264957264945, violated group size: 0.217\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "iteration: 235, error: 0.4193829787234044, fairness violation: 0.00499619574468085, violated group size: 0.217\n", "iteration: 236, error: 0.41930084745762713, fairness violation: 0.005002610169491525, violated group size: 0.283\n", "iteration: 237, error: 0.4192194092827004, fairness violation: 0.005008970464135021, violated group size: 0.283\n", "iteration: 238, error: 0.41913865546218493, fairness violation: 0.00501527731092437, violated group size: 0.283\n", "iteration: 239, error: 0.4190585774058578, fairness violation: 0.005021531380753138, violated group size: 0.283\n", "iteration: 240, error: 0.4189791666666667, fairness violation: 0.005027733333333333, violated group size: 0.217\n", "iteration: 241, error: 0.41890041493775937, fairness violation: 0.005033883817427385, violated group size: 0.217\n", "iteration: 242, error: 0.4188223140495868, fairness violation: 0.0050399834710743805, violated group size: 0.217\n", "iteration: 243, error: 0.4187448559670781, fairness violation: 0.005046032921810699, violated group size: 0.217\n", "iteration: 244, error: 0.41890983606557386, fairness violation: 0.005032467213114753, violated group size: 0.217\n", "iteration: 245, error: 0.419073469387755, fairness violation: 0.005019012244897959, violated group size: 0.217\n", "iteration: 246, error: 0.41923577235772364, fairness violation: 0.005005666666666667, violated group size: 0.283\n", "iteration: 247, error: 0.4191578947368422, fairness violation: 0.005011757085020243, violated group size: 0.217\n", "iteration: 248, error: 0.41908064516129034, fairness violation: 0.005017798387096774, violated group size: 0.283\n", "iteration: 249, error: 0.4192409638554217, fairness violation: 0.005004618473895581, violated group size: 0.217\n", "iteration: 250, error: 0.4194000000000001, fairness violation: 0.004991544, violated group size: 0.217\n", "iteration: 251, error: 0.4195577689243028, fairness violation: 0.004978573705179282, violated group size: 0.283\n", "iteration: 252, error: 0.4197142857142857, fairness violation: 0.004965706349206349, violated group size: 0.217\n", "iteration: 253, error: 0.4198695652173912, fairness violation: 0.00495294071146245, violated group size: 0.217\n", "iteration: 254, error: 0.42002362204724414, fairness violation: 0.00494027559055118, violated group size: 0.217\n", "iteration: 255, error: 0.4201764705882353, fairness violation: 0.004927709803921568, violated group size: 0.217\n", "iteration: 256, error: 0.420328125, fairness violation: 0.004915242187499999, violated group size: 0.217\n", "iteration: 257, error: 0.42047859922178993, fairness violation: 0.004902871595330739, violated group size: 0.217\n", "iteration: 258, error: 0.42062790697674424, fairness violation: 0.004890596899224807, violated group size: 0.217\n", "iteration: 259, error: 0.4207760617760617, fairness violation: 0.004878416988416988, violated group size: 0.283\n", "iteration: 260, error: 0.42069615384615383, fairness violation: 0.004884692307692307, violated group size: 0.217\n", "iteration: 261, error: 0.42061685823754785, fairness violation: 0.004890919540229886, violated group size: 0.283\n", "iteration: 262, error: 0.42076335877862603, fairness violation: 0.004878877862595419, violated group size: 0.217\n", "iteration: 263, error: 0.4209087452471483, fairness violation: 0.004866927756653992, violated group size: 0.217\n", "iteration: 264, error: 0.4208295454545454, fairness violation: 0.004873151515151516, violated group size: 0.283\n", "iteration: 265, error: 0.4209735849056603, fairness violation: 0.004861313207547171, violated group size: 0.283\n", "iteration: 266, error: 0.4211165413533834, fairness violation: 0.004849563909774436, violated group size: 0.217\n", "iteration: 267, error: 0.42125842696629223, fairness violation: 0.0048379026217228475, violated group size: 0.217\n", "iteration: 268, error: 0.42139925373134324, fairness violation: 0.004826328358208956, violated group size: 0.283\n", "iteration: 269, error: 0.42131970260223045, fairness violation: 0.0048325873605947955, violated group size: 0.217\n", "iteration: 270, error: 0.42145925925925937, fairness violation: 0.00482111851851852, violated group size: 0.283\n", "iteration: 271, error: 0.42159778597785963, fairness violation: 0.004809734317343174, violated group size: 0.217\n", "iteration: 272, error: 0.42173529411764704, fairness violation: 0.004798433823529413, violated group size: 0.283\n", "iteration: 273, error: 0.4216556776556777, fairness violation: 0.004804703296703296, violated group size: 0.217\n", "iteration: 274, error: 0.42157664233576647, fairness violation: 0.00481092700729927, violated group size: 0.217\n", "iteration: 275, error: 0.42171272727272724, fairness violation: 0.004799745454545455, violated group size: 0.217\n", "iteration: 276, error: 0.42184782608695653, fairness violation: 0.004788644927536233, violated group size: 0.217\n", "iteration: 277, error: 0.4219819494584837, fairness violation: 0.004777624548736462, violated group size: 0.217\n", "iteration: 278, error: 0.42190287769784157, fairness violation: 0.004783856115107913, violated group size: 0.217\n", "iteration: 279, error: 0.42182437275985674, fairness violation: 0.004790043010752689, violated group size: 0.217\n", "iteration: 280, error: 0.42174642857142863, fairness violation: 0.004796185714285715, violated group size: 0.283\n", "iteration: 281, error: 0.42166903914590753, fairness violation: 0.0048022846975088965, violated group size: 0.283\n", "iteration: 282, error: 0.4218014184397163, fairness violation: 0.00479141134751773, violated group size: 0.217\n", "iteration: 283, error: 0.42172438162544174, fairness violation: 0.0047974840989399295, violated group size: 0.217\n", "iteration: 284, error: 0.4216478873239437, fairness violation: 0.004803514084507042, violated group size: 0.217\n", "iteration: 285, error: 0.42157192982456126, fairness violation: 0.004809501754385964, violated group size: 0.217\n", "iteration: 286, error: 0.4217027972027972, fairness violation: 0.004798755244755245, violated group size: 0.217\n", "iteration: 287, error: 0.4218327526132404, fairness violation: 0.004788083623693379, violated group size: 0.283\n", "iteration: 288, error: 0.4219618055555556, fairness violation: 0.004777486111111113, violated group size: 0.283\n", "iteration: 289, error: 0.4218858131487888, fairness violation: 0.004783480968858131, violated group size: 0.217\n", "iteration: 290, error: 0.4218103448275861, fairness violation: 0.004789434482758621, violated group size: 0.217\n", "iteration: 291, error: 0.42193814432989696, fairness violation: 0.004778941580756014, violated group size: 0.283\n", "iteration: 292, error: 0.42186301369863016, fairness violation: 0.0047848698630136985, violated group size: 0.217\n", "iteration: 293, error: 0.4217883959044368, fairness violation: 0.004790757679180888, violated group size: 0.217\n", "iteration: 294, error: 0.42171428571428576, fairness violation: 0.004796605442176871, violated group size: 0.217\n", "iteration: 295, error: 0.4216406779661017, fairness violation: 0.004802413559322035, violated group size: 0.217\n", "iteration: 296, error: 0.4215675675675675, fairness violation: 0.004808182432432432, violated group size: 0.217\n", "iteration: 297, error: 0.4214949494949495, fairness violation: 0.00481391245791246, violated group size: 0.283\n", "iteration: 298, error: 0.4214228187919464, fairness violation: 0.0048196040268456385, violated group size: 0.217\n", "iteration: 299, error: 0.42135117056856186, fairness violation: 0.0048252575250836115, violated group size: 0.217\n", "iteration: 300, error: 0.42128, fairness violation: 0.004830873333333335, violated group size: 0.283\n", "iteration: 301, error: 0.42120930232558146, fairness violation: 0.004836451827242525, violated group size: 0.217\n", "iteration: 302, error: 0.42113907284768215, fairness violation: 0.004841993377483444, violated group size: 0.217\n", "iteration: 303, error: 0.42106930693069305, fairness violation: 0.004847498349834984, violated group size: 0.217\n", "iteration: 304, error: 0.4211940789473684, fairness violation: 0.004837263157894738, violated group size: 0.283\n", "iteration: 305, error: 0.4211245901639345, fairness violation: 0.004842747540983607, violated group size: 0.283\n", "iteration: 306, error: 0.4210555555555555, fairness violation: 0.004848196078431373, violated group size: 0.217\n", "iteration: 307, error: 0.42098697068403895, fairness violation: 0.004853609120521175, violated group size: 0.283\n", "iteration: 308, error: 0.4209188311688312, fairness violation: 0.004858987012987015, violated group size: 0.283\n", "iteration: 309, error: 0.42085113268608415, fairness violation: 0.00486433009708738, violated group size: 0.283\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "iteration: 310, error: 0.4207838709677419, fairness violation: 0.00486963870967742, violated group size: 0.283\n", "iteration: 311, error: 0.420717041800643, fairness violation: 0.004874913183279744, violated group size: 0.217\n", "iteration: 312, error: 0.42065064102564104, fairness violation: 0.0048801538461538466, violated group size: 0.217\n", "iteration: 313, error: 0.42058466453674115, fairness violation: 0.0048853610223642185, violated group size: 0.217\n", "iteration: 314, error: 0.42051910828025474, fairness violation: 0.004890535031847135, violated group size: 0.217\n", "iteration: 315, error: 0.4204539682539683, fairness violation: 0.004895676190476191, violated group size: 0.217\n", "iteration: 316, error: 0.4203892405063292, fairness violation: 0.004900784810126583, violated group size: 0.217\n", "iteration: 317, error: 0.4203249211356468, fairness violation: 0.004905861198738172, violated group size: 0.283\n", "iteration: 318, error: 0.4202610062893082, fairness violation: 0.00491090566037736, violated group size: 0.217\n", "iteration: 319, error: 0.4201974921630094, fairness violation: 0.004915918495297806, violated group size: 0.217\n", "iteration: 320, error: 0.4201343749999999, fairness violation: 0.004920900000000002, violated group size: 0.217\n", "iteration: 321, error: 0.4200716510903427, fairness violation: 0.004925850467289721, violated group size: 0.217\n", "iteration: 322, error: 0.4200093167701862, fairness violation: 0.0049307701863354056, violated group size: 0.283\n", "iteration: 323, error: 0.4199473684210526, fairness violation: 0.00493565944272446, violated group size: 0.283\n", "iteration: 324, error: 0.41988580246913576, fairness violation: 0.004940518518518519, violated group size: 0.217\n", "iteration: 325, error: 0.41982461538461535, fairness violation: 0.004945347692307694, violated group size: 0.217\n", "iteration: 326, error: 0.4197638036809816, fairness violation: 0.004950147239263805, violated group size: 0.283\n", "iteration: 327, error: 0.4197033639143731, fairness violation: 0.004954917431192661, violated group size: 0.283\n", "iteration: 328, error: 0.4196432926829268, fairness violation: 0.004959658536585366, violated group size: 0.217\n", "iteration: 329, error: 0.41958358662613987, fairness violation: 0.004964370820668694, violated group size: 0.283\n", "iteration: 330, error: 0.41952424242424236, fairness violation: 0.004969054545454545, violated group size: 0.217\n", "iteration: 331, error: 0.41946525679758306, fairness violation: 0.00497370996978852, violated group size: 0.217\n", "iteration: 332, error: 0.41940662650602417, fairness violation: 0.004978337349397591, violated group size: 0.217\n", "iteration: 333, error: 0.4193483483483482, fairness violation: 0.004982936936936937, violated group size: 0.217\n", "iteration: 334, error: 0.4192904191616766, fairness violation: 0.004987508982035928, violated group size: 0.217\n", "iteration: 335, error: 0.4192328358208956, fairness violation: 0.004992053731343284, violated group size: 0.283\n", "iteration: 336, error: 0.4191755952380953, fairness violation: 0.00499657142857143, violated group size: 0.283\n", "iteration: 337, error: 0.4191186943620178, fairness violation: 0.0050010623145400595, violated group size: 0.217\n", "iteration: 338, error: 0.41906213017751476, fairness violation: 0.005005526627218935, violated group size: 0.217\n", "iteration: 339, error: 0.4190058997050148, fairness violation: 0.005009964601769911, violated group size: 0.217\n", "iteration: 340, error: 0.41894999999999993, fairness violation: 0.005014376470588236, violated group size: 0.283\n", "iteration: 341, error: 0.41889442815249267, fairness violation: 0.005018762463343108, violated group size: 0.217\n", "iteration: 342, error: 0.41883918128654973, fairness violation: 0.005023122807017544, violated group size: 0.217\n", "iteration: 343, error: 0.41878425655976675, fairness violation: 0.0050274577259475225, violated group size: 0.283\n", "iteration: 344, error: 0.4187296511627907, fairness violation: 0.005031767441860465, violated group size: 0.217\n", "iteration: 345, error: 0.4186753623188406, fairness violation: 0.005036052173913045, violated group size: 0.283\n", "iteration: 346, error: 0.4186213872832369, fairness violation: 0.005040312138728323, violated group size: 0.217\n", "iteration: 347, error: 0.41856772334293946, fairness violation: 0.005044547550432276, violated group size: 0.283\n", "iteration: 348, error: 0.41851436781609197, fairness violation: 0.005048758620689655, violated group size: 0.217\n", "iteration: 349, error: 0.418461318051576, fairness violation: 0.005052945558739255, violated group size: 0.283\n", "iteration: 350, error: 0.4185771428571428, fairness violation: 0.005043468571428572, violated group size: 0.283\n", "iteration: 351, error: 0.4186923076923077, fairness violation: 0.005034045584045584, violated group size: 0.217\n", "iteration: 352, error: 0.4188068181818182, fairness violation: 0.005024676136363637, violated group size: 0.283\n", "iteration: 353, error: 0.4189206798866855, fairness violation: 0.005015359773371105, violated group size: 0.217\n", "iteration: 354, error: 0.41903389830508475, fairness violation: 0.005006096045197741, violated group size: 0.283\n", "iteration: 355, error: 0.41914647887323936, fairness violation: 0.004996884507042254, violated group size: 0.283\n", "iteration: 356, error: 0.4192584269662922, fairness violation: 0.004987724719101122, violated group size: 0.217\n", "iteration: 357, error: 0.41936974789915965, fairness violation: 0.0049786162464986, violated group size: 0.217\n", "iteration: 358, error: 0.41948044692737424, fairness violation: 0.004969558659217878, violated group size: 0.217\n", "iteration: 359, error: 0.41959052924791085, fairness violation: 0.004960551532033426, violated group size: 0.283\n", "iteration: 360, error: 0.4195361111111111, fairness violation: 0.004964855555555557, violated group size: 0.283\n", "iteration: 361, error: 0.4196454293628808, fairness violation: 0.004955911357340723, violated group size: 0.283\n", "iteration: 362, error: 0.4197541436464089, fairness violation: 0.004947016574585636, violated group size: 0.217\n", "iteration: 363, error: 0.4198622589531681, fairness violation: 0.004938170798898072, violated group size: 0.283\n", "iteration: 364, error: 0.41996978021978026, fairness violation: 0.004929373626373626, violated group size: 0.217\n", "iteration: 365, error: 0.42007671232876714, fairness violation: 0.004920624657534246, violated group size: 0.217\n", "iteration: 366, error: 0.42018306010928963, fairness violation: 0.004911923497267759, violated group size: 0.217\n", "iteration: 367, error: 0.4202888283378746, fairness violation: 0.004903269754768393, violated group size: 0.217\n", "iteration: 368, error: 0.42039402173913043, fairness violation: 0.00489466304347826, violated group size: 0.217\n", "iteration: 369, error: 0.4204986449864499, fairness violation: 0.00488610298102981, violated group size: 0.283\n", "iteration: 370, error: 0.4206027027027027, fairness violation: 0.0048775891891891885, violated group size: 0.217\n", "iteration: 371, error: 0.4207061994609164, fairness violation: 0.004869121293800538, violated group size: 0.217\n", "iteration: 372, error: 0.4208091397849463, fairness violation: 0.004860698924731182, violated group size: 0.217\n", "iteration: 373, error: 0.420911528150134, fairness violation: 0.004852321715817694, violated group size: 0.217\n", "iteration: 374, error: 0.420855614973262, fairness violation: 0.004856754010695187, violated group size: 0.217\n", "iteration: 375, error: 0.4209573333333334, fairness violation: 0.004848432, violated group size: 0.217\n", "iteration: 376, error: 0.42105851063829786, fairness violation: 0.004840154255319148, violated group size: 0.217\n", "iteration: 377, error: 0.4211591511936339, fairness violation: 0.004831920424403182, violated group size: 0.217\n", "iteration: 378, error: 0.4211031746031746, fairness violation: 0.004836359788359788, violated group size: 0.217\n", "iteration: 379, error: 0.42120316622691284, fairness violation: 0.004828179419525066, violated group size: 0.217\n", "iteration: 380, error: 0.42130263157894726, fairness violation: 0.004820042105263157, violated group size: 0.217\n", "iteration: 381, error: 0.42124671916010503, fairness violation: 0.004824477690288715, violated group size: 0.283\n", "iteration: 382, error: 0.42134554973821986, fairness violation: 0.004816392670157068, violated group size: 0.283\n", "iteration: 383, error: 0.42144386422976504, fairness violation: 0.004808349869451696, violated group size: 0.217\n", "iteration: 384, error: 0.42154166666666676, fairness violation: 0.004800348958333333, violated group size: 0.283\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "iteration: 385, error: 0.4214857142857143, fairness violation: 0.00480478961038961, violated group size: 0.217\n", "iteration: 386, error: 0.4215829015544041, fairness violation: 0.0047968393782383415, violated group size: 0.217\n", "iteration: 387, error: 0.42152713178294576, fairness violation: 0.004801266149870801, violated group size: 0.283\n", "iteration: 388, error: 0.4216237113402061, fairness violation: 0.004793365979381444, violated group size: 0.283\n", "iteration: 389, error: 0.42171979434447304, fairness violation: 0.004785506426735219, violated group size: 0.217\n", "iteration: 390, error: 0.4218153846153847, fairness violation: 0.00477768717948718, violated group size: 0.217\n", "iteration: 391, error: 0.4219104859335038, fairness violation: 0.004769907928388747, violated group size: 0.217\n", "iteration: 392, error: 0.4218545918367348, fairness violation: 0.00477434693877551, violated group size: 0.217\n", "iteration: 393, error: 0.42194910941475816, fairness violation: 0.004766615776081424, violated group size: 0.217\n", "iteration: 394, error: 0.42204314720812186, fairness violation: 0.004758923857868021, violated group size: 0.283\n", "iteration: 395, error: 0.4221367088607595, fairness violation: 0.00475127088607595, violated group size: 0.217\n", "iteration: 396, error: 0.42208080808080806, fairness violation: 0.004755712121212122, violated group size: 0.283\n", "iteration: 397, error: 0.42202518891687657, fairness violation: 0.004760130982367758, violated group size: 0.217\n", "iteration: 398, error: 0.42196984924623115, fairness violation: 0.004764527638190955, violated group size: 0.283\n", "iteration: 399, error: 0.42191478696741846, fairness violation: 0.004768902255639098, violated group size: 0.217\n", "iteration: 400, error: 0.42186, fairness violation: 0.004773255, violated group size: 0.217\n", "iteration: 401, error: 0.4218054862842893, fairness violation: 0.004777586034912718, violated group size: 0.283\n", "iteration: 402, error: 0.4217512437810945, fairness violation: 0.00478189552238806, violated group size: 0.217\n", "iteration: 403, error: 0.4218436724565757, fairness violation: 0.0047743374689826305, violated group size: 0.283\n", "iteration: 404, error: 0.42178960396039605, fairness violation: 0.004778633663366336, violated group size: 0.217\n", "iteration: 405, error: 0.4217358024691357, fairness violation: 0.004782908641975308, violated group size: 0.217\n", "iteration: 406, error: 0.4216822660098523, fairness violation: 0.004787162561576355, violated group size: 0.217\n", "iteration: 407, error: 0.4216289926289926, fairness violation: 0.004791395577395577, violated group size: 0.283\n", "iteration: 408, error: 0.421575980392157, fairness violation: 0.004795607843137254, violated group size: 0.217\n", "iteration: 409, error: 0.4215232273838631, fairness violation: 0.004799799511002444, violated group size: 0.217\n", "iteration: 410, error: 0.42147073170731714, fairness violation: 0.004803970731707317, violated group size: 0.283\n", "iteration: 411, error: 0.4214184914841849, fairness violation: 0.0048081216545012165, violated group size: 0.217\n", "iteration: 412, error: 0.4213665048543689, fairness violation: 0.004812252427184466, violated group size: 0.283\n", "iteration: 413, error: 0.42131476997578693, fairness violation: 0.004816363196125908, violated group size: 0.217\n", "iteration: 414, error: 0.42126328502415455, fairness violation: 0.004820454106280194, violated group size: 0.217\n", "iteration: 415, error: 0.4212120481927711, fairness violation: 0.004824525301204821, violated group size: 0.283\n", "iteration: 416, error: 0.42116105769230766, fairness violation: 0.004828576923076923, violated group size: 0.217\n", "iteration: 417, error: 0.4211103117505996, fairness violation: 0.004832609112709832, violated group size: 0.283\n", "iteration: 418, error: 0.42105980861244025, fairness violation: 0.004836622009569378, violated group size: 0.283\n", "iteration: 419, error: 0.42100954653937933, fairness violation: 0.004840615751789977, violated group size: 0.217\n", "iteration: 420, error: 0.42110000000000003, fairness violation: 0.0048332238095238084, violated group size: 0.217\n", "iteration: 421, error: 0.42104988123515436, fairness violation: 0.004837206650831354, violated group size: 0.217\n", "iteration: 422, error: 0.42100000000000004, fairness violation: 0.004841170616113744, violated group size: 0.217\n", "iteration: 423, error: 0.420950354609929, fairness violation: 0.004845115839243499, violated group size: 0.217\n", "iteration: 424, error: 0.42104009433962253, fairness violation: 0.004837783018867924, violated group size: 0.217\n", "iteration: 425, error: 0.4209905882352941, fairness violation: 0.004841717647058822, violated group size: 0.217\n", "iteration: 426, error: 0.42094131455399053, fairness violation: 0.004845633802816901, violated group size: 0.217\n", "iteration: 427, error: 0.42089227166276344, fairness violation: 0.004849531615925057, violated group size: 0.217\n", "iteration: 428, error: 0.4208434579439252, fairness violation: 0.004853411214953271, violated group size: 0.217\n", "iteration: 429, error: 0.4207948717948717, fairness violation: 0.0048572727272727274, violated group size: 0.283\n", "iteration: 430, error: 0.42074651162790694, fairness violation: 0.004861116279069767, violated group size: 0.217\n", "iteration: 431, error: 0.4206983758700697, fairness violation: 0.004864941995359629, violated group size: 0.283\n", "iteration: 432, error: 0.420650462962963, fairness violation: 0.00486875, violated group size: 0.217\n", "iteration: 433, error: 0.42060277136258656, fairness violation: 0.0048725404157043874, violated group size: 0.217\n", "iteration: 434, error: 0.42055529953917054, fairness violation: 0.0048763133640553, violated group size: 0.283\n", "iteration: 435, error: 0.42050804597701147, fairness violation: 0.004880068965517241, violated group size: 0.217\n", "iteration: 436, error: 0.4204610091743119, fairness violation: 0.004883807339449542, violated group size: 0.217\n", "iteration: 437, error: 0.4204141876430207, fairness violation: 0.004887528604118992, violated group size: 0.217\n", "iteration: 438, error: 0.42036757990867574, fairness violation: 0.004891232876712329, violated group size: 0.217\n", "iteration: 439, error: 0.4203211845102506, fairness violation: 0.0048949202733485206, violated group size: 0.283\n", "iteration: 440, error: 0.42027499999999995, fairness violation: 0.00489859090909091, violated group size: 0.283\n", "iteration: 441, error: 0.42022902494331066, fairness violation: 0.004902244897959184, violated group size: 0.283\n", "iteration: 442, error: 0.42018325791855204, fairness violation: 0.004905882352941177, violated group size: 0.217\n", "iteration: 443, error: 0.42013769751693003, fairness violation: 0.004909503386004516, violated group size: 0.283\n", "iteration: 444, error: 0.42009234234234244, fairness violation: 0.004913108108108108, violated group size: 0.217\n", "iteration: 445, error: 0.420047191011236, fairness violation: 0.004916696629213483, violated group size: 0.217\n", "iteration: 446, error: 0.42000224215246645, fairness violation: 0.004920269058295964, violated group size: 0.217\n", "iteration: 447, error: 0.4199574944071588, fairness violation: 0.004923825503355704, violated group size: 0.217\n", "iteration: 448, error: 0.41991294642857147, fairness violation: 0.004927366071428571, violated group size: 0.217\n", "iteration: 449, error: 0.41986859688195993, fairness violation: 0.004930890868596881, violated group size: 0.217\n", "iteration: 450, error: 0.41982444444444433, fairness violation: 0.004934399999999999, violated group size: 0.217\n", "iteration: 451, error: 0.41978048780487814, fairness violation: 0.004937893569844789, violated group size: 0.217\n", "iteration: 452, error: 0.41973672566371684, fairness violation: 0.004941371681415928, violated group size: 0.217\n", "iteration: 453, error: 0.41969315673289187, fairness violation: 0.0049448344370860925, violated group size: 0.217\n", "iteration: 454, error: 0.41964977973568285, fairness violation: 0.004948281938325991, violated group size: 0.283\n", "iteration: 455, error: 0.41960659340659345, fairness violation: 0.004951714285714286, violated group size: 0.283\n", "iteration: 456, error: 0.41956359649122804, fairness violation: 0.004955131578947367, violated group size: 0.217\n", "iteration: 457, error: 0.41952078774617063, fairness violation: 0.0049585339168490145, violated group size: 0.217\n", "iteration: 458, error: 0.41947816593886456, fairness violation: 0.004961921397379911, violated group size: 0.217\n", "iteration: 459, error: 0.4194357298474945, fairness violation: 0.00496529411764706, violated group size: 0.283\n", "iteration: 460, error: 0.4193934782608696, fairness violation: 0.004968652173913044, violated group size: 0.283\n", "iteration: 461, error: 0.41935140997830805, fairness violation: 0.004971995661605205, violated group size: 0.283\n", "iteration: 462, error: 0.41930952380952374, fairness violation: 0.0049753246753246735, violated group size: 0.217\n", "iteration: 463, error: 0.41926781857451406, fairness violation: 0.004978639308855291, violated group size: 0.217\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "iteration: 464, error: 0.41922629310344817, fairness violation: 0.004981939655172413, violated group size: 0.217\n", "iteration: 465, error: 0.41918494623655916, fairness violation: 0.004985225806451612, violated group size: 0.217\n", "iteration: 466, error: 0.4191437768240344, fairness violation: 0.004988497854077254, violated group size: 0.283\n", "iteration: 467, error: 0.41910278372591, fairness violation: 0.004991755888650964, violated group size: 0.283\n", "iteration: 468, error: 0.4190619658119658, fairness violation: 0.004994999999999998, violated group size: 0.217\n", "iteration: 469, error: 0.4190213219616205, fairness violation: 0.0049982302771855, violated group size: 0.217\n", "iteration: 470, error: 0.41898085106382993, fairness violation: 0.005001446808510636, violated group size: 0.283\n", "iteration: 471, error: 0.41894055201698516, fairness violation: 0.005004649681528661, violated group size: 0.217\n", "iteration: 472, error: 0.41890042372881364, fairness violation: 0.005007838983050847, violated group size: 0.283\n", "iteration: 473, error: 0.4188604651162791, fairness violation: 0.005011014799154333, violated group size: 0.217\n", "iteration: 474, error: 0.41882067510548526, fairness violation: 0.005014177215189871, violated group size: 0.217\n", "iteration: 475, error: 0.41878105263157905, fairness violation: 0.0050173263157894735, violated group size: 0.283\n", "iteration: 476, error: 0.41874159663865557, fairness violation: 0.0050204621848739485, violated group size: 0.217\n", "iteration: 477, error: 0.4188259958071279, fairness violation: 0.005013576519916141, violated group size: 0.217\n", "iteration: 478, error: 0.41878661087866115, fairness violation: 0.005016707112970709, violated group size: 0.217\n", "iteration: 479, error: 0.4188705636743216, fairness violation: 0.005009858037578285, violated group size: 0.217\n", "iteration: 480, error: 0.41883125000000004, fairness violation: 0.005012983333333334, violated group size: 0.283\n", "iteration: 481, error: 0.4187920997920998, fairness violation: 0.005016095634095634, violated group size: 0.283\n", "iteration: 482, error: 0.4187531120331951, fairness violation: 0.0050191950207468874, violated group size: 0.283\n", "iteration: 483, error: 0.4188364389233955, fairness violation: 0.00501239751552795, violated group size: 0.217\n", "iteration: 484, error: 0.41891942148760325, fairness violation: 0.005005628099173555, violated group size: 0.283\n", "iteration: 485, error: 0.4190020618556701, fairness violation: 0.004998886597938144, violated group size: 0.283\n", "iteration: 486, error: 0.41896296296296304, fairness violation: 0.005001995884773661, violated group size: 0.217\n", "iteration: 487, error: 0.4190451745379877, fairness violation: 0.004995289527720739, violated group size: 0.283\n", "iteration: 488, error: 0.4191270491803279, fairness violation: 0.004988610655737704, violated group size: 0.283\n", "iteration: 489, error: 0.4192085889570552, fairness violation: 0.004981959100204497, violated group size: 0.217\n", "iteration: 490, error: 0.41916938775510204, fairness violation: 0.004985077551020407, violated group size: 0.283\n", "iteration: 491, error: 0.4192505091649695, fairness violation: 0.004978460285132381, violated group size: 0.217\n", "iteration: 492, error: 0.4192113821138212, fairness violation: 0.004981573170731706, violated group size: 0.217\n", "iteration: 493, error: 0.41917241379310355, fairness violation: 0.004984673427991887, violated group size: 0.283\n", "iteration: 494, error: 0.41913360323886634, fairness violation: 0.004987761133603237, violated group size: 0.217\n", "iteration: 495, error: 0.4192141414141415, fairness violation: 0.004981191919191918, violated group size: 0.217\n", "iteration: 496, error: 0.4192943548387097, fairness violation: 0.004974649193548386, violated group size: 0.217\n", "iteration: 497, error: 0.419374245472837, fairness violation: 0.004968132796780683, violated group size: 0.217\n", "iteration: 498, error: 0.4194538152610441, fairness violation: 0.004961642570281124, violated group size: 0.217\n", "iteration: 499, error: 0.41953306613226454, fairness violation: 0.0049551783567134255, violated group size: 0.217\n" ] } ], "source": [ "C = 100\n", "print_flag = True\n", "gamma = .005\n", "\n", "\n", "fair_model = GerryFairClassifier(C=C, printflag=print_flag, gamma=gamma, fairness_def='FP',\n", " max_iters=max_iterations, heatmapflag=False)\n", "\n", "# fit method\n", "fair_model.fit(data_set, early_termination=True)\n", "\n", "# predict method. If threshold in (0, 1) produces binary predictions\n", "\n", "dataset_yhat = fair_model.predict(data_set, threshold=False)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**3-d heatmaps**\n", "\n", "We now show to generate a 3d-heatmap of unfairness using the `generate_heatmap` method. The $X-Y$ axes in the plot represent the coefficients of the linear threshold function that defines a protected subgroup with respect to the first two sensitive attributes. Which $2$ attributes are considered sensitive can be overwritten with the `col_index` argument. The $Z$-axes is the $\\gamma$-disparity (FP) of the corresponding subgroup defined by the linear threshold function. This is important because it allows us to (1) visualize convergence as the heatmap flattens and (2) brute force check the fairness in low-dimensions without relying on a heuristic auditor. See the [the rich subgroup fairness empirical paper](https://arxiv.org/abs/1808.08166) for a discussion of these plots. Note that in the below plot no group has a $\\gamma$-disparity of greater than $.005$, which we would expect since the set of linear threshold functions on two attributes is a subset of the set of linear threshold functions on all protected attributes, and the final model is $\\gamma$-fair. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEgCAYAAADVKCZpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOy9eZQcdbn//67epvfpWTNrZs8kE7LNZJn4Q+CqCMEQ9OJFvChyEPRyBEXOVbgsAiqGq3i+iqC4ACLnXBHwahS9EfCKfCUhgZAA2Wd6enp6Znq2np7epveq3x/5firV3dXdVb1M9ySf1zk5SXqqq6p7uutdz/N5nvfDcBzHgUKhUCiUZYai1CdAoVAoFEouUAGjUCgUyrKEChiFQqFQliVUwCgUCoWyLKECRqFQKJRlCRUwCoVCoSxLqIBRKBQKZVlCBYxCoVAoyxIqYBQKhUJZllABo1AoFMqyhAoYhUKhUJYlVMAoFAqFsiyhAkahUCiUZQkVMAqFQqEsS6iAUSgUCmVZQgWMQqFQKMsSKmAUCoVCWZZQAaNQKBTKsoQKGIVCoVCWJVTAKBQKhbIsoQJGoVAolGUJFTAKhUKhLEuogFEoFAplWUIFjEKhUCjLEipgFAqFQlmWUAGjUCgUyrKEChiFQqFQliVUwCgUCoWyLKECRqFQKJRlCRUwCoVCoSxLqIBRKBQKZVlCBYxCoVAoyxIqYBQKhUJZllABo1AoFMqyhAoYhUKhUJYlVMAoFAqFsiyhAkahUCiUZQkVMAqFQqEsS6iAUSgUCmVZQgWMQqFQKMsSKmAUCoVCWZZQAaNQKBTKsoQKGIVCoVCWJVTAKBQKhbIsoQJGoVAolGUJFTAKhUKhLEuogFEoFAplWaIq9QlQKKWA4zhwHIdwOAwAUCqVUCgUUCgUYBgGDMOU+AwpFEo2qIBRzis4jgPLsojFYmBZFtFoFPF4PEGwGIaBQqGAUqmESqWiwkahlCkMx3FcqU+CQik2ycJFhCj5/2Rb8odgt9vR1tYGpVJJhY1CKRNoBEY5p+E4DvF4HLFYDBzH8WKTSXDEfu5yudDR0QGWZRGPxxGJRBJ+ToSNpCKVSiUVNgqlyFABo5yTcByHaDQKl8sFi8XCpwXzRWwfJLqLx+O8SAq3J9Fa8jobhULJDypglHMKjuMQi8UQj8cRjUYxNDSEbdu2FfWY6SItkoaMRCIJwjY7O4uamhpUVFQkRG1U2CgUeVABo5wTEOGKxWIAzoiKUqlEoZZ4GYZJia6kPEds+5mZGZjNZigUCkQikZSILTkdSYWNQhGHChhlWUNSd0LhIhd7IjqZCIfDYBgGarU667EKWe9EBFZs/7FYDNFoNOFnVNgolFSogFGWJaSiMB6PAxCPdjIJmN/vx8jICPx+PxiGQTweh1qthtFohF6v5/8mwlZIoUi3L6HwCkkWNmEkSIpJSEQnLCChUM51qIBRlg1kTSkajYJlWQDp03TkZ8l4PB6MjIwgFouhs7MTJpOJF4hoNIpAIIBAIICpqSkEAgHEYjGo1WoEg0FMTk7CZDLBYDCkjdj8D3wRxgd+WqBXnPg6xITN4/EgFApBo9GkPCddxEbFjXKuQAWMUvYIe7hOnjyJ1tZW6PV6WRfi+fl5jIyMQKFQoLOzExaLBQD4KI5hGGg0Gmg0GlRVVSU8NxKJ4MiRI2BZFtPT0wnCZjAY+D+qH9wJ4IyIiVEsYSNRF4EIsjC1KnwObdKmnCtQAaOULWLNx5FIJKXxONPzY7EYDh48CI1Gg97eXphMJtnnodFooFar0dTUlBB5RSIRPmKbnp5Gc5b9EGHrABAH4P9/j+cjbGKFJekiNrK9WC8bEbZ4PA6dTsdHbVTYKOUMFTBK2ZGp+VihUPDpw0zPn56exujoKKLRKAYGBmAwGPI6J7H1tOSIzS/2RAn4H/gi3nn0UMrjF82/neMe05Op5J9lWRw6dAj9/f0J2whTkVTYKOUEFTBK2SAmXMmNw5kEjGVZTE1NYXR0FBaLBRs2bMDhw4ezipeU8ngpFY25ICZchNerN4s+XkxhYxgGKtXZy4KUJm3hGhutjKQsJVTAKCVH2HycTrgIYkLCsizGx8fhcDhQW1uLgYEBVFRUFPQcswnY/PQkNGl/mkom4cqGmLDZUBhhS36Ncpu0AVryT1k6qIBRSgbHcfD7/WBZFhqNRpLdkzACi8ViGB8fx8TEBFasWIGtW7dK6ufK53zzJR/hykYpIrZkhJWioVAIp06dQl9fHwAqbJTCQwWMsuQIm4/Hx8eh1WrR1NQk6bnEvcJqtcLpdKK5uRnbtm1LSHsVg3wvssUUrmzIEbZ8X6dQ2Mi4GqEjCm3SphQSKmCUJUOs+VipVGYtyiCEw2HMz89jYmICnZ2d2L59e4qbRbEo1hpYKUkWtkJHahzH8RF1Lk3a5PMhLPenTdoUIVTAKEUlW/OxlKrCUCgEm80Gt9sNvV6PlpYWNDdnK1pPPAc5zc6Z9iPG/PQkND95MONz+788IPp4KSOzZLgn7we37mMF2x/LsllTwtmETdjLFo/H4XQ60draSpu0KQCogFGKRHIPFyC+bqJUKlNmaxECgQBsNht8Ph86OjqwevVq2O12WZFQLia86fZTDMpB2D74vbOitbi4iLfffjuhQVuv10Or1cp+D6QIWDrEhC0ej8PtdmPlypUZm7STKyOpsJ27UAGjFBSx5uNMFxCxCMzn82FkZAShUAidnZ1Yu3ZtQsQmR8DI/vOdBbbUKcT+Lw8UXcSEwkUwGAzYtGkTFhcX4ff7sbCwgImJCYRCISgUCuj1+gRxyyRshbhxEBKPx9MKEvndsCyLcDic8DPqPnLuQgWMUhBID9f09DQ0Gg1MJpOkCwRxfwDO+BRarVawLIvOzk5UVVWlPF+4vRQyCY/b7YbVakU4HIbBYIDRaOQvzBUVFQnHXkoBK4VwETa/9xKYLVtgMplSXEvi8TgWFxcRCATg8XgwOTmZUdgKceMghGXZtGueubiPAGdMnaurq2mT9jKFChglL5Kbjz0eDwwGA8xms6TnMwyDQCCAt956C0qlEl1dXaisrEy7vUKhSKliy7b/ZOGZn5+H1WqFSqVCd3c31Go1QqEQAoEA3G43xsfHEQ6HoVQqeWf6cDgs2vNUSIopXJlESypKpVKWsLEsC47jMDo6yrv763S6nN+/XAUxU8n/qVOnMDAwkPJ7FVtjo5WR5QcVMEpOpGs+ViqVkiIkjuMwNzeH06dPg2VZbNy4UZJPoZSiD7HtOY6Dy+XCyMgIKioqsHr1aphMJn5ys9iFORaL8am0cDgMm80Gq9UKpVLJR2t6df4RRikjrkKQTthcLhecTie0Wi28Xi+cTieCwSAYhkmJ2KQIW6EjOiJsYnPZMrmP0JL/8oEKGEUWYpOPhReVbAJDfAptNhtMJhO6u7sxNzcn2WRXroABwNzcHCYmJqDT6dDX1wej0SjpeSqVCmazGWazGT6fDw0NDaisrEQsFkMgEIDfn6v74dJQbOHKBsMw0Gq1aGhoSHicZVk+YvP5fJiampIkbPF4fEnaJqQ0adNJ2uUBFTCKJDJNPhaiVCpFU3wsy8LpdMJut6OqqgqbNm2CVquFz+eTJUhS16I4jsPs7CwWFhagUCiwbt066PV6ycfJdFyVSoXKykpUVlZifnoy530SxCoR84nK8hUu7sn7wXw+c1uAFNJFTAqFAkajMeVGQkzYQqEQAPC/O5ZlEQgEoNPp8o7GpE41IGQSNuBMxG6z2VBRUYG6ujoAVNiKDRUwSkakTD4WolQq+YsOcOaueWJiAg6HA3V1ddi8eXPC8EW5RRlyIjyz2QyLxYKenp604lWIPrBsPWC5ILW8/oPf+xj+79f+xP+7nJArEJmEjQwU9fv9sNlsCAaDAACdTpcSsUkVtkJFdMICkng8zpfxZ3MfSVfyT5EOFTBKCsJUyYkTJ9DT0yPZAYEITCwWg8PhwMTEBBobG9P6FOa6piV2zlNTU7DZbLBYLHyE995778lOOYoh9toLEX3JhQibofVsWq7chIsgdOLIB4VCwVeJarVatLa2AjgrbGQm28zMjCxhy1TVmCuxWIzfp9QmbbLO9pOf/ATr16/Hxz5Wnr/PcoQKGIVHrPmYmO1K9RokxRLT09NoaWnB4OBgxufKsZICUgVMOEKluroa/f390Gq1CdsXovy9XKykhMJVTAqRRixGGX3yeisRqOTtMgkbqSyVYh4tFxKBZSKdsE1OTmJgQDzypohDBYySsflYalVhOBzG6OgopqenodVq8YEPfEDSxSHXCIxlWUxOTsJut2ccocIwTEEiMKAwbvS5slTCVUiKIWBSbqQyCRtplwgEAlhYWIDP58PBgwdTIja9Xp/TucdisZyNpb1eLywWS07PPV+hAnYek2nyMSGbgAWDQdhsNiwsLKC9vR0NDQ0YGxuT/OWXuwZGRrDs378fdXV12LJlS8Kamtj+CxWBlYLlKFyEQqUQCfF4PK85b6ThWq/Xo66uDm63G3Nzc+ju7k6I2Obm5rC4uAiO42QLmzCFKBePx8NP96ZIgwrYeYiUyceEdAIWCAQwMjKCQCCAjo4OrFmzhm9KLpRThpB4PI7x8XGMjY0BAAYHByXN/ipU6i95P0ux/lVq8co3jSgn9Sx1f8Vw9iDl+0TYCBzHJQiby+XC4uIiWJblU5FCYSPflVxfs8fjoRGYTKiAnUfImXxMSBYwr9eLkZERRCIRdHZ2oqamJqUfRm5ZfCbi8TgcDgfGx8fR2NiITZs24dSpU5IHVxYqhZiLEEZuub8oFYrLhWKvgeUL8VZMRyZhE6Yi5+fneWEjGYlkYZOC1+vN6EJDSYUK2HkAES6Xy8Wn+qReCIiALSwswGq1guM4dHV1pU11SF0zy4awirG5uZkvBolEIrLXzLIJT7mWLisGLwH75mslPYdDhw6l+ERmStkKkVtGn41CNzLnGi0xDAOdTgedTofa2lr+cY7jcODAAVRWVqYIm1arTUlFJr+WeDxe1Ini5yJUwM5hkpuPAfCOB1LgOA7hcBinTp2CwWBAd3d31jvEfAUsFovBbrfD6XSipaUlZWhlLhFeuu1jsRhGR0exsLDAX1iIZ1+ywJdLFeJS03/kD/B+8g4EAgHMzs5idHQU0WgUKpUqQdQMBkPKxbfQa2BLHYHJhWQ0amtrU4QtFArxTdputxuBQIAXNpfLhZMnT0KhUCAQCKR1itm7dy++8pWvIB6P46abbsJdd92V8PNwOIzrr78ehw4dQk1NDX7zm9+gvb0dALB79248+eSTUCqVePTRR3HZZZchFArhoosuQjgcRiwWwyc/+Uk8+ODyyhhQATsHSdd8rFKpUmYoiUFcLGw2G+LxOBobG9HV1SXp2LlYPQFANBqF3W7ny+/TTVvOZZxK8vZEJKemptDc3Iyuri5+rYOsc3Acx69xGI3GhNYC4frX+ZAiJK4jQqLRKG+nNT09jUAggFgsBrVazQtbMBgsaEqsGAImNZqUQjqjZ2HEVlNTk7B9OBzG6dOnMTs7C5fLhcsuuwyBQAA33XQTbr311oRz/dKXvoRXXnkFLS0t2LJlC3bt2oW+vj5+myeffBJVVVUYHh7Gc889hzvvvBO/+c1vcPz4cTz33HM4duwYJicn8ZGPfASnT59GRUUF/vd//xdGoxHRaBQXXnghduzYgcHBwZTXUOj3vlBQATtHyDb5GMgeHZFm4NHRUZjNZqxbtw4ul0v2AEk5RCIRhEIhHDx4ECtXrsT27duzrkvkaj0lFK7W1lZs374dwJmLscFgSLhrFvYS+Xw+uFwuzMzMYHx8HJ2tTdlf1y33Sz7HTJRDGlEMtVoNi8WSUnQQiUTg9/t5cRsZGeENlIXRmsFgkJ0OLHTEVIz9yXlNxCty/fr16OrqwhtvvIE33niDj9iEHDx4EN3d3ejs7AQAXHvttdizZ0+CgO3ZswcPPPAAAOCTn/wkbr31VnAchz179uDaa69FRUUFOjo60N3djYMHD2L79u18tBeNRhGNRkWbrhmGwVNPPYXa2loMDg6meFuWEipgyxypk48BpI3ASE/V2NgYqqureRcLAFhYWEgZEFgISN/Y3NwcFAoFBgcHJX355QokwzCIRqOwWq2Ymprim6vJsdKJs7CXqL6+HiqVCmq1GvX19fDMTUs6dqboLFuBh+lfrpV0jHJDo9Gguroa1dXVCAQCaGpqgslkShC2iYmJhBRatrUhQqGdMwq9ppZPD9jCwgIfrZKITcjExATvQAIALS0tOHDgQNptiF+ny+XCxMREQlTV0tKCiYkJAGfeg4GBAQwPD+NLX/oStm3blrBP8n2bmZnBCy+8gNdffx1XXXUVNm3aJHlkUjGhArZMIaXw8Xhc0uRj4MyHWhiBkdL08fFx1NfXp/gUkucsLi4W7LxDoRBsNhvcbjfa29vR09ODAwcOFKWQIhaLYX5+Hh6PB52dnZJFUgxyfkvhhl5u5FpOT9JODMOgoqICFRUVKSm0dNV8Yv1XxUghlosglqoCUalU4siRI1hYWMAnPvEJHD16FBdccEHKdnfffTfuvvtuvPjii7j99tthNBpxyy234FOf+lRJvxPll9SkZIRUFIZCIRw5ciRtA7IYJP0Wi8UwMjKC/fv3Ix6PY9u2bejp6RFdDyhUVWEoFMLx48fxzjvvwGKxYPv27WhqauLdugvllgGAf30HDhyAQqFAe3s72tra8vqilbKIQzF4SUmOmy/ZBIdEGrW1tWhra0NfXx82b96MLVu2oKurCyaTCcFgEHa7HYcOHYLX68WJEydgs9kwMzPDR3G5Uk4RmMfjyShgzc3NcDgc/P/Hx8fR3NycdptYLAaPx4OamhpJz7VYLPinf/on7N27V/T4kUgEp06dQm9vL77xjW9gfn4eu3fvxurVq/GHP/xB9ustFDQCWyaINR/7fD5ZkUs0GkUoFMKBAwcyFkoIyVfAFhcXYbPZ4PV6ExqehRA3jnybXmOxGMbGxvgKxsHBQUxNTcma4JwJjuMkNTBLWf86H4o/cp1ena7/6sCBA+js7BT1OMxlQGYxBCzX/S0sLGRsYt6yZQuGhoZgs9nQ3NyM5557Dv/1X/+VsM2uXbvwzDPPYPv27XjxxRfxoQ99CAzDYNeuXfjXf/1X3HHHHZicnMTQ0BC2bt2K2dlZfi0zGAzilVdewZ133plybJZl8eMf/xgnTpzA+++/jw996EP485//jLa2NtjtdlxyySXYtWtXTq87X6iAlTnZBkhKIRQKYXR0FC6XCwqFImuhhBClUimpclEIwzD82ItAIIDOzk709fWlvaDkWrlIEBMuoSN4uVlJLccG51zSiMWYoJzO41BsQCaxjhIKm1arLdqAzGK6cKhUKjz22GO47LLLEI/HceONN2Lt2rX4xje+gc2bN2PXrl34/Oc/j89+9rPo7u5GdXU1nnvuOQDA2rVrcc0116Cvrw8qlQqPP/44lEolnE4nPve5z/HLENdccw127tyZcmyv14vXX38d9913HzZt2sQ/znEcGhsb8R//8R85veZCQAWsTBETLrkXUWH0097ejt7eXuzfv1/WRUVuBOb3+xEMBnH06FF0dXWhtrY263nnKmBC4SLNzskXpHzFkXC2+rE0Tc/lWo2YiWIImBjp5ojF43Fe2DweDyYnJxEKhfgCncXFRXg8HphMJmg0mrxvUvJNIWazkbriiitwxRVXJDz2zW9+k/+3VqvFCy+8IPrce+65B/fcc0/CY+vXr8fhw4eznpter8e2bdsSxMvr9eKpp57C7bffjptuuinrPooFFbAyQ+rkY4JYmoaULy8uLqZEP+RCLNeJIxs+nw8jIyMIh8PQarXYuHFjwliTbMeQIzIcx2FkZCSjcBGK5YUIFC8NGLnlfmDuVFH2vZQU2olDLkqlEiaTCSaTKeHxeDzONxQvLCxgYmIC4XAYSqUyIVozGo2y+sTyjcCS16VKTSgUwvvvv4+//vWvePbZZ3H11VcjGAyiubkZ77//Pv7whz/g9ttvL+nvmApYmSB38jFwtiyeOCB4vV5YrVbEYjF0dnaiuro6ZR+kErFQAiY8ZldXF6qrq3H48OGCDKlMhkRcgUBAcul9oSIwADBozr8KRCFy04iFduIoFEqlEmazGWq1Gt3d3fzjsVgswbjXbrfzriNCURNzHSHPl3rTlkw5jlIJh8M4duwY/vKXv2Bubg73338/fD4fotEoFhYWcPHFFwMozmBQqVABKyGk+TgSicBqtaKzs1NWqpAIGIm4AKCzszPjSAaypiXVcy2dgHk8HlitVrAsm+KNKDftmG2kCvFFnJycRHNzM4xGI1auXCnp4ljYNbDs+yEFHOmiMykFHjVpoq/llkbMtYgj3b6KDemdSuc6QgpH/H4//x0SilokEslrlEq5GflWVlbihhtuwNq1azExMYGPf/zjmJqaQjgcRlVVFd8HVsoyeipgJUCs+XhmZibhblDKPmKxGI4cOQKdToeenh5JjYVyxSX5AuR2uzEyMgKGYdDV1SX6pct1SGUyQkNfYXHG9PS05DRoId3oKfIp1PtWSiujTK4jRNicTifm5uYwPz8PnU6X4hOZ7SJfjqNU/v73v4PjOKxZswbHjx/H3r17E5rUdTpdyc2HqYAtIbk0H4vtY2ZmBjabDdFoFF1dXWhqym5tRJDqh5jM/Pw8rFYrVCpVVrHMJQITikxyxJWPoW8m70SWZTE+Pg6n05ngeyiWImIYRkoAljflvv7FPXk/rBd/NsH4eCnuwAstYIWI6DQaDTQaDZ99OHr0KDo6OqBSqXgrLaHrSEVFRYKwCd87r9ebMXNSaCNfh8OB66+/HtPT02AYBl/4whfwla98RfR9stvt+NGPfgSGYeDxeBAOh+FwOHDPPffgW9/6VsGrOeVABWwJiUajiMfjOQkXy7K8T6HFYsGGDRvgcDhk3wHJEReO4zA/P49AIICxsTGsXr06ZUFcDLlTlkkRR7qIS2z/UgVMLIVIrLPsdjvq6+uxevVq3upIaEwrvOBomMI1WudT/FEOacSqqioEAgE4HI4U5wzyfiVbIeVLOblmZNqnWq2GRqNBRUUFqqur+Z8R415ip0VcR5xOJ376059iYWEBr7zyCjZt2oRVq1YlFI8Uw8hXpVLh+9//Pvr7++Hz+TAwMIBLL72U3yfHcfwa17Fjx7B///601xqaQjxPyNTDla46kGVZTExMYGxsDLW1tRgYGODHqidbQ0lBSgTGcRzm5uYwMjICnU7HVxVKJRdnjenpaVitVtGIKxm5ERjZluM4OJ1OjI6Oora2Flu2bIFarUYkEoFOp0tIhyZfcDTa7DcKhTLwLXdqampSLKGI8bHf7+cbjAOBAI4dO8aLmtFoREVFRU5pxXK3kQIyNzIT416tVptgGh2Px9Hd3Y2bbroJY2Nj2Lt3LxobG/HII4/w2xTLyLexsREAYDKZsGbNGkxMTPD7ZBgGkUgEGo0GDz/8MAYHB/GlL32poO9XIaACtoRkuvCq1WrEYjH+zisWi/E+hQ0NDdiyZYuoT6HcdGCmCIyMURkZGYHBYMAFF1wAg8GA/fv3y1qQlxrlxeNxjI2NwW63w2KxyDL0lROBsSwLp9MJm82G6urqBM/HdKmk5AuOFAeObJyrApfOOePgwYNoa2uD3+9P6MMSlqvzEW6WcvXlIGC5nKNSqcTq1auhUChw9913i37HimXkSxgdHcXhw4dTjHzJ+9PR0YF3330Xb7zxBlasWMGnP8uh6IQKWJmgUqn4cQbJzbnpekvIhGK5x0kWPbKuNjIyApPJhPXr10Ov1/M/l2v1lC1CIsI1OTmJpqYmdHV1geM4yRcUqTPBSAp0bm4OGo0G/f39OZc5J1OMHjCpAlfqNKLUcnqGYUQbjIXl6sIhmcJZYuQP+cwthxQikF/RSikKhfx+P66++mr84Ac/SFnXJmJcX1+PF154AceOHeOjx+npafzsZz/D+vXrC1ptKhcqYGUCwzAYGRmB1+vlZ1Vl+4Ll4hSvVCr58SjC+V+VlZXYuHGj6NoFiaikCli6CIwI18TEBJqbm7Ft2zaoVCo4nc6U+UeZyCaQJAVqtVr51OCaNWvSbk8rDJeWdOXqpKrP7/fD6XQiEAggHo9Dq9VCqVQiGo3C7/eLTsyWSykLD5IJhUL8soAYcox8W1paJBv5RqNRXH311bjuuuvwz//8zynHJd+La6+9FjfffDP/+1lcXMTCwgJfNU0bmc8TxH7RZLyIy+VCU1NT0X0KVSoV/H4/JicnMTo6iqqqqoT5X+mOI7coQxgZxuNxvjijqakpJaosVNk9x3FwuVywWq3Q6/VYv349GIbBiRMnJO9bDLkGvvlEZ+l6wJYbubQuJFf1AWdHrkxNTcHtdsNut/M3bcnl6lIMfAmFFrB8qhqz9YAVw8iX4zh8/vOfx5o1a3DHHXdkPL/a2lq8/vrrUKlU/Eicjo6OhCxNqaACViIWFxcxMjICn8+Hjo4OPn0i585S7hoYy7Jwu928kAgLQjKRa1k8ES5y10ciLrHt8ym7B86U+Q8PD0Or1fJrd8CZ8uJCjmrJlXNt/StbGrFQLhxk5Ar5fXZ0dABInZgtNPAVW19LFrZCC1g+a3SlMPL9xz/+gWeffRbr1q3jC7S+853vpHgtAsAPf/hD7Nu3Dy+88ALq6+sxMzMDAJibm0uotCwFVMCWEDICZWRkBKFQCB0dHVi7di2/7iV37IdUARNWMprNZtTU1GD16tWyjiO3+Xl+fh7T09OiEVcy+URgbrcbw8PDUKvV6OvrS1lvkeLEUcocPkGuwJV6HSwbhS66SLYrSp6YTSAGvn6/H/Pz8xgbG0MkEuHtoArhmiFGMWeBAYU38r3wwgslR40//vGPcfz4cTgcDuzbtw9vvPEGXnrpJVrEcb4RjUZx+vRptLe3p/gUqlQqfm1KKtkEjDTqOhwO1NfXY8uWLbxtlRzkVBU6HA7Y7XZUVFSkjbiSkStgDMPwvWkMw2TsTyukF2IhWG5jVHKl0D6IUgUxnYEvsYMivX7z8/NgWRbz8/MJEVuujdn5RHTZZoGVEuLvqFAoEAgEMDU1hf7+ftx8883YvXt3qU+PCthSotFoMExcnn0AACAASURBVDAwIPoztVqNQCAga3/pBEy45tTQ0ICtW7fyTYikYVgO2QQseY1r3bp1mJyclFX0IVVkSLpIqVRi7dq1We8CpXohpovCCjXA8lwkUxqx0E70+ab8ku2gxsbGoFarUV1dzff6ZWvMziSg+URgXq+3LKIZMaLRKK688koEg0FcddVVePDBB2E2m9HQ0FDqUwNABaxsIGX0cki+8AudLJqamkQjoFyan9MViwiFq7GxkT+e3+/Pe00rGb/fj+HhYUSjUdTU1MBisUj60mcTMOKIUkyz2GIJXDmnEYuRQpQz2iQbsVgMer0eFRUVfGECIV1jNnBmNpZYY3Y+AlbOEZhOp8O3v/1tAMDdd9+NJ554AiqVCnfffXeJz+wMVMCWmHQXy1w9CoGzY0aId2CmNadcKheTI7B0wkXIZU0rneAFAgEMDw8jHA7zC9R2uz0vKylK8SmGgC3V/tI1ZpPJz6QxWzhHTKlUgmEYuN1uSY3ZQrxerywj76XGbrfjb3/7G1iWxbp167Bhw4ayiRipgJUJarVadgQWjUYRDodx4MABtLS0SOodyyWtQ3pwsgmXcPt8I7DFxUVYrVYsLi7ywkXOXa4XYjpisRjsdjsmJyf5ogDSeJtpmGGh17GWcwoyXRqx0IUxcmbYSd2f3Igp3eRncgO5uLiYtjGbrK+JHbMcnegJo6OjuPfeezE+Po7e3l48++yz8Pv9eOKJJ9IuhywlVMCWmEJEYJFIBHa7HTMzM2AYRrIFU64wDMPb0mQSLkI+AhYMBvn2gq6uLtTW1qZcCPMdkSIU4tbWVmzZsoVPGwmr11Y21mffWRJL3QNWDmnE48ePJ1yoNRpN0asQ86WQgqhSqaDRaKDVahMmQwgbsycnJxMas0nhiNPphNvtzihghXaiB4Abb7wRL730Eurr63H06NGUY5Lf35tvvgmv14vXXnuN/9mzzz6Lb3/72/jd735X8oZwKmBlgpSLfiQSgc1mw9zcHNra2rB9+3a89dZbRUuRxeNxjI+PY3R0FDqdrmhVhSStefz4cXg8HnR2dqKvry/tHbxCoZAdrQKJ7QSNjY288EciEXAcl3J3XYgCjuUcXUmltbUVfr8fbrcbDocjoYl9cnKSF7Z8LnTl7oVI1tSEZGrMDgQC8Hq92L17N44ePYqDBw9i/fr1+MAHPoDbbrst4TwL7USvVCpxww034NZbb8X1118v+nrId89isaC+vh6Tk5PQaDSwWCwIhUJoa2tL2K5UUAFbYtL9wjN9EMLhMGw2G+bn59HW1oaenh7+y0wiN7npkEwpHiJc4+PjaGxsRF9fH+bm5mR5IUoV1UgkktDQvWbNmqxfCrkCyXEc7zxSV1eXUJVJyR+xsvXp6WnMzs4iHo+n2EKRGwViCivlIliMFGIp+sBIY7ZOp0NtbS2ef/55XH311fj5z3/Oj1cRUiwn+osuugijo6Npz5NcHxQKBd555x3ccsstuOSSS3D48GGMj4/j8ssvx/PPP4++vj5ccMEF8t+wAkEFrIwhNlNutxvt7e3o7e1N+bLnUvxBBCD5CywUroaGBj7i8ng8sisXsxGJRDA6Ooq5uTm0t7fDYDBILs2VKmDEpJjc7Qpd6EuBWHqxEBFaqdOIYutgSqUSer0+wUWdRB9+v5+v7ltcXIRCoeCr+9K5ZxQjhVgu+/N4PKirq4Ner0/x7Cy2E306yM1CS0sLbrnlFgSDQXi9XvT19aG5uRl2ux1vvvkmbrjhBipglLOQLzkx9u3o6MDq1avT3qXmMxOMfOHSCRdB7ppWJqLRKEZHRzEzM4O2tjYMDg5CoVBkvBtMRoqZL/FEJIvncpxHKPkjlvITRh/C6j6he4bL5eLdM9RqNZ9+DIfDBU2VFzolmU8ZfTgcLvgA0EJRVVWFz3zmM9DpdPzacVNTU9ZxREsFFbAlJlO6hGEYvP/++1hcXERHR0fGdSBCPjPBsglX8vb5QCr+pqameLf9XC8gmUrjibVURUUF1q1bB71ej3379sneH13/kkfIkWiYbAZglhiQpHPPEBZBhEIhHD9+PKXJ2Gg0yjLxFVLoKslcBCybABTLiT4bJKL83ve+h8HBQVxzzTW444478Mwzz2Dnzp145JFH0NDQQNfAKGd6nUjJeGtrK9atWyf5g5FrA7TD4cDc3FxG4RJun6uACUeotLa2FqRiUiwC83q9GBoagkKhyGgtda5SqjRi+KPXZvx5srARtK3px9sQhEUQ09PT6O/vB8MwKU3GJA0ptITK1AZRDDJNY5ZCuu97MZzo5XDkyBHcfPPNOHLkCAKBAObn53HdddfhyJEjuPzyy0vuI0oFbIkR/rL9fj+sVivC4TC/SGs2m2V9IOREYMQbcXZ2FitWrJBcVZhLmpLjOIyOjvJ3fVJ61KQiFLBAIIChoSHEYjH09PQUvcGykD1gyzlCyyZc2RATtkyiRi6U6ZqMk9OQdrtdtBfLYDAUpew71zUwkipNRzGc6AHg05/+NF577TXMzc2hpaUFDz74ID7/+c+nHL+pqQmvvvoqXnvtNVx11VVQKBRwuVwJziWlhApYCfD5fLBarYhGo+js7OSbdGdnZ3Oa75UtAhOa+jY0NKC5uRk1NTWSUx5y+q7IsRYXFxGLxbI60eeCQqFAJBLh0609PT1ZxzosxZ3i+TAHLF/hykS2aC3T709KGnJiYgKBQAAsy/IFUkTYck1DCsnl+aVwogeAX//61xmPSYTua1/7Gn70ox9BpVJh586dAM7YaZHJzDSFeJ4RDAZx6tQpdHV1JfSHALm5cahUqrTTjJOFi5SPW61W2eNRssGyLCYnJ2G327FixQqYzWasXLlSlnhJERnSUuB2u7F+/XrRRmex85cjYMt1/atYacRiipYUQo4TWNdgTBA4KSlIQLwXKxaL4Z133oHRaOTd6YWzxJKbsotJuRr5kqnpPT09ePzxx1FRUYFgMIiFhQU8/fTTKdeuUkEFbInR6/XYvHmz6M9yKcgQe0464crnOOlI7rHasmULNBoNvF6v7CnOmUqlo9Eo38Td3NyMWCyWkELKBEk5FrLqjFJa8llbI8bAdXV1KWnIQCCAQCAgmoYUTn8uVBpSSgRWCp5++mncc889ePDBB6FQKHj3EGKHddNNN5XF94kKWBmRawRGxEgoXCtWrEjbsFuIqkKO4zA1NQWbzYaamhpeuHI9BjH0Tb4wCKsXSdl9JBLB3Nyc5H1nM/T1er3gOA4GgwGeuWnJ+5VDcnpxOax/lTryygUpwpZuvUqpVMJsNsNsNic8HolE+JErwjSkTqfj2zQ4jsspTV2uTvQ7d+4EwzBYv349/9oDgQBmZ2cRCoXKQrwAKmBLTqYPuEql4sc2SIUY7Y6NjWUVLuFx5A7PBM6W/M7MzGBkZAQWiwUDAwOoqKhI2TafKctAol8hMSomX5pcBmCKCZjH4+ErF5vqquEJ+iXvs1wpRBpxOQpXNoTCxgDosUi/9Gk0GlRXVyesswq9M71eL8LhMN566y3ZaUiPx1M26TgCy7JgWRaHDh3CpZdeCrPZDI7joNFoSup7KAYVsBKQydBXTgTGsixmZmYwOzsLo9Eo2SIplwiMYRheuMxmMzZt2gStVluwYxBRSvYrFKuUzFcchZWLLStqJe+HsByip1w5F8UrHfmkIYXVkCaTCcFgEOvWrePTkOmqIckfMvk5WwqxGEa+2fbp9Xrx2GOPoaqqCl6vF06nEz09PWfes1AIq1atwle/+tWs79FSQAWsjFCr1ZLWpoQX+bq6OhiNRlnzhOSsgRFXCzJOfMOGDSmmpWLkImDT09NwOp1Z/QpzjcBCoRCsViv8fj/amlZIfr5clpvAnU+iJQW5wiZ04ciWhvT7/RgfH0cgEMBDDz0Ej8eDlStXorW1FevXr0dnZyefpSmGkS+ArPvUarW45ZZbYLfb8eSTT6KrqwsbN27E2NgYfv/73/OCW+oeMIAKWEnIdaSKULhIqlClUslaDwKki8v8/DyGh4eh1WphNpuxatUqyZY3cvwKZ2dn+deQLiUpJJchlVarFV6vF52tTagxG2Q9l1CoHrByEjgqXtJJ17smxUZKLA35wgsv4D/+4z9gsVjw7rvv4te//jV+/etf82m6Yhj5Asi6T61Wy48Y0mg0eOyxx/ifffzjH8f995/5/FIBoySQrohDKFz19fV5u6lnE0pix6RWq9HX1wej0Yh3331XdlVhtu1dLheGh4dhMBhQV1eH1tbWrOIFSO89icfjsNvtmJ+fR0dHBxzsRgDDkp4rl3LqAZOyDkaFqzCEHCcQ19XltDakUqnAsiyuuOIKXHTRRSk/L5aRb7Z9kopdEjW+/vrraG1thU6nw2uvvcZfe0rtgwhQASsrkoWl0MJFSCcupKhBqVSm2DHlWlUoxsLCAoaGhqDRaHDBBRfAYDDg5MmTeQ2pFCJ835qamhCtvxynA2d+dtidmmrdVCVd1MopesoFKlyFRdu6BgtTUzk365fjNGZSLNXf348rr7wS3/ve97Bx40acPHkSwWAQ9957b8J2pYQKWAnINhMsF+GSE84nC6XX68Xw8DA4jktrxyRXwEhflxCfz4ehoSEASBFIuetaYnAch+npaYyMjKCurg5e08Xw+rI/T0zUAHnCRihngaPiVTiklOVLIVMVYrGMfKUa/Or1etx+++3YsWMHDh8+jB07dmDbtm38ay11+hCgAlZWsCyLSCSC/fv3y4q40s33yra93+/H0NAQ4vE4uru7M94J5iJgpFSfVP1Fo1H09PSIHkdM8OQwNzeH4eFhmM1meIwXwSOvG0EUImxEyHIVJ2F6cakEjopV8Ugu5ojFYhkrcjORScCKYeTLcVzWfSbT29uL3t7enF5fsaECVgKS71yENkwsy2Lz5s2S1oIIyfO9srG4uIjFxUUcP36cNwDNRi4pxHA4jKNHjyIQCKC7uzujAWimlGMmPB4PTp8+jYqKCrj1F8JdGIMRALlFYOVA0CxtMChFHlKqEOUSDAbTVvUWy8hXbJ/p4DiO/14qFAreULlcoAJWQoTCVV9fjy1btuDw4cOy0xFEwLKJ3uLiIj+2RaPRYMuWLZI/jHIELBwOY3JyEh6PB2vXrkVdXV3W48hNIcbjcRw+fBgsy2KuYrvk50mBChdFSLa+sFxTiKQIItN3oxhGvmL7TAfDMAU34y4k5Xtm5zAcx2F8fDxBuEi3PhEjOR+abFWFwWCQ73/q6upCbW0t9u/fL+tOSoqACf0K6+rqoNVqUV9fL2n/UgUsFApheHj4zGj6yn8CCmwMkI94lWr9K1m43BUNqApPleRczjWkNDXnE4EB5bGWlI6XX34ZgUAAWq0WNTU1qKqqQkdHR9mIWnmcxXmG1+tFMBhM8Q8EpDczC0knYKFQCCMjI/B4POjq6sLatWsTvixyCj+Ea1rJiPkVer1evmxX6v4jkUjan0ciEYyMjMDtdmPB8EFgxUbJ+5bCUkRdhRa4TBGXuyL1Z43zRxEyyHceOR85Oh0Ax3HQeY4mOGhUVFSkfGdyjcDyHYJZLMh14ac//SneffddPPXUU1ixYgXcbjf8fj/eeustDAwM0D6w8xWLxQKDQbyZNpcJy8kDJ8nIkfn5eXR2dmLNmjUpHzQielLL8lUqFRYXFxMeY1mWn7ac7FeYq5VUMkJxbG9vhy1ygeR9yiG5YGOpyLUH7FT1hQCAlbHE8x1TdcMEcU9HZ7X4e0ejtbOQiGtz65nPN/E79Hg8mJiYQDgchkqlShC1aDSaU0Ti9XpTHDvKAaGAvfLKKxgdHcUf//hHzM3N4fvf/z7a2toAlEfkSAWsBGQz9M01AotEIrDZbHC5XGhvb0dvb2/aYxGBkSpgwiIL4dpdQ0ODqF9hvn1jQmf9lpYWeE0X4z2X5N3lTC59YoWc0iyXMZV0C7F0JEdrrfa/I2aqOe+iteR0ITHmNRgMWLHirPVYNBrl/Q4nJyfh9Xpx+PBh3p2e/NFqtRm/6+XYAwacvT5xHAedTodgMIh//OMfuPjii/GnP/0Jd9xxR4nP8CxUwMqMXEaqMAyDyclJ2Gw2tLW1oaenJ2uToVyhVCqViMVicDqdsNlsqK2tzVjmPzoXR0VNN46PJTZi9a00iW5PIjCO4+B0OjE6Oor6+np4TRfjuEfyaRYFKX1i5dL/ZVLm56jfav87AEDlc8HoS71j8DeUZzl1PkgdjklQq9WwWCy8+Ph8PmzevJmP1nw+H6amphAMBqFUKhOc6Y1GI3+zJ2eUyvz8PD71qU9hdHQU7e3teP7550XL75955hl8+9vfBgDce++9+NznPgcAOHToEG644QYEg0FcccUV+OEPfwiGYfDCCy/ggQcewIkTJ3Dw4EFs3ryZF7B/+Zd/QTgcxtVXX42nn34af/7zn1FbW1tW88sYrhz8QM5D0q0nORwOcByHlStXZt0HSa85HA6YzWZs3LhRcnf80aNH0draKunDyHEcxsbGMDw8jKamJnR2dqateEwWLCn0rTTxzt3hcBgWiwWj0XWy97PUSEk3kugsncDlkkIk6UMxchUwIly5sJxFTa54ifHWW29hy5Ytoj+LxWJ8tEb+xONxvPLKK7DZbAgGg3jkkUfQ1dWVcT3s61//Oqqrq3HXXXfh4Ycfhtvtxn/+538mbDM/P4/Nmzfj7bffBsMwGBgYwKFDh1BVVYWtW7fi0UcfxbZt23DFFVfgy1/+Mnbs2IETJ05AoVDgi1/8Ih555JG0w3b/9Kc/weFw4LOf/Wza5Y9SQCOwEpHOkFatViMQCGR8biwWw9jYGCYnJ9Ha2oq+vj4sLCzIsnaRGoERv8KKigpUVlZizRrxL3wuwpX4XA20tT3QAuAAtMEN+0J5zUkilLLMfi+zEx1YKNj+8hEugnFKXITLWdgKIVxSIP6EwhtFjuNQW1uLZ599Fu+88w7uvfdeDA8P48UXX+RNdpPZs2cPXnvtNQDA5z73OVxyySUpAvaXv/wFl156Kd/Xeemll2Lv3r245JJL4PV6eW/E66+/Hr///e+xY8eOtN9nAJiamsKrr74KhmHQ0dGBrq4uzMzMoKOjI5+3pKBQASszMgkLGfJI7F+2b98OpVKJhYUF2etm2daokv0KVSoVjh49mrJdPsKVjTaLO+WxUopaqfvD9jI7C7avQghXNsSErdSipm1dcyZias2+rRRySWAxDIPOzk50dHSgublZ0myt6elpNDY2AgAaGhowPZ06OVzM/HdiYoIvskp+PBMejwd33nknPB4P3G43XC4X5ufnUVNTg/fff78sKhABKmBlh1gZvbCgobGxEYODgwlFE/kUfiSTzq8wFoslbF9M4cpEKUSt1MIFLD/xSoeYqC1VwYi2dU3BHdTz6QFbWFhI8CH8yEc+gqmp1IrQhx56KOH/S+GGYbfb8eabb+LUKfHouhzEC6ACVjKkTGVOnv8lVu1HnpNvBBYIBDA8PIxIJCLqV0i8CkslXJkQEzVP2ICFYPpR7lIphHjlu/51rohXOopdMCJMFxY6csjHyNfr9SbYOL366qtpt12xYgWcTicaGxvhdDpFDQKam5v5NCNwxqj3kksuQXNzM8bHxxMeT2fgS2hoaMBNN92EAwcOoLq6GjqdDhqNhp8mXS5QASsziIBNTExgdHQ063Ri8pxcIrBwOMy7dGTzKzzh8KOyuTg9WMWgsiKAyorUtUS50ZqwArEUkVghxQsAHG0XpzxWjqIGANrAmSGnuUZnYutc+QiOGPlEYHLK6Ilp71133YVnnnkGV111Vco2l112Ge6++2643Wdu6F5++WXs3r0b1dXVMJvNePPNN7Ft2zb86le/wm233ZbxeAzDYGJiAl/4whfwsY99DBzHIRKJoL+/H9dddx1NIZ7viP3yOY7D3Nwc3G43zGazqFOHGKTEXQ4sy2JqagpTU1Po6upK61dYjhFXPuSTgizk2BUpyBWvXCsQy03UYqbEm6hchOw9pw9a93sJfVk6na7gAhaPx5dEwO666y5cc801ePLJJ9HW1obnn38eAPD222/jiSeewC9+8QtUV1fjvvvu4ysiv/GNb/AFHT/+8Y/5MvodO3Zgx44dAIDf/e53uO222zA7O4uPfexj2LBhA15++WX85S9/wZtvvolvfetb8Pl8CIfDcLvdkoy/lxJaRl8iYrEYn8Ijc6xsNhssFgtcLhcuvDB9qbQY+/btwwc+8IGs2xG/wqmpKej1egwMDJwXwiWXfNfViKhpfvJgzilEMQHrqEpfgZhvD1g2lkLUksVLjExCRqIujuPO+GUKyteDwTMzduLxOFauXMn3Z+Xj6+dyubCwsICuri7Zz7322mvx+OOPo729PefjFxoSWf3ud7+Dw+HAl7/85VKfUkZoBFZCOI7D7OwsrFYrKisrsWnTJmi1Wuzbt6/gxyKl906nEytXrsQFF1wAp9OZIl7nu3AR8llXK0SDc6FTh/lSbPGKbfl44gMn/2/abbWBuRQRS04XMgwDnU4HnU6Huro6/nG32833WjqdTgQCAcTjcdkuGvx555lCTDcLrFSQuYIzMzP4yU9+gsnJSfT398NisaCyshK9vb1l5R5CBaxEeL1evP/++zAajdi4cSN0Ol1RjsOyLBwOB2/JNDg4CKVSCb/fn5J2pOKVmWzraoVKJeYiXr/6HzW+VATNW3LhIqz+IP9PvlFYIGrCtKLcni6dTpdQVs5xXIKLhtPpRCgUSvE8NBgMKenHfFKSfr8fRqMxp+cWC9JL2tzcjHXr1uHEiRPYt28fgsEgTpw4gR/84Ae46aabCp6KzRUqYCVCrVZj/fr1ohU9DMOAZVlZjcnJz0n2K0wuvRdWIVLhyg8Src1zZ9Nf1Uxuxo3lEnktSbownXilQyBqBLlzkMUuvAzDQK/XQ6/XJ1T3RaNRPv04MTGBQOCMQ71er+dFLRQK5XTzSVZu5HzHlwKGYRCPx7Fz507s3Jn+s1gO4gVQASsZBoMhrech8UPMZSqzWq3G1NRUVr9ClUoFbW0PFa8i8ZarBwCwpWZI8nPOF/GSLVwFRE7koFarUVVVlZDmY1kWi4uL8Pv9cLvdmJmZAXDGtYKImslkgl6vlyRO5VDJJ4TjOCiVSrz77rvYs2cPAoEAdDod9Ho9otEorr/++oRm6VJDBawMkTphWYhSqcT09DTGx8dhsVgwMDBQUL9CijT+fIhc7Dj0djBphSy5gON8EK9SChch39SXQqHghQo4awtlMBj4aM1ut/Ojh4QmviaTib+ZlJNhKZaR79e+9jX88Y9/hEajQVdXF55++mmYTCYolUp85zvfgVarxQUXXIBYLAa/34+pqSnZ1c7FhgpYiSjkSBVSCQUg43oaFa7icVa4xMkUkUkVr3QViL/6H2kjcaTgaLu4KCI2230xjNGo5PE9xSKfsncxSBGHRqNBdXV1Qpk5y7K8kS8xq45Gozh27BgOHToEhmFw8uRJ9PT0ZBTVhx9+GB/+8Id5I9+HH35Y1Mj3wQcfTDDy3bVrF6qqqnDLLbfg5z//OW/ku3fvXuzYsQOXXnopdu/eDZVKhTvvvBO7d+/G7t27+f395je/Kbuy+WSogJUhUkeqeDwenD59Gmq1GrW1tWhpaREVLypcxSObcCVDhOxynInAChV5fWlnatWkkMdfqsq6DUGsLwzILTpzr/7wmchkbg42mw2xWAxarZaPSLJV/BW6yycej8vKbEjZXzrxUSgUMJlMvB0bcOb1tLS0IBaL4fDhw7j//vsxNDSEhx9+GB/96EdF91MsI1/h8QYHB/Hiiy/yUeFXv/pV3H///RgYGEBjYyMsFgtMJpPocNxSQgWsDMkWgRG/Qo7j0NvbC7PZjKGhIVpVuMRkE69TtjNpxHQsZdpQqnhlQk7D8+ma9ejs7IQJSLmAC/uzxCr+TCYTDAYDP+S00I3HpXTiYBgGTU1N2Lp1K44cOYJf/epXWZ+zFEa+Tz31FD71qU/x/z906BAOHjzIX2dCoRDcbjfefPNNaiVFyZxCTBeBCf0Ku7u7E/LgQtGjwlVc5EZdYpTLmle+iImaElEo/t8aUDLp+rOEFX8Oh4MfKaTVahEOhzE/P5+whpQrpRYwgsfjSRixUkoj34ceeggqlQrXXXcd/9jjjz+OkZGRBLGKRCKSnIGWEipgJSSToa9w4GUoFMLw8DD8fj/vV5j8IVapVFiImbBAxatoFEK4Ck0h17/ypbH+zPszNTUluzw8XcWf2+2G1WqFy+XC6OhoQgqSRGtSm46BwgsYx3E5lcIn20iVysj3l7/8JV566SX89a9/5d/DSCSCSy65BO+99x4/vFalUhV07bBQlN8ZUfihlpFIBFarFW63G11dXVi7dm0G26fy6Y4/18hHuLKlEZcCOetfuUCEiyC3hzEdCoUCWq0WBoMBPT1n1g45jkM4HIbP54Pf78f09DSCwSCUSiW/pkbK2MWEqlwacMvByHfv3r347ne/i7///e8JkVYoFEIgEMDXv/51XHjhhdDr9VCr1airq8ONN95YgFdfOKiAlZB0ERgAzM7O8tNPV69enfYOk6YLi0s5Rl3lRLJ4AYUdWZIshgzDQKvVQqvVpk1Bjo+PJzQdC4WtnARMLJISo1hGvrfeeivC4TAuvfRSAGcKOZ544gkolUp8+tOfhtFoxOzsLBYXF+FyuXhxLBcneoCa+ZaUaDQKlmX5/xO/wvHxcajVamzbtk3SnSwVscJTSOEqRASWrYQ+U4RVjAhMTLgIDocDKpWKLzzIB4/Hg6mpKfT2yp8NRpqOSbTm8/ng9XphsVhgNpsTXOpzuSBzHIe3336bFw057N69G/39/fjkJz8p+7nFRChODocDwJnlCZPJBI1GQ9fAKKkQv0KSnx4YGMDJkyclp2H6Vprg8/kwOjqKdevWAaCilivFiLiKlUaUIl6FJpNwEQqVQgTyS/klNx0DwMGDB9Hb24tAIACfzyeagkzne1jIstB9JwAAIABJREFUcytHI1/gTIQ7NTWFF198EW+88QZmZ2dhsVgwMTGBnTt34p577ino7zdfqICVEI7jMD4+zvsVkonLsVgspwnLwuf0rTxbuhyPx2G32xFS1Yk9lYJzN1X4+EtL/7qKmULMF2EVZG3tWUd74jbh8/lSfA+FwiaMQPIVsHJydQfOvtf/+Mc/cODAAfT19eHw4cO47bbb8MMf/rCsLKQIVMBKiN1uRzAYTBlcKTTalYpY7xjLspiYmMDY2BiamprQ25y4sG21WhFWS8vDn6ucq8IlpFAR2uMvVeErV85mbT4upOgs1d2+SqWCxWJJEBVhClLopFFRUQGj0ciX9Oci2OUagQHA2NgYNm3ahPXr12N8fBwXX3wxRkZGcPDgQVx//fUFby7PBypgJaSzs1M00srl7lUoYGRA5sjICOrq6tIa+iqVSlQqvQlltcD5k35cSvEqh2rEdEhdI/vKlbMJ40bUanWCowYxsC2XFGK+iKUgSRWk3+/H3NwcAoEA3nrrLSiVyoT3IlsKshwjMHLdqa2tBcdx0Gq1WFxcxG9/+1u8/vrrOQ3tLDZUwM4RFAoFOI7D3NwchoeHYTabMxr6AukdP4TpR8K5JGrnQtRViv6vurq6hMq/SCTCp91cLhcWFxf5cRzE1dxoNOYlQOW03gIkVkEqFAqoVCp0d3fzKUix0StiKUi/3w+z2Zz1eMUy8r3vvvuwZ88eKBQK1NfX45e//CWampoAnCnbj8fjqKmpgdVqxbe+9S1cccUV+Ld/+zcA5TNKBaBViCWFZdm0nof79u3D9u3bJUdjHo8HBw8eRH19PXp6eiTZvTidTgSDQXR2dmbdluM4OBwOnDp1Cl1dXWhra8OpCXG3hXKl1MKVawQmVoEoFLB00RNZ/ypUClFKAUc8HsexY8eg1+v5i7pYObtUR41CVjSyLIt33nkHmzdvzntfADAzM4PFxUW0t7enPR4ZvUIqIa1WK372s5/B4/HggQcewKZNm9DV1ZVWpL/+9a+jurqaN/J1u92iRr6bN29OMPI9dOgQqqqqsHXrVjz66KO8ke+Xv/xl7NixA16vlxfQRx99FMePH8cTTzwB4OzSBvFYraysBMdxOTdtFxMagZUpwvlemfD7/RgaGgLLstBqtdiwYYPsY2Rjbm4OQ0NDqKyshMFg4AVvuURqpRYuQjmmEaWmDx9/qQrfltDDqlQqoVarsWLFCt4DMXktSeioIRS1ioqKlBu2QprvxuPxgl6As6U3hSnIhoYGAMCGDRuwadMmfOYzn8GpU6fwwgsv4OKLL8att94quo9iGfkKo79AIJAwEPfll1/GM888g66uLlRXV2N6ehqtra1Yu3YtLr/8csn9a0sBFbAyhfghphMwYi8VCATQ09OD6upq7Nu3T9aCcrZiEeJ2r9FosGHDBuh0Ouzfvz/jPpOrH99++22YGvsknU8xKBfxOhcg2QLix8cwjKggJKf90q0lhUIh+Hw++Hw+TE5OIhwOQ61WpzQeF7IgpBijVOSgUCjQ0dEBlUqF++67L+v2xTTyveeee/CrX/0KlZWV+Nvf/sY/fuzYMXR3d+PCCy+E0WjE3r178e677+Lw4cN49dVX8d3vfpcX5FJDBayE5DITLBKJYGRkBPPz8+ju7kZdXR2/H6lRW7ZjLC4uYmhoCNFolHe7zwXiJi4UNY7jMDMzA1e4uI7W57JwyUkfFhK1Wg2WZfk/APgbIKGoSbmJEpazC+/oI5EIn26bm5uD2+3G3NwcXC5XglN9LuswsVisoBEYiSLl4vf7Exz6S2Xk+9BDD+Ghhx7C7t278dhjj+H+++8HAOzfvx+vvvoqf47XXnstPvrRj+K///u/8YlPfAJOp5MKGCUzKpUqYX0sFovBbrdjamoK7e3t6O3tFTX0lSNgyREY8V5cWFhAT09PQp9MLiSfn8fjwalTp6DX69Hd3Z3y5S9E+rHchWup04iFWP8iYqhUKhOEg2VZcByX8Dep0OM4DtFoFAqFgv8cSBEPjUaDmpoa1NTUAABOnTqFuro6KJXKjD1aUtbVWJYti9EsCwsLCU70pTLyJVx33XW44oor8MADDwAAuru78d3vfhdXXXUVjEYj/H4/ZmZm+BuXchpySQWshGQbqRKLxcCyLMbHx+FwONDc3Izt27envRDIneRMto/H4xgdHcXU1FRW78VcEEZ0a9asSbj7BM4OLWwyx3H06FGoVCqYzWaYzWZ42UqxXaZQ7sJVjsiJ0nbfnHqhJp9DpVLJu8k4nU6sWrUKOp2OX/gXRmukEIA8N5uosSzLpxWFF33hutrc3FzKuhoRNuG6WiwWK8tRKpkolpHv0NAQb5C8Z8+ehO/8Pffcg0ceeQTPPPMMKioqcOjQIdx8882oqKjA6tWr+ZuLcoAKWIlJZ+irVCr5kvgVK1bwLh2ZkCtgDMNgcXERb775ZlZxFCJ1nS0ajSIUCuHdd99NG9GRCxzLsjAajRgcHEQsFoPX64XX60XYd8ZMVKlUwmw2w2Qywced7Z+hwlV6FhYW+Ehpy5YtKSJBBEwYqZHIXywFKfwMpiujF66rkTUi4bqax+PBxMREwrqa8BwKcYOWawQmR8CKZeR711134dSpU1AoFGhra+MrEAGgr68PP/vZzzAyMoJgMIj77ruPP9/HH39c9ustJlTAygzSyzU2NgatVpvi0pEJqQLGcRxmZ2cxPDyMWCyG7du3S047SlnjYFkWY2NjmJiYgEKhwODgYMr2QuEi+yXbqNXqhDQScEYMFxYWMD4+joWFU1CpVHjb/RFJ51xuyEkjJpfQS+n/khNZ5ZNijEQiGBoaQiQSwbp169K2bqSLtsRSkEBipBaLxSSLTbZ1tampKfj9/oTG43zW1fKJwKQ2MdfU1OCvf/1ryuObN2/GL37xC/7/N954o+iok82bN+Po0aMpj//2t7/NeFyVSoVVq1ZJOsdSQgWsjHC73RgaGoJOp0NnZyfC4bAs92cpAkaOodfr0d/fj3feeUfWlFtyDLHzIg4gVqsVDQ0NGBwcxIEDBxIuQJmEKx0cx/Hl1w0NDVi/fj2USiUGo3489j/GjM+l5AcRw/379/NrTiaTCYFAAE6nE52dnaivr88pohGmIAlEzOLxOCYnJxEKhaBQKBLWg8m6mtSCDLKuFolEYDab0dramrbx2GAwJDhqZPpuLIWAUTJDBazEMAwDr9eLoaEhAODXiFwuF/x+v6x9ZRIw0i/GcRz6+voSSprlkK703u124/Tp0zCZTNi8eTPfu0P6S8jfZF1EakUVKeU3Go3o7+9PEM58x8ufz8itUhwcHEQwGMTMzAxOnDgBhmGgVCoxOTkJn88Hk8kEs9ksazqyGAqFAj6fDydPnoTFYsG2bdv4qF/4+RGmIYnrR7ZiEWHKL533YSAQgN/vx+zsLGw2G2KxGHQ6HS9qZKyIsG9KLlTACgcVsBIzNDQEl8uFnp6eBIsYUsQhB5VKhXA4nPBYKBSC1WqF3+/n+8XyIVnAAoEATp8+DY7jsHbt2hRhJKX0wtSjlC99MBjkU5xr1qzJWXDLlVyqEZPTh0s5RiUej8PhcMDn86G/vx9Go5H3BfR6vbxHYjAYhEaj4S/2ZrMZer1ekqjF43FYrVZ4PB6sXr06pdgnOVIjf2dKQQrTl/F4PONNj0Kh4M9buK4WDAbh9/tT1tXC4TBmZmZ4H0ipwu31etHR0SFpW0pmqICVmPb2dnR2dqYtiZeDSqVCIBAAcCa9YbPZMDs7i87OTvT19aX9guXS/ByJRDA8PAyv14tVq1aJCiPHcVCpVBgaGuKHCGbrmyHnTfrcslU8fXVXGP/nD4VxajgXEEZWhRS4t956C21tbVi1ahX/WRH6AoqtOXm9Xn6iL5m3JawQFN7IzM7Owmq1oqWlBT09PVk/j5nW1dIVi4RCIWi1Wv6GSsqNFMMw0Ov10Ov1Ca8xHA7jnXfeQTAYTHiNwvRj8msk0AiscFABKzEajUY0JUecOORAesfsdjvGx8fR2tqKwcHBjF9UIkhSc/kMw8DhcMDj8aCzsxNr1qzJWKCxZs0aeDwe3m0hFAqhoqKCL5M3m82oqKgAx3GYnJyEw+FAa2srtm7dWjZjy881pKYPyXaf/f9Ooadns+SUbXIvF3DmxoS4boyNjcHv9/NFF4FAAGq1GuvXr5fk4ZkJYdRFCIfDGB4eRigUQltbm2iklslZJN1rVKlUCT6IyTPFyBKAwWDgRY0sGUipQiyWkS/h+9//Pv793/8ds7Ozefd8lgoqYGWK3AiM4zgsLCzA6XSira1NUtm98DjZtiUCMz09jfr6etGSe7ECjYqKCtTX1/N3r8K0k9fr5b/osVgMRqMR7e3tZTsnqdCUozeiGH19+VuBqVQqVFVV8b9bjuMwNjaG8fFx1NTUgGVZHD16FCzLwmAw8C0Tcox/kyGuLyMjI2hvb0dDQwN/Ac9UAUnIVCwitv6VaV2NTH/+4he/iKmpKUxNTeGDH/wgLrroIlx00UWi5//www/jwx/+MG/k+/DDD4sa+T744IMJRr67du1CVVUVbrnlFvz85z/njXz37t3Ll9E7HA68/PLLWLlyZQ7vbPlABazEpIsy5EQfLpeLryy0WCzo7u6W/FwpwzNdLhdOnz4Ni8WClpYWmM3mhC9v8gJ7pgINYdpJr9fzd6MrV65EJBKB1+uF0+lEOBzmm1KFkZrYfs/VNKKwhL4Y41OWcg1NiLBIY3BwMGVti1zwSVoxFovxFZBE2LIZ/IZCIZw8eRIqlQoDAwMpVbOZKiClFItEo1FJZffCdbWmpib8/e9/x5VXXolvfvObGBsbw+TkZNrnFsvIFwC++tWv8m4byxkqYMsYn8+H06dPQ6lUYt26dVCr1Xjvvfdk7SNb5eKpU6egVCqxYcMG6PV6jI6OJggeKXmWU6BBLKuIEbEwnZIuUhsfH+dFjQiayWTKyYvuXKWQ/ofF8FKMxWIYGRmBx+NJW5gjvOATOI7jXTfcbjfsdjsikUjCDY7wszA+Po6JiQn09PTIco1IJ2rkb6HAzc/PQ6lUIhqNJnzupXz+fT4fNm3ahG3btmXcrlhGvnv27EFzc7OsyRXlChWwEiOlByp5m2AwiKGhIYTDYaxatYoXAJZlZRd+iEVg4XAYQ0NDCAQC6O3tTUiJkO1z6eeKx+MYGxvD9PR0VssqsQKBZKcFh8PBixowKOt1lwtLnUbMRZiOHz/O3zSkK0zIBmmcb21tlVSkIYRhGBgMBhgMBt5ENrkCcnJyEoFAAJFIBHq9Hq2trdBqtXm7biQLUzQaxenTpxGJRNDb2wulUsnfxAHZnUXINiQtutRGvouLi/jOd76Dl19+Oe99lQNUwMqY5AKLaDSa4ERfW1ub8KEm49zlIIzAYrEYRkdHMTMzg66uLqxduzblS6NQKBAIBPg7T6mNyNPT07DZbGhsbMTWrVtzugiKOS0QUWtqGsN/HVje+fxypampCT6fDw6Hgy9MMBqNCetU6dJpoVCItyzq7+8v2Gwv4Q1ObW0tbDYbIpEIVq9eDeBMqbrVak2pgDSbzTAYDDl9/mZmZmC1WtHR0YEVK1akfO6FEVqyY7+wWERoHbfURr5WqxU2m42Pvsb///bOO6zJs/vj3zBlI6iAICJ7yZDh6FLUUq2iVquob8VZ29pqrQuLWrRVrB12aJ21Wluk1dbxVsQ96mApbtlD9giQAIGQcf/+4Pc8bwIBAgQBvT/XxdUSniTPE5N87/uc7zknLw9DhgxBfHx8t+kw3xaogHUxyoxU4XA4bLzcxsZGzsrcUdTV1SEWi5Gbm4unT5/CyspKoXOR+WAaGBigsLAQ8fHxCt2Ejc+rsrISaWlpMDAwUJiL6ChMQS2XywXwfAqYovxX4/xVZ4T8GBobEyQSCeu2KygoQHV1NdvLkhEJfX19FBYWoqCgoM2hvLbA9GE0MzODr68v+75t3IasuroafD4fOTk5rANS1tbfkgjX19cjOTmZNUk09x5uLa8mkUiwd+9eFBcXK/X57YxGvoMHD0ZJSQl7fxsbGyQmJlIXIkX1aGhoID8/H0VFRejfv3+ThHdHYYo0c3NzYW5uDn9//yaOr8ZJbV1dXXh7ewMAG85j3IRMnQ1T78V8UDqrEJnpuch00Ue6yp/imdAZYcSOGDRkxVBRF3p1dXUYGRk16Q5fU1MDPp+P3NxclJWVQV1dHcbGxqiqahiTY2hoqLLuKWKxGGlpaaitrW2xDyPQUJIi64AE/ifCfD5foQgztnemhRkze6+tMKKWlZWFpUuXYsiQIcjMzFTqvp3VyPd5gkMUtUKnPDMIIaivr29yW1lZGR48eABTU1O4uLgovXO5efMmhg8f3uoKj8/nIyUlBRKJBKampuxohcbnIWvQUCZUWFNTg/T0dPB4PLa+S0dHR26n1tFdGNOMODMzE2ZmZrC2tmaFvae6ERsLWGsOxNZ2YIoETJljGh+nSMCaQywWIyMjA1VVVXB2doaenh7rKGRyVSKRCLq6umz4sT3vByaUN3DgQFhYWKgsGiHrgKyoqEBJSQk4HA6MjY1hZGTECltbwqASiQS7du1CVFQUfvzxR7z00ksqOVdKA3QH1sUoGvqYmpoKbW1tmJubo2/fvm36gLdWmNzYAMLsomRpj0FDKpUiPz8feXl5sLa2hqenJxvvr6urA5/Pl3OQMV9izI+yK/OqqiqkpaVBW1sb3t7eKsupvGio2kLPiIq1tbVciFvRyJPmHIWy7lJF4WihUIjk5GSoqal1SjiaGdHCFN57eHjAxMREaQdk4/NNTU3F0qVL4e/vjxs3bkBHR0el50uhAtYt4HA4bE9BiUTC9oHLyspqVzcORYXJjIW5rKyMnc3F1LPI1rm0VbgAoKysDBkZGTA1NYWfn5/cc8saL8zMzNjnEQgE4PP5KCsrQ2ZmJsRiMVvAyvzIPo6s9d7R0RGGhoZtel26O82FEVU9PkXVj9VavVVjmnMUMoscWXcpk2Nlut8XFRXB0dGx0/I1AoEAT548gb6+vtxcs+bOl+kswoTPtbS08PTpU5SUlKCgoAAXL17Ejh07MGLEiE45XwoVsG5BcnIyKioqmiS729sPUfY+zKRcZmfU2KAhO5W5rcJVXV2N1NRUaGlpwdPTU+maLNkvMdmVOZNDYVbzEokEenp6bL7C1ta21WnRz2tRc0dRtclDdgJzR00azS1yhEIhSktLkZqaytrRc3JyUF5ezgpbW5roNgfTFaSwsBDOzs6t9ilsae5YTk4O/vrrL5SXl0NLSwuhoaHYtWsX3NzcOnSOFMVQAesGWFpaKnQWampqss15lYURJKaNTkZGBvr27auwtRRj7a2oqEB+fj7rHmvtC0EoFLIW5caFyO2Fw+Gw4ab+/fuzea60tDTo6enBxMQEeXl5ePr0KWvhZr7EVGlsochTW1vbJDzG4/GQkpLC7rg74/VnWpeVlpbCw8ODfY8x3VqY1ky1tbVy07qZ7vfK2uSrq6vx5MkT9O7du0PXIhaL8dNPP+Hvv//Gzp072SJlJhdM6RyogHUDDA0NFdZvtXcHVllZidTUVHZopaKdEWPQ0NHRgbOzM/h8PrKysiAQCKChoSEXytPR0QGHw2lSiKyoka8qkN3Z+fj4yJ2/VCqVc48x+TtZUQOa1sv0BJR1Iz7LFlDJyclsA2bGlCESieDq6tpk3Imq4PF4SE5ORr9+/eDn5ycnRlpaWujTp49cGFEkErFGkaysLNTU1LRa+yWVSpGdnY2ysjI4Ozt3KCT95MkTfPTRR3jttddw/fp1uferKhZ3lOahAtaNaWtHeoFAgNLSUqipqWHw4MEKv2AU5bkaW4xFIhHbwqm4uBgCgQBAw86rb9++8PDwYEVNlYhEItbFJtthRBY1NTUZoWpA1hKdl5eHEWbJuFmsuEFqT6K9+a/2Clzjx2pwIHqzu6HMzEx2oOPDhw+hpaUltxPu6HtCLBYjPT0dNTU1cHd3h56enlL309TUhImJidxIH9nu90ztF2PS0NTURGlpaZPasfac7/fff49Tp07hp59+Yq3slGcHFbBuQHMfemV3YPX19cjMzERFRQVbwNhYvNpi0NDU1GTHYTCFyLq6uqwjKzk5Wa4voZGRUYfs8VKplO1fZ2NjAycnpzZ9ESqqS7p5ql2n0i2QtdCrgo7kv2pra5GSkgINDQ0MHTpU7t+4pWGWbc1RMa2mrK2t2/zvr4jG3e+Bhs9JSkoKysvLYWBggLKyMpSVlckVYCsbkn78+DGWLl2KgIAAXL9+nYYJuwgqYN2Y1gRMKpUiJyeH7dDh5OSEgoICuV1be52FjN1eIpHA1dW1yWq4JXs8I2jKjMJgHIx9+vSBv7+/yvIpPdXMkZJFMKiTp8kou0PLyclBYWFhswNLtbW10bdvX7kC38Y5KoFAAE1NzSY5KuY9KBQKkZKSAgAqbTXVmMrKSiQnJ8PCwgLu7u5yY1WY3XthYSFSU1NbHOkiEonw3Xff4fTp09i1axd8fHw65XwpykEFrBvQ0k5IUQiREIKioiJkZmbC3NxcrkOHhoYG6urq2jTiRBaRSITs7GxUVFTAzs6uWXdZa/Z4ZhSGRCJRaLpgygY0NDTa5GCkPDvEYnGbjQ2KclSyE5pLSkrYPCvTV3PQoEGwsrLqlHyqbFhS0cBMRSFp2YJmxgh1/Phx3L17FwUFBfD398fJkydZBy2l66AC1o1RU1OTa/wJABUVFUhNTYWBgQH8/PyahO2YqcxtHXHSuBDZ3t6+zV8oiuzxsi2GCgsL2fAjAFhYWMDc3FzlBakA/t+92fN2YAzdof7Lzs5OJY/deEKzQCDAo0ePoK6uDktLS9YF29hNqKen1yFRY+bkWVlZtSks2XiGl0gkwoULFyCVSvHOO++gsrISs2bNws6dO1Uy7JPSfqiAdQOU+WAxOxYAzSa4CSHQ0tJiQzdMXsjQ0LDZVTQhBFwulw3jNS5E7ijMl4Genh6kUikqKythZ2cHfX19tsN5VVUVexxzvu398hKLxcjKykJFRQXmveqIX66ZqexaeiKd2eS3rTAh75KSkiZjegB5N2FmZqZcJ3lG2JTpJC878sTLy6tDu/sHDx5g6dKlGDduHC5cuNApiy1K+6EC1s2RSqV4/Pgxqqqq4ODgoDAXIZvn6tWrF0aMGMGG8oqKipCWlgZCCPT19VmB0NfXR01NDdLS0tpciNxWuFwu0tPTm3TqkP0CY1xjja3QTHjHyMioRZcbIQSFhYXIycnBgAED2rWD7A6UFAta3H111RTljsLn85GcnMwukhSJUHNuQianlp2djZqaGnaxw7w3ZEWNMYPY2NjA3Ny83e+B+vp6fP3117hw4QL27NkDLy+v9l04pVOhAtZNkUgkyM7OhkAggK2trcKaq5YMGrJFwUCDEDICkZ2djfLyckilUvTp0wcmJiZyIUdVIRAIkJqaCjU1NdZ63xyKXGOydn4md8JYtxkh1tbWBp/PR2pqKgwNDeHr66uyjufPkpJiQZuOb25n1R6BU/RYs4c/wdOnHS8Wl0gkSE9PR1VVFdzc3JS2xjNoaGg0a5GXHY/C3K6hoQFHR0f07t273e/le/fuYdmyZZgwYQKuXbtGd13dGCpg3QDZDxpTc5OdnY3+/fujd+/eMDU1bXJMWw0aTA1MeXk5BAIBXF1d0bt3b/aLID09XU4gGJFQ1FS1NUQiEbKyslBZWQkHBwc5UWoLsnZ+Bsa6zYzt4PP54HA4MDMzg6mpaZOcYXd3I7ZVuNpCR8KHAwcObOLMa2sHlLKyMqSnp8PKykqlM+xkFzvMsNTMzExYWlpCXV0dhYWFSEtLY9/zsm7ClsKPQqEQX331FS5fvoz9+/fDw8NDJecbExODZcuWQSKRYOHChQgNDZX7+/Lly3H58mUADYu+kpISVFY2lFKoq6tj8ODBAABra2ucOtWD60M6ASpg3Qgul4vU1FS2rY2WlhZ4PB7EYjFrL2484kQZgwbjWmREUXYicuPVbX19PXg8Hjvji6n3YnY8RkZGze5wCCHIz89Hbm4urK2t2zw6Xhm0tbVhamoKgUAAkUgEFxcXGBoaNukWznS7b6gN655usc4Ur47CfOFbWloC+J8Zh8fjtSpq9fX1bGPqjuagWoJpJKypqQk/P78m70uJRMIWM+fl5bE7NdkOHbq6utDU1MTdu3exbNkyTJ48GdeuXVPZLl4ikWDJkiU4f/48rKys4Ofnh6CgIDnzx/bt29n///HHH5GUlMT+rqOjg7t376rkXJ5HqIB1AwghuH37NtTV1eHp6Sln9ZXtbdieeq62TkTW0tKSq+1h6r14PB7Ky8uRnZ0NkUgEPT09VtQMDQ3B4/GQnp7Oiq8qjSCyMM4yps0QswvQ1dVt1s7f3QSsK4WrvTk0WWceg6K2XvX19RCLxTAzM4OVlVWnhHOZKEVubm6LjYSZgZqKpkkzXVvWrVuH9PR0VFdXY+HChRg9erRKezvGx8fD3t4etra2AIDg4GCcPHmyWffikSNHsHHjRpU9//MOFbBugJqaGlxcXBROldXQ0IBQKGQLmpUVLoFAgPT0dEilUoWFyMoiW+8lO06CWY3n5eWhrKwMQMNuTkdHBwKBAPr6+u1u0dPc9TD5NE9PzxbzaY3t/E5O3TuM2Fa6cnyKLLI1VLW1tewoEgsLCwgEAlbUCCFypgt9ff12iwTzPLq6uvD19W3zQkm2a8udO3fA5XIxd+5cjB07Fvfu3cPvv//ONuJVBfn5+RgwYAD7u5WVFeLi4hQem5OTg6ysLAQEBLC31dXVsdcZGhqKyZMnq+zcngeogHUT9PT05PI3zI7LyMgIaWlprCOP+fApGqAHyOef7O3tFboWOwqHw0GvXr3Y9kGenp7s6Hg+n4+nT5+yvedkDRftGX0hkUiQlZUFLpfbrAuzJ3Hm9+vwGTOk05/nWdnnZceqODk5sflO2X8n2Z3owaRXAAAgAElEQVRafn6+wgbMrYkaIQS5ubkoKCiQe572UFdXh61bt+LmzZs4dOgQO+pk2LBh7X5MVRAVFYVp06bJvQ45OTmwtLREZmYmAgICMHjwYJXV5z0PUAHrZjDGDMak0bdvX/Tr14915PF4PBQVFbFjLhiBMDAwQElJCfLy8jBw4MBOyT8x51dQUICnT582sasz4sqsOBkLtCKTiKyLUNF5Msn5rKwsNnegyh1dV3Dm9+sAgNsX7jT527MQNVVTVVWFJ0+ewNTUVC6v2pjmul0wC57WRK2mpgaPHz+GsbFxh8e3JCYmYvny5ZgxYwauXLnSaaFuBktLS+Tm5rK/5+XlsXnFxkRFRWHnzp1N7g8Atra2GDlyJJKSkqiAycAhjW1blC6B6Z4ha9BoSYCYgX+VlZUoLi4Gl8uFuro6evfuzQqJqmdlVVRUIC0tDcbGxhg0aFC78huyLkIejwehUAgdHR05Uaurq0NKSgr09PRgZ2enMhtzV4URGeFqK41FjclfKWOh78gxDV3om0cikSAzMxOVlZVwcXGBvr5+i8cri2x+is/no7q6GkKhEFKpFJaWlujXr1+rTsLmqKurw5YtWxAfH489e/bAxcVFJefcGmKxGI6Ojrh48SIsLS3h5+eHyMjIJgMuk5OT8cYbbyArK4v93FdUVEBXVxfa2tooKyvD8OHDW8yfvYjQHVg3gBCCHTt2wMPDQ+lRJRwOByKRCAUFBdDS0sKIESOgra0t5xRjmqQyHS6MjIza1eGCaewrlUrbVcsjS+MGsLImkZKSEjx8+BASiQTGxsbQ1dVlC5p74tDK9goXg+xOzWfMkG7RVYMx0VhaWsLX11elu3zZ/BSzu+vfvz9MTU1RXV3dxEmorD0+Pj4eK1aswMyZM3Hp0iWV7bpas8cfPHgQq1atgoGBAZydnWFkZIRly5bBzc0NkyZNQkJCAvT09LBu3TpkZWUhODhY7vV88uQJFi9eDDU1NUilUoSGhlLxagQVsG6AWCyGrq4uIiMjsWbNGqipqcHLyws+Pj7w9fWFo6Oj3Bc4MxG5trYWDg4OcqEZpoCZCT0wVmLZDhfMwEpmx9NcPk0sFiM7OxtcLhf29vYdGhvfHBwOB9ra2hCJRKisrISTkxP69esHgUDAhkuZTiKNjQDdOaTYUfFiaE9osaNCd/v2bbmBpr169YJIJEJaWppK2jO1hFQqZUcDubq6srs72ZxXYydhY1HT0dFhc8qbN2/G7du38fvvv8PZ2Vll56mMPR4AZsyYgR07dsjdVl5ejgcPHuDhw4fgcDjw8fHB7du3m+T1RowYgQcPHqjsnJ9HqIB1AzQ1NbF48WIsXrwYhBBUV1fj9u3biIuLQ0REBFJTU9GnTx94eHiguLgYBgYGWLt2Lfr169fqCliRlZgZecHj8VBQUIC6ujq21osJPZaVlSEnJ6fT80/l5eVIS0tj8yiMUCsS4urqavB4PNYkwvTJU8YkUlNTg9es7uBq3vBOuQ4GVQkXoPq8mLIW+sGDB7NhvIKCAlRXV0MkEsHU1JTt7KLqri1AQ8lHSkoKzM3NW9zdKZr/JrtQu3nzJtatWwc+nw87OzuEhISofAffVnu8LGfPnsXYsWNZo8vYsWMRExODmTNnqvQcXwSogHUzOBwODAwMMHLkSIwcORJAw5fFvn37EBERAWdnZ5SUlCAoKAj29vbsLs3b2xv6+vpKfak0HnkhG8bLz89HWVkZ1NTUYGJiAkIIqqqqOmR9VoRsWHLw4MEKSwhkUfSlxZhEmPCjIpOIpqYmu6J3dHTE1TyVXYIc3Vm4FNHSLo15f+jp6YHH48HExAQDBw5EbW0tK2rMokd2p9beWV5Mu6nq6mql3guKYBZqWlpauHnzJiwtLXH06FEIBALcvn0bjx8/hoODQ7vOTxHK2uP/+usvXLt2DY6Ojti+fTsGDBig8L75+fkqO7cXCSpgPQAOhwMbGxvcvn2bXbVJJBKkpqYiNjYWJ0+exGeffQaRSAQPDw/4+PjAz88PLi4uShktGMNIaWkpJBIJhg4dCh0dHTafxrjEGHHtSMd4iUTCdiRvqQhVGRT1yWNMIjweD5mZmaipqWGLnCUSSbufqyW6MlzYGcha1mWHWerr68vlLmVf69zcXDlDDvPTmgGnvLwcqampKmk3devWLaxatQohISH49ttv2QXXiBEj2v2YHWHixImYOXMmtLW1sWfPHoSEhODSpUvtfryqqqomk9ZfdKiA9RBef/11ud/V1dXh4uICFxcXzJs3D0DDrubu3buIjY3FDz/8gMePH8PAwABDhgyBn58ffHx8MGDAALlwINM0uKysDHZ2dnKDCBt3XpBIJGxoiRl3wUzblc2nKYIQgtLSUmRmZsLCwqJF23VH0NbWhq6uLnJzc2FgYABvb29IpVLweDxwuVy80j8L/xa8pJLn6o67LlUYPRITE1u1rDO1gL169UK/fv0AtDylW1bUmEGtaWlpEAqFHc6p1dTUYNOmTXj48CH++OMPle60mkMZe7zs4mzhwoVYvXo1e98rV67I3ZeJtihCJBIhNjYWtbW1GDVqFG7dugUfH58OmameF6iN/jmGmfWVkJCA2NhYJCQksH0KfXx8UFNTg6KiIqxfvx5WVlbtEhTZ3omytnjZNlNCoRCpqanQ1taGg4NDp3X3lp0F5uTkJBdulKWjdnpVCpci2itmSyZUtChgyljo3/K6A2dnZ5Wt9GXbejE/dXV1EIvF6NOnD/r37w8jI6N2OQMJIbhx4wbWrFmD+fPn44MPPlBJmLs1d+G3336Lffv2ISMjA76+vjh06BCmTZuGyMhIeHh4sM13+/Xrh3PnzgEAjh8/ji+//BKxsbEoLy+Hj48P7txpcJkOGTJELrqiiPPnz+O7775DWloapkyZgoiIiG5tYnpWUAF7wZBKpTh16hRCQ0NhYGAAHR0d8Pl8uLq6sqHHwYMHtzufQQhBbW0teDweKisrUVpaCrFYDGNjY/Tt25e1Pqvywydb9DxgwABYWlq2Gopqr4h1tngpQhlBa61GTNljtixU67Q5avX19UhJSYFUKsWAAQPY3Rqfz4dUKoWenp7cTq0lMaqpqUF4eDiSk5Oxd+9elRX3SiQSODo6yrkLjxw5ImfOuHz5MoYOHYorV65g3rx5qKmpwdq1axEWFgYtLS0cO3YMQUFBWLt2LU6dOsWGunft2sU6IQ8cOIAtW7YAAMLCwtgoCgPztcz8W6SkpGDcuHEYMmQI9u3bh969e0Mqlb7wIkYF7AXk7NmzsLKyYosp6+vr8eDBA8TGxiI+Ph4PHjyAlpYWvL29WVGzs7NT+sMi25V+4MCBMDMzQ01NDbtLYyYwd7TNFABUV1cjJSUFOjo6sLe3V3p311YB6wrhaglFRc6thQ+VEbDWipjbg+wCw9bWlm26LAvT7Z4RtKqqKrbbvWx4WktLC9evX8eaNWuwaNEivP/++yr9Er916xbCw8Nx9uxZAEBERAQAYO3atQqPT0pKwocffogbN24AaMgTMrb+9iKRSFjxvn79OsRiMTw9PVFRUYEDBw7A3Nwcc+bMkSufeVGhObAXkMDAQLnftbS04OPjAx8fHyxZsgSEEPD5fCQmJiI2NhafffYZMjIyYG5uzroefX190bdv3yaiU1lZKTcShgkNMatqKysrAM23mZId29LSLlAsFiMzMxM8Hg+Ojo7Nhgs7SncTLoa2Fjl31SRnoVCI5ORkaGhotDhsVLbbvewIF9keikuXLkVhYSHq6+vxwQcfYNiwYSrfLbal+S4A/Pzzzxg3bhz7uyqa7zLi9csvv2Djxo14+eWXIRaLsW/fPgwbNgwxMTG4f/8+Xn75ZaSlpfXY6eOqgAoYpQkcDgdGRkYYPXo0Ro8eDeB/u6q4uDjExsZix44dKC8vh6OjI3x8fGBjY4Pjx4/j/fffh7u7e6sJ5tYchHl5eRAKhdDV1ZXLp6mrq7OzzQYMGNDuno/KDLrsruLF0BlFzo8ePZKb79Xe3Y1sz0wHBwc5c5CyMLt0AwMD1jT0ySefwM/PD3fu3MHhw4fh4+PTrvNTBb/99hsSExNx9epV9rb2Nt9ldl2MUWrixInw9fXFo0ePIJVKsXHjRmzYsAHbt2/Ho0ePsHfvXsyePRurVq2Cvb19Z15mt4YKGEUpOBwOrKysYGVlhalTpwJo2AXdu3cPW7Zswfbt2+Hi4oLVq1fD09OT3ak5OTkpnaBX1GaKMQCUlJQgJSUFtbW10NbWhqWlJQwNDTuloPZ5FC5lsbKykutwwZROMKKmp6fXqqjJjjzp6Gy4qqoqrF+/HtnZ2Thx4gRsbGwAdF7neGWb7164cAGbN2/G1atX5SIFbW2+y2RwmF2XmpoaevfuDR8fH1y/fp197EWLFmHFihU4ffo01qxZg3PnzuHtt9/GxIkTO37RPRgqYJR2w4x29/f3R2RkJLS0tNjC0fj4eGzbto0NJzIhSn9/f1hYWCglOsxcLy0tLfD5fGhoaGDIkCHgcDhyY1uYUTNM6FGZXpLN8SKLF4BmO1zweDxkZ2ezvSllzRZM/pIQgry8POTn53d45AkhBFevXsXatWuxZMkS7N69+5kYFvz8/JCWloasrCxYWloiKioKkZGRcsckJSVh8eLFiImJYUsIgKbNd2/cuMFa55uDeZ+eOXMG33zzDYYPHw43Nzd8//338Pb2xtGjRzFz5kzY2tpi5syZ+Oyzz/Dyyy83Kat5UaEmDkqnQghBSUkJ4uPjWSt/YWEhBg0axObShgwZAgMDgyaiQwhBYWEhcnJyYG1tjf79+zc7A435kuXz+RAIBNDW1pbLpzVn7mDCiM+7cKnSwMGM9mF+BAIB1NXVUVdXBwMDAzg4OLSryJ2Bz+dj3bp1yMvLw969e2Ftbd2ux2lMa/Z4oVCIOXPm4Nq1a6ioqICZmRneffddhIWFISAgAE+ePGEFu6CgABYWDZO+ra2tcerUKdy8eVOu+e7HH3+MBQsWNDmPS5cuQSqVYsyYMQCAf//9F+vXr8ePP/6I6OhoREZG4uzZs0hKSsKqVatw8eJFmJmZsYs2d3d3lbwezwNUwCjPHKlUirS0NMTFxSEuLg537tyBUCiEm5sbK2o1NTV48OABRo0aBTs7uzaPbmEs2oyo1dfXszZtRtjU1dVBCEFgcGInXalqUMWuSxmXYnsciFKpFE+fPkVhYSH69+/PmnPa02qKEILLly8jLCwMH330EebPn6+yXZcy9viffvoJ9+/fx+7duxEVFYXjx4/jjz/+wOPHjzFz5kzEx8ejoKAAY8aMQWpqartrzq5duwYXFxd2YXX48GEIhUIYGxvj888/x7p16/D2228DAObOnYuysjL8888/KnkdnjdoCJHyzFFTU4OTkxOcnJwwZ84cAA2r37t37+Ly5ctYsGAB+Hw+nJyckJWVxYqajY2N0l9oirpENO5wLxaLIRKJELFaH3Z2djA0NGQf//UZCZ1z8e2AcRx2l1ZTDLIDLYcOHSr3b8O0mmLqAZ8+fdpsVw4A4PF4WLduHQoLC/HPP//IOQFVgTLNd0+ePInw8HAAwLRp0/Dhhx+CEIKTJ08iODgY2traGDRoEOzt7REfH4/hw5VvDC2VStmWba+++iqio6Nx6tQp7NixA2ZmZnj77bfx+uuvIzY2Fjo6OsjNzUVVVRX279+P69e7d3SgK6EC1gUcPXoU4eHhePLkCeLj4+Hr66vwuOZCHszsIC6XCx8fHxw+fLjTuls8K7S1tTF06FCcOXMGn376Kf7zn/+gsrISCQkJiIuLw7Fjx1iHFyNoPj4+MDExaVM+TU9PD/369UNGRgZ4PB5sbGwgFotZ0wKT3/n1+wEwMjKSGzXT1aLW3knOqrbQS6VSZGVloby8XG7kiSyyraaYui/ZIveysjJkZmZi+/btKC8vR2ZmJt555x189913ndLvTxl7vOwxGhoaMDIyApfLRX5+vpxpRNnmu4zBiBDCivvNmzeho6MDHx8ffPXVV/jnn3/g4uKCkJAQmJiYQEdHBxcuXMDKlSuxcuVKuLq6tthm6kWHClgX4O7ujr///huLFy9u9piW5g2tWbMGy5cvR3BwMN577z38/PPPeP/995/hFXQezAoYAExMTBAYGMjWrTHhqtjYWFy7dg3ffPMN+Hw+nJ2dWVHz9PRssR8jU1BrbW2tsHksk99hdmq1tbVsKCxy56AmDWp7iqipahgmj8dDcnIyzMzM4OPj06YQH4fDga6uLnR1dWFhYYHKykoYGRlBLBZjxYoVSE9PR2BgIE6cOCFnjuipVFRUsAss5vN8584dbNu2Dd7e3li0aBEOHjyIiIgIvP/++5g/fz6Sk5ORnJyMTZs2ISgoqKsvodtDBawLUGaceXMhDxcXF1y6dIl1RoWEhCA8PPy5EbCWUFNTg42NDWxsbBAcHAygQXAePnyIuLg4/Prrr7h//z7U1dXZLiK+vr5wcHDA48ePweVy0a9fP/j4+DS7Y9XU1ISpqSnbiFU2FFZRUYHs7GyIxWI2n/bnHgcYGBiw+ZCuFjSgcyY5SyQSZGRkgM/nK1Xn1xKEEJw7dw6fffYZVqxYgXfeeafTHYbK2OOZY6ysrCAWi8Hj8WBqaqq0tZ5BKBQiMTER0dHR2Lx5MwDgxIkT4HK5iI+PZ4+bNWsWrly5gsOHD2Pz5s24fPkyKioqYGpq2uMjKs8KKmDdlOZCHlwuF8bGxmxtzYs+S0hTUxPe3t7w9vbGe++9xw4ETUxMRFxcHDZu3IjY2Fj06tULkyZNwssvvwwTExOYmZkpHXpUFApjRs0UFhYiJSUFAKCnp4cvVjSEjdzc3Ni5Vl0hau3Jl3G5XLm8FAMz8sTS0rLdheMMFRUVWLt2LSorKxETE8MOyOxslLHHBwUF4dChQxg+fDiOHTuGgIAAcDgcBAUFYdasWfjkk09QUFCAtLQ0+Pv7K3yeAwcO4Mcff8Tly5cxYsQInDt3Dq+//jqqqqrY+sb6+npwOBxoamoiPDwcb7zxBl566SW8+eabrLORohxUwDqJMWPGoKioqMntmzdvxqRJk1T6XGKxGGPHjkV2djZsbGzw559/NqnBuXz5MpYvX87+npycjKioKEyePBlz587F1atX2fqfgwcPwsvLS6Xn+KxgCm9HjRqFkSNH4o033kBoaCimTp3KTrnevXs3ysrKmgwEVdb6zeFw5CZGM/VPOTk56N27NyQSCe7du8eOmjn8gzXby+9Z5NPaI17LJpairKxhhppEIoGenh4MDAxQWVkJiUQCT09P6OjotPucCCGIiYnBxo0bsXr1asyaNeuZNqLV0NDAjh07EBgYCIlEgvnz58PNzQ0bNmyAr68vgoKCsGDBArzzzjuwt7eHiYkJoqKiAABubm6YPn06XF1doaGhgZ07dzZxIDK5vZs3b2Lz5s0ghCA9PR2zZ8/G9evXYW5uDrFYjNLSUlbIrl27hmHDhuHQoUPw8PB4Zq/F8wS10XchI0eOxNdff63QxNFcU9HQ0FD07dsXRUVF0NDQwK1btzBr1iwsXrwYoaGh2Lp1KyoqKvDll182+7zl5eWwt7dHXl4edHV1MXfuXEyYMAHTpk3rnAvtQsRiscJOEBKJBCkpKWwD46SkJIjF4iYDQVvrIlFTU4Pk5GTo6zc4GWWPr6+vl7PyM9Zypli48W6no6LWEZeirIVeKpUiPz8fWVlZ0NXVZQeBMh05jIyMlOrIwVBeXo7Q0FBUV1dj165dnbbLKC8vx4wZM1pcyN29exfvv/8++Hw+1NXVERYWhhkzZgBAuxdyv/zyC86fP4+wsDB89dVXKCoqglQqxfHjx/HDDz+wQ2fnzp0LHR0dBAQE4Nq1a0hJScHevXvZ7iKUtkN3YN2U5kIeHA4Ho0aNwrFjxxAcHIxDhw5BIBAgJCQEQENObOTIkS0K2LFjxzBu3Lh2jW7vaTQnQOrq6nB1dYWrqyvmz58PABAIBEhKSkJcXBy+++47PHnyBAYGBuwuzc/PD5aWllBTU0NNTQ3y8vLA4/GanT2mpaWFPn36sH0AmYGPzHBN2d2OkZERju51hL6+frvyaaqy2ItEIqSkpLCTuZnaLaYjB5/PR05OjlIdUAghiI6Oxueff47Q0FAEBwd36q5r69atGD16NLuQ27p1a5PPga6uLn799Vc4ODigoKAAPj4+CAwMhLGxMQDgq6++atNCrqKiArt378aPP/4IJycnqKmpIT09Hfv374eenh4++eQTBAUFYc+ePdi9ezf++OMPnD17FoaGhoiOju5Qmy0K3YF1CcePH8dHH32E0tJSGBsbw8vLC2fPnkVBQQEWLlyI6OhoAEB0dDQ+/vhjNuQRFhYGAMjMzERwcDDKy8vh7e2N8+fPo7KyEkDDl0bv3r3Z3xUREBCATz75BBMmTADQsPK8desWtLW1MXr0aGzdurXd88CeJwghKCsrQ3x8POLi4pCQkIC8vDzo6+ujqKgIy5Ytw9tvvw1jY+N254WYMSLMLq2qqooNgxoZGUEikbBjafr379+k6FpVwhWxSB3FxcXIzMxsduRJYxR15NDW1sbVq1dhaGiIixcvQl1dHTt37oS5ublKzrMlnJyccOXKFVhYWKCwsBAjR45k85PN4enpiWPHjsHBwaHNkQjGJr98+XJcvnwZ5ubm+Pnnn7F//34QQjBr1iw4OjoiISEBc+fOxW+//QZvb2/U1tZ2KBxL+R9UwHoILeXUQkJC5ASrd+/eqKhQXPtTWFgIDw8PFBQUsOGrwsJCmJubo76+HiEhIUhISGAdf4rCMEDDDoaZPMu00gGezxo1BkII5s+fj/z8fEyYMAHp6elITExEbW2t3EBQd3f3Di0AJBIJuFwuMjIyIBKJoKGhAW1tbbkuIrKlAmv3STp8bcH+D6Gurg5HR8cO/XvV1dVh+/btiImJgVAoBIfDga2tLQ4dOtTp86uMjY3btJCLj49HSEgIHj16BDU1NaUXcrLzuqqrq/H666+jqKgIW7ZsQXBwMNLT07Fx40aMHj0aU6dOhYGBAT777DOYmppi6dKlnXPxLyhUwJ4D2rLy/P7779lxDIoIDg7G3bt3kZyc3GI+rbnBfdOnT8dbb73F1qh5eno+Vxb/5ORkdqouQ319Pe7fv8/m0x4+fAhtbW25gaC2trZKhc9kx5DY29vLOdeYXRqPx4NQKISOjo7cqBnZfFpbRW3FlIp2jTyRpaysDKtWrYJUKmU7TBBCkJGRATs7O5VMDVDlQm7kyJE4dOgQW6Qsu5B79913YWdnhw0bNii8f3V1Ne7cuQMXFxfo6+vj4sWL2L9/P3744QdYW1sjKioKZ8+exaxZszB27NhOmZpAoQL2XLBq1SqYmpqysf/y8nJs27ZN4bHDhg1DREQERo0axd5WWFgICwsLEEJgYmKC2bNnY8eOHS2KoSIBI4Q0MZjIGlFeFAgh4PF47EDQhIQEZGZmwsLCQm4gaJ8+feS+1AQCAZ48eQI9PT3Y29u3mB+R7WrBhPAkEoncBGPZeV6tCVpHJjETQnDq1Cls2bIF69atw/Tp07vky1rZhRyfz8fIkSPx6aefNhsuvHLlCr7++muFPQhPnDiB8PBwTJo0CX/++Sd+/fVXODs7Y+PGjZBIJNi+fTsAYNmyZRg7diwbqqeoHipgzwFcLhfTp0/H06dPMXDgQPz5558wMTFBYmIidu/ejf379wMAsrOz8dJLLyE3N1duNxAQEIDS0lIQQpCamory8nLo6+u3GIbR0NCAl5eX3OTZsrIyDBs2DOnp6QCA3NxcjBs3Dg8fPnw2L0Q3hhCC3NxctoFxQkICKisr4ejoCC8vL2RkZKBv375YunRpu8eQyE4w5vF4qKqqYodCyhot8vPzkZ+fj5MP/AB0TLxKS0uxcuVKqKur44cffujSDhrKLOTq6+sxbtw4TJw4ER9//LHc32QXcsuXL0evXr2wZcsWuc+KWCzGkiVLsGLFCujq6sLLywvh4eH48MMPkZSUhE2bNmHy5MkICQlhXaeUzoMK2AuIKsIw+fn5cpNnL168CCMjIzkBe/DgAYYPHw4LC4tnamvuKYjFYhw9ehRhYWGwtLREXV0dAMDLy0tuIGh7u54zz8Hs0LhcLng8HjQ1NWFmZgZjY2MYGRm1K19HCMGJEyfw5ZdfYsOGDZg6dWqn7LqUscYDDTlZFxcX5OTkgBCCYcOG4c8//wSPx8OECRPYxdS4ceOwaNEiuLm5sfdl3leyCzkvLy/s3LmTfe/V19dDS0sLT58+RXh4OIyNjfHvv//i008/xZQpUyAUCqGtrc0aOBYtWqTy14LSFCpgFDna4+Ri3FtTp06VCyH+5z//QXx8PFJTU5vNp6WmpoLD4cjZmp88eQJjY+Pnuj6N4fDhw/Dz84OzszPb4YMpuE5ISGAHgjLNi/38/JQeCMpACEFOTg6Ki4vh7OyMXr16yeXTmC7xsvm0lsKXJSUlWLFiBbS1tfHDDz90OHfWEqtXr4aJiUmrNY6dlZPl8XhYvnw5CCFwdnbGmjVrMGHCBPB4PPz7778AGnJ/W7duxbp16+QmGlA6HypgFDmUCcM0njw7fPhwdjTF22+/jalTpyI4OBjGxsZYs2YN1q5d+0xszc8jTANi2YGgRUVFsLW1lRsIqq+vr1DUqqur8eTJE5iYmGDQoEEKv1yZUTOyRddSqVSucFlbWxtaWlr466+/8NVXX2Hjxo2YMmVKp+e6lF1QqSonK5VKoaamBkIIqqqq8NZbb2HYsGGYOHEiNm/ejIEDB2LlypV45ZVX8Pnnn0MoFGLnzp0ICgrC559/rvLrp7QMFTCKHMrk01qaPCtbo/b06VNUVVVBW1u7U23NLxpSqRSpqalsPi0pKQlCoRDu7u6sqNnZ2eG3336Dj48PXFxc2jyiRCqVsoXLhYWFWLRoEUQiEXr16oXly5dj7NixbKPpzkRZa3xHc6yzSHQAABVdSURBVLKyLkFGCMViMZYtW4aff/6Z3ZFaWlri7NmzKC0txZ07d3Dnzh289957eOWVVzrl+iktQwWM0iG6i635RUcoFLJdRM6cOYO4uDi4u7vLdeUfOHBgm8NbUqkUx44dw7fffovQ0FCYmZkhISGhRadrW3lWOVllTEW//vor9u7di7CwMPj7+8PPzw8nT55kax43bNiA/v3747333uvoZVNUAaFQOglHR0dSUFBACCGkoKCAODo6KjyOx+MRb29vcvToUYV/P3PmDBkwYADR1dUlERERTf5eV1dHpk+fTuzs7Ii/vz/Jyspi/7ZlyxZiZ2dHHB0dSUxMTMcvqpuTnp5ORo0aRZKTk0lZWRk5c+YMCQ8PJ+PHjydubm7kjTfeIOvXrycnTpwgubm5pLq6mtTU1Cj8ycjIIEFBQeSdd94hXC63S65H2feQLCEhIeTo0aNEKpUSU1NTIhKJCCGE3Lx5k7z++uvN3u/UqVNkxIgR5Pbt2+xtW7duJV5eXqSoqIjweDzyxhtvkOjo6A5eFUVVUAF7wZFIJEQqlXbKY69cuZIVnIiICLJq1aomxwiFQhIQEEC2b9/e5G8FBQVELBYTW1tbMnfuXLJy5Uri4eFBHj16JHfczp07yeLFiwkhhBw5coRMnz6dEELIo0ePiIeHB6mrqyOZmZnE1taWiMViVV9mt6O5f0+JREIyMjJIZGQk+fjjj8lLL71EPD09yYwZM8hXX31FLl++TLhcLqmqqiI///wzGTx4MDl16lSnvT+UQZn3UHl5OamrqyOEEFJaWkrs7e3Z98i0adPIkSNHCCGELF68mOzcubPZ5woLCyObNm0ihDS8LxkWLlxI5s2bR9zd3UloaKhqLoyiEqiAUTqNsrIyEhAQQOzt7cno0aPZVXxCQgJZsGABIYSQw4cPEw0NDeLp6cn+JCUlEUIIGTVqFLG1tSV6enpk9uzZpKqqimzZsoVs2bJF7nlef/11cvPmTUIIISKRiJiamhKpVNrkWNnjKA3U19eT27dvk59++omEhISQIUOGEDMzMxIcHEzKy8s75Tm5XC4ZM2YMsbe3J2PGjFH4PJcuXSKenp7Ezc2N6OvrEw6HQzw8PAiXyyUhISHEwsKCmJiYEE9PT/LLL78Qd3d34uHhQdzd3cn+/fvZx8nIyCB+fn7Ezs6OTJs2jQgEgmbP67fffiNLly6VO5+amhpCCCHV1dUkNTVVha8CRRVQAXuBOX/+PDlw4AC5c+dOs8d05eqbEEKOHj3Kih0hhPz6669kyZIlcse4ubmR3Nxc9ndbW1tSWlpKlixZQg4fPszePn/+/GbDlJQGpFIpyc3NJRKJpNOeY9WqVXK7qtWrV7d4PJfLJb1792bFhAkRthXZa6qtrW3y90uXLpFVq1axu7CjR4+ScePGUeHqxtCChReU+/fv4/fff0diYiI++OADbN68GTU1NQAaZpFlZ2cDaBjeyMyDkkUqlT7L01UpMTExcHJygr29PbZu3drk799++y1cXV3h4eGB0aNHIycnh/2buro6vLy84OXlhaCgoGd52s8EDocDKyurTq1lOnnypNz4nxMnTrR4vKrG/6ipqaG4uBgzZ87E+vXrER0dLfc+HjlyJCZPnoyrV69iypQpiIiIwMaNG+Hg4NCh56V0HnQYzQtKTU0NEhMTcf78eZibm6O8vBx6enrYsmULuFwukpKSIJVK8fvvv8PS0hKxsbHw9fVl7cTPqljT0tISubm57O95eXmwtLRUeIyVlRXEYjF4PB5MTU0V3tfc3BwhISE4f/48rKys4Ofnh6CgILi6urLHeXt7IzExEbq6uti1axdWr16NP/74AwCgo6ODu3fvdvJVP98UFxezQy3Nzc1RXFzc4vFRUVH45JNP5G4LCwvDpk2bWi2vIDL2+MePH2PZsmVYtGgRNDU1MW/ePPz555947bXX2ONGjBiB//73vygqKsKgQYNUcLWUzoTuwF5Q3N3dMXXqVERERODs2bMwMTHBjRs3sG3bNgQHB+P06dNYsGABjh49CkIIwsPD8d///hcAcPbsWZw9e7bFXZiiXVt7kB3sWV9fj6ioqCY7n6CgIBw6dAhAw2o9ICAAHA4HQUFBiIqKglAoRFZWFtLS0gAA9vb2sLW1hZaWFoKDg3Hy5Em5xxs1ahS72h82bBjy8vJUci0vEmPGjIG7u3uTn8avNYfDabEYurCwEA8ePEBgYCB7W0REBJKTk1k7v6LOHMx7k8PhsC26hEIh3njjDQwYMAA7d+7E7Nmz8dprr7HHMejo6FDx6il0cQiT0gXIOqwiIyNJQEAAuXjxItmxYwfx8fEhs2bNIt7e3sTR0ZEEBwcTQhqMF35+fiQ2NpZ4eHiQ48ePK3xs2VxUY8RicbtyaqdPnyYODg7E1taWfPHFF4QQQtavX09OnjxJCGnIZ0ybNo3Y2dkRPz8/kpGRwd73iy++ILa2tsTR0ZFER0crlVOTZcmSJeTzzz9nf1dXVyc+Pj5k6NChzb4GlJZpizX+u+++I4sWLWr275cvXyZvvvlms3/fv38/ee211wiXyyX//PMPGTFiBBk+fDg5f/48IaThs/Dw4cN2Xgmlq6EC9gJSWFhI3n33XRIeHk6OHTtG5syZQ65fv05WrlxJvvzyS/a4goICtqYqLy+PvPLKKyQwMJBcunSJECIvSCUlJeSbb74hw4YNI4MHDyZz5sxhk+7MfxUhFos71TDQmLYI2OHDh8nQoUNZizYhDa8DIQ3utoEDB5L09HRy5swZ4ujoSOzs7BTWqf3yyy+kT58+rMty37597N8OHjxI7O3tib29PTl48KCqLrNbo4w1nmHo0KHs+42BET+pVEqWLVtG1qxZo/C+oaGhZPTo0SQuLo4Q0uCKHT9+PPs6i8ViMnHiRPLhhx8+0/cgRXVQAXsBEYvF5MqVKyQ8PJxMmjSJxMTEEKlUSqKjo8ncuXPJlStXSH19PeHxeKxAbd++nfTt25d89NFH7GMQ8j+X4rZt28i4ceNIVVUVqa6uJrGxsaSuro78+++/JCgoiDg7O5Ply5cTPp/f4rlJJBJy8+ZNcuDAAZKTk6Pya29czKrIlk9Ig0PT2dmZFBcXN/tYISEhJCoqitja2pKMjAwiFAoV1qn98ssvCkWSy+WSQYMGES6XS8rLy8mgQYM6zbrenVCmvIIQQrKyskj//v2biMuoUaOIu7s7cXNzY8srGh8jEAjIf/7zH1bsmEXI6dOnyZIlS0hgYCDx8vIiGzZs6MxLpXQyVMAocmzdupWMHTuWODk5kS+//JIIhUKyevVqMnnyZJKYmEjGjh1LsrOz2eOZL44333yTREZGyj3WjRs3yKxZs8jevXuJVColc+bMYWt0UlNTyerVq8nMmTNJZGQku0vLysoi48ePJ++99x7Ztm0b4fF4ZPbs2WTDhg0kOzu7w1/wIpGIDBo0iGRmZrKC0ziEdOfOHWJra9vEPq2oYPb3339vVRCbE7DIyEjy7rvvsr+/++67TV7DnsKff/5JXF1dCYfDIQkJCc0e19xuNTMzk/j7+xM7Ozsyffp0uTB3S8iGpIuLi8m///7L/j58+HCyZ88eQsj/FlzMf5OSkkh6erryF0jpllATB0WONWvW4Ny5c0hOTsbixYshFArB5/Nx5MgR+Pj4wMnJCVFRUezxTPI7MzMT9vb2ABqS5QBw7do1eHt7Y+LEieBwODAyMkJZWRkyMjLw008/wd/fH8uXL0dMTAzu3r2Lu3fv4q233kJGRgbWrVuHBQsW4MCBA1BTU0NAQADu3buHb775BlwuF0CDw4y0sZWnhoYGduzYgcDAQLi4uGD69Olwc3PDhg0bcOrUKQANHfmrq6vx9ttvy9nlnzx5Al9fX3h6emLUqFEIDQ2FlpYWBgwYwD6+lZUV8vPzmzzvX3/9BQ8PD0ybNo11Rubn5yt1356Au7s7/v77b7z66qvNHiORSLBkyRKcOXMGjx8/xpEjR/D48WMADe+75cuXIz09Hb1798bPP/+s1PMy77+9e/fi1Vdfxb59+7BkyRIUFBRg/fr1OHbsGNLS0qCurs46SoGGmWt2dnYdvGpKV0Nt9JRmYYb57dq1ixWKsLAw3Lp1iz2Gw+GAEIIZM2bgwoULcHV1hZ6eHgBAU1MTAoEApqamABpGXlhYWOC3337DuXPncO/ePQQHB6OgoAAxMTHYtGkTTExMYGZmhmPHjiEuLg7R0dGws7ODra0tDA0NWTFknluWqqoqpKSkYNCgQexzKmL8+PEYP3683G2bNm1i///ChQsK7zdixAg8ePBA7rZjx441/wL+PxMnTsTMmTOhra2NPXv2ICQkBJcuXWr1fj0JFxeXVo+Jj49nHaAAWAeoi4sLLl26hMjISAANtWHh4eHNzu2SSCTskM+6ujpcu3YNN2/exL1793Du3DmEhIRgwIABmDFjBl566SXMmTMHpqamEAqFKmtATOke0B0YRSkYsTA3N8eUKVPkdj4cDgcLFy5EYmIi/P39MWPGDFRXV8PHxwc3b96EpqYmKisrcfLkSTg5OUEkEmHZsmX44osvwOPxYG1tDSsrKwANwwF/+uknLFu2DBERERg+fDj75b9gwQJ8//33ABpGXZw7dw5JSUly51JSUoKMjAwADVZqiUTSqUXXytSpmZqasnVKCxcuxO3bt1u8b2uF1suXL2eLqR0dHWFsbMz+rTsXWje34+RyuTA2NmZrDFvbiTLi9dtvv2HmzJnw9/fHjh078N133+HLL7/E559/jhs3buDevXv47LPP8Pfff2P58uU4f/48vL29O/ciKc8UugOjtIvGux9LS0v89ddfAICCggLo6+vD29sbdnZ2sLOzg5OTE2bNmoWhQ4fi0aNHOH36NN59912MGDGCfQwulws+nw9TU1NIpVJkZmZCS0sLK1euBNBQfM2MtWA6OeTn56OyshJnzpwBIQQODg5sKLO5YmupVNpq/ZGyyNapWVpaIioqit1JMBQWFrKFu6dOnWJ3K4GBgfj000/Z8SDnzp3DF198gWHDhrVYaL19+3b2/3/88UckJSWxv3dmoXVLY08mTZrUKc+piPr6eixZsgRVVVXYsmULjI2NweVycePGDZw/fx46OjqIjIzEwYMHYWtrCw8PD/b1pzxfUAGjqJz+/fsDaAhB7tixA0KhEIWFhewuKzAwEGfPnsWECRPg5OSEV199FZMmTUJiYiIGDhwIQ0ND1NfXIysrC7179wbQMMtJJBLB0tISJ0+eRHZ2Nm7cuAEAKC0tRd++fXHgwAHExMTg0KFD6NWrFzZu3AgOhwM/Pz8EBgayK3dZYSMynRpqamrY8KeyyObUJBIJ5s+fz+bUfH19ERQUhB9++AGnTp2ChoYGTExMcPDgQQCAiYkJ1q9fDz8/PwANs6bS09MVhtlkBUyWI0eOYOPGjW065/bSXGhVWZrbcZqamqKyshJisRgaGhoKd7GyaGlpQV1dHfHx8XBxcQEhBMbGxuDz+fjmm2/g7OwMPT09LFiwAB4eHh06Z0r3hoYQKZ2OtrY2bGxsoKGhAUIILC0tsW/fPnzwwQfQ0dFhJ+DGxMSwX1wCgQDp6elwcnICANy9exf9+vWDjo4O0tLS8NZbbwFoMIz07dsXAoEAfD4fHh4e4HA4WLRoEXx9fWFtbY3IyEhcvXoVQEPO6urVq7h//z5EIpHcLmz79u0oKytr8/WNHz8eqampyMjIQFhYGICGnBoTwouIiMCjR49w7949XL58Gc7Ozux958+fj/T0dKSnp2PevHltMnbk5OQgKysLAQEB7G11dXXw9fXFsGHDWu0x+KxprqsKh8PBqFGj2HzioUOHWt3Rbdu2DSYmJti/fz84HA7U1NSwbds23L59G/v27cO3336LiRMnPovLonQlXWV/pFAaU1RUxFr0i4uLyTvvvMN2HV+1ahX5+OOPCSENdvPG9Tu5ublk1apV5K+//iK3bt0iWlpaZM6cOeT48ePk66+/JiNHjiSEEDJ79mwyatQoMmnSJOLk5EQuXLhAJBIJ2bt3L7GxsXmGV6uYthRab926lXz44YdytykqtH4W/P3338TS0pJoaWmRfv36saUF+fn5ZNy4cexxirqqMOcrO/ZEtni8Oc6dO0e8vb3lur/weDwVXhWlu0NDiJRug5mZGfv//fr1w6FDhyAWiwE0hJ+Y0OT48eNx7NgxnDt3DoMGDYKDgwNKS0tRVVUFDw8P/PLLL5gzZw7mzZuHqKgoJCQkYNy4cSgsLAQhBJMnT8bSpUuxZ88e7NixA6NHj0Z0dDQqKyvxyiuvYN68eZg/f36XvAbKmEIYoqKisHPnzib3BwBbW1uMHDkSSUlJz8QuPmXKFEyZMqXJ7f3790d0dDT7uyIHKNBwvvHx8W16zrFjxyImJgYhISG4ePEiAMDQ0LCNZ07pyVABo3RbOBwONDU1AQDLli1jb3/zzTfx9OlT7N69G8XFxTh9+jQKCwtRWloKY2NjmJqaQiwWY8SIEXImkf/+97+wsLBga5VycnJYUfTy8sLgwYOxadMmFBQUPMOrlEcZUwgAJCcno6KiAsOHD2dvq6iogK6uLrS1tVFWVoYbN26wdU/PK2FhYTh79mxXnwali6A5MEqPQ0NDAx999BH+/vtv3LhxA8bGxnB3d8esWbNgamqK9957DxkZGZg7dy727duH48ePA2hwLOrp6bGidf/+fQwbNgwAkJCQAE9PTwD/M6F0BcoUWgMNu6/g4GC5HJ6iQuvmzB/PCyYmJpg5c2ZXnwali+AQ0sZWBhRKDyA7Oxvnz59HXFwcrK2tsWHDBnzyyScwNjbGhg0bAABDhgzBwYMH4eDgAF9fX1y6dAlmZmZyzkQKhdJ9oQJGeWHIzs6GQCCAq6srsrOzERgYiKSkJPB4PLzyyitITk5mi2kpFEr3h4YQKS8MNjY2cHV1BSEENjY2SEhIgK6uLnr16oUxY8ZgxIgRbI0WhULp/tAdGIUiQ3uKmSkUStdABYxCoVAoPRIaQqRQKBRKj4QKGIVCoVB6JFTAKBQKhdIjoQJGoVAolB4JFTAKhUKh9EiogFEoFAqlR0IFjEKhUCg9EipgFAqFQumRUAGjUCgUSo+EChiFQqFQeiRUwCgUCoXSI6ECRqFQKJQeCRUwCoVCofRIqIBRKBQKpUdCBYxCoVAoPRIqYBQKhULpkVABo1AoFEqPhAoYhUKhUHokVMAoFAqF0iOhAkahUCiUHgkVMAqFQqH0SKiAUSgUCqVHQgWMQqFQKD0SKmAUCoVC6ZFQAaNQKBRKj4QKGIVCoVB6JP8H7BuVmhx77EMAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "# output heatmap (brute force)\n", "# replace None with the relative path if you want to save the plot\n", "fair_model.heatmapflag = True\n", "fair_model.heatmap_path = 'heatmap'\n", "fair_model.generate_heatmap(data_set, dataset_yhat.labels)\n", "Image(filename='{}.png'.format(fair_model.heatmap_path)) \n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**black-box auditing**\n", "\n", "We now show to audit any black box classifier with respect to rich subgroup fairness under either FP or FN rate. Note the below auditing procedure would work for any set of (soft) predictions $\\hat{y}$, and need make no assumptions about the structure of the predictor. We note that as expected the disparity of the group found is the same as the disparity printed out in the last iteration of the `fit` method.\n", " " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.004955178356713431\n" ] } ], "source": [ "\n", "\n", "gerry_metric = BinaryLabelDatasetMetric(data_set)\n", "gamma_disparity = gerry_metric.rich_subgroup(array_to_tuple(dataset_yhat.labels), 'FP')\n", "print(gamma_disparity)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**pareto curves**\n", "\n", "The `FairFictPlay` algorithm implemented in the `fit` method converges given access to perfect oracles for solving cost-sensitive classification (CSC) problems. A cost-sensitive classification problem over a hypothesis class $\\mathcal{H}$ is $$\\min_{h}\\sum_{i = 1}^{n}(1-h(x_i))c_0 + h(x_i)c_1$$\n", "By default in this package, and in the companion [empirical](https://arxiv.org/abs/1808.08166) and [theory](https://arxiv.org/pdf/1711.05144.pdf) papers, the hypothesis class of the learner and the of the subgroups are hyperplanes. The corresponding heuristic oracle for solving the CSC problem first forms two regression problems $(x_i, c_0)$ and $(x_i, c_1)$. Then in the case of hyperplanes, trains two regressions $r_i: \\mathcal{X} \\to R$ which predict the costs of classifying a given point $x$ $0,1$ respectively. Finally the binary classifier output by the oracle is defined as $\\hat{r}(x) = \\arg\\min_{j \\in \\{0,1\\}}r_j(x)$. But of course if we are interesting in different hypothesis classes for the learner, we simply need different regressors. In this package in addition to linear regression, we've added support for regression trees, kernelized ridge regression, and support vector regression. Below we trace out Pareto curves of $\\gamma$-disparity vs. error for each of these different heuristic oracles. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Curr Predictor: Linear\n", "Curr Predictor: SVR\n", "Curr Predictor: Tree\n", "Curr Predictor: Kernel\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# set to 50 iterations for fast running of notebook - set >= 1000 when running real experiments\n", "pareto_iters = 50\n", "def multiple_classifiers_pareto(dataset, gamma_list=[0.002, 0.005, 0.01, 0.02, 0.05, 0.1], save_results=False, iters=pareto_iters):\n", "\n", " ln_predictor = linear_model.LinearRegression()\n", " svm_predictor = svm.LinearSVR()\n", " tree_predictor = tree.DecisionTreeRegressor(max_depth=3)\n", " kernel_predictor = KernelRidge(alpha=1.0, gamma=1.0, kernel='rbf')\n", " predictor_dict = {'Linear': {'predictor': ln_predictor, 'iters': iters},\n", " 'SVR': {'predictor': svm_predictor, 'iters': iters},\n", " 'Tree': {'predictor': tree_predictor, 'iters': iters},\n", " 'Kernel': {'predictor': kernel_predictor, 'iters': iters}}\n", "\n", " results_dict = {}\n", "\n", " for pred in predictor_dict:\n", " print('Curr Predictor: {}'.format(pred))\n", " predictor = predictor_dict[pred]['predictor']\n", " max_iters = predictor_dict[pred]['iters']\n", " fair_clf = GerryFairClassifier(C=100, printflag=True, gamma=1, predictor=predictor, max_iters=max_iters)\n", " fair_clf.printflag = False\n", " fair_clf.max_iters=max_iters\n", " errors, fp_violations, fn_violations = fair_clf.pareto(dataset, gamma_list)\n", " results_dict[pred] = {'errors': errors, 'fp_violations': fp_violations, 'fn_violations': fn_violations}\n", " plt.plot(errors, fp_violations, label=pred)\n", "\n", " if save_results:\n", " pickle.dump(results_dict, open('results_dict_' + str(gamma_list) + '_gammas' + str(gamma_list) + '.pkl', 'wb'))\n", "\n", " plt.xlabel('Error')\n", " plt.ylabel('Unfairness')\n", " plt.legend()\n", " plt.title('Error vs. Unfairness\\n(Adult Dataset)')\n", " plt.savefig('gerryfair_pareto.png')\n", " plt.close()\n", "multiple_classifiers_pareto(data_set)\n", "Image(filename='gerryfair_pareto.png') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A natural question one might ask is, suppose we fix a statistical fairness definition for rich subgroup fairness like equality of false positive rates, `FP`. Does learning a classifier that is fair with respect to `FP` increase or decrease fairness with respect to false negative rates `FN`? One could see this relationship going in either direction - and indeed we submit that it is dataset dependent. In some cases, if enforcing `FP` fairness pushes the classifier towards the constant classifier, then it will also satisify `FN` rate fairness, since the constant classifier is perfectly fair. However, if the hypothesis class is sufficiently rich, then one would expect that ceteris paribus since we are optimizing for error in addition to `FP` rate fairness, the algorithm would increase `FN` rate unfairness in order to decrease error. Below we trace the FN vs. FP rate tradeoff across a range of input $\\gamma$, where the classifier is optimized only for `FP` rate fairness. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gamma: 0.001 gamma: 0.002 gamma: 0.003 gamma: 0.004 gamma: 0.005 gamma: 0.0075 gamma: 0.01 gamma: 0.02 gamma: 0.03 gamma: 0.05 " ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def fp_vs_fn(dataset, gamma_list, iters):\n", " fp_auditor = Auditor(dataset, 'FP')\n", " fn_auditor = Auditor(dataset, 'FN')\n", " fp_violations = []\n", " fn_violations = []\n", " for g in gamma_list:\n", " print('gamma: {} '.format(g), end =\" \")\n", " fair_model = GerryFairClassifier(C=100, printflag=False, gamma=g, max_iters=iters)\n", " fair_model.gamma=g\n", " fair_model.fit(dataset)\n", " predictions = array_to_tuple((fair_model.predict(dataset)).labels)\n", " _, fp_diff = fp_auditor.audit(predictions)\n", " _, fn_diff = fn_auditor.audit(predictions)\n", " fp_violations.append(fp_diff)\n", " fn_violations.append(fn_diff)\n", "\n", " plt.plot(fp_violations, fn_violations, label='adult')\n", " plt.xlabel('False Positive Disparity')\n", " plt.ylabel('False Negative Disparity')\n", " plt.legend()\n", " plt.title('FP vs FN Unfairness')\n", " plt.savefig('gerryfair_fp_fn.png')\n", " plt.close()\n", "\n", "gamma_list = [0.001, 0.002, 0.003, 0.004, 0.005, 0.0075, 0.01, 0.02, 0.03, 0.05]\n", "fp_vs_fn(data_set, gamma_list, pareto_iters)\n", "Image(filename='gerryfair_fp_fn.png')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" }, "pycharm": { "stem_cell": { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [] } } }, "nbformat": 4, "nbformat_minor": 1 }