[Zope] ZClasses and non-ZMI interface (was: how to add a ZClass instance from Python)
Luca Manini
manini@flashnet.it
Sun, 31 Mar 2002 18:14:41 +0200
--+y7mEigI9R
Content-Type: text/plain; charset=us-ascii
Content-Description: message body text
Content-Transfer-Encoding: 7bit
I'm trying to get a basic undestanding of the various techniques
available in Zope to create a very common kind of application:
something where you have one (or more) classe that implement your
"business domain data and logic" and you want a GUI to
create/edit/list/delete instances of those classes.
For any part of the job there are many different ways to do the needed
thing and I would like to explore at least some of them in a
as-simple-as-possible example. For each approach I would like not only
to find "a" solution, but I want to find out how to write it in a way
that allows it to be changed with another one without hurting too much
the rest of the app. For example to go from plain ZClasses in Folder
to Python Products with Specialist without rewriting the interface
(presentation) stuff. I think Zope has the needed "flexibility" but,
still, one has to find out how to take advantage of it.
When I say "application's parts" and "different ways to do things" I
mean:
For the back-end:
1) pure ZClasses (everything done via ZMI),
2) ZClasses based on external Python classes,
3) pure Python ZClasses.
For the storage:
1) instances added to "plain" Folders and "saved" in ZODB,
2) database backend (with hand-made SQL methods),
3) ZPatterns (with Specialists, Data-Skins and Racks).
For the interface:
1) the ZMI and the automagically (for ZClasses) created stuff,
2) something you roll yourself.
And finally (at least for the HTML/Web newbie, like me) you have to
survive the various "technical" ways to set up the interface:
1) to frame or not to frame,
2) to javascript or not,
3) use links (<a heref...>) or buttons,
4) how to substitute for the missing "modal" windows (that is how to
jump to another page and come back home).
The ZopeBook examples, other "known" examples like Poll, ZPatterns
examples (Attendance and Lunch) do show different ways to do different
things (also with different "style" depending on the writer) but they
do not (seems to me) explain the "why" and the "how else".
I would like to make one thing in many ways, understanding (and
commenting) the pros and cons. I will surely ask for help on the list,
so I hope I'll be able to give back some "zexp" or some "how-to".
If you are still reading, here comes some initial stuff!
See attaches for:
- zexp's of the Product (import in Control_Panel/Products),
- zexp of the example (import wherever you want),
- kind of how-to for both (for your eyes only).
I'll wait for feed-back (i.e. interest) before sending more stuff
to the list (sorry no personal web-site yet for that).
bye, Luca.
--+y7mEigI9R
Content-Type: application/octet-stream
Content-Description: Product
Content-Disposition: attachment;
filename="PhoneBook.zexp"
Content-Transfer-Encoding: base64
WkVYUAAAAAAAADD6AAAAAAAAATooKFULQXBwLlByb2R1Y3RxAVUHUHJvZHVjdHECdHEDTnQufXEE
KFUFdGl0bGVxBVUAVRJfX2FjX2xvY2FsX3JvbGVzX19xBn1xB1UEbHVrZXEIXXEJVQVPd25lcnEK
YXNVAmlkcQtVCVBob25lQm9va3EMVQRIZWxwcQ0oVQgAAAAAAAAw+3EOKFUPSGVscFN5cy5IZWxw
U3lzcQ9VC1Byb2R1Y3RIZWxwcRB0dFFVBlBlcnNvbnERKFUIAAAAAAAAMRJxEihVD1pDbGFzc2Vz
LlpDbGFzc3ETVQZaQ2xhc3NxFHR0UVUIX29iamVjdHNxFSh9cRYoVQltZXRhX3R5cGVxF1UMUHJv
ZHVjdCBIZWxwcRhoC2gNdX1xGShoF1UHWiBDbGFzc3EaaAtVBlBlcnNvbnEbdXR1LgAAAAAAADD7
AAAAAAAAAJooKFUPSGVscFN5cy5IZWxwU3lzcQFVC1Byb2R1Y3RIZWxwcQJ0cQNOdC59cQQoVQV0
aXRsZXEFVQlQaG9uZUJvb2txBlUHY2F0YWxvZ3EHKFUIAAAAAAAAMPxxCChVGlByb2R1Y3RzLlpD
YXRhbG9nLlpDYXRhbG9ncQlVCFpDYXRhbG9ncQp0dFFVAmlkcQtVBEhlbHBxDHUuAAAAAAAAMRIA
AAAAAAABBCgoVQ9aQ2xhc3Nlcy5aQ2xhc3NxAVUGWkNsYXNzcQJ0cQNOdC59cQQoVRxfemNsYXNz
X3Byb3BlcnR5c2hlZXRzX2NsYXNzcQVVCAAAAAAAADETcQZRVQJpZHEHVQZQZXJzb25xCFUHX3pi
YXNlc3EJXXEKY1pDbGFzc2VzLlpDbGFzcwpaT2JqZWN0CnELYVUSX19hY19sb2NhbF9yb2xlc19f
cQx9cQ1VBGx1a2VxDl1xD1UFT3duZXJxEGFzVQhfemNsYXNzX3ERVQgAAAAAAAAxFHESUVUFdGl0
bGVxE1UAVQ5wcm9wZXJ0eXNoZWV0c3EUVQgAAAAAAAAxFXEVUXUuAAAAAAAAMPwAAAAAAAABLCgo
VRpQcm9kdWN0cy5aQ2F0YWxvZy5aQ2F0YWxvZ3EBVQhaQ2F0YWxvZ3ECdHEDTnQufXEEKFUCaWRx
BVUHY2F0YWxvZ3EGVQhfb2JqZWN0c3EHKH1xCChVCW1ldGFfdHlwZXEJVQpWb2NhYnVsYXJ5cQpo
BWgKdXRxC1UJdGhyZXNob2xkcQxNECdVCHZvY2FiX2lkcQ1oCmgKKFUIAAAAAAAAMP1xDihVHFBy
b2R1Y3RzLlpDYXRhbG9nLlZvY2FidWxhcnlxD1UKVm9jYWJ1bGFyeXEQdHRRVQhfY2F0YWxvZ3ER
KFUIAAAAAAAAMP5xEihVGVByb2R1Y3RzLlpDYXRhbG9nLkNhdGFsb2dxE1UHQ2F0YWxvZ3EUdHRR
VQV0aXRsZXEVVQB1LgAAAAAAADETAAAAAAAAAXkoY0V4dGVuc2lvbkNsYXNzCkV4dGVuc2lvbkNs
YXNzCnEBKFUaUGVyc29uX1Byb3BlcnR5U2hlZXRzQ2xhc3NxAihjWkNsYXNzZXMuWkNsYXNzClBl
cnNpc3RlbnRDbGFzcwpxA2NaQ2xhc3Nlcy5Qcm9wZXJ0eQpaSW5zdGFuY2VTaGVldHMKcQR0cQV9
cQYoVQRpY29ucQdVAFUKX3BfY2hhbmdlZHEISwFVB19fZG9jX19xCVUWUGVyc29uIFByb3BlcnR5
IFNoZWV0c3EKVRFfX3Byb3BzZXRfYXR0cnNfX3ELKFUFYmFzaWNxDHRxDVUFYmFzaWNxDihVCAAA
AAAAADEtcQ8oVRFaQ2xhc3Nlcy5Qcm9wZXJ0eXEQVQ5aSW5zdGFuY2VTaGVldHERdHRRVQZfcF9v
aWRxElUIAAAAAAAAMRNxE1UKX19tb2R1bGVfX3EUTlUJX3Bfc2VyaWFscRVVCANDuZL2tiqAcRZ1
dHEXdC5OLgAAAAAAADEUAAAAAAAAAr4oY0V4dGVuc2lvbkNsYXNzCkV4dGVuc2lvbkNsYXNzCnEB
KFUGUGVyc29ucQIoY1pDbGFzc2VzLlpDbGFzcwpQZXJzaXN0ZW50Q2xhc3MKcQNjT0ZTLlNpbXBs
ZUl0ZW0KU2ltcGxlSXRlbQpxBHRxBX1xBihVBGljb25xB1UAVQpfcF9jaGFuZ2VkcQhLAVUHX19k
b2NfX3EJVQZQZXJzb25xClUGX3Bfb2lkcQtVCAAAAAAAADEUcQxVCW1ldGFfdHlwZXENVQZQZXJz
b25xDlUOcHJvcGVydHlzaGVldHNxD1UIAAAAAAAAMRlxEFFVBXBob25lcRFVAzU1NXESVQ5tYW5h
Z2Vfb3B0aW9uc3ETKH1xFChVBWxhYmVscRVVBFVuZG9xFlUEaGVscHEXKFUET0ZTUHEYVQhVbmRv
LnN0eHEZdFUGYWN0aW9ucRpVD21hbmFnZV9VbmRvRm9ybXEbdX1xHChoFVUJT3duZXJzaGlwcR1o
FyhoGFUNT3duZXJzaGlwLnN0eHEedGgaVQxtYW5hZ2Vfb3duZXJxH1UGZmlsdGVycSBjQWNjZXNz
Q29udHJvbC5Pd25lZApvd25hYmxlRmlsdGVyCnEhdX1xIihoFVUIU2VjdXJpdHlxI2gXKGgYVQxT
ZWN1cml0eS5zdHhxJHRoGlUNbWFuYWdlX2FjY2Vzc3EldXRxJlUSX19hY19wZXJtaXNzaW9uc19f
cScpVQRuYW1lcShVA2JhcnEpVQlfcF9zZXJpYWxxKlUIA0O5t1JJHypxK1UKX19tb2R1bGVfX3Es
VRkqaTVRTUJYdkx5SW5jYkF1bkxzU3Mwdz09cS1VDm5hbWVfYW5kX3Bob25lcS4oVQgAAAAAAAAx
SnEvKFUPWkNsYXNzZXMuTWV0aG9kcTBVA01XcHExdHRRdXRxMnQuTi4AAAAAAAAxFQAAAAAAAACk
KFUIAAAAAAAAMRZxAVFOdC59cQIoVQZjb21tb25xAyhVCAAAAAAAADEXcQQoVRFaQ2xhc3Nlcy5Q
cm9wZXJ0eXEFVRRaSW5zdGFuY2VTaGVldHNTaGVldHEGdHRRVQdtZXRob2RzcQcoVQgAAAAAAAAx
GHEIKFUPWkNsYXNzZXMuTWV0aG9kcQlVElpDbGFzc01ldGhvZHNTaGVldHEKdHRRdS4AAAAAAAAw
/QAAAAAAAADmKChVHFByb2R1Y3RzLlpDYXRhbG9nLlZvY2FidWxhcnlxAVUKVm9jYWJ1bGFyeXEC
dHEDTnQufXEEKFUFdGl0bGVxBVUKVm9jYWJ1bGFyeXEGVQJpZHEHaAZVEl9fYWNfbG9jYWxfcm9s
ZXNfX3EIfXEJVQRsdWtlcQpdcQtVBU93bmVycQxhc1UHbGV4aWNvbnENKFUIAAAAAAAAMQ5xDihV
G1NlYXJjaEluZGV4Lkdsb2JiaW5nTGV4aWNvbnEPVQ9HbG9iYmluZ0xleGljb25xEHR0UVUIZ2xv
YmJpbmdxEUsBdS4AAAAAAAAw/gAAAAAAAAJJKChVGVByb2R1Y3RzLlpDYXRhbG9nLkNhdGFsb2dx
AVUHQ2F0YWxvZ3ECdHEDTnQufXEEKFUGc2NoZW1hcQV9cQYoVQtwZXJtaXNzaW9uc3EHSwFVCmNh
dGVnb3JpZXNxCEsAVQt0aXRsZV9vcl9pZHEJSwJVAmlkcQpLBFUDdXJscQtLA3VVB19fbGVuX19x
DChVCAAAAAAAADD/cQ0oVQ1CVHJlZXMuTGVuZ3RocQ5VBkxlbmd0aHEPdHRRVQRkYXRhcRAoVQgA
AAAAAAAxAHERKFUOQlRyZWVzLklPQlRyZWVxElUHSU9CVHJlZXETdHRRVQVuYW1lc3EUKGgIaAdo
CWgLaAp0cRVVB2luZGV4ZXNxFn1xFyhVDlNlYXJjaGFibGVUZXh0cRgoVQgAAAAAAAAxAXEZKFUX
U2VhcmNoSW5kZXguVW5UZXh0SW5kZXhxGlULVW5UZXh0SW5kZXhxG3R0UWgIKFUIAAAAAAAAMQJx
HChVGlNlYXJjaEluZGV4LlVuS2V5d29yZEluZGV4cR1VDlVuS2V5d29yZEluZGV4cR50dFFoByhV
CAAAAAAAADEDcR8oaB1VDlVuS2V5d29yZEluZGV4cSB0dFF1VQR1aWRzcSEoVQgAAAAAAAAxBHEi
KFUOQlRyZWVzLk9JQlRyZWVxI1UHT0lCVHJlZXEkdHRRVQdsZXhpY29ucSVVClZvY2FidWxhcnlx
JlUFcGF0aHNxJyhVCAAAAAAAADEFcSgoaBJVB0lPQlRyZWVxKXR0UXUuAAAAAAAAMS0AAAAAAAAA
eigoVRFaQ2xhc3Nlcy5Qcm9wZXJ0eXEBVQ5aSW5zdGFuY2VTaGVldHECdHEDTnQufXEEKFUDX21k
cQV9cQZVBV9iYXNlcQcoVQgAAAAAAAAxLHEIKGgBVQxaQ29tbW9uU2hlZXRxCXR0UVUCaWRxClUF
YmFzaWNxC3UuAAAAAAAAMRkAAAAAAAAAFShVCAAAAAAAADETcQFRTnQufXECLgAAAAAAADFKAAAA
AAAAAGsoKFUPWkNsYXNzZXMuTWV0aG9kcQFVA01XcHECdHEDTnQuKFUIAAAAAAAAMUtxBChVI1By
b2R1Y3RzLlB5dGhvblNjcmlwdHMuUHl0aG9uU2NyaXB0cQVVDFB5dGhvblNjcmlwdHEGdHRRLgAA
AAAAADEWAAAAAAAAAS8oY0V4dGVuc2lvbkNsYXNzCkV4dGVuc2lvbkNsYXNzCnEBKFUbUGVyc29u
X1pQcm9wZXJ0eVNoZWV0c0NsYXNzcQIoY1pDbGFzc2VzLlpDbGFzcwpQZXJzaXN0ZW50Q2xhc3MK
cQNjWkNsYXNzZXMuWkNsYXNzClpDbGFzc1NoZWV0cwpxBGNBcHAuUGVyc2lzdGVudEV4dHJhClBl
cnNpc3RlbnQKcQV0cQZ9cQcoVQRpY29ucQhVAFUKX3BfY2hhbmdlZHEJSwBVB19fZG9jX19xClUb
UGVyc29uX1pQcm9wZXJ0eVNoZWV0c0NsYXNzcQtVBl9wX29pZHEMVQgAAAAAAAAxFnENVQltZXRh
X3R5cGVxDmgLVQpfX21vZHVsZV9fcQ9OdXRxEHQuTi4AAAAAAAAxFwAAAAAAAAC4KChVEVpDbGFz
c2VzLlByb3BlcnR5cQFVFFpJbnN0YW5jZVNoZWV0c1NoZWV0cQJ0cQNOdC59cQQoVQViYXNpY3EF
KFUIAAAAAAAAMSxxBihoAVUMWkNvbW1vblNoZWV0cQd0dFFVCF9vYmplY3RzcQgofXEJKFUJbWV0
YV90eXBlcQpVHkNvbW1vbiBJbnN0YW5jZSBQcm9wZXJ0eSBTaGVldHELVQJpZHEMVQViYXNpY3EN
dXR1LgAAAAAAADEYAAAAAAAAAJ4oKFUPWkNsYXNzZXMuTWV0aG9kcQFVElpDbGFzc01ldGhvZHNT
aGVldHECdHEDTnQufXEEKFUDX21kcQV9cQZVCF9vYmplY3RzcQcofXEIKFUJbWV0YV90eXBlcQlV
D1NjcmlwdCAoUHl0aG9uKXEKVQJpZHELVQ9uYW1lX2FuZF9waG9uZSBxDHV0VQJpZHENVQdtZXRo
b2RzcQ51LgAAAAAAADEOAAAAAAAAAPEoKFUbU2VhcmNoSW5kZXguR2xvYmJpbmdMZXhpY29ucQFV
D0dsb2JiaW5nTGV4aWNvbnECdHEDTnQufXEEKFULX2ludmVyc2VMZXhxBShVCAAAAAAAADEPcQYo
VQ5CVHJlZXMuSU9CVHJlZXEHVQdJT0JUcmVlcQh0dFFVCF9kaWdyYW1zcQkoVQgAAAAAAAAxEHEK
KFUOQlRyZWVzLk9PQlRyZWVxC1UHT09CVHJlZXEMdHRRVQhfbGV4aWNvbnENKFUIAAAAAAAAMRFx
DihVDkJUcmVlcy5PSUJUcmVlcQ9VB09JQlRyZWVxEHR0UXUuAAAAAAAAMP8AAAAAAAAAJigoVQ1C
VHJlZXMuTGVuZ3RocQFVBkxlbmd0aHECdHEDTnQuSwAuAAAAAAAAMQAAAAAAAAAAJygoVQ5CVHJl
ZXMuSU9CVHJlZXEBVQdJT0JUcmVlcQJ0cQNOdC5OLgAAAAAAADEBAAAAAAAAASAoKFUXU2VhcmNo
SW5kZXguVW5UZXh0SW5kZXhxAVULVW5UZXh0SW5kZXhxAnRxA050Ln1xBChVCWlnbm9yZV9leHEF
TlUCaWRxBlUOU2VhcmNoYWJsZVRleHRxB1UGX2luZGV4cQgoVQgAAAAAAAAxDHEJKFUOQlRyZWVz
LklPQlRyZWVxClUHSU9CVHJlZXELdHRRVQhfdW5pbmRleHEMKFUIAAAAAAAAMQ1xDShoClUHSU9C
VHJlZXEOdHRRVQhfbGV4aWNvbnEPKFUIAAAAAAAAMQ5xEChVG1NlYXJjaEluZGV4Lkdsb2JiaW5n
TGV4aWNvbnERVQ9HbG9iYmluZ0xleGljb25xEnR0UVUMY2FsbF9tZXRob2RzcRNOdS4AAAAAAAAx
AgAAAAAAAAEaKChVGlNlYXJjaEluZGV4LlVuS2V5d29yZEluZGV4cQFVDlVuS2V5d29yZEluZGV4
cQJ0cQNOdC59cQQoVQlpZ25vcmVfZXhxBU5VB19fbGVuX19xBihVCAAAAAAAADEJcQcoVQ1CVHJl
ZXMuTGVuZ3RocQhVBkxlbmd0aHEJdHRRVQJpZHEKVQpjYXRlZ29yaWVzcQtVBl9pbmRleHEMKFUI
AAAAAAAAMQpxDShVDkJUcmVlcy5PT0JUcmVlcQ5VB09PQlRyZWVxD3R0UVUIX3VuaW5kZXhxEChV
CAAAAAAAADELcREoVQ5CVHJlZXMuSU9CVHJlZXESVQdJT0JUcmVlcRN0dFFVDGNhbGxfbWV0aG9k
c3EUTnUuAAAAAAAAMQMAAAAAAAABGygoVRpTZWFyY2hJbmRleC5VbktleXdvcmRJbmRleHEBVQ5V
bktleXdvcmRJbmRleHECdHEDTnQufXEEKFUJaWdub3JlX2V4cQVOVQdfX2xlbl9fcQYoVQgAAAAA
AAAxBnEHKFUNQlRyZWVzLkxlbmd0aHEIVQZMZW5ndGhxCXR0UVUCaWRxClULcGVybWlzc2lvbnNx
C1UGX2luZGV4cQwoVQgAAAAAAAAxB3ENKFUOQlRyZWVzLk9PQlRyZWVxDlUHT09CVHJlZXEPdHRR
VQhfdW5pbmRleHEQKFUIAAAAAAAAMQhxEShVDkJUcmVlcy5JT0JUcmVlcRJVB0lPQlRyZWVxE3R0
UVUMY2FsbF9tZXRob2RzcRROdS4AAAAAAAAxBAAAAAAAAAAnKChVDkJUcmVlcy5PSUJUcmVlcQFV
B09JQlRyZWVxAnRxA050Lk4uAAAAAAAAMQUAAAAAAAAAJygoVQ5CVHJlZXMuSU9CVHJlZXEBVQdJ
T0JUcmVlcQJ0cQNOdC5OLgAAAAAAADEsAAAAAAAAALUoKFURWkNsYXNzZXMuUHJvcGVydHlxAVUM
WkNvbW1vblNoZWV0cQJ0cQNOdC59cQQoVQV0aXRsZXEFVQBVA19tZHEGfXEHVQJpZHEIVQViYXNp
Y3EJVQtfcHJvcGVydGllc3EKKH1xCyhVBG1ldGFxDH1xDWgIVQRuYW1lcQ5VBHR5cGVxD1UGc3Ry
aW5ncRB1fXERKGgMfXESaAhVBXBob25lcRNoD1UGc3RyaW5ncRR1dHUuAAAAAAAAMUsAAAAAAAAE
vSgoVSNQcm9kdWN0cy5QeXRob25TY3JpcHRzLlB5dGhvblNjcmlwdHEBVQxQeXRob25TY3JpcHRx
AnRxA050Ln1xBChVCWZ1bmNfY29kZXEFKGNTaGFyZWQuREMuU2NyaXB0cy5TaWduYXR1cmUKRnVu
Y0NvZGUKcQZvcQd9cQgoVQtjb192YXJuYW1lc3EJKFUEbmFtZXEKVQVwaG9uZXELVQ0kbG9vcF93
YXRjaGVycQxVCyRyZWFkX2d1YXJkcQ1VDCR3cml0ZV9ndWFyZHEOVQYkZ3VhcmRxD3RVC2NvX2Fy
Z2NvdW50cRBLAHViVQJpZHERVQ5uYW1lX2FuZF9waG9uZXESVRJfX2FjX2xvY2FsX3JvbGVzX19x
E31xFFUEbHVrZXEVXXEWVQVPd25lcnEXYXNVAl90cRgoaBJOKEsASwZLA0sDVad0AwB9AgB8AgCD
AAABdAQAfQMAdAUAfQQAdAYAfQUAfwEAfwIAfAMAdAAAgwEAaQEAZAEAagIAbw0AAX8CAGQCAH0A
AG4TAAF/AwB8AwB0AACDAQBpAQB9AAB/BQB8AwB0AACDAQBpAgBkAQBqAgBvDQABfwUAZAMAfQEA
bhMAAX8GAHwDAHQAAIMBAGkCAH0BAH8IAGQEAHwAAHwBAGYCABZTZAAAU3EZKE5VAFUHbm8gbmFt
ZXEaVQhubyBwaG9uZXEbVQclcyAoJXMpcRx0cR0oVQdjb250ZXh0cR5VBG5hbWVxH1UFcGhvbmVx
IFUNJGxvb3Bfd2F0Y2hlcnEhVQskcmVhZF9ndWFyZHEiVQwkd3JpdGVfZ3VhcmRxI1UGJGd1YXJk
cSR0cSUoaB9oIGghaCJoI2gkdHEmVQ9TY3JpcHQgKFB5dGhvbilxJ2gSSwFVDgMBEwANAQwCEwAN
AQwCcSgpdE59cSl0cSpVBV9ib2R5cStV/2lmIGNvbnRleHQubmFtZSA9PSAiIjogbmFtZSA9ICJu
byBuYW1lIgplbHNlOiAgICAgICAgICAgICAgICAgIG5hbWUgPSBjb250ZXh0Lm5hbWUKICAgIApp
ZiBjb250ZXh0LnBob25lID09ICIiOiBwaG9uZSA9ICJubyBwaG9uZSIKZWxzZTogICAgICAgICAg
ICAgICAgICAgcGhvbmUgPSBjb250ZXh0LnBob25lCiAgICAKcmV0dXJuICIlcyAoJXMpIiAlIChu
YW1lLCBwaG9uZSkKCiMgTG9jYWwgVmFyaWFibGVzOgojIG1vZGU6cHl0aG9uCiMgRW5kOnEsVQtf
YmluZF9uYW1lc3EtKGNTaGFyZWQuREMuU2NyaXB0cy5CaW5kaW5ncwpOYW1lQXNzaWdubWVudHMK
cS5vcS99cTBVBl9hc2duc3ExfXEyKFUObmFtZV9jb250YWluZXJxM1UJY29udGFpbmVycTRVDG5h
bWVfc3VicGF0aHE1VRB0cmF2ZXJzZV9zdWJwYXRocTZVDG5hbWVfY29udGV4dHE3VQdjb250ZXh0
cThVC25hbWVfbV9zZWxmcTlVBnNjcmlwdHE6dXNiVQxQeXRob25fbWFnaWNxO1UEmU4NCnE8VQ1m
dW5jX2RlZmF1bHRzcT1OdS4AAAAAAAAxDwAAAAAAAAAnKChVDkJUcmVlcy5JT0JUcmVlcQFVB0lP
QlRyZWVxAnRxA050Lk4uAAAAAAAAMRAAAAAAAAAAJygoVQ5CVHJlZXMuT09CVHJlZXEBVQdPT0JU
cmVlcQJ0cQNOdC5OLgAAAAAAADERAAAAAAAAACcoKFUOQlRyZWVzLk9JQlRyZWVxAVUHT0lCVHJl
ZXECdHEDTnQuTi4AAAAAAAAxDAAAAAAAAAAnKChVDkJUcmVlcy5JT0JUcmVlcQFVB0lPQlRyZWVx
AnRxA050Lk4uAAAAAAAAMQ0AAAAAAAAAJygoVQ5CVHJlZXMuSU9CVHJlZXEBVQdJT0JUcmVlcQJ0
cQNOdC5OLgAAAAAAADEJAAAAAAAAACYoKFUNQlRyZWVzLkxlbmd0aHEBVQZMZW5ndGhxAnRxA050
LksALgAAAAAAADEKAAAAAAAAACcoKFUOQlRyZWVzLk9PQlRyZWVxAVUHT09CVHJlZXECdHEDTnQu
Ti4AAAAAAAAxCwAAAAAAAAAnKChVDkJUcmVlcy5JT0JUcmVlcQFVB0lPQlRyZWVxAnRxA050Lk4u
AAAAAAAAMQYAAAAAAAAAJigoVQ1CVHJlZXMuTGVuZ3RocQFVBkxlbmd0aHECdHEDTnQuSwAuAAAA
AAAAMQcAAAAAAAAAJygoVQ5CVHJlZXMuT09CVHJlZXEBVQdPT0JUcmVlcQJ0cQNOdC5OLgAAAAAA
ADEIAAAAAAAAACcoKFUOQlRyZWVzLklPQlRyZWVxAVUHSU9CVHJlZXECdHEDTnQuTi7/////////
////////////
--+y7mEigI9R
Content-Type: application/octet-stream
Content-Description: Test
Content-Disposition: attachment;
filename="PhoneTest.zexp"
Content-Transfer-Encoding: base64
WkVYUAAAAAAAADACAAAAAAAAA30oKFUKT0ZTLkZvbGRlcnEBVQZGb2xkZXJxAnRxA050Ln1xBChV
BmRlbFNlbHEFKFUIAAAAAAAAMHZxBihVI1Byb2R1Y3RzLlB5dGhvblNjcmlwdHMuUHl0aG9uU2Ny
aXB0cQdVDFB5dGhvblNjcmlwdHEIdHRRVQNhZGRxCShVCAAAAAAAADDUcQooaAdVDFB5dGhvblNj
cmlwdHELdHRRVQJpZHEMVQlQaG9uZVRlc3RxDVUSX19hY19sb2NhbF9yb2xlc19fcQ59cQ9VBGx1
a2VxEF1xEVUFT3duZXJxEmFzVQZuZXh0SWRxEyhVCAAAAAAAADAJcRQoaAdVDFB5dGhvblNjcmlw
dHEVdHRRVQhfb2JqZWN0c3EWKH1xFyhVCW1ldGFfdHlwZXEYVQtEVE1MIE1ldGhvZHEZaAxVCmlu
ZGV4X2h0bWxxGnV9cRsoVQltZXRhX3R5cGVxHFUPU2NyaXB0IChQeXRob24pcR1VAmlkcR5VBm5l
eHRJZHEfdX1xIChVCW1ldGFfdHlwZXEhVQtEVE1MIE1ldGhvZHEiVQJpZHEjVQlzaG93X2h0bWxx
JHV9cSUoaCFVD1NjcmlwdCAoUHl0aG9uKXEmaCNoBXV9cScoVQltZXRhX3R5cGVxKFUPU2NyaXB0
IChQeXRob24pcSlVAmlkcSpVA2FkZHErdX1xLChVCW1ldGFfdHlwZXEtVQZGb2xkZXJxLlUCaWRx
L1UGUGVvcGxlcTB1fXExKGgtVQtEVE1MIE1ldGhvZHEyaC9VCWxpc3RfaHRtbHEzdX1xNChoLWgy
aC9VCGFkZF9odG1scTV1dHE2aCQoVQgAAAAAAAAwZXE3KFUOT0ZTLkRUTUxNZXRob2RxOFUKRFRN
TE1ldGhvZHE5dHRRaDUoVQgAAAAAAAAxX3E6KGg4VQpEVE1MTWV0aG9kcTt0dFFVBl9vd25lcnE8
KF1xPVUJYWNsX3VzZXJzcT5haBB0cT9VCmluZGV4X2h0bWxxQChVCAAAAAAAADAGcUEoaDhVCkRU
TUxNZXRob2RxQnR0UWgzKFUIAAAAAAAAMV5xQyhoOFUKRFRNTE1ldGhvZHFEdHRRaDAoVQgAAAAA
AAAwXXFFKGgBVQZGb2xkZXJxRnR0UVUFdGl0bGVxR1UVUGhvbmUgQm9vayAoWkNsYXNzZXMpcUh1
LgAAAAAAADB2AAAAAAAABJQoKFUjUHJvZHVjdHMuUHl0aG9uU2NyaXB0cy5QeXRob25TY3JpcHRx
AVUMUHl0aG9uU2NyaXB0cQJ0cQNOdC59cQQoVQlmdW5jX2NvZGVxBShjU2hhcmVkLkRDLlNjcmlw
dHMuU2lnbmF0dXJlCkZ1bmNDb2RlCnEGb3EHfXEIKFULY29fdmFybmFtZXNxCShVA2lkc3EKVQ0k
bG9vcF93YXRjaGVycQtVCyRyZWFkX2d1YXJkcQxVDCR3cml0ZV9ndWFyZHENVQYkZ3VhcmRxDnRV
C2NvX2FyZ2NvdW50cQ9LAHViVQJpZHEQVQZkZWxTZWxxEVUSX19hY19sb2NhbF9yb2xlc19fcRJ9
cRNVBGx1a2VxFF1xFVUFT3duZXJxFmFzVQJfdHEXKGgRTihLAEsFSwRLA1WYdAgAfQEAfAEAgwAA
AXQJAH0CAHQKAH0DAHQLAH0EAH8BAH8CAHwCAHwCAHwCAHQAAIMBAGkBAIMBAGkCAIMBAGQBABl9
AAB/AwB8AgB0AACDAQBpBABkAgB8AACDAAEBfwQAfAIAfAIAfAIAdAAAgwEAaQEAgwEAaQUAgwEA
aQYAfAIAdAAAgwEAaQcAgwAAgwEAAWQAAFNxGChOVQZzZWxJZHNxGVUDaWRzcRp0cRsoVQdjb250
ZXh0cRxVB1JFUVVFU1RxHVUEZm9ybXEeaBpVEW1hbmFnZV9kZWxPYmplY3RzcR9VCFJFU1BPTlNF
cSBVCHJlZGlyZWN0cSFVDGFic29sdXRlX3VybHEiVQ0kbG9vcF93YXRjaGVycSNVCyRyZWFkX2d1
YXJkcSRVDCR3cml0ZV9ndWFyZHElVQYkZ3VhcmRxJnRxJyhoGmgjaCRoJWgmdHEoVQ9TY3JpcHQg
KFB5dGhvbilxKWgRSwFVBgMBEwETAXEqKXROfXErdHEsVQVfYm9keXEtVatpZHMgPSBjb250ZXh0
LlJFUVVFU1QuZm9ybVsnc2VsSWRzJ10KY29udGV4dC5tYW5hZ2VfZGVsT2JqZWN0cyhpZHM9aWRz
KQpjb250ZXh0LlJFUVVFU1QuUkVTUE9OU0UucmVkaXJlY3QgKGNvbnRleHQuYWJzb2x1dGVfdXJs
KCkpCgojIExvY2FsIFZhcmlhYmxlczoKIyBtb2RlOnB5dGhvbgojIEVuZDpxLlULX2JpbmRfbmFt
ZXNxLyhjU2hhcmVkLkRDLlNjcmlwdHMuQmluZGluZ3MKTmFtZUFzc2lnbm1lbnRzCnEwb3ExfXEy
VQZfYXNnbnNxM31xNChVDm5hbWVfY29udGFpbmVycTVVCWNvbnRhaW5lcnE2VQxuYW1lX3N1YnBh
dGhxN1UQdHJhdmVyc2Vfc3VicGF0aHE4VQxuYW1lX2NvbnRleHRxOVUHY29udGV4dHE6VQtuYW1l
X21fc2VsZnE7VQZzY3JpcHRxPHVzYlUMUHl0aG9uX21hZ2ljcT1VBJlODQpxPlUMX3Byb3h5X3Jv
bGVzcT8oVQdNYW5hZ2VycUBVBU93bmVycUF0cUJVDWZ1bmNfZGVmYXVsdHNxQ051LgAAAAAAADDU
AAAAAAAABYsoKFUjUHJvZHVjdHMuUHl0aG9uU2NyaXB0cy5QeXRob25TY3JpcHRxAVUMUHl0aG9u
U2NyaXB0cQJ0cQNOdC59cQQoVQlmdW5jX2NvZGVxBShjU2hhcmVkLkRDLlNjcmlwdHMuU2lnbmF0
dXJlCkZ1bmNDb2RlCnEGb3EHfXEIKFULY29fdmFybmFtZXNxCShVA3JlcXEKVQJpZHELVQFpVQ0k
bG9vcF93YXRjaGVycQxVCyRyZWFkX2d1YXJkcQ1VDCR3cml0ZV9ndWFyZHEOVQYkZ3VhcmRxD3RV
C2NvX2FyZ2NvdW50cRBLAHViVQJpZHERVQNhZGRxElUSX19hY19sb2NhbF9yb2xlc19fcRN9cRRV
BGx1a2VxFV1xFlUFT3duZXJxF2FzVQJfdHEYKGgSTihLAEsHSwVLA1XkdA8AfQMAfAMAgwAAAXQQ
AH0EAHQRAH0FAHQSAH0GAH8BAH8CAHwEAHQAAIMBAGkBAH0AAH8DAHwEAHwEAHwAAIMBAGkDAIMB
AGQBABl9AQB/BQB8BAB8BAB8BAB8BAB0AACDAQBpBQCDAQBkAgAZgwEAaQYAgwEAaQcAfAEAfAAA
gwIAfQIAfwYAfAQAfAQAfAQAfAIAgwEAaQkAgwEAaQoAgwEAaQsAfAAAgwEAAX8IAHwEAHwEAHwA
AIMBAGkMAIMBAGkNAHwEAHwEAHQAAIMBAGkBAIMBAGkOAIMBAFNkAABTcRkoTlUCaWRxGlUJUGhv
bmVCb29rcRt0cRwoVQdjb250ZXh0cR1VB1JFUVVFU1RxHlUDcmVxcR9VBGZvcm1xIGgaVRFtYW5h
Z2VfYWRkUHJvZHVjdHEhVQZQZXJzb25xIlUVY3JlYXRlSW5PYmplY3RNYW5hZ2VycSNVAWlVDnBy
b3BlcnR5c2hlZXRzcSRVBWJhc2ljcSVVF21hbmFnZV9jaGFuZ2VQcm9wZXJ0aWVzcSZVCFJFU1BP
TlNFcSdVCHJlZGlyZWN0cShVBFVSTDFxKVUNJGxvb3Bfd2F0Y2hlcnEqVQskcmVhZF9ndWFyZHEr
VQwkd3JpdGVfZ3VhcmRxLFUGJGd1YXJkcS10cS4oaB9oGlUBaWgqaCtoLGgtdHEvVQ9TY3JpcHQg
KFB5dGhvbilxMGgSSwFVCgMBDAEQAh8BFgJxMSl0Tn1xMnRxM1UFX2JvZHlxNFQPAQAAcmVxID0g
Y29udGV4dC5SRVFVRVNUCmlkICA9IHJlcS5mb3JtWydpZCddCgppID0gY29udGV4dC5tYW5hZ2Vf
YWRkUHJvZHVjdFsnUGhvbmVCb29rJ10uUGVyc29uLmNyZWF0ZUluT2JqZWN0TWFuYWdlcihpZCwg
cmVxKQppLnByb3BlcnR5c2hlZXRzLmJhc2ljLm1hbmFnZV9jaGFuZ2VQcm9wZXJ0aWVzIChyZXEp
CgpyZXR1cm4gcmVxLlJFU1BPTlNFLnJlZGlyZWN0IChjb250ZXh0LlJFUVVFU1QuVVJMMSkKCiMg
TG9jYWwgVmFyaWFibGVzOgojIG1vZGU6cHl0aG9uCiMgRW5kOnE1VQtfYmluZF9uYW1lc3E2KGNT
aGFyZWQuREMuU2NyaXB0cy5CaW5kaW5ncwpOYW1lQXNzaWdubWVudHMKcTdvcTh9cTlVBl9hc2du
c3E6fXE7KFUObmFtZV9jb250YWluZXJxPFUJY29udGFpbmVycT1VDG5hbWVfc3VicGF0aHE+VRB0
cmF2ZXJzZV9zdWJwYXRocT9VDG5hbWVfY29udGV4dHFAVQdjb250ZXh0cUFVC25hbWVfbV9zZWxm
cUJVBnNjcmlwdHFDdXNiVQxQeXRob25fbWFnaWNxRFUEmU4NCnFFVQ1mdW5jX2RlZmF1bHRzcUZO
dS4AAAAAAAAwCQAAAAAAAANLKChVI1Byb2R1Y3RzLlB5dGhvblNjcmlwdHMuUHl0aG9uU2NyaXB0
cQFVDFB5dGhvblNjcmlwdHECdHEDTnQufXEEKFUJZnVuY19jb2RlcQUoY1NoYXJlZC5EQy5TY3Jp
cHRzLlNpZ25hdHVyZQpGdW5jQ29kZQpxBm9xB31xCChVC2NvX3Zhcm5hbWVzcQkoVQdyYW5kaW50
cQpVDSRsb29wX3dhdGNoZXJxC1ULJHJlYWRfZ3VhcmRxDFUMJHdyaXRlX2d1YXJkcQ1VBiRndWFy
ZHEOdFULY29fYXJnY291bnRxD0sAdWJVAmlkcRBVBm5leHRJZHERVRJfX2FjX2xvY2FsX3JvbGVz
X19xEn1xE1UEbHVrZXEUXXEVVQVPd25lcnEWYXNVAl90cRcoaBFOKEsASwVLBEsDVUZ0AwB9AQB8
AQCDAAABdAQAfQIAdAUAfQMAdAYAfQQAfwEAfwIAawAAbAEAAX8EAHQCAHwAAGQBAGQCAIMCAIMB
AFNkAABTcRgoTksATRAndHEZKFUGcmFuZG9tcRpoClUDc3RycRtoC2gMaA1oDnRxHChoCmgLaAxo
DWgOdHEdVQ9TY3JpcHQgKFB5dGhvbilxHmgRSwFVBAMBCgJxHyl0Tn1xIHRxIVUFX2JvZHlxIlVi
ZnJvbSByYW5kb20gaW1wb3J0IHJhbmRpbnQKCnJldHVybiBzdHIocmFuZGludCgwLCAxMDAwMCkp
CgojIExvY2FsIFZhcmlhYmxlczoKIyBtb2RlOnB5dGhvbgojIEVuZDpxI1UMUHl0aG9uX21hZ2lj
cSRVBJlODQpxJVUNZnVuY19kZWZhdWx0c3EmTlULX2JpbmRfbmFtZXNxJyhjU2hhcmVkLkRDLlNj
cmlwdHMuQmluZGluZ3MKTmFtZUFzc2lnbm1lbnRzCnEob3EpfXEqVQZfYXNnbnNxK31xLChVDm5h
bWVfY29udGFpbmVycS1VCWNvbnRhaW5lcnEuVQxuYW1lX3N1YnBhdGhxL1UQdHJhdmVyc2Vfc3Vi
cGF0aHEwVQxuYW1lX2NvbnRleHRxMVUHY29udGV4dHEyVQtuYW1lX21fc2VsZnEzVQZzY3JpcHRx
NHVzYnUuAAAAAAAAMGUAAAAAAAABFCgoVQ5PRlMuRFRNTE1ldGhvZHEBVQpEVE1MTWV0aG9kcQJ0
cQNOdC59cQQoVQV0aXRsZXEFVQBVA3Jhd3EGVW48IS0tIC0qLSBtb2RlOmh0bWwgLSotIC0tPgo8
ZHRtbC12YXIgc3RhbmRhcmRfaHRtbF9oZWFkZXI+Cjxocj48ZHRtbC12YXIgbGlzdF9odG1sPgo8
aHI+PGR0bWwtdmFyIGFkZF9odG1sPgoKCnEHVRJfX2FjX2xvY2FsX3JvbGVzX19xCH1xCVUEbHVr
ZXEKXXELVQVPd25lcnEMYXNVB2dsb2JhbHNxDX1xDlUIX19uYW1lX19xD1UJc2hvd19odG1scRBV
BV92YXJzcRF9cRJ1LgAAAAAAADFfAAAAAAAAAcQoKFUOT0ZTLkRUTUxNZXRob2RxAVUKRFRNTE1l
dGhvZHECdHEDTnQufXEEKFUFdGl0bGVxBVUAVQNyYXdxBlQcAQAAPCEtLSAtKi0gbW9kZTpodG1s
IC0qLSAtLT4KPGZvcm0gYWN0aW9uPSIuLyIgbWV0aG9kPSJwb3N0Ij4KCiAgPGJyPmlkOiAgICA8
aW5wdXQgbmFtZT0iaWQiICAgIHZhbHVlPSImZHRtbC1uZXh0SWQ7Ij4KICA8YnI+bmFtZTogIDxp
bnB1dCBuYW1lPSJuYW1lIiAgdmFsdWU9ImZvbyI+CiAgPGJyPnBob25lOiA8aW5wdXQgbmFtZT0i
cGhvbmUiIHZhbHVlPSI1NTUiPgogIDxicj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIEFk
ZCBtZXRob2QiIG5hbWU9ImFkZDptZXRob2QiPgoKPC9mb3JtPgpxB1USX19hY19sb2NhbF9yb2xl
c19fcQh9cQlVBGx1a2VxCl1xC1UFT3duZXJxDGFzVQdnbG9iYWxzcQ19cQ5VCF9fbmFtZV9fcQ9V
CGFkZF9odG1scRBVBV92YXJzcRF9cRJ1LgAAAAAAADAGAAAAAAAAANgoKFUOT0ZTLkRUTUxNZXRo
b2RxAVUKRFRNTE1ldGhvZHECdHEDTnQufXEEKFUFdGl0bGVxBVUAVQNyYXdxBlUxPCEtLSAtKi0g
bW9kZTpodG1sIC0qLSAtLT4KPGR0bWwtdmFyIHNob3dfaHRtbD4KCnEHVRJfX2FjX2xvY2FsX3Jv
bGVzX19xCH1xCVUEbHVrZXEKXXELVQVPd25lcnEMYXNVB2dsb2JhbHNxDX1xDlUIX19uYW1lX19x
D1UKaW5kZXhfaHRtbHEQVQVfdmFyc3ERfXESdS4AAAAAAAAxXgAAAAAAAAJ8KChVDk9GUy5EVE1M
TWV0aG9kcQFVCkRUTUxNZXRob2RxAnRxA050Ln1xBChVBXRpdGxlcQVVAFUDcmF3cQZU0wEAADwh
LS0gLSotIG1vZGU6aHRtbCAtKi0gLS0+Cjxmb3JtIGFjdGlvbj0iLi8iIG1ldGhvZD0icG9zdCI+
Cjx0YWJsZT4KICA8dHI+CiAgICA8dGg+CiAgICA8dGg+aWQKICAgIDx0aD5uYW1lIAogICAgPHRo
PnBob25lCiAgICA8dGg+bmFtZSBhbmQgcGhvbmUKICA8L3RyPgo8ZHRtbC1pbiAib2JqZWN0VmFs
dWVzKCdQZXJzb24nKSI+CiAgPHRyPgogICAgPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFt
ZT0ic2VsSWRzOmxpc3QiIHZhbHVlPSImZHRtbC1pZDsiPgogICAgPHRkPjxkdG1sLXZhciBpZD4K
ICAgIDx0ZD48ZHRtbC12YXIgbmFtZT4KICAgIDx0ZD48ZHRtbC12YXIgcGhvbmU+CiAgICA8dGQ+
PGR0bWwtdmFyIG5hbWVfYW5kX3Bob25lPgogIDwvdHI+CjwvZHRtbC1pbj4KPC90YWJsZT4KPGJy
PjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgRGVsICIgbmFtZT0iZGVsU2VsOm1ldGhvZCI+
CjwvZm9ybT4KcQdVEl9fYWNfbG9jYWxfcm9sZXNfX3EIfXEJVQRsdWtlcQpdcQtVBU93bmVycQxh
c1UHZ2xvYmFsc3ENfXEOVQhfX25hbWVfX3EPVQlsaXN0X2h0bWxxEFUFX3ZhcnNxEX1xEnUuAAAA
AAAAMF0AAAAAAAAAfSgoVQpPRlMuRm9sZGVycQFVBkZvbGRlcnECdHEDTnQufXEEKFUCaWRxBVUG
UGVvcGxlcQZVCF9vYmplY3RzcQcpVQV0aXRsZXEIVQBVEl9fYWNfbG9jYWxfcm9sZXNfX3EJfXEK
VQRsdWtlcQtdcQxVBU93bmVycQ1hc3Uu/////////////////////w==
--+y7mEigI9R
Content-Type: application/octet-stream
Content-Description: how to (sort of)
Content-Disposition: attachment;
filename="how-to.txt"
Content-Transfer-Encoding: base64
CgoJCQkgICAgIFRIRSBFWEFNUExFCgpUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNyZWF0ZSBh
IFpDbGFzcyBhbmQgYSBzaW1wbGUgaW50ZXJmYWNlIHRvCnVzZSBpdCAodGhhdCBpcyBidWlsZGlu
ZyBhbiBhcHBsaWNhdGlvbiBiYXNlZCBvbiB0aG9zZSBvYmplY3RzKS4KClpDbGFzc2VzIGFsbG93
cyB5b3UgdG8gaGF2ZSBvYmplY3RzIHdpdGggY3VzdG9tIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMK
dGhyb3VnaCB0aGUgWk1JIChab3BlIG1hbmFnZW1lbnQgSW50ZXJmYWNlKSwgd2l0aCBtaW5pbWFs
IChpZiBhbnkpCiJwcm9ncmFtbWluZyIgKGJ1dCBzb21lIGJhc2ljIFB5dGhvbiB3aWxsIGhlbHAg
YSBsb3QpLiAKClRoZSAiY3JlYXRpb24iIHBhdHRlcm4gaXMgYXMgZm9sbG93czoKCjEpIENyZWF0
ZSBhIFByb2R1Y3QgKFpDbGFzc2VzIGxpdmVzIHRoZXJlKQoyKSBDcmVhdGUgKGF0IGxlYXN0KSBv
bmUgWkNsYXNzCjMpIENyZWF0ZSBwcm9wZXJ0aWVzIChzYXkgImJhc2ljIikKNCkgQ3JlYXRlIGEg
VmlldyAoc2F5ICJpbmZvIikgZm9yIHRoZSAgcHJvcGVydHkgc2hlZXQKNSkgQ3JlYXRlIG1ldGhv
ZHMgKGlmIHlvdSBuZWVkIGFueSkKClRoZSAidXNlIiBwYXR0ZXJuIGlzIGFzIGZvbGxvd3M6Cgox
KSBHbyB0byBzb21lIEZvbGRlcgoyKSBTZWxlY3QgeW91ciBaQ2xhc3MgaW4gdGhlICJBZGQiIGNv
bWJvCjMpIFpvcGUgd2lsbCBkaXNwbGF5cyBhIHBhZ2UgZm9yIHlvdSB0byBlbnRlciB0aGUgaWQg
Zm9yIHRoZSBuZXcgb2JqZWN0CjQpIEJhY2sgdG8gdGhlIGZvbGRlciB5b3UgY2xpY2sgb24gdGhl
IG5ldyBpbnN0YW5jZQo1KSBZb3UgY2xpY2sgdGhlIHRhYiBjb3JyZXNwb25kaW5nIHRvIHRoZSBW
aWV3IChpbmZvKSB5b3UgY3JlYXRlZCBiZWZvcmUKNikgWm9wZSBkaXNwbGF5cyBhIHBhZ2UgZm9y
IHlvdSB0byBzZXQgdGhlIHByb3BlcnRpZXMgdmFsdWVzLiAKNykgVGhlIFpNSSBhbGxvd3MgeW91
IHRvIHNlbGVjdCBhbmQgZGVsZXRlIGFueSBpbnN0YW5jZXMKClRoaXMgd2F5IHlvdSBnZXQgYSBs
b3Qgb2Ygc3R1ZmYgd2l0aCBtaW5pbXVtIGVmZm9ydCwgYnV0IEkgc2VlIHR3bwoicHJvYmxlbXMi
IChhbmQgYSBzb3J0IG9mICJhc2ltbWV0cnkiKQoKMSkgeW91IGFyZSBzdGlsbCBtaXNzaW5nIHNv
bWUgImxpc3QiIGludGVyZmFjZSAodGhlIEZvbGRlciBzaG93cyB5b3UKICAgYWxsIHRoZSBvYmpl
Y3RzLCBub3QganVzdCB5b3Ugc3BlY2lmaWMgY2xhc3NlcywgYW5kIG1vcmUgaW1wb3J0YW50CiAg
IHlvdSBkbyBub3Qgc2VlIHRoZSBwcm9wZXJ0aWVzKS4gVGhpcyBpcyBlYXN5IHRvIGRvIGFuZCB0
aGUKICAgcmVzdWx0aW5nICJwYWdlIiB3aWxsIGJlICJ2aXNpYmxlIiB3aXRob3V0IGxvZ2dpbmcg
aW50byBab3BlCiAgIChpLmUuIHdpdGhvdXQgdXNpbmcgdGhlIFpNSSkuCgoyKSB5b3UgaGF2ZSB0
byB1c2UgdGhlIFpNSSBmb3IgdGhlIGFkZC9lZGl0L2RlbGV0ZSBzdHVmZiwgYnV0IHRoZSBaTUkK
ICAgZXhwb3NlIGFsc28gbWFueSAiZmVhdHVyZXMiIChvd25lciwgc2VjdXJpdHksIHByb3BlcnRp
ZXMgdGFicykgdGhhdAogICBzZWVtcyB0byBiZSBvdXQgb2YgdGhlICJzY29wZSIgb2YgdGhlIG5v
cm1hbCB1c2VyLiAKCk9uZSBzb2x1dGlvbiBpcyBqdXN0IHRvIHJvbGwgeW91ciBvd24gKG5vdCBa
TUkpIHN0dWZmIGZvciB0aGUgd2hvbGUKbGlzdC9hZGQvZWRpdC9kZWxldGUgY3ljbGUsIGJ1dDoK
CjEpIGxpc3QgaXMgZWFzeSwgeW91IGp1c3QgbmVlZCBhIDxkdG1sLWluCiAgIG9iamVjdFZhbHVl
cyg8eW91ci1jbGFzcy1uYW1lLWhlcmU+KSBsb29wIGFuZCB5b3UgZ2V0IGFjY2VzcyB0bwogICBp
bnN0YW5jZXMgcHJvcGVydGllcyBhbmQgbWV0aG9kcywgCgoyKSBhZGRpbmcgaXMgbWVhbnQgZG8g
YmUgZG9uZSB2aWEgWk1JIChhZGQgY29tYm8gaW4gRm9sZGVycykgYW5kIGlzCiAgIG5vdCBlYXN5
IHRvIGdldCBpdCBvdXQgZnJvbSB0aGVyZSAobG9vayBhdCB0aGUgYWRkIENvbWJvIGluIHRoZQog
ICBIVE1MIHNvdXJjZSBvZiA8YW55Rm9sZGVyPi9tYW5hZ2VfbWFpbikKCjMpIGVkaXQgaXMgbm90
IGRpZmZpY3VsdCAoc2VlIG1hbmFnZV9lZGl0KSwKCjQpIGRlbGV0ZSBpcyBub3QgZGlmZmljdWx0
LCBidXQgeW91IG5lZWQgdG8gaW50ZWdyYXRlIHNlbGVjdGlvbiBpbgogICBsaXN0IGFuZCB0aGVu
IHVzZSBtYW5hZ2VfZGVsZXRlCgo1KSBhcGFydCBmcm9tIGxpc3RpbmcsIHlvdXIgdXNlciAob3Ig
eW91ciBzY3JpcHRzKSB3aWxsIG5lZWQgc29tZQogICBhZGRpdGlvbiAoY29tcGFyZWQgdG8gYW5v
bnltb3VzJ29uZXMpIHBlcm1pc3Npb24gKHRob3NlIHRoYXQgd2VyZQogICBnaXZlbiB3aGVuIGxv
Z2dpbiBpbnRvIHRoZSBaTUkpLgoKCgoJCQkgICAgIFRIRSBQUk9EVUNUCgpUaGUgcHJvZHVjdCBp
cyB2ZXJ5IHNpbXBsZSBhbmQgaGFzIGEgc2luZ2xlIGNsYXNzIHdpdGgganVzdCB0d28KcHJvcGVy
dGllcyBhbmQgYSBzaW5nbGUgKHF1aXRlIHN0dXBpZCkgbWV0aG9kLiBJdCBpcyBkb25lIHdpdGgK
WkNsYXNzZXMsIHdpdGggdGhlIGlkZWEgKHBlcnNvbmFsIGFuZCBtYXkgYmUgd3JvbmcpIG9mIG5v
dCB1c2luZyBpdAp2aWEgWk1JLgoKCgkJCSBDUkVBVElORyBUSEUgUFJPRFVDVAkKCkNyZWF0ZSB0
aGUgUHJvZHVjdDoKCiAgR290byBDb250cm9sX1BhbmVsL1Byb2R1Y3RzCiAgQ2xpY2sgIkFkZCBQ
cm9kdWN0IiBhbmQgY2hvb3NlOgogCiAgICBpZDogIlBob25lQm9vayIgCiAgICB0aXRsZTogIlBo
b25lQm9vayIgKG9yIGFueXRoaW5nIGVsc2UpCgpDcmVhdGUgdGhlIFpDbGFzczoKCiAgRW50ZXIg
dGhlIG5ldyBwcm9kdWN0IChjbGljayBvbiBpdCkKICBBZGQgYSBuZXcgWkNsYXNzIGFuZCBjaG9v
c2U6CgogICAgaWQ6ICJQZXJzb24iCiAgICBUaXRsZTogIlBlcnNvbiIgKG9yIGFueXRoaW5nIGVs
c2UpCiAgICBNZXRhIFR5cGU6ICJQZXJzb24iCiAgICBDcmVhdGUgY29uc3RydWN0b3Igb2JqZWN0
cz86IGNoZWNrZWQgKGJ1dCB3ZSB3aWxsIG5vdCB1c2UgdGhlbSkKICAgIEJhc2UgY2xhc3NlcyAo
bm90aGluZyBzcGVjaWFsIG5lZWRlZCkgCiAgICBJbmNsdWRlIHN0YW5kYXJkIFpvcGUgcGVyc2lz
dGVudCBvYmplY3QgYmFzZSBjbGFzc2VzPzogY2hlY2tlZAoKQWRkIGEgcHJvcGVydHkgc2hlZXQ6
CgogIEVudGVyIHRoZSBuZXcgY2xhc3MgKGNsaWNrIG9uIGl0KQogIENsaWNrIHRoZSAiUHJvcGVy
dHkgU2hlZXRzIiB0YWIKICBDbGljayB0aGUgIkFkZCBDb21tb24gSW5zdGFuY2UgUHJvcGVydHkg
U2hlZXQiIGJ1dHRvbiBhbmQgY2hvb3NlOgoKICAgIGlkOiAiQmFzaWMiCiAgICB0aXRsZTogIiIg
KG9yIGFueXRoaW5nIGVsc2UpCiAgICAKQWRkIHNvbWUgcHJvcGVydGllczoKCiAgRW50ZXIgdGhl
IG5ldyBwcm9wZXJ0eSBzaGVldCAoY2xpY2sgb24gaXQpCiAgQWRkIGEgbmV3IHByb3BlcnR5IHdp
dGg6CgogICAgbmFtZTogIm5hbWUiCiAgICB0eXBlOiAic3RyaW5nIiAoY2hvb3NlIGZyb20gdGhl
IGNvbWJvKQogICAgdmFsdWU6ICJmb28iICAgKHdpbGwgYmUgdXNlZCBhcyBkZWZhdWx0KQoKICBB
ZGQgYW5vdGhlciBvbmUgd2l0aDoKCiAgICBuYW1lOiAicGhvbmUiCiAgICB0eXBlOiAic3RyaW5n
IiAoY2hvb3NlIGZyb20gdGhlIGNvbWJvKQogICAgdmFsdWU6ICI1NTUiICAgKHdpbGwgYmUgdXNl
ZCBhcyBkZWZhdWx0KQoKQWRkIGEgbWV0aG9kOgoKICBDbGljayB0aGUgIk1ldGhvZHMiIHRhYgog
IEFkZCBhIG5ldyBQeXRob24gU2NyaXB0IChjaG9vc2UgZnJvbSB0aGUgY29tYm8pIGFuZCBjaG9v
c2U6CgogICAgaWQ6ICJuYW1lX2FuZF9waG9uZSIKCiAgQ2xpY2sgIkFkZCBhbmQgRWRpdCIKICBX
cml0ZSBhbnl0aGluZyB0aGF0IHJldHVybnMgYSBzdHJpbmcgbGlrZToKCiAgICBpZiBjb250ZXh0
Lm5hbWUgPT0gIiI6IG5hbWUgPSAibm8gbmFtZSIKICAgIGVsc2U6ICAgICAgICAgICAgICAgICAg
bmFtZSA9IGNvbnRleHQubmFtZQoKICAgIGlmIGNvbnRleHQucGhvbmUgPT0gIiI6IHBob25lID0g
Im5vIHBob25lIgogICAgZWxzZTogICAgICAgICAgICAgICAgICAgcGhvbmUgPSBjb250ZXh0LnBo
b25lCgogICAgcmV0dXJuICIlcyAoJXMpIiAlIChuYW1lLCBwaG9uZSkKCgoJCQkgICAgICAgVEhF
IEdVSQoKVGhlIEdVSSBpcyB2ZXJ5IHNpbXBsZSwgYXMgaXQgYWxsb3dzIGp1c3QgZm9yIGxpc3Rp
bmcsIGFkZGluZyBhbmQKZGVsZXRpbmcgaW5zdGFuY2VzIG9mIFBlcnNvbiBjbGFzcy4gVGhlcmUg
aXMgYSAibWFpbiIgZm9sZGVyCihQaG9uZVRlc3QpIHRoYXQgd2lsbCBjb250YWluIHRoZSBEVE1M
IGFuZCB0aGUgUHl0aG9uU2NyaXB0cyBmb3IgdGhlCmludGVyZmFjZSBhbmQgYWxzbyBvbmUgRm9s
ZGVyICh0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lKSB0aGF0IGFjdHMKYXMgY29udGFpbmVy
IGZvciB0aGUgaW5zdGFuY2VzIChpLmU6IGFzIGEgc2luZ2xlIFBob25lQm9vaykuCgpUaGUgUGhv
bmVUZXN0IEZvbGRlciBjb250YWlucyBzb21lIERUTUwgTWV0aG9kczoKCi0gaW5kZXhfaHRtbDog
aW4gdGhpcyBleGFtcGxlLCBpcyBqdXN0IGEgcGxhY2UgaG9sZGVyIGZvciB0aGUKICBzaG93X2h0
bWwuIEl0IGNvdWxkIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIHRoYXQgbGlzdHMgKGFuZCBsaW5r
cwogIHRvKSB0aGUgYXZhaWxhYmxlIFBob25lQm9va3MuCgotIHNob3dfaHRtbDogdGhlIG1haW4g
InZpZXciIG9mIGEgUGhvbmVCb29rLCBpbiB0aGlzIGV4YW1wbGUgaW5jbHVkZXMKICBhIGxpc3Qg
YW5kIGFuIGVkaXQgZm9ybXMuCgotIGxpc3RfaHRtbDogYW4gSFRNTCBGT1JNIHRoYXQgbGlzdHMg
YWxsIHRoZSBQZXJzb24gaW5zdGFuY2VzLAogIHJlZmVyZW5jaW5nIHRoZWlyIHByb3BlcnRpZXMg
KG5hbWUgYW5kIHBob25lKSBhbmQgY2FsbGluZyB0aGUgbWV0aG9kCiAgKG5hbWVfYW5kX3Bob25l
KS4gSXQgYWxsb3dzIG11bHRpcGxlIHNlbGN0aW9uIGZvciBkZWxldGlvbi4KCi0gYWRkX2h0bWw6
IGFuIEhUTUwgRk9STSB3aXRoIG9uZSA8aW5wdXQgLi4uPiBmb3IgZWFjaCBwcm9wZXJ0eSwgdGhl
CiAgSWQgaXMgcHJlZmlsbGVkIHdpdGggYSByYW5kb20gdmFsdWUsIHRoZSBvdGhlcnMgd2l0aCBj
b25zdGFudAogIHN0cmluZ3MgKEJUVzogd2hhdCdzIHRoZSB1c2Ugb2YgdGhlICJ2YWx1ZSIgb25l
IGNhbiBzcGVjaWZ5IHdoZW4KICBkZWZpbmluZyBaQ2xhc3MgcHJvcGVydGllcz8pLiAKCmFuZCBh
IGNvdXBsZSBvZiBQeXRob24gU2NyaXB0czoKCi0gYWRkOiB0aGlzIHNjcmlwdCBkb2VzIChpbiBQ
eXRob24pIHdoYXQgKGZvciBaQ2xhc3NlcykgaXMgZG9uZSBieSB0aGUKICA8Q2xhc3NOYW1lPl9h
ZGQgYW5kIDxDbGFzc05hbWU+X2FkZEZvcm0gRFRNTCBhdXRvbWFnaWNhbGx5IGdlbmVyYXRlZAog
IGJ5IFpvcGUuIENvbnZlcnRpbmcgdGhlICJtYWdpYyIgaW50byBhIHNpbXBsZSBQeXRob25TY3Jp
cHQgd2FzIHRvbwogIGRpZmZpY3VsdCBmb3IgbWUsIHNvIHRoYW5rcyB0byBEaWV0ZXIgTWF1cmVy
IGZvciBwdXR0aW5nIG1lIG9uIHRoZQogIHJpZ2h0IHRyYWNrLCBJIGhvcGUgSSd2ZSBtYWRlIGdv
b2QgdXNlIG9mIGhpcyBoaW50cy4gKGFsc28gdGhhbmtzIHRvCiAgSm9obiBIdW50ZXIgZm9yIGFz
a2luZyBlc3NlbnRpYWxseSB0aGUgc2FtZSBxdWVzdGlvbiBJIGRpZCkuCgotIGRlbFNlbDogbm90
aGluZyBzcGVjaWFsLiBUaGUgcXVlc3Rpb24gb24gaG93IHRvIGdvIGJhY2sgdG8gdGhlCiAgIm9y
aWdpbmF0aW5nIiBwYWdlIGlzIHN0aWxsIG9wZW4gZm9yIG1lICh0aGUgc2FtZSBob2xkcyBmb3Ig
dGhlCiAgImFkZCIgc2NyaXB0KS4gCgpOb3RlOiB0aGUgRk9STXMgdXNlIHRoZSBQT1NUIG1ldGhv
ZCBhbmQgdGhlIGJ1dHRvbnMgY2FsbCAodmlhCm5hbWU9Inh4eDptZXRob2QiKSBzb21lIFB5dGhv
blNjcmlwdHMuIFRoaXMgaXMgdGhlIHNldC11cCBJIHByZWZlcmUsCmJ1dCBJJ20gbm90IHN0aWxs
IHN1cmUgaWYgaXQgaXMgdGhlIGJlc3Qgb25lOyBtYW55IHBlb3BsZSBzZWVtcyB0bwpwcmVmZXJl
IHRvIHVzZSBEVE1MIG1ldGhvZHMgZm9yIGFjdGlvbnMsIG9mdGVuIHdpdGggdGhlICJ0cmljayIg
b2YKY2FsbGluZyBhIFB5dGhvblNjcmlwdCAodmlhIDxkdG1sLWNhbGw+KSBhbmQgZGlzcGxheWlu
ZyBhbiAiT0siIGJ1dHRvbgpmb3IgYWNrbm93bGVkZ2VtZW50LiBPbmUgaG93LXRvIG9uIGhvdyB0
byAic3VibWl0Im9yICJjYWxsIGFub3RoZXIKVVJMIiBpbiBkaWZmZXJlbnQgKGJ1dCBlcXVpdmFs
ZW50KSB3YXlzIHdpbGwgYmUgdmVyeSB1c2VmdWxsIChhbmQgbm86CkknbSBub3QgYWJsZSB0byB3
cml0ZSBpdCEpLgo=
--+y7mEigI9R--