[kplato] CVS Diff changes (next set)

Chris Clarke kplato@kde.org
Thu, 5 Jul 2001 16:56:57 -0700


--------------Boundary-00=_XIY0UY1R9ROAUPXOIW94
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

Thomas,

Here's the next set of updates.  I think this fixes most of your concerns, 
although I've done another big thing that will probably raise more :-)  (bear 
with me here...)

First the easy stuff:

* KPTNode removed addDependNode and removeDependNode as they have been 
replaced by parent/child equivalents (Per tzander request)

* KPTNode and KPTMilestone removed all KPTRisk references, this is now 
contained in KPTResourceGroup; it only exists when resources are allocated to 
tasks (Per tzander request)

* KPTMilestone added empty definition of insertResource for completeness 
(operation not allowed) (missed this yesterday)

* KPTMilestone added empty definition of add/insertDependChildNode (operation 
not allowed) (per tzander request; now we can only add parent dependents)

* Created data class KPTEffort (per agreement cclarke/tzander)

* KPTNode removed get/set Optimistic,Pessimistic,Expected effort  functions 
and replaced with addEffort, and effort()

* Modified main function to use effort class

Now for the resources (oh boy, I knew this was going to be fun even before I 
started thinking about the project).  

Yes I have moved it back out from under KPTNode, but I've created a new class 
as well.  First I want to explain what situation I have in mind (this is a 
real but simplified version of what I've had to do before, so it is not a 
contrived example).

Let's take a task definition: 

-------------------------------------
Task Name: Integrate Software on Target Platform
Expected Effort: 500 manhours

Resources Lists

   People assigned/Risk:
        Thomas/None, Richard/None, Jim/None, Stephen/None, Chris/Medium
         Constraint: Each person requires an integration string

   Integration Strings Assigned (no risk associated):
        String 1, String 2
-------------------------------------

Now when I look at it this way, what I see is that I'm not assigning 
resources to tasks, but groups of resources.  So this is what I've done, I've 
created a ResourceGroup which goes with the task, the resources then get 
added within each group.  The risk is assigned with the resources inside the 
group, so we've maintained that constraint like you mentioned.

Now I don't expect that our initial product will handle balancing so that 
each person gets a string assigned, but this is something that is important 
to me so I want the hooks there to do it (btw in my real world experience we 
were balancing 2 strings across about 20 people, so it was even worse than 
above).  In the simple case of one group of resources (e.g. people), this 
falls down into basically what you had before, there's just an extra level 
now.

There are a couple or problems that aren't yet covered by this breakdown:

1) How do I associate the 500 hours to the list of people
2) How do I ensure that I don't add a string to a people list

But its good for the next approximation (I hope!)

Hope you're having fun at LinuxTag!

Cheers,
Chris C.
-- 
Chris Clarke
chris.clarke@cfourconsulting.com
http://cfourconsulting.com
--------------Boundary-00=_XIY0UY1R9ROAUPXOIW94
Content-Type: text/x-c++;
  charset="iso-8859-1";
  name="chrisc.diff"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="chrisc.diff"

SW5kZXg6IGtwdG5vZGUuY2MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL2tvZmZpY2Uv
a3BsYXRvL2twdG5vZGUuY2MsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNgpkaWZmIC1yMS42IGtw
dG5vZGUuY2MKNTIsODRkNTEKPCBLUFRSZWxhdGlvbjo6UmVzdWx0IEtQVE5vZGU6OmFkZERlcGVu
ZE5vZGUoIEtQVE5vZGUqLCBUaW1pbmdUeXBlLCBUaW1pbmdSZWxhdGlvbikgewo8ICAgLy8gT25s
eSBwb3NzaWJsZSBpZiB3ZSBoYXZlIGEgdGVybWluYWwgbm9kZQo8IAo8ICAgaWYgKCAhbV9ub2Rl
cy5pc0VtcHR5KCkgKSB7CjwgICAJcmV0dXJuIEtQVFJlbGF0aW9uOjpIQVNDSElMRFJFTjsKPCAg
IH0KPCAKPCAgIHJldHVybiBLUFRSZWxhdGlvbjo6Tk9USU1QTDsKPCAKPCB9CjwgCjwgCjwgS1BU
UmVsYXRpb246OlJlc3VsdCBLUFROb2RlOjppbnNlcnREZXBlbmROb2RlKCB1bnNpZ25lZCBpbnQs
IEtQVE5vZGUgKiwgVGltaW5nVHlwZSwgVGltaW5nUmVsYXRpb24pIHsKPCAgIC8vIE9ubHkgcG9z
c2libGUgaWYgd2UgaGF2ZSBhIHRlcm1pbmFsIG5vZGUKPCAKPCAgIGlmICggIW1fbm9kZXMuaXNF
bXB0eSgpICkgewo8ICAgCXJldHVybiBLUFRSZWxhdGlvbjo6SEFTQ0hJTERSRU47CjwgICB9Cjwg
CjwgICByZXR1cm4gS1BUUmVsYXRpb246Ok5PVElNUEw7CjwgfQo8IAo8IHZvaWQgS1BUTm9kZTo6
cmVtb3ZlRGVwZW5kTm9kZSggS1BUTm9kZSogbm9kZSkgewo8IH0KPCAKPCB2b2lkIEtQVE5vZGU6
OnJlbW92ZURlcGVuZE5vZGUoIHVuc2lnbmVkIGludCBpbmRleCl7CjwgfQo8IAo8IEtQVFJpc2sg
KktQVE5vZGU6OnJpc2soKSB7CjwgfQo8IAo8IHZvaWQgS1BUTm9kZTo6c2V0UmlzayhLUFRSaXNr
ICpyaXNrKSB7CjwgfQpJbmRleDoga3B0cmVzb3VyY2UuY2MKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog
L2hvbWUva2RlL2tvZmZpY2Uva3BsYXRvL2twdHJlc291cmNlLmNjLHYKcmV0cmlldmluZyByZXZp
c2lvbiAxLjQKZGlmZiAtcjEuNCBrcHRyZXNvdXJjZS5jYwoyMmEyMyw1OAo+IAo+IEtQVFJlc291
cmNlR3JvdXA6OktQVFJlc291cmNlR3JvdXAoKSB7Cj4gfQo+IAo+IEtQVFJlc291cmNlR3JvdXA6
On5LUFRSZXNvdXJjZUdyb3VwKCkgewo+IH0KPiAKPiAJCj4gdm9pZCBLUFRSZXNvdXJjZUdyb3Vw
OjpzZXROYW1lKFFTdHJpbmcpIHsKPiB9Cj4gCj4gUVN0cmluZyAmS1BUUmVzb3VyY2VHcm91cDo6
bmFtZSgpIHsKPiB9Cj4gCQo+IAkKPiB2b2lkIEtQVFJlc291cmNlR3JvdXA6OmFkZFJlc291cmNl
KEtQVFJlc291cmNlKiwgS1BUUmlzayopIHsKPiB9Cj4gCj4gS1BUUmVzb3VyY2UqIEtQVFJlc291
cmNlR3JvdXA6OmdldFJlc291cmNlKGludCkgewo+IH0KPiAKPiBLUFRSaXNrKiBLUFRSZXNvdXJj
ZUdyb3VwOjpnZXRSaXNrKGludCkgewo+IH0KPiAKPiB2b2lkIEtQVFJlc291cmNlR3JvdXA6OnJl
bW92ZVJlc291cmNlKGludCkgewo+IH0KPiAJCj4gdm9pZCBLUFRSZXNvdXJjZUdyb3VwOjphZGRS
ZXF1aXJlZFJlc291cmNlKEtQVFJlc291cmNlR3JvdXAqKSB7Cj4gfQo+IAo+IEtQVFJlc291cmNl
R3JvdXAqIEtQVFJlc291cmNlR3JvdXA6OmdldFJlcXVpcmVkUmVzb3VyY2UoaW50KSB7Cj4gfQo+
IAo+IHZvaWQgS1BUUmVzb3VyY2VHcm91cDo6cmVtb3ZlUmVxdWlyZWRSZXNvdXJjZShpbnQpIHsK
PiB9Cj4gCkluZGV4OiBrcHR0YXNrLmNjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9r
b2ZmaWNlL2twbGF0by9rcHR0YXNrLmNjLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjQKZGlmZiAt
cjEuNCBrcHR0YXNrLmNjCjQ1YzQ1Cjwgdm9pZCBLUFRUYXNrOjphZGRSZXNvdXJjZSggS1BUUmVz
b3VyY2UgKnJlc291cmNlICkgewotLS0KPiB2b2lkIEtQVFRhc2s6OmFkZFJlc291cmNlKCBLUFRS
ZXNvdXJjZUdyb3VwICpyZXNvdXJjZSApIHsKNDhjNDgKPCB2b2lkIEtQVFRhc2s6OnJlbW92ZVJl
c291cmNlKCBLUFRSZXNvdXJjZSAqcmVzb3VyY2UgKXsKLS0tCj4gdm9pZCBLUFRUYXNrOjpyZW1v
dmVSZXNvdXJjZSggS1BUUmVzb3VyY2VHcm91cCAqcmVzb3VyY2UgKXsKNTZjNTYKPCB2b2lkIEtQ
VFRhc2s6Omluc2VydFJlc291cmNlKCB1bnNpZ25lZCBpbnQgaW5kZXgsIEtQVFJlc291cmNlICpy
ZXNvdXJjZSApIHsKLS0tCj4gdm9pZCBLUFRUYXNrOjppbnNlcnRSZXNvdXJjZSggdW5zaWduZWQg
aW50IGluZGV4LCBLUFRSZXNvdXJjZUdyb3VwICpyZXNvdXJjZSApIHsKNTdhNTgsNjYKPiAKPiBL
UFRFZmZvcnQ6OktQVEVmZm9ydCggUURhdGVUaW1lIGUsIFFEYXRlVGltZSBwLCBRRGF0ZVRpbWUg
bykgewo+ICAgbV9leHBlY3RlZER1cmF0aW9uID0gZTsKPiAgIG1fcGVzc2ltaXN0aWNEdXJhdGlv
biA9IHA7Cj4gICBtX29wdGltaXN0aWNEdXJhdGlvbiA9IG87Cj4gfQo+IAo+IEtQVEVmZm9ydDo6
fktQVEVmZm9ydCgpIHsKPiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpJbmRleDogbWFp
bi5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvaG9tZS9rZGUva29mZmljZS9rcGxhdG8vbWFpbi5j
Yyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yCmRpZmYgLXIxLjIgbWFpbi5jYwozOGEzOQo+ICAg
ICAvLyBFZmZvcnQgaW5pdGlhbGl6ZWQgaW4gb25lIGxpbmUKNDBjNDEKPCAgICAgdGEtPnNldEV4
cGVjdGVkRHVyYXRpb24obmV3IFFEYXRlVGltZSgqKG5ldyBRRGF0ZSgxLDAsMCkpLCAqKG5ldyBR
VGltZSgyLDAsMCkpKSk7Ci0tLQo+ICAgICB0YS0+YWRkRWZmb3J0KCBuZXcgS1BURWZmb3J0KFFE
YXRlVGltZSgqKG5ldyBRRGF0ZSgxLDAsMCkpLCAqKG5ldyBRVGltZSgyLDAsMCkpKSkpOwo0NGE0
Ngo+ICAgICAvLyBlZmZvcnQgaW5pdGlhbGl6ZWQgdGhlIGVhc3kgdG8gcmVhZCB3YXkKNDZjNDgs
NDkKPCAgICAgdGEtPnNldEV4cGVjdGVkRHVyYXRpb24obmV3IFFEYXRlVGltZSgqKG5ldyBRRGF0
ZSgxLDAsMCkpLCooIG5ldyBRVGltZSgxLDAsMCkpKSk7Ci0tLQo+ICAgICB0YTEtPmFkZEVmZm9y
dChuZXcgS1BURWZmb3J0KTsKPiAgICAgdGExLT5lZmZvcnQoKS0+ZXhwZWN0ZWQoKSA9IFFEYXRl
VGltZSgqKG5ldyBRRGF0ZSgxLDAsMCkpLCooIG5ldyBRVGltZSgxLDAsMCkpKTsKNjJjNjUKPCAg
ICAga2REZWJ1ZygpIDw8ICJUb3RhbCBydW5uaW5nIHRpbWU6ICIgPDwgcC0+ZXhwZWN0ZWREdXJh
dGlvbigpIDw8IGVuZGw7Ci0tLQo+ICAgICBrZERlYnVnKCkgPDwgIlRvdGFsIHJ1bm5pbmcgdGlt
ZTogIiA8PCBwLT5nZXRFeHBlY3RlZER1cmF0aW9uKCkgPDwgZW5kbDsKSW5kZXg6IGtwdG1pbGVz
dG9uZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9rb2ZmaWNlL2twbGF0by9rcHRt
aWxlc3RvbmUuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS40CmRpZmYgLXIxLjQga3B0bWlsZXN0
b25lLmgKMjdjMjcKPCBjbGFzcyBLUFRSZXNvdXJjZTsKLS0tCj4gY2xhc3MgS1BUUmVzb3VyY2VH
cm91cDsKNDFjNDEsNDIKPCAgICAgICAgIHZvaWQgYWRkUmVzb3VyY2UoIEtQVFJlc291cmNlICop
IHt9Ci0tLQo+ICAgICAgICAgdm9pZCBhZGRSZXNvdXJjZSggS1BUUmVzb3VyY2VHcm91cCAqKSB7
fQo+ICAgICAgICAgdm9pZCBpbnNlcnRSZXNvdXJjZSggS1BUUmVzb3VyY2VHcm91cCAqKSB7fQo0
M2M0NCw1MAo8ICAgICAgICAgdm9pZCBpbnNlcnRSaXNrKCB1bnNpZ25lZCBpbnQsIEtQVFJpc2sg
Kikge30KLS0tCj4gCj4gICAgICAgICAvLyBObyBjaGlsZCB0aW1lIGRlcGVuZGVuY2llcyBwZXJt
aXR0ZWQKPiAKPiAgICAgICAgIHZvaWQgYWRkRGVwZW5kQ2hpbGROb2RlKCBLUFROb2RlKiwgVGlt
aW5nVHlwZSwgVGltaW5nUmVsYXRpb24pIHt9Cj4gICAgICAgICB2b2lkIGFkZERlcGVuZENoaWxk
Tm9kZSggS1BUTm9kZSosIFRpbWluZ1JlbGF0aW9uLCBRRGF0ZVRpbWUpIHt9Cj4gICAgICAgICB2
b2lkIGluc2VydERlcGVuZENoaWxkTm9kZSggdW5zaWduZWQgaW50LCBLUFROb2RlKiwgVGltaW5n
VHlwZSwgVGltaW5nUmVsYXRpb24pIHt9Cj4gCkluZGV4OiBrcHRub2RlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpS
Q1MgZmlsZTogL2hvbWUva2RlL2tvZmZpY2Uva3BsYXRvL2twdG5vZGUuaCx2CnJldHJpZXZpbmcg
cmV2aXNpb24gMS42CmRpZmYgLXIxLjYga3B0bm9kZS5oCjI5YzI5CjwgY2xhc3MgS1BUUmlzazsK
LS0tCj4gY2xhc3MgS1BURWZmb3J0Owo1Myw2NWQ1Mgo8ICAgICAgICAgLy8gRGVwZW5kZW5jeSBt
YW5hZ2VtZW50LiAgQWxsIHR5cGVzIG9mIHRhc2tzIG5vZGVzIGNhbiBoYXZlIGRlcGVuZGVuY2ll
cwo8ICAgICAgICAgLy8gYXMgbG9uZyBhcyB0aGV5IGhhdmUgbm8gY2hpbGQgbm9kZXMKPCAKPCAg
ICAgICAgIHZpcnR1YWwgS1BUUmVsYXRpb246OlJlc3VsdCBhZGREZXBlbmROb2RlKCBLUFROb2Rl
KiwgVGltaW5nVHlwZSwgVGltaW5nUmVsYXRpb24pOwo8ICAgICAgICAgdmlydHVhbCBLUFRSZWxh
dGlvbjo6UmVzdWx0IGluc2VydERlcGVuZE5vZGUoIHVuc2lnbmVkIGludCwgS1BUTm9kZSAqLCBU
aW1pbmdUeXBlLCBUaW1pbmdSZWxhdGlvbik7CjwgCjwgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVt
b3ZlRGVwZW5kTm9kZSggS1BUTm9kZSogbm9kZSk7CjwgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVt
b3ZlRGVwZW5kTm9kZSggdW5zaWduZWQgaW50IGluZGV4KTsKPCAKPCAKPCAgICAgICAgIEtQVFJp
c2sgKnJpc2soKTsKPCAgICAgICAgIHZvaWQgc2V0UmlzayhLUFRSaXNrICpyaXNrKTsKPCAKMTAw
LDEwNWM4Nyw5MAo8ICAgICAgICAgdm9pZCBzZXRPcHRpbWlzdGljRHVyYXRpb24oUURhdGVUaW1l
ICpvZCkge21fb3B0aW1pc3RpY0R1cmF0aW9uID0gb2Q7IH0KPCAgICAgICAgIFFEYXRlVGltZSAq
b3B0aW1pc3RpY0R1cmF0aW9uKCkgeyByZXR1cm4gbV9vcHRpbWlzdGljRHVyYXRpb247IH0KPCAg
ICAgICAgIHZvaWQgc2V0UGVzc2VtaXN0aWNEdXJhdGlvbihRRGF0ZVRpbWUgKnBkKSB7bV9wZXNz
ZW1pc3RpY0R1cmF0aW9uID0gcGQ7IH0KPCAgICAgICAgIFFEYXRlVGltZSAqcGVzc2VtaXN0aWNE
dXJhdGlvbigpIHsgcmV0dXJuIG1fcGVzc2VtaXN0aWNEdXJhdGlvbjsgfQo8ICAgICAgICAgdm9p
ZCBzZXRFeHBlY3RlZER1cmF0aW9uKFFEYXRlVGltZSAqZWQpIHsgbV9leHBlY3RlZER1cmF0aW9u
PWVkOyB9CjwgICAgICAgICBRRGF0ZVRpbWUgKmV4cGVjdGVkRHVyYXRpb24oKSB7IHJldHVybiBt
X2V4cGVjdGVkRHVyYXRpb247IH0KLS0tCj4gCj4gCj4gICAgICAgICB2b2lkIGFkZEVmZm9ydChL
UFRFZmZvcnQqIGUpIHsgbV9lZmZvcnQgPSBlOyB9Cj4gICAgICAgICBLUFRFZmZvcnQqIGVmZm9y
dCgpIHsgcmV0dXJuIG1fZWZmb3J0OyB9CjE0NiwxNDdjMTMxCjwgICAgICAgICBRRGF0ZVRpbWUg
Km1fb3B0aW1pc3RpY0R1cmF0aW9uLCAqbV9wZXNzZW1pc3RpY0R1cmF0aW9uLCAqbV9leHBlY3Rl
ZER1cmF0aW9uOwo8ICAgICAgICAgS1BUUmlzayAqbV9yaXNrOwotLS0KPiAgICAgICAgIEtQVEVm
Zm9ydCogbV9lZmZvcnQ7CjE0OGExMzMsMTQ5Cj4gCj4gY2xhc3MgS1BURWZmb3J0IHsKPiAKPiAg
ICAgcHVibGljOgo+ICAgICAgICAgS1BURWZmb3J0ICggUURhdGVUaW1lIGUgPSBRRGF0ZVRpbWUo
KSwgUURhdGVUaW1lIHAgPSBRRGF0ZVRpbWUoKSwgUURhdGVUaW1lIG8gPSBRRGF0ZVRpbWUoKSAp
Owo+ICAgICAgICAgfktQVEVmZm9ydCgpOwo+IAo+ICAgICAgICAgUURhdGVUaW1lJiBvcHRpbWlz
dGljKCkge3JldHVybiBtX29wdGltaXN0aWNEdXJhdGlvbjt9Cj4gICAgICAgICBRRGF0ZVRpbWUm
IHBlc3NpbWlzdGljKCkge3JldHVybiBtX3Blc3NpbWlzdGljRHVyYXRpb247fQo+ICAgICAgICAg
UURhdGVUaW1lJiBleHBlY3RlZCgpIHtyZXR1cm4gbV9leHBlY3RlZER1cmF0aW9uO30KPiAKPiAg
ICAgcHJpdmF0ZToKPiAgICAgICAgUURhdGVUaW1lIG1fb3B0aW1pc3RpY0R1cmF0aW9uOwo+ICAg
ICAgICBRRGF0ZVRpbWUgbV9wZXNzaW1pc3RpY0R1cmF0aW9uOwo+ICAgICAgICBRRGF0ZVRpbWUg
bV9leHBlY3RlZER1cmF0aW9uOwo+IH07Cj4gCkluZGV4OiBrcHRyZXNvdXJjZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9rb2ZmaWNlL2twbGF0by9rcHRyZXNvdXJjZS5oLHYKcmV0
cmlldmluZyByZXZpc2lvbiAxLjMKZGlmZiAtcjEuMyBrcHRyZXNvdXJjZS5oCjI4LDI5ZDI3Cjwg
I2luY2x1ZGUgImtwdG5vZGUuaCIKPCAKMzNhMzIsNzgKPiBjbGFzcyBLUFROb2RlOwo+IGNsYXNz
IEtQVFJlc291cmNlOwo+IAo+IC8qKgo+ICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBncm91
cCBvZiBzaW1pbGFyIHJlc291cmNlcyB0byBiZSBhc3NpZ25lZCB0byBhIHRhc2sKPiAgICogZS5n
LiBUaGUgbGlzdCBvZiBlbXBsb3llZXMsIGNvbXB1dGVyIHJlc291cmNlcywgZXRjCj4gICAqLwo+
IAo+IGNsYXNzIEtQVFJlc291cmNlR3JvdXAgewo+ICAgICBwdWJsaWM6Cj4gCSAgICAgIEtQVFJl
c291cmNlR3JvdXAoKTsKPiAJICAgICAgfktQVFJlc291cmNlR3JvdXAoKTsKPiAJCj4gCSAgICAg
IHZvaWQgc2V0TmFtZShRU3RyaW5nKTsKPiAJICAgICAgUVN0cmluZyAmbmFtZSgpOwo+IAkKPiAJ
ICAgICAgLyoqIE1hbmFnZSB0aGUgcmVzb3VyY2VzIGluIHRoaXMgbGlzdAo+IAkgICAgICAgICog
QXQgc29tZSBwb2ludCB3ZSB3aWxsIGhhdmUgdG8gbG9vayBhdCBub3QgbWl4aW5nIHR5cGVzIG9m
IHJlc291cmNlcwo+IAkgICAgICAgICogKGUuZy4geW91IGNhbid0IGFkZCBhIHBlcnNvbiB0byBh
IGxpc3Qgb2YgY29tcHV0ZXJzCj4gCSAgICAgICAgKgo+IAkgICAgICAgICogUmlza3MgbXVzdCBh
bHdheXMgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UsIHNvIHRoZXJlIGlzIG5vIG9wdGlv
bgo+IAkgICAgICAgICogdG8gbWFuaXB1bGF0ZSByaXNrcyBzZXBlcmF0ZWx5Cj4gCSAgICAgICAg
Ki8KPiAJCj4gCSAgICAgIHZvaWQgYWRkUmVzb3VyY2UoS1BUUmVzb3VyY2UqLCBLUFRSaXNrKik7
Cj4gICAgICAgICB2b2lkIGluc2VydFJlc291cmNlKCB1bnNpZ25lZCBpbnQgaW5kZXgsIEtQVFJl
c291cmNlICpyZXNvdXJjZSApOwo+ICAgICAgICAgdm9pZCByZW1vdmVSZXNvdXJjZSggS1BUUmVz
b3VyY2UgKnJlc291cmNlICk7Cj4gCSAgICAgIHZvaWQgcmVtb3ZlUmVzb3VyY2UoaW50KTsKPiAK
PiAJICAgICAgS1BUUmVzb3VyY2UqIGdldFJlc291cmNlKGludCk7Cj4gCSAgICAgIEtQVFJpc2sq
IGdldFJpc2soaW50KTsKPiAgCQo+IAkgICAgICAvKiogTWFuYWdlIHRoZSBkZXBlbmRlbnQgcmVz
b3VyY2VzLiAgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHJlc291cmNlCj4gCSAgICAgICAgKiBncm91
cHMgdGhhdCBtdXN0IGhhdmUgYXZhaWxhYmxlIHJlc291cmNlcyBmb3IgdGhpcyByZXNvdXJjZSB0
bwo+IAkgICAgICAgICogcGVyZm9ybSB0aGUgd29yawo+IAkgICAgICAgICovCj4gCQo+IAkgICAg
ICB2b2lkIGFkZFJlcXVpcmVkUmVzb3VyY2UoS1BUUmVzb3VyY2VHcm91cCopOwo+IAkgICAgICBL
UFRSZXNvdXJjZUdyb3VwKiBnZXRSZXF1aXJlZFJlc291cmNlKGludCk7Cj4gCSAgICAgIHZvaWQg
cmVtb3ZlUmVxdWlyZWRSZXNvdXJjZShpbnQpOwo+IAkKPiAgICAgcHJpdmF0ZToKPiAgICAgICAg
IFFTdHJpbmcgbV9uYW1lOwo+ICAgICAgICAgUUxpc3Q8S1BUUmVzb3VyY2U+IG1fcmVzb3VyY2Vz
Owo+ICAgICAgICAgUUxpc3Q8S1BUUmlzaz4gbV9yaXNrczsKPiAgICAgICAgIFFMaXN0PEtQVFJl
c291cmNlR3JvdXA+IG1fcmVxdWlyZXM7Cj4gfTsKMzVjODAKPCBjbGFzcyBLUFRSZXNvdXJjZSA6
IHB1YmxpYyBLUFROb2RlIHsKLS0tCj4gY2xhc3MgS1BUUmVzb3VyY2UgewpJbmRleDoga3B0dGFz
ay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9rb2ZmaWNlL2twbGF0by9rcHR0YXNr
LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMwpkaWZmIC1yMS4zIGtwdHRhc2suaAo2Myw2NmM2
Myw2Ngo8ICAgICAgICAgY29uc3QgUUxpc3Q8S1BUUmVzb3VyY2U+ICZyZXNvdXJjZUl0ZXJhdG9y
KCkgY29uc3QgeyByZXR1cm4gbV9yZXNvdXJjZTsgfQo8ICAgICAgICAgdmlydHVhbCB2b2lkIGFk
ZFJlc291cmNlKCBLUFRSZXNvdXJjZSAqcmVzb3VyY2UgKTsKPCAgICAgICAgIHZpcnR1YWwgdm9p
ZCBpbnNlcnRSZXNvdXJjZSggdW5zaWduZWQgaW50IGluZGV4LCBLUFRSZXNvdXJjZSAqcmVzb3Vy
Y2UgKTsKPCAgICAgICAgIHZvaWQgcmVtb3ZlUmVzb3VyY2UoIEtQVFJlc291cmNlICpyZXNvdXJj
ZSApOwotLS0KPiAgICAgICAgIGNvbnN0IFFMaXN0PEtQVFJlc291cmNlR3JvdXA+ICZyZXNvdXJj
ZUl0ZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gbV9yZXNvdXJjZTsgfQo+ICAgICAgICAgdmlydHVh
bCB2b2lkIGFkZFJlc291cmNlKCBLUFRSZXNvdXJjZUdyb3VwICpyZXNvdXJjZSApOwo+ICAgICAg
ICAgdmlydHVhbCB2b2lkIGluc2VydFJlc291cmNlKCB1bnNpZ25lZCBpbnQgaW5kZXgsIEtQVFJl
c291cmNlR3JvdXAgKnJlc291cmNlICk7Cj4gICAgICAgICB2b2lkIHJlbW92ZVJlc291cmNlKCBL
UFRSZXNvdXJjZUdyb3VwICpyZXNvdXJjZSApOwo3MmM3Mgo8ICAgICAgICAgUUxpc3Q8S1BUUmVz
b3VyY2U+IG1fcmVzb3VyY2U7Ci0tLQo+ICAgICAgICAgUUxpc3Q8S1BUUmVzb3VyY2VHcm91cD4g
bV9yZXNvdXJjZTsK

--------------Boundary-00=_XIY0UY1R9ROAUPXOIW94--