From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel To: gcc@gcc.gnu.org Cc: gcc@gnu.org Subject: what is the use of __umoddi3() and __udivdi3() in the function printf()? Date: Thu, 15 Aug 2002 22:20:00 -0000 Message-id: <20020816052029.52307.qmail@web10908.mail.yahoo.com> X-SW-Source: 2002-08/msg00953.html Content-type: multipart/mixed; boundary="----------=_1583533010-675-1" This is a multi-part message in MIME format... ------------=_1583533010-675-1 Content-length: 3068 Hai, I tried to create a program which independant of all system and standard libs. When i modified and make the printf function, the linker says missing symbols ___umoddi3 and ___udivdi3. I globaly declared two functions with the name of the above and complied the program, it works fine now. However i want know what is the use of the above symbols, can you tell me what is the use of these functions or variables? I herewith the attached the modified version of printf.c and the makefile i used. The makefile contains refer other files also.The included header files does not refer any external symbols. However if you require i am ready to send those files also. Thanks & Regards, Sam ( samuelhard@yahoo.com ) Do You Yahoo!? HotJobs, a Yahoo! service - Search Thousands of New Jobs Attachment: Printf.c Description: Printf.c Kernel : Kernel.o CKernel.o Processor.o MemMan.o Heap.o Keyboard.o VGAText.o PIC.o Timer.o VGACursor.o PCI.o PCIEnum.o NumConvert.o Printf.o String.o Boot.bin OSLoader.bin ld -Ttext 0x19000 --oformat binary -o Kernel.bin Kernel.o CKernel.o Processor.o MemMan.o Heap.o Keyboard.o IO.o VGAText.o VGACursor.o PIC.o Timer.o PCI.o PCIEnum.o NumConvert.o Printf.o modf.o String.o Boot.bin: Boot/Boot.asm nasmw -i Includes -w+orphan-labels -o Boot.bin Boot/Boot.asm OSLoader.bin : Boot/OSLoader.asm nasmw -i Includes -w+orphan-labels -o OSLoader.bin Boot/OSLoader.asm Kernel.o : Kernel/Kernel.asm nasmw -i Includes -w+orphan-labels -f coff -o Kernel.o Kernel/Kernel.asm CKernel.o : Kernel/CKernel.c gcc -ffreestanding -c -I Includes -o CKernel.o Kernel/CKernel.c Processor.o : Kernel/Processor.asm nasmw -i Includes -w+orphan-labels -f coff -o Processor.o Kernel/Processor.asm MemMan.o : Kernel/MemMan.asm nasmw -i Includes -w+orphan-labels -f coff -o MemMan.o Kernel/MemMan.asm Heap.o : MemMan.o Kernel/Heap.c gcc -ffreestanding -c -I Includes -o Heap.o Kernel/Heap.c Keyboard.o : Kernel/Keyboard.asm nasmw -i Includes -w+orphan-labels -f coff -o Keyboard.o Kernel/Keyboard.asm VGACursor.o : IO.o Kernel/VGACursor.c gcc -ffreestanding -c -I Includes -o VGACursor.o Kernel/VGACursor.c VGAText.o : IO.o Kernel/VGAText.asm nasmw -i Includes -w+orphan-labels -f coff -o VGAText.o Kernel/VGAText.asm PIC.o : Kernel/PIC.asm nasmw -i Includes -w+orphan-labels -f coff -o PIC.o Kernel/PIC.asm IO.o : Kernel/IO.asm nasmw -i Includes -w+orphan-labels -f coff -o IO.o Kernel/IO.asm Timer.o : Kernel/Timer.asm nasmw -i Includes -w+orphan-labels -f coff -o Timer.o Kernel/Timer.asm PCI.o : IO.o Kernel/PCI.c gcc -ffreestanding -c -I Includes -o PCI.o Kernel/PCI.c PCIEnum.o : PCI.o Kernel/PCIEnum.c gcc -ffreestanding -c -I Includes -o PCIEnum.o Kernel/PCIEnum.c NumConvert.o : Src/NumConvert.c gcc -ffreestanding -c -I Includes -o NumConvert.o Src/NumConvert.c Printf.o : VGAText.o VGACursor.o modf.o Src/Printf.c gcc -ffreestanding -c -I Includes -o Printf.o Src/Printf.c modf.o : Src/modf.S as -I Includes -o modf.o Src/modf.S String.o : Src/String.c gcc -ffreestanding -c -I Includes -o String.o Src/String.c ------------=_1583533010-675-1 Content-Type: text/x-c; charset=us-ascii; name="Printf.c" Content-Disposition: inline; filename="Printf.c" Content-Transfer-Encoding: base64 Content-Length: 29728 LyoJQWNlIE9TIEtlcmVubCBTb3VyY2UgQ29kZSAtIENyZWF0ZWQgb24gMTMt QXVnLTIwMDIgYnkgU2FtIChzYW11ZWxoYXJkQHlhaG9vLmNvbSkNCglDb3Bp ZWQgYW5kIG1vZGlmaWVkIHRoZSBHQ0MgMy4wIGRvcHJudC5jIGZpbGUgcHJv dmlkZWQgd2l0aCBESkdQUAkNCiovDQojaW5jbHVkZSA8U3RkQXJnYS5oPg0K I2luY2x1ZGUgPFR5cGVEZWZzLmg+DQojaW5jbHVkZSA8Q2hUeXBlLmg+DQoj aW5jbHVkZSA8VkdBVGV4dC5oPg0Kdm9pZCBfX3Vtb2RkaTMoKQ0KICAgIHsN CiAgICB9DQp2b2lkIF9fdWRpdmRpMyhpbnQgeCkNCiAgICB7DQogICAgfQ0K DQpjaGFyIGRlY2ltYWwgPSAnLic7DQppbnQgbmFuID0gMDsNCi8qIDExLWJp dCBleHBvbmVudCAoVkFYIEcgZmxvYXRpbmcgcG9pbnQpIGlzIDMwOCBkZWNp bWFsIGRpZ2l0cyAqLw0KI2RlZmluZQlNQVhFWFAJCTMwOA0KI2RlZmluZSBN QVhFWFBMRAkzNzAwIC8qIHRoaXMgaW5jbHVkZXMgc3Vibm9ybWFsIG51bWJl cnMgKi8NCi8vI2RlZmluZQlNQVhFWFAJCTMwOA0KLy8jZGVmaW5lIE1BWEVY UExECTQ5NTIgLyogdGhpcyBpbmNsdWRlcyBzdWJub3JtYWwgbnVtYmVycyAq Lw0KLyogMTI4IGJpdCBmcmFjdGlvbiB0YWtlcyB1cCAzOSBkZWNpbWFsIGRp Z2l0czsgbWF4IHJlYXNvbmFibGUgcHJlY2lzaW9uICovDQojZGVmaW5lCU1B WEZSQUNUCTM5DQoNCiNkZWZpbmUJREVGUFJFQwkJNg0KI2RlZmluZQlERUZM UFJFQwk2DQoNCiNkZWZpbmUJQlVGCQkJKE1BWEVYUExEK01BWEZSQUNUKzEp CS8qICsgZGVjaW1hbCBwb2ludCAqLw0KDQojZGVmaW5lCVBVVEMoY2gpCSh2 b2lkKSBQdXRDaChjaCkNCg0KI2RlZmluZSBBUkcoYmFzZXR5cGUpIF91bG9u Z2xvbmcgPSBcDQoJCWZsYWdzJkxPTkdEQkwgPyB2YV9hcmcoYXJncCwgbG9u ZyBsb25nIGJhc2V0eXBlKSA6IFwNCgkJZmxhZ3MmTE9OR0lOVCA/IHZhX2Fy ZyhhcmdwLCBsb25nIGJhc2V0eXBlKSA6IFwNCgkJZmxhZ3MmU0hPUlRJTlQg PyAoc2hvcnQgYmFzZXR5cGUpdmFfYXJnKGFyZ3AsIGludCkgOiBcDQoJCXZh X2FyZyhhcmdwLCBpbnQpDQoNCi8qIGhhdmUgdG8gZGVhbCB3aXRoIHRoZSBu ZWdhdGl2ZSBidWZmZXIgY291bnQga2x1ZGdlICovDQoNCiNkZWZpbmUJTE9O R0lOVAkJMHgwMQkJLyogbG9uZyBpbnRlZ2VyICovDQojZGVmaW5lCUxPTkdE QkwJCTB4MDIJCS8qIGxvbmcgZG91YmxlICovDQojZGVmaW5lCVNIT1JUSU5U CTB4MDQJCS8qIHNob3J0IGludGVnZXIgKi8NCiNkZWZpbmUJQUxUCQkJMHgw OAkJLyogYWx0ZXJuYXRlIGZvcm0gKi8NCiNkZWZpbmUJTEFESlVTVAkJMHgx MAkJLyogbGVmdCBhZGp1c3RtZW50ICovDQojZGVmaW5lCVpFUk9QQUQJCTB4 MjAJCS8qIHplcm8gKGFzIG9wcG9zZWQgdG8gYmxhbmspIHBhZCAqLw0KI2Rl ZmluZQlIRVhQUkVGSVgJMHg0MAkJLyogYWRkIDB4IG9yIDBYIHByZWZpeCAq Lw0KDQppbnQgY3Z0bChsb25nIGRvdWJsZSBudW1iZXIsIGludCBwcmVjLCBp bnQgZmxhZ3MsIGNoYXIgKnNpZ25wLCB1bnNpZ25lZCBjaGFyIGZtdGNoLCBj aGFyICpzdGFydHAsIGNoYXIgKmVuZHApOw0KY2hhciAqcm91bmRsKGxvbmcg ZG91YmxlIGZyYWN0LCBpbnQgKmV4cHYsIGNoYXIgKnN0YXJ0LCBjaGFyICpl bmQsICBjaGFyIGNoLCBjaGFyICpzaWducCk7DQpjaGFyICpleHBvbmVudGwo Y2hhciAqcCwgaW50IGV4cHYsIHVuc2lnbmVkIGNoYXIgZm10Y2gpOw0KI2lm ZGVmIF9fR08zMl9fDQoJc3RhdGljIGludCBpc3NwZWNpYWxsKGxvbmcgZG91 YmxlIGQsIGNoYXIgKmJ1ZnApOw0KI2VuZGlmDQoNCnN0YXRpYyBjaGFyIE5V TExfUkVQW10gPSAiKG51bGwpIjsNCmludCBQcmludGYoY29uc3QgY2hhciAq Zm10LCAuLi4pDQoJe19Eb1ByaW50KGZtdCwgKCZmbXQpKzEpOw0KCSByZXR1 cm4gMTsNCgl9DQppbnQgX0RvUHJpbnQoY29uc3QgY2hhciAqZm10MCwgdmFf bGlzdCBhcmdwKQ0KCXtjb25zdCBjaGFyICpmbXQ7CQkvKiBmb3JtYXQgc3Ry aW5nICovDQoJaW50IGNoOwkJCQkJLyogY2hhcmFjdGVyIGZyb20gZm10ICov DQoJaW50IGNudDsJCQkJLyogcmV0dXJuIHZhbHVlIGFjY3VtdWxhdG9yICov DQoJaW50IG47CQkJCQkvKiByYW5kb20gaGFuZHkgaW50ZWdlciAqLw0KCWNo YXIgKnQ7CQkJCS8qIGJ1ZmZlciBwb2ludGVyICovDQoJbG9uZyBkb3VibGUg X2xkb3VibGU7CS8qIGRvdWJsZSBhbmQgbG9uZyBkb3VibGUgcHJlY2lzaW9u IGFyZ3VtZW50cyAlTC5bZUVmZ0ddICovDQoJdW5zaWduZWQgbG9uZyBsb25n IF91bG9uZ2xvbmc9MDsgLyogaW50ZWdlciBhcmd1bWVudHMgJVtkaW91eFhd ICovDQoJaW50IGJhc2U7CQkJCS8qIGJhc2UgZm9yIFtkaW91eFhdIGNvbnZl cnNpb24gKi8NCglpbnQgZHByZWM7CQkJCS8qIGRlY2ltYWwgcHJlY2lzaW9u IGluIFtkaW91eFhdICovDQoJaW50IGZpZWxkc3o7CQkJLyogZmllbGQgc2l6 ZSBleHBhbmRlZCBieSBzaWduLCBldGMgKi8NCglpbnQgZmxhZ3M7CQkJCS8q IGZsYWdzIGFzIGFib3ZlICovDQoJaW50IGZwcHJlYzsJCQkJLyogYGV4dHJh JyBmbG9hdGluZyBwcmVjaXNpb24gaW4gW2VFZmdHXSAqLw0KCWludCBwcmVj OwkJCQkvKiBwcmVjaXNpb24gZnJvbSBmb3JtYXQgKCUuM2QpLCBvciAtMSAq Lw0KCWludCByZWFsc3o7CQkJCS8qIGZpZWxkIHNpemUgZXhwYW5kZWQgYnkg ZGVjaW1hbCBwcmVjaXNpb24gKi8NCglpbnQgc2l6ZTsJCQkJLyogc2l6ZSBv ZiBjb252ZXJ0ZWQgZmllbGQgb3Igc3RyaW5nICovDQoJaW50IHdpZHRoOwkJ CQkvKiB3aWR0aCBmcm9tIGZvcm1hdCAoJThkKSwgb3IgMCAqLw0KCWNoYXIg c2lnbjsJCQkJLyogc2lnbiBwcmVmaXggKCcgJywgJysnLCAnLScsIG9yIFww KSAqLw0KCWNoYXIgc29mdHNpZ247CQkJLyogdGVtcG9yYXJ5IG5lZ2F0aXZl IHNpZ24gZm9yIGZsb2F0cyAqLw0KCWNvbnN0IGNoYXIgKmRpZ3M7CQkvKiBk aWdpdHMgZm9yIFtkaW91eFhdIGNvbnZlcnNpb24gKi8NCgljaGFyIGJ1ZltC VUZdOwkJCS8qIHNwYWNlIGZvciAlYywgJVtkaW91eFhdLCAlW2VFZmdHXSAq Lw0KCWludCBuZWdfbGRvdWJsZSA9IDA7CS8qIG5vbi16ZXJvIGlmIF9sZG91 YmxlIGlzIG5lZ2F0aXZlICovDQoJZGVjaW1hbCA9ICcuJzsNCglmbXQgPSBm bXQwOw0KICAJZGlncyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsNCiAgCWZvciAo Y250ID0gMDs7ICsrZm10KQ0KICAgIAl7DQogICAgCXdoaWxlICgoY2ggPSAq Zm10KSAmJiBjaCAhPSAnJScpDQogICAJCQl7UFVUQyAoY2gpOw0KICAgICAg CQlmbXQrKzsNCiAgICAgIAkJY250Kys7DQogICAgICAJCX0NCiAgIAkJaWYg KCFjaCkNCiAgICAgIAkJcmV0dXJuIGNudDsNCiAgIAkJZmxhZ3MgPSAwOyBk cHJlYyA9IDA7IGZwcHJlYyA9IDA7IHdpZHRoID0gMDsNCiAgIAkJcHJlYyA9 IC0xOyBzaWduID0gJ1wwJzsNCiAJCXJmbGFnOg0KIAkJc3dpdGNoICgqKytm bXQpDQogICAgCQl7DQogICAgCQljYXNlICcgJzoNCiAgICAgCQkgCS8qDQoJ CSAgICAgICAqIGBgSWYgdGhlIHNwYWNlIGFuZCArIGZsYWdzIGJvdGggYXBw ZWFyLCB0aGUgc3BhY2UNCgkJICAgICAgICogZmxhZyB3aWxsIGJlIGlnbm9y ZWQuJycNCgkJICAgICAgICoJLS0gQU5TSSBYM0oxMQ0KCQkgICAgICAgKi8N CgkJICAgICAgIGlmICghc2lnbikNCgkJICAgICAgIAkJc2lnbiA9ICcgJzsN CiAgICAgICAJCSAgIGdvdG8gcmZsYWc7DQogCQkgICAgY2FzZSAnIyc6DQog CQkgICAJCWZsYWdzIHw9IEFMVDsNCiAJCSAgIAkJZ290byByZmxhZzsNCgkg ICAJCWNhc2UgJyonOg0KCQkgICAgICAvKg0KCQkJICAgCQkgKiBgYEEgbmVn YXRpdmUgZmllbGQgd2lkdGggYXJndW1lbnQgaXMgdGFrZW4gYXMgYQ0KCQkg ICAgICAgKiAtIGZsYWcgZm9sbG93ZWQgYnkgYSAgcG9zaXRpdmUgZmllbGQg d2lkdGguJycNCgkJICAgICAgICoJLS0gQU5TSSBYM0oxMQ0KCQkgICAgICAg KiBUaGV5IGRvbid0IGV4Y2x1ZGUgZmllbGQgd2lkdGhzIHJlYWQgZnJvbSBh cmdzLg0KCQkgICAgICAgKi8NCgkJICAgICAgICBpZiAoKHdpZHRoID0gdmFf YXJnKGFyZ3AsIGludCkpID49IDApDQoJCSAgICAgICAJCWdvdG8gcmZsYWc7 DQoJICAgICAgIAkJd2lkdGggPSAtd2lkdGg7DQoJICAgICAgIAkJLyogRkFM TFRIUk9VR0ggKi8NCiAgICAgICAJCWNhc2UgJy0nOg0KICAgICAgIAkJCWZs YWdzIHw9IExBREpVU1Q7DQogICAgICAgCQkJZ290byByZmxhZzsNCiAgIAkJ CWNhc2UgJysnOg0KICAgCQkJCXNpZ24gPSAnKyc7DQogICAJCQkJZ290byBy ZmxhZzsNCgkJCWNhc2UgJy4nOg0KCQkJCWlmICgqKytmbXQgPT0gJyonKQ0K CQkJCQluID0gdmFfYXJnKGFyZ3AsIGludCk7DQoJCQkJZWxzZQ0KCQkJCQl7 DQoJCQkJCW4gPSAwOw0KCQkJCQl3aGlsZSAoSXNBc2NpaSgqZm10KSAmJiBJ c0RpZ2l0KCpmbXQpKQ0KCQkJCQkJbiA9IDEwICogbiArIFRvRGlnaXQoKmZt dCsrKTsNCgkJCQkJLS1mbXQ7DQoJCQkJCX0NCgkJCQlwcmVjID0gbiA8IDAg PyAtMSA6IG47DQoJCQkJZ290byByZmxhZzsNCgkJCWNhc2UgJzAnOg0KCQkJ ICAgICAgLyoNCgkJCSAgICAgICAqIGBgTm90ZSB0aGF0IDAgaXMgdGFrZW4g YXMgYSBmbGFnLCBub3QgYXMgdGhlDQoJCQkgICAgICAgKiBiZWdpbm5pbmcg b2YgYSBmaWVsZCB3aWR0aC4nJw0KCQkJICAgICAgICoJLS0gQU5TSSBYM0ox MQ0KCQkJICAgICAgICovDQoJCSAgICAgICBmbGFncyB8PSBaRVJPUEFEOw0K CQkgICAgICAgZ290byByZmxhZzsNCiAgICAgICAJIAljYXNlICcxJzogY2Fz ZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoNCiAgICAgICAJIAljYXNlICc1 JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6DQog ICAgICAgCSAJCW4gPSAwOw0KICAgICAgIAkgCQlkbyB7DQogICAgICAgCSAJ CQluID0gMTAgKiBuICsgVG9EaWdpdCgqZm10KTsNCiAgICAgIAkgCQkJfSB3 aGlsZSAoSXNBc2NpaSgqKytmbXQpICYmIElzRGlnaXQoKmZtdCkpOw0KICAg ICAgICAgICAJCXdpZHRoID0gbjsNCiAgICAgICAgICAgCQktLWZtdDsNCiAg ICAgICAgICAgCQlnb3RvIHJmbGFnOw0KICAgICAgIAkJY2FzZSAnTCc6DQog ICAgICAgCQkJZmxhZ3MgfD0gTE9OR0RCTDsNCiAgICAgICAJCQlnb3RvIHJm bGFnOw0KCQkJY2FzZSAnaCc6DQoJCQkJZmxhZ3MgfD0gU0hPUlRJTlQ7DQoJ CQkJZ290byByZmxhZzsNCgkJCWNhc2UgJ2wnOg0KCQkJCWlmIChmbGFncyZM T05HSU5UKQ0KCQkJCQlmbGFncyB8PSBMT05HREJMOyAvKiBmb3IgJ2xsJyAt IGxvbmcgbG9uZyAqLw0KCQkJCWVsc2UNCgkJCQkJZmxhZ3MgfD0gTE9OR0lO VDsNCgkJCQlnb3RvIHJmbGFnOw0KCQkJY2FzZSAnYyc6DQoJCQkJKih0ID0g YnVmKSA9IHZhX2FyZyhhcmdwLCBpbnQpOw0KCQkJCXNpemUgPSAxOw0KCQkJ CXNpZ24gPSAnXDAnOw0KCQkJCWdvdG8gcGZvcnc7DQoJCQljYXNlICdEJzoN CgkJCQlmbGFncyB8PSBMT05HSU5UOw0KCQkJCS8qRkFMTFRIUk9VR0gqLw0K CQkJY2FzZSAnZCc6DQoJCQljYXNlICdpJzoNCgkJCQlBUkcoaW50KTsNCgkJ CQlpZiAoKGxvbmcgbG9uZylfdWxvbmdsb25nIDwgMCkNCgkJCQkJew0KCQkJ CQlfdWxvbmdsb25nID0gLV91bG9uZ2xvbmc7DQoJCQkJCXNpZ24gPSAnLSc7 DQoJCQkJCX0NCgkJCQliYXNlID0gMTA7DQoJCQkJZ290byBudW1iZXI7DQoJ CQljYXNlICdlJzoNCgkJCWNhc2UgJ0UnOg0KCQkJY2FzZSAnZic6DQoJCQlj YXNlICdnJzoNCgkJCWNhc2UgJ0cnOg0KCQkJCWlmIChmbGFncyAmIExPTkdE QkwpDQoJCQkJCV9sZG91YmxlID0gdmFfYXJnKGFyZ3AsIGxvbmcgZG91Ymxl KTsNCgkJCQllbHNlDQoJCQkJCV9sZG91YmxlID0gKGxvbmcgZG91YmxlKXZh X2FyZyhhcmdwLCBkb3VibGUpOw0KCQkgICAgICAgIC8qDQoJCSAgICAgICAg KiBkb24ndCBkbyB1bnJlYWxpc3RpYyBwcmVjaXNpb247IGp1c3QgcGFkIGl0 IHdpdGgNCgkJICAgICAgICAqIHplcm9lcyBsYXRlciwgc28gYnVmZmVyIHNp emUgc3RheXMgcmF0aW9uYWwuDQoJCSAgICAgICAgKi8NCgkJICAgICAgICBp ZiAocHJlYyA+IE1BWEZSQUNUKQ0KCQkgICAgICAgIAl7DQoJCSAgICAgICAg CWlmICgqZm10ICE9ICdnJyAmJiAoKmZtdCAhPSAnRycgfHwgKGZsYWdzJkFM VCkpKQ0KCQkgICAgICAgIAkJZnBwcmVjID0gcHJlYyAtIE1BWEZSQUNUOw0K CQkgICAgICAgIAlwcmVjID0gTUFYRlJBQ1Q7DQoJCSAgICAgICAgCX0NCgkJ ICAgICAgICBlbHNlIGlmIChwcmVjID09IC0xKQ0KCQkgICAgICAgIAl7DQoJ CSAgICAgICAgCWlmIChmbGFncyZMT05HSU5UKQ0KCQkgICAgICAgIAkJcHJl YyA9IERFRkxQUkVDOw0KCQkgICAgICAgIAllbHNlDQoJCSAgICAgICAgCQlw cmVjID0gREVGUFJFQzsNCgkJICAgICAgICAJfQ0KCQkgICAgICAgIC8qDQoJ CSAgICAgICAgKiBzb2Z0c2lnbiBhdm9pZHMgbmVnYXRpdmUgMCBpZiBfZG91 YmxlIGlzIDwgMCBhbmQNCgkJICAgICAgICAqIG5vIHNpZ25pZmljYW50IGRp Z2l0cyB3aWxsIGJlIHNob3duDQoJCSAgICAgICAgKi8NCgkJICAgICAgICBp ZiAoX2xkb3VibGUgPCAwKQ0KCQkJCQl7c29mdHNpZ24gPSAnLSc7DQoJCQkJ CV9sZG91YmxlID0gLV9sZG91YmxlOw0KCQkJCQluZWdfbGRvdWJsZSA9IDE7 DQoJCQkJCX0NCgkJCQllbHNlDQoJCQkJCXtzb2Z0c2lnbiA9IDA7DQoJCQkJ CW5lZ19sZG91YmxlID0gMDsNCgkJCQkJfQ0KCQkJICAgICAgLyoNCgkJCSAg ICAgICAqIGN2dCBtYXkgaGF2ZSB0byByb3VuZCB1cCBwYXN0IHRoZSAic3Rh cnQiIG9mIHRoZQ0KCQkJICAgICAgICogYnVmZmVyLCBpLmUuIGBgaW50Zigi JS4yZiIsIChkb3VibGUpOS45OTkpOycnOw0KCQkJICAgICAgICogaWYgdGhl IGZpcnN0IGNoYXIgaXNuJ3QgTlVMTCwgaXQgZGlkLg0KCQkJICAgICAgICov DQoJCQkJKmJ1ZiA9IE5VTEw7DQoJCQkJc2l6ZSA9IGN2dGwoX2xkb3VibGUs IHByZWMsIGZsYWdzLCAmc29mdHNpZ24sICpmbXQsIGJ1ZiwgYnVmICsgc2l6 ZW9mKGJ1ZikpOw0KCQkJICAgICAgLyoNCgkJCSAgICAgICAqIElmIHRoZSBm b3JtYXQgc3BlY2lmaWVyIHJlcXVlc3RlZCBhbiBleHBsaWNpdCBzaWduLA0K CQkJICAgICAgICogd2UgcHJpbnQgYSBuZWdhdGl2ZSBzaWduIGV2ZW4gaWYg bm8gc2lnbmlmaWNhbnQgZGlnaXRzDQoJCQkgICAgICAgKiB3aWxsIGJlIHNo b3duLCBhbmQgd2UgYWxzbyBwcmludCBhIHNpZ24gZm9yIGEgTmFOLiAgSW4N CgkJCSAgICAgICAqIG90aGVyIHdvcmRzLCAiJStmIiBtaWdodCBwcmludCAt MC4wMDAwMDAsICtOYU4gYW5kIC1OYU4uDQoJCQkgICAgICAgKi8NCgkJCQlp ZiAoc29mdHNpZ24gfHwgKHNpZ24gPT0gJysnICYmIChuZWdfbGRvdWJsZSB8 fCBuYW4gPT0gLTEpKSkNCgkJCQkJc2lnbiA9ICctJzsNCgkJCQluYW4gPSAw Ow0KCQkJCXQgPSAqYnVmID8gYnVmIDogYnVmICsgMTsNCgkJCQlnb3RvIHBm b3J3Ow0KCQkJY2FzZSAnbic6DQoJCQkJaWYgKGZsYWdzICYgTE9OR0RCTCkN CgkJCQkJKnZhX2FyZyhhcmdwLCBsb25nIGxvbmcgKikgPSBjbnQ7DQoJCQkJ ZWxzZSBpZiAoZmxhZ3MgJiBMT05HSU5UKQ0KCQkJCQkqdmFfYXJnKGFyZ3As IGxvbmcgKikgPSBjbnQ7DQoJCQkJZWxzZSBpZiAoZmxhZ3MgJiBTSE9SVElO VCkNCgkJCQkJKnZhX2FyZyhhcmdwLCBzaG9ydCAqKSA9IGNudDsNCgkJCQll bHNlDQoJCQkJCSp2YV9hcmcoYXJncCwgaW50ICopID0gY250Ow0KCQkJCWJy ZWFrOw0KCQkJY2FzZSAnTyc6DQoJCQkJZmxhZ3MgfD0gTE9OR0lOVDsNCgkJ CS8qRkFMTFRIUk9VR0gqLw0KCQkJY2FzZSAnbyc6DQoJCQkJQVJHKHVuc2ln bmVkKTsNCgkJCQliYXNlID0gODsNCgkJCQlnb3RvIG5vc2lnbjsNCgkJCWNh c2UgJ3AnOg0KCQkJCS8qDQogICAgICAJCQkqIGBgVGhlIGFyZ3VtZW50IHNo YWxsIGJlIGEgcG9pbnRlciB0byB2b2lkLiAgVGhlDQoJCSAgICAgICAqIHZh bHVlIG9mIHRoZSBwb2ludGVyIGlzIGNvbnZlcnRlZCB0byBhIHNlcXVlbmNl DQoJCSAgICAgICAqIG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzLCBpbiBhbiBp bXBsZW1lbnRhdGlvbi0NCgkJICAgICAgICogZGVmaW5lZCBtYW5uZXIuJycN CgkJICAgICAgICoJLS0gQU5TSSBYM0oxMQ0KCQkgICAgICAgKi8NCgkJICAg IAkvKiBOT1NUUklDVCAqLw0KCQkJCV91bG9uZ2xvbmcgPSAodW5zaWduZWQg bG9uZyl2YV9hcmcoYXJncCwgdm9pZCAqKTsNCgkJCQliYXNlID0gMTY7DQoJ CQkJZ290byBub3NpZ247DQoJCQljYXNlICdzJzoNCgkJCQlpZiAoISh0ID0g dmFfYXJnKGFyZ3AsIGNoYXIgKikpKQ0KCQkJCQl0ID0gTlVMTF9SRVA7DQoJ CQkJaWYgKHByZWMgPj0gMCkNCgkJCQkJew0KCQkJCQkJLyoNCgkJCQkJCSAq IGNhbid0IHVzZSBzdHJsZW47IGNhbiBvbmx5IGxvb2sgZm9yIHRoZQ0KCQkJ CQkJICogTlVMIGluIHRoZSBmaXJzdCBgcHJlYycgY2hhcmFjdGVycywgYW5k DQoJCQkJCQkgKiBzdHJsZW4oKSB3aWxsIGdvIGZ1cnRoZXIuDQoJCQkJCQkg Ki8NCgkJCQkJY2hhciAqcAkJCS8qLCAqbWVtY2hyKCkgKi87DQoJCQkJCWlm ICgocCA9IFN0ck5DaHIodCwgMCwgcHJlYykpKQ0KCQkJCQkJe3NpemUgPSBw IC0gdDsNCgkJCQkJCWlmIChzaXplID4gcHJlYykNCgkJCQkJCQlzaXplID0g cHJlYzsNCgkJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQkJc2l6ZSA9IHByZWM7 DQoJCQkJCX0NCgkJCQllbHNlDQoJCQkJCXNpemUgPSBTdHJMZW4odCk7DQoJ CQkJc2lnbiA9ICdcMCc7DQoJCQkJZ290byBwZm9ydzsNCgkJCWNhc2UgJ1Un Og0KCQkJCWZsYWdzIHw9IExPTkdJTlQ7DQoJCQkJLypGQUxMVEhST1VHSCov DQoJCQljYXNlICd1JzoNCgkJCQlBUkcodW5zaWduZWQpOw0KCQkJCWJhc2Ug PSAxMDsNCgkJCQlnb3RvIG5vc2lnbjsNCgkJCWNhc2UgJ1gnOg0KCQkJCWRp Z3MgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7DQoJCQkJLyogRkFMTFRIUk9VR0gg Ki8NCgkJCWNhc2UgJ3gnOg0KCQkJCUFSRyh1bnNpZ25lZCk7DQoJCQkJYmFz ZSA9IDE2Ow0KCQkJCS8qIGxlYWRpbmcgMHgvWCBvbmx5IGlmIG5vbi16ZXJv ICovDQoJCQkJaWYgKGZsYWdzICYgQUxUICYmIF91bG9uZ2xvbmcgIT0gMCkN CgkJCQkJZmxhZ3MgfD0gSEVYUFJFRklYOw0KICAgIAkJCW5vc2lnbjoNCgkJ CQkJLyogdW5zaWduZWQgY29udmVyc2lvbnMgKi8NCgkJCQkJc2lnbiA9ICdc MCc7DQoJCQkJbnVtYmVyOg0KCQkJICAgICAgLyoNCgkJCSAgICAgICAqIGBg Li4uIGRpb3VYeCBjb252ZXJzaW9ucyAuLi4gaWYgYSBwcmVjaXNpb24gaXMN CgkJCSAgICAgICAqIHNwZWNpZmllZCwgdGhlIDAgZmxhZyB3aWxsIGJlIGln bm9yZWQuJycNCgkJCSAgICAgICAqCS0tIEFOU0kgWDNKMTENCgkJCSAgICAg ICAqLw0KCQkJCQlpZiAoKGRwcmVjID0gcHJlYykgPj0gMCkNCgkJCQkJCWZs YWdzICY9IH5aRVJPUEFEOw0KCQkgICAgICAgIAkvKiBgYFRoZSByZXN1bHQg b2YgY29udmVydGluZyBhIHplcm8gdmFsdWUgd2l0aCBhbg0KCQkJICAgICAg ICAqIGV4cGxpY2l0IHByZWNpc2lvbiBvZiB6ZXJvIGlzIG5vIGNoYXJhY3Rl cnMuJycNCgkJCSAgICAgICAgKgktLSBBTlNJIFgzSjExKi8NCgkJCQkJdCA9 IGJ1ZiArIEJVRjsNCgkJCQkJaWYgKF91bG9uZ2xvbmcgIT0gMCB8fCBwcmVj ICE9IDApDQoJCQkJCQl7DQoJCQkgICAgICAgIAkvKiBjb252ZXJzaW9uIGlz IGRvbmUgc2VwYXJhdGVseSBzaW5jZSBvcGVyYXRpb25zDQoJCQkJCSAgICB3 aXRoIGxvbmcgbG9uZyBhcmUgbXVjaCBzbG93ZXIgKi8NCgkJCQkJCSNkZWZp bmUgQ09OVkVSVCh0eXBlKSBcDQogICAgCQkJCQl7IFwNCgkJCQkJCXJlZ2lz dGVyIHR5cGUgX24gPSAodHlwZSlfdWxvbmdsb25nOyBcDQoJCQkJCQlkbyB7 IFwNCgkJCQkJCQkqLS10ID0gZGlnc1tfbiAlIGJhc2VdOyBcDQoJCQkJCQkJ X24gLz0gYmFzZTsgXA0KCQkJCQkJCX0gd2hpbGUgKF9uKTsgXA0KCQkJCQkJ fQ0KCQkJCQkJaWYgKGZsYWdzJkxPTkdEQkwpDQoJCQkJCQkJQ09OVkVSVCh1 bnNpZ25lZCBsb25nIGxvbmcpIC8qIG5vIDsgKi8NCgkJCQkJCWVsc2UNCgkJ CQkJCQlDT05WRVJUKHVuc2lnbmVkIGxvbmcpIC8qIG5vIDsgKi8NCgkJCQkJ CSN1bmRlZiBDT05WRVJUDQoJCQkJCQlpZiAoZmxhZ3MgJiBBTFQgJiYgYmFz ZSA9PSA4ICYmICp0ICE9ICcwJykNCgkJCQkJCQkqLS10ID0gJzAnOwkJLyog b2N0YWwgbGVhZGluZyAwICovDQoJCQkJICAgICAgCX0NCg0KCQkJCQlkaWdz ID0gIjAxMjM0NTY3ODlhYmNkZWYiOw0KICAgIAkgICAgCQlzaXplID0gYnVm ICsgQlVGIC0gdDsNCgkJCQlwZm9ydzoNCgkJCSAgICAgIC8qDQoJCQkgICAg ICAgKiBBbGwgcmVhc29uYWJsZSBmb3JtYXRzIHdpbmQgdXAgaGVyZS4gIEF0 IHRoaXMgcG9pbnQsDQoJCQkgICAgICAgKiBgdCcgcG9pbnRzIHRvIGEgc3Ry aW5nIHdoaWNoIChpZiBub3QgZmxhZ3MmTEFESlVTVCkNCgkJICAgIAkgICAq IHNob3VsZCBiZSBwYWRkZWQgb3V0IHRvIGB3aWR0aCcgcGxhY2VzLiAgSWYN CgkJCSAgICAgICAqIGZsYWdzJlpFUk9QQUQsIGl0IHNob3VsZCBmaXJzdCBi ZSBwcmVmaXhlZCBieSBhbnkNCgkJCSAgICAgICAqIHNpZ24gb3Igb3RoZXIg cHJlZml4OyBvdGhlcndpc2UsIGl0IHNob3VsZCBiZSBibGFuaw0KCQkJICAg ICAgICogcGFkZGVkIGJlZm9yZSB0aGUgcHJlZml4IGlzIGVtaXR0ZWQuICBB ZnRlciBhbnkNCgkJICAgIAkgICAqIGxlZnQtaGFuZCBwYWRkaW5nIGFuZCBw cmVmaXhpbmcsIGVtaXQgemVyb2VzDQoJCQkgICAgICAgKiByZXF1aXJlZCBi eSBhIGRlY2ltYWwgW2Rpb3V4WF0gcHJlY2lzaW9uLCB0aGVuIHByaW50DQoJ CQkgICAgICAgKiB0aGUgc3RyaW5nIHByb3BlciwgdGhlbiBlbWl0IHplcm9l cyByZXF1aXJlZCBieSBhbnkNCgkJCSAgICAgICAqIGxlZnRvdmVyIGZsb2F0 aW5nIHByZWNpc2lvbjsgZmluYWxseSwgaWYgTEFESlVTVCwNCgkJCSAgICAg ICAqIHBhZCB3aXRoIGJsYW5rcy4NCgkJCSAgICAgICAqLw0KCQkNCgkJCSAg ICAgIC8qDQoJCQkgICAgICAgKiBjb21wdXRlIGFjdHVhbCBzaXplLCBzbyB3 ZSBrbm93IGhvdyBtdWNoIHRvIHBhZA0KCQkJICAgICAgICogZmllbGRzeiBl eGNsdWRlcyBkZWNpbWFsIHByZWM7IHJlYWxzeiBpbmNsdWRlcyBpdA0KCQkg ICAgCSAgICovDQoJCQkJCWZpZWxkc3ogPSBzaXplICsgZnBwcmVjOw0KCQkJ CQlyZWFsc3ogPSBkcHJlYyA+IGZpZWxkc3ogPyBkcHJlYyA6IGZpZWxkc3o7 DQoJCQkJCWlmIChzaWduKQ0KCQkJCQkJcmVhbHN6Kys7DQoJCQkJCWlmIChm bGFncyAmIEhFWFBSRUZJWCkNCgkJCQkJCXJlYWxzeiArPSAyOw0KCQkJCQkv KiByaWdodC1hZGp1c3RpbmcgYmxhbmsgcGFkZGluZyAqLw0KCQkJCQlpZiAo KGZsYWdzICYgKExBREpVU1R8WkVST1BBRCkpID09IDAgJiYgd2lkdGgpDQoJ CQkJCQlmb3IgKG4gPSByZWFsc3o7IG4gPCB3aWR0aDsgbisrKQ0KCQkJCQkJ CVBVVEMoJyAnKTsNCgkJCQkJLyogcHJlZml4ICovDQoJCQkJCWlmIChzaWdu KQ0KCQkJCQkJUFVUQyhzaWduKTsNCgkJCQkJaWYgKGZsYWdzICYgSEVYUFJF RklYKQ0KCQkJCQkJe1BVVEMoJzAnKTsNCgkJCQkJCVBVVEMoKGNoYXIpKmZt dCk7DQoJCQkJCQl9DQoJCQkJCS8qIHJpZ2h0LWFkanVzdGluZyB6ZXJvIHBh ZGRpbmcgKi8NCgkJCQkJaWYgKChmbGFncyAmIChMQURKVVNUfFpFUk9QQUQp KSA9PSBaRVJPUEFEKQ0KCQkJCQkJZm9yIChuID0gcmVhbHN6OyBuIDwgd2lk dGg7IG4rKykNCgkJCQkJCQlQVVRDKCcwJyk7DQoJCQkJCS8qIGxlYWRpbmcg emVyb2VzIGZyb20gZGVjaW1hbCBwcmVjaXNpb24gKi8NCgkJCQkJZm9yIChu ID0gZmllbGRzejsgbiA8IGRwcmVjOyBuKyspDQoJCQkJCQlQVVRDKCcwJyk7 DQoNCgkJCQkJLyogdGhlIHN0cmluZyBvciBudW1iZXIgcHJvcGVyICovDQoJ CQkJCWZvciAobiA9IHNpemU7IG4gPiAwOyBuLS0pDQoJCQkJCQlQVVRDKCp0 KyspOw0KCQkJCQkvKiB0cmFpbGluZyBmLnAuIHplcm9lcyAqLw0KCQkJCQl3 aGlsZSAoLS1mcHByZWMgPj0gMCkNCgkJCQkJCVBVVEMoJzAnKTsNCgkJCQkJ LyogbGVmdC1hZGp1c3RpbmcgcGFkZGluZyAoYWx3YXlzIGJsYW5rKSAqLw0K CQkJCQlpZiAoZmxhZ3MgJiBMQURKVVNUKQ0KCQkJCQkJZm9yIChuID0gcmVh bHN6OyBuIDwgd2lkdGg7IG4rKykNCgkJCQkJCQlQVVRDKCcgJyk7DQoJCQkJ CS8qIGZpbmFsbHksIGFkanVzdCBjbnQgKi8NCgkJCQkJY250ICs9IHdpZHRo ID4gcmVhbHN6ID8gd2lkdGggOiByZWFsc3o7DQoJCQkJCWJyZWFrOw0KCQkJ Y2FzZSAnXDAnOgkJCS8qICIlPyIgcHJpbnRzID8sIHVubGVzcyA/IGlzIE5V TEwgKi8NCgkJCQlyZXR1cm4gY250Ow0KCQkJZGVmYXVsdDoNCgkJCQlQVVRD KChjaGFyKSpmbXQpOw0KCQkJCWNudCsrOw0KCQkJfQ0KCQl9DQogIAkvKiBO T1RSRUFDSEVEICovDQoJfQ0KDQpzdGF0aWMgbG9uZyBkb3VibGUgcHRlbltd ID0JezFlMUwsIDFlMkwsIDFlNEwsIDFlOEwsIDFlMTZMLCAxZTMyTCwgMWU2 NEwsIDFlMTI4TCwgMWUyNTZMLCAxZTUxMkwsIDFlMTAyNEwsIDFlMjA0OEws IDFlNDA5Nkx9Ow0Kc3RhdGljIGxvbmcgZG91YmxlIHB0ZW5uZWdbXSA9ezFl LTFMLCAxZS0yTCwgMWUtNEwsIDFlLThMLCAxZS0xNkwsIDFlLTMyTCwgMWUt NjRMLCAxZS0xMjhMLCAxZS0yNTZMLDFlLTUxMkwsIDFlLTEwMjRMLCAxZS0y MDQ4TCwgMWUtNDA5Nkx9Ow0KDQojZGVmaW5lIE1BWFAgNDA5Ng0KI2RlZmlu ZSBOUCAgIDEyDQojZGVmaW5lIFAgICAgKDQyOTQ5NjcyOTYuMEwgKiA0Mjk0 OTY3Mjk2LjBMICogMi4wTCkgICAvKiAyXjY1ICovDQpzdGF0aWMgbG9uZyBk b3VibGUgSU5WUFJFQyA9IFA7DQpzdGF0aWMgbG9uZyBkb3VibGUgUFJFQyA9 IDEuMEwvUDsNCiN1bmRlZiBQDQovKg0KICogRGVmaW5pbmcgRkFTVF9MRE9V QkxFX0NPTlZFUlNJT04gcmVzdWx0cyBpbiBhIGxpdHRsZSBiaXQgZmFzdGVy DQogKiB2ZXJzaW9uLCB3aGljaCBtaWdodCBiZSBsZXNzIGFjY3VyYXRlIChh Ym91dCAxIGJpdCkgZm9yIGxvbmcNCiAqIGRvdWJsZS4gRm9yICdub3JtYWwn IGRvdWJsZSBpdCBkb2Vzbid0IG1hdHRlci4NCiAqLw0KLyogI2RlZmluZSBG QVNUX0xET1VCTEVfQ09OVkVSU0lPTiAqLw0KDQppbnQgY3Z0bChsb25nIGRv dWJsZSBudW1iZXIsIGludCBwcmVjLCBpbnQgZmxhZ3MsIGNoYXIgKnNpZ25w LCB1bnNpZ25lZCBjaGFyIGZtdGNoLGNoYXIgKnN0YXJ0cCwgY2hhciAqZW5k cCkNCgl7Y2hhciAqcCwgKnQ7DQoJbG9uZyBkb3VibGUgZnJhY3Q9MDsNCglp bnQgZG90cmltLCBleHBjbnQsIGdmb3JtYXQ7DQoJaW50IGRvZXh0cmFkcHM9 MDsgICAgLyogRG8gZXh0cmEgZGVjaW1hbCBwbGFjZXMgaWYgdGhlIHByZWNp c2lvbiBuZWVkcyBpdCAqLw0KCWludCBkb2luZ3plcm89MDsgICAgIC8qIFdl J3JlIGRpc3BsYXlpbmcgMC4wICovDQoJbG9uZyBkb3VibGUgaW50ZWdlciwg dG1wOw0KDQoJaWYgKChleHBjbnQgPSBpc3NwZWNpYWxsKG51bWJlciwgc3Rh cnRwKSkpDQoJCXJldHVybihleHBjbnQpOw0KDQoJZG90cmltID0gZXhwY250 ID0gZ2Zvcm1hdCA9IDA7DQoJLyogZnJhY3QgPSBtb2RmbChudW1iZXIsICZp bnRlZ2VyKTsgKi8NCglpbnRlZ2VyID0gbnVtYmVyOw0KDQoJLyogZ2V0IGFu IGV4dHJhIHNsb3QgZm9yIHJvdW5kaW5nLiAqLw0KCXQgPSArK3N0YXJ0cDsN Cg0KCXAgPSBlbmRwIC0gMTsNCglpZiAoaW50ZWdlcikNCgkJew0KCQlpbnQg aSwgbHA9TlAsIHB0PU1BWFA7DQoJCSNpZm5kZWYgRkFTVF9MRE9VQkxFX0NP TlZFUlNJT04NCgkJCWxvbmcgZG91YmxlIG9pbnQgPSBpbnRlZ2VyLCBkZD0x LjBMOw0KCQkjZW5kaWYNCgkJaWYgKGludGVnZXIgPiBJTlZQUkVDKQ0KCQkJ e2ludGVnZXIgKj0gUFJFQzsNCgkJCXdoaWxlKGxwID49IDApIA0KCQkJCXtp ZiAoaW50ZWdlciA+PSBwdGVuW2xwXSkNCgkJCQkJe2V4cGNudCArPSBwdDsN CgkJCQkJaW50ZWdlciAqPSBwdGVubmVnW2xwXTsNCgkJCQkJI2lmbmRlZiBG QVNUX0xET1VCTEVfQ09OVkVSU0lPTg0KCQkJCQkJZGQgKj0gcHRlbltscF07 DQoJCQkJCSNlbmRpZg0KCQkJCQl9DQoJCQkJcHQgPj49IDE7DQoJCQkJbHAt LTsNCgkJCQl9DQoJCQkjaWZuZGVmIEZBU1RfTERPVUJMRV9DT05WRVJTSU9O DQoJCQkJaW50ZWdlciA9IG9pbnQvZGQ7DQoJCQkjZWxzZQ0KCQkJCWludGVn ZXIgKj0gSU5WUFJFQzsNCgkJCSNlbmRpZg0KCQkJfQ0KCQkvKg0KCSAgICAq IERvIHdlIHJlYWxseSBuZWVkIHRoaXMgPw0KICAgIAkqLw0KCQlmb3IgKGkg PSAwOyBpIDwgZXhwY250OyBpKyspDQogICAgICAJCSpwLS0gPSAnMCc7DQoJ CX0NCgkJbnVtYmVyID0gaW50ZWdlcjsNCgkJZnJhY3QgPSBtb2RmbChudW1i ZXIsICZpbnRlZ2VyKTsNCgkJLyogSWYgaW50ZWdlciBpcyB6ZXJvIHRoZW4g d2UgbmVlZCB0byBsb29rIGF0IHdoZXJlIHRoZSBzaWcgZmlncyBhcmUgKi8N CgkJaWYgKGludGVnZXI8MSkNCgkJCXsvKiBJZiBmcmFjdCBpcyB6ZXJvIHRo ZSB6ZXJvIGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludCBpcyBhIHNpZyBmaWcg Ki8NCgkJCWlmIChmcmFjdD09MC4wKQ0KICAgCQkJCWRvaW5nemVybz0xOw0K CQkJLyogSWYgZnJhY3QgaXMgbm9uLXplcm8gYWxsIHNpZyBmaWdzIGFyZSBp biBmcmFjdGlvbmFsIHBhcnQgKi8NCgkJCWVsc2UgDQogICAJCQkJZG9leHRy YWRwcz0xOw0KICAJCQl9DQoJCS8qDQoJCSogZ2V0IGludGVnZXIgcG9ydGlv biBvZiBudW1iZXI7IHB1dCBpbnRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcjsg dGhlDQoJCSogLjAxIGlzIGFkZGVkIGZvciBtb2RmKDM1Ni4wIC8gMTAsICZp bnRlZ2VyKSByZXR1cm5pbmcgLjU5OTk5OTk5Li4uDQoJCSovDQoJCWZvciAo OyBpbnRlZ2VyOyArK2V4cGNudCkNCgkJCXsgdG1wID0gbW9kZmwoaW50ZWdl ciAqIDAuMUwgLCAmaW50ZWdlcik7DQogICAgCQkqcC0tID0gVG9DaGFyKChp bnQpKCh0bXAgKyAuMDFMKSAqIDEwKSk7DQogIAkJCX0NCgkJc3dpdGNoKGZt dGNoKQ0KCQkJew0KCQkJY2FzZSAnZic6DQoJCQkJLyogcmV2ZXJzZSBpbnRl Z2VyIGludG8gYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLw0KCQkJCWlmIChleHBj bnQpDQoJCQkJCWZvciAoOyArK3AgPCBlbmRwOyAqdCsrID0gKnApOw0KCQkJ CWVsc2UNCgkJCQkJKnQrKyA9ICcwJzsNCgkJCQkvKg0KCQkJCSogaWYgcHJl Y2lzaW9uIHJlcXVpcmVkIG9yIGFsdGVybmF0ZSBmbGFnIHNldCwgYWRkIGlu IGENCgkJCQkqIGRlY2ltYWwgcG9pbnQuDQoJCQkJKi8NCgkJCQlpZiAocHJl YyB8fCBmbGFncyZBTFQpDQoJCQkJCSp0KysgPSBkZWNpbWFsOw0KCQkJCS8q IGlmIHJlcXVpcmVzIG1vcmUgcHJlY2lzaW9uIGFuZCBzb21lIGZyYWN0aW9u IGxlZnQgKi8NCgkJCQlpZiAoZnJhY3QpDQoJCQkJCXtpZiAocHJlYykNCgkJ CQkJZG8gew0KCQkJCQkJZnJhY3QgPSBtb2RmbChmcmFjdCAqIDEwLjBMLCAm dG1wKTsNCgkJCQkJCSp0KysgPSBUb0NoYXIoKGludCl0bXApOw0KCQkJCQkJ fXdoaWxlICgtLXByZWMgJiYgZnJhY3QpOw0KCQkJCQlpZiAoZnJhY3QpDQoJ CQkJCQlzdGFydHAgPSByb3VuZGwoZnJhY3QsIChpbnQgKilOVUxMLCBzdGFy dHAsIHQgLSAxLCAoY2hhcikwLCBzaWducCk7DQoJCQkJCX0NCgkJCQlmb3Ig KDsgcHJlYy0tOyAqdCsrID0gJzAnKTsNCgkJCQlicmVhazsNCgkJCWNhc2Ug J2UnOg0KCQkJY2FzZSAnRSc6DQoJCQkJZWZvcm1hdDoNCgkJCQkJaWYgKGV4 cGNudCkNCgkJCQkJCXsqdCsrID0gKisrcDsNCgkJCQkJCWlmIChwcmVjIHx8 IGZsYWdzJkFMVCkNCgkJCQkJCQkqdCsrID0gZGVjaW1hbDsNCgkJCQkJCS8q IGlmIHJlcXVpcmVzIG1vcmUgcHJlY2lzaW9uIGFuZCBzb21lIGludGVnZXIg bGVmdCAqLw0KCQkJCQkJZm9yICg7IHByZWMgJiYgKytwIDwgZW5kcDsgLS1w cmVjKQ0KCQkJCQkJCSp0KysgPSAqcDsNCgkJCQkJCS8qIGlmIGRvbmUgcHJl Y2lzaW9uIGFuZCBtb3JlIG9mIHRoZSBpbnRlZ2VyIGNvbXBvbmVudCwNCgkJ CQkJCSogcm91bmQgdXNpbmcgaXQ7IGFkanVzdCBmcmFjdCBzbyB3ZSBkb24n dCByZS1yb3VuZA0KCQkJCQkJKiBsYXRlci4qLw0KCQkJCQkJaWYgKCFwcmVj ICYmICsrcCA8IGVuZHApDQoJCQkJCQkJe2ZyYWN0ID0gMDsNCgkJCQkJCQlz dGFydHAgPSByb3VuZGwoKGxvbmcgZG91YmxlKTAuMEwsICZleHBjbnQsc3Rh cnRwLCB0IC0gMSwgKnAsIHNpZ25wKTsNCgkJCQkJCQl9DQoJCQkJCQkvKiBh ZGp1c3QgZXhwY250IGZvciBkaWdpdCBpbiBmcm9udCBvZiBkZWNpbWFsICov DQoJCQkJCQktLWV4cGNudDsNCgkJCQkJCX0NCgkJCQkJCS8qIHVudGlsIGZp cnN0IGZyYWN0aW9uYWwgZGlnaXQsIGRlY3JlbWVudCBleHBvbmVudCAqLw0K CQkJCQllbHNlIGlmIChmcmFjdCkNCgkJCQkJCXtpbnQgbHA9TlAsIHB0PU1B WFA7DQoJCQkJCQkjaWZuZGVmIEZBU1RfTERPVUJMRV9DT05WRVJTSU9ODQoJ CQkJCQkJbG9uZyBkb3VibGUgb2ZyYWN0ID0gZnJhY3QsIGRkPTEuMEw7DQoJ CQkJCQkjZW5kaWYNCgkJCQkJCWV4cGNudCA9IC0xOw0KCQkJCQkJaWYgKGZy YWN0IDwgUFJFQykNCgkJCQkJCQl7ZnJhY3QgKj0gSU5WUFJFQzsNCgkJCQkJ CQl3aGlsZShscCA+PSAwKQ0KCQkJCQkJCQl7aWYgKGZyYWN0IDw9IHB0ZW5u ZWdbbHBdKQ0KCQkJCQkJCQkJe2V4cGNudCAtPSBwdDsNCgkJCQkJCQkJCWZy YWN0ICo9IHB0ZW5bbHBdOw0KCQkJCQkJCQkJI2lmbmRlZiBGQVNUX0xET1VC TEVfQ09OVkVSU0lPTg0KCQkJCQkJCQkJCWRkICo9IHB0ZW5bbHBdOw0KCQkJ CQkJCQkJI2VuZGlmDQoJCQkJCQkJCQl9DQoJCQkJCQkJCXB0ID4+PSAxOw0K CQkJCQkJCQlscC0tOw0KCQkJCQkJCQl9DQoJCQkJCQkJI2lmbmRlZiBGQVNU X0xET1VCTEVfQ09OVkVSU0lPTg0KCQkJCQkJCQlmcmFjdCA9IG9mcmFjdCpk ZDsNCgkJCQkJCQkjZWxzZQ0KCQkJCQkJCQlmcmFjdCAqPSBQUkVDOw0KCQkJ CQkJCSNlbmRpZg0KCQkJCQkJCX0NCgkJCQkJCS8qIGFkanVzdCBleHBjbnQg Zm9yIGRpZ2l0IGluIGZyb250IG9mIGRlY2ltYWwgKi8NCgkJCQkJCWZvciAo LyogZXhwY250ID0gLTEgKi8gOzsgLS1leHBjbnQpDQoJCQkJCQkJe2ZyYWN0 ID0gbW9kZmwoZnJhY3QgKiAxMC4wTCwgJnRtcCk7DQoJCQkJCQkJaWYgKHRt cCkNCiAgICAgIAkJCQkJCQlicmVhazsNCiAgICAgICAgICAgIAkJCQl9DQoJ CQkJCQkqdCsrID0gVG9DaGFyKChpbnQpdG1wKTsNCgkJCQkJCWlmIChwcmVj IHx8IGZsYWdzJkFMVCkNCgkJCQkJCQkqdCsrID0gZGVjaW1hbDsNCgkJCQkJ CX0NCgkJCQkJZWxzZQ0KIAkJCQkJCXsqdCsrID0gJzAnOw0KCQkJCQkJaWYg KHByZWMgfHwgZmxhZ3MmQUxUKQ0KCQkJCQkJCSp0KysgPSBkZWNpbWFsOw0K CQkJCQkJfQ0KCQkJCS8qIGlmIHJlcXVpcmVzIG1vcmUgcHJlY2lzaW9uIGFu ZCBzb21lIGZyYWN0aW9uIGxlZnQgKi8NCgkJCQlpZiAoZnJhY3QpDQoJCQkJ CXtpZiAocHJlYykNCgkJCQkJCWRvIHsNCgkJCQkJCQlmcmFjdCA9IG1vZGZs KGZyYWN0ICogMTAuMEwsICZ0bXApOw0KCQkJCQkJCSp0KysgPSBUb0NoYXIo KGludCl0bXApOw0KCQkJCQkJCX0gd2hpbGUgKC0tcHJlYyAmJiBmcmFjdCk7 DQoJCQkJCQlpZiAoZnJhY3QpDQoJCQkJCQkJc3RhcnRwID0gcm91bmRsKGZy YWN0LCAmZXhwY250LCBzdGFydHAsIHQgLSAxLCAoY2hhcikwLCBzaWducCk7 DQoJCQkJCX0NCgkJCQkvKiBpZiByZXF1aXJlcyBtb3JlIHByZWNpc2lvbiAq Lw0KCQkJCWZvciAoOyBwcmVjLS07ICp0KysgPSAnMCcpOw0KCQkJCS8qIHVu bGVzcyBhbHRlcm5hdGUgZmxhZywgdHJpbSBhbnkgZy9HIGZvcm1hdCB0cmFp bGluZyAwJ3MgKi8NCgkJCQlpZiAoZ2Zvcm1hdCAmJiAhKGZsYWdzJkFMVCkp DQoJCQkJCXt3aGlsZSAodCA+IHN0YXJ0cCAmJiAqLS10ID09ICcwJyk7DQoJ CQkJCWlmICgqdCA9PSBkZWNpbWFsKQ0KCQkJCQkJLS10Ow0KCQkJCQkrK3Q7 DQoJCQkJCX0NCgkJCQl0ID0gZXhwb25lbnRsKHQsIGV4cGNudCwgZm10Y2gp Ow0KCQkJCWJyZWFrOw0KCQkJY2FzZSAnZyc6DQoJCQljYXNlICdHJzoNCgkJ CQlpZiAocHJlYykNCiAgICAJCQkJey8qIElmIGRvaW5nIHplcm8gYW5kIHBy ZWNpc2lvbiBpcyBncmVhdGVyIHRoYW4gMCBjb3VudCB0aGUgKiAwIGJlZm9y ZSB0aGUgZGVjaW1hbCBwbGFjZSAqLw0KCQkJCQlpZiAoZG9pbmd6ZXJvKSAt LXByZWM7DQoJCQkJCX0NCgkJCQllbHNlDQogICAgCQkJCXsvKiBhIHByZWNp c2lvbiBvZiAwIGlzIHRyZWF0ZWQgYXMgcHJlY2lzaW9uIG9mIDEgdW5sZXNz IGRvaW5nIHplcm8gKi8NCgkJCQkJaWYgKCFkb2luZ3plcm8pICsrcHJlYzsN CgkJCQkJfQ0KCQkJICAgIC8qIGBgVGhlIHN0eWxlIHVzZWQgZGVwZW5kcyBv biB0aGUgdmFsdWUgY29udmVydGVkOyBzdHlsZSBlDQoJCQkgICAgICogd2ls bCBiZSB1c2VkIG9ubHkgaWYgdGhlIGV4cG9uZW50IHJlc3VsdGluZyBmcm9t IHRoZQ0KCQkgICAgCSAqIGNvbnZlcnNpb24gaXMgbGVzcyB0aGFuIC00IG9y IGdyZWF0ZXIgdGhhbiB0aGUgcHJlY2lzaW9uLicnDQoJCQkgICAgICoJLS0g QU5TSSBYM0oxMSAqLw0KCQkJCWlmIChleHBjbnQgPiBwcmVjIHx8ICghZXhw Y250ICYmIGZyYWN0ICYmIGZyYWN0IDwgLjAwMDEpKQ0KCQkJCQl7DQoJCQkJ CS8qIGcvRyBmb3JtYXQgY291bnRzICJzaWduaWZpY2FudCBkaWdpdHMsIG5v dCBkaWdpdHMgb2YNCiAgICAJCQkJKiBwcmVjaXNpb247IGZvciB0aGUgZS9F IGZvcm1hdCwgdGhpcyBqdXN0IGNhdXNlcyBhbg0KCQkJCQkqIG9mZi1ieS1v bmUgcHJvYmxlbSwgaS5lLiBnL0cgY29uc2lkZXJzIHRoZSBkaWdpdA0KCQkJ CQkqIGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludCBzaWduaWZpY2FudCBhbmQg ZS9FIGRvZXNuJ3QNCgkJCQkJKiBjb3VudCBpdCBhcyBwcmVjaXNpb24uKi8N CgkJCQkJLS1wcmVjOw0KCQkJCQlmbXRjaCAtPSAyOwkJLyogRy0+RSwgZy0+ ZSAqLw0KCQkJCQlnZm9ybWF0ID0gMTsNCgkJCQkJZ290byBlZm9ybWF0Ow0K CQkJCQl9DQoJCQkJLyogcmV2ZXJzZSBpbnRlZ2VyIGludG8gYmVnaW5uaW5n IG9mIGJ1ZmZlciwgbm90ZSwgZGVjcmVtZW50IHByZWNpc2lvbiAqLw0KCQkJ CWlmIChleHBjbnQpDQoJCQkJCWZvciAoOyArK3AgPCBlbmRwOyAqdCsrID0g KnAsIC0tcHJlYyk7DQoJCQkJZWxzZQ0KCQkJCQkqdCsrID0gJzAnOw0KCQkJ ICAgIC8qIGlmIHByZWNpc2lvbiByZXF1aXJlZCBvciBhbHRlcm5hdGUgZmxh ZyBzZXQsIGFkZCBpbiBhDQoJCQkgICAgICogZGVjaW1hbCBwb2ludC4gIElm IG5vIGRpZ2l0cyB5ZXQsIGFkZCBpbiBsZWFkaW5nIDAuICovDQoJCQkJaWYg KHByZWMgfHwgZmxhZ3MmQUxUKQ0KCQkJCQl7ZG90cmltID0gMTsNCgkJCQkJ KnQrKyA9IGRlY2ltYWw7DQoJCQkJCX0NCgkJCQllbHNlDQoJCQkJCWRvdHJp bSA9IDA7DQoJCQkJLyogaWYgcmVxdWlyZXMgbW9yZSBwcmVjaXNpb24gYW5k IHNvbWUgZnJhY3Rpb24gbGVmdCAqLw0KCQkJCXdoaWxlIChwcmVjICYmIGZy YWN0KQ0KCQkJCQl7ZnJhY3QgPSBtb2RmbChmcmFjdCAqIDEwLjBMLCAmdG1w KTsNCgkJCQkJKnQrKyA9IFRvQ2hhcigoaW50KXRtcCk7DQoJCQkJCS8qIElm IHdlJ3JlIG5vdCBhZGRpbmcgMHMgb3Igd2UgYXJlIGJ1dCB0aGV5J3JlIHNp ZyBmaWdzOg0KCQkJICAgICAgICAqIGRlY3JlbWVudCB0aGUgcHJlY2lzaW9u ICovDQoJCQkJCWlmICgoZG9leHRyYWRwcyE9MSkgfHwgKChpbnQpdG1wIT0w KSkgDQogICAgIAkJCQkJe2RvZXh0cmFkcHM9MDsNCgkJCQkJCXByZWMtLTsN CiAgICAgIAkJCQkJfQ0KCQkJCQl9DQoJCQkJaWYgKGZyYWN0KQ0KCQkJCQlz dGFydHAgPSByb3VuZGwoZnJhY3QsIChpbnQgKilOVUxMLCBzdGFydHAsIHQg LSAxLCAoY2hhcikwLCBzaWducCk7DQoJCQkJLyogYWx0ZXJuYXRlIGZvcm1h dCwgYWRkcyAwJ3MgZm9yIHByZWNpc2lvbiwgZWxzZSB0cmltIDAncyAqLw0K CQkJCWlmIChmbGFncyZBTFQpDQoJCQkJCWZvciAoOyBwcmVjLS07ICp0Kysg PSAnMCcpOw0KCQkJCWVsc2UgaWYgKGRvdHJpbSkNCgkJCQkJe3doaWxlICh0 ID4gc3RhcnRwICYmICotLXQgPT0gJzAnKTsNCgkJCQkJaWYgKCp0ICE9IGRl Y2ltYWwpDQoJCQkJCQkrK3Q7DQoJCQkJCX0NCgkJfQ0KCXJldHVybiB0IC0g c3RhcnRwOw0KCX0NCg0KY2hhciAqIHJvdW5kbChsb25nIGRvdWJsZSBmcmFj dCwgaW50ICpleHB2LCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyIGNo LCBjaGFyICpzaWducCkNCgl7bG9uZyBkb3VibGUgdG1wOw0KCWlmIChmcmFj dCkNCiAJCXtpZiAoZnJhY3QgPT0gMC41TCkNCgkJCXtjaGFyICplID0gZW5k Ow0KCQkJaWYgKCplID09ICcuJykNCgkJCQllLS07DQoJCQlpZiAoKmUgPT0g JzAnIHx8ICplID09ICcyJyB8fCAqZSA9PSAnNCcgfHwgKmUgPT0gJzYnIHx8 ICplID09ICc4JykNCgkJCQl7dG1wID0gMy4wOw0KCQkJCWdvdG8gc3RhcnQ7 DQoJCQkJfQ0KCQkJfQ0KCQkJKHZvaWQpbW9kZmwoZnJhY3QgKiAxMC4wTCwg JnRtcCk7DQogIAkJfQ0KCWVsc2UNCgkJdG1wID0gVG9EaWdpdChjaCk7DQoJ c3RhcnQ6DQoJCWlmICh0bXAgPiA0KQ0KCQkJZm9yICg7OyAtLWVuZCkNCgkJ CQl7aWYgKCplbmQgPT0gZGVjaW1hbCkNCgkJCQkJLS1lbmQ7DQoJCQkJaWYg KCsrKmVuZCA8PSAnOScpDQoJCQkJCWJyZWFrOw0KCQkJCSplbmQgPSAnMCc7 DQoJCQkJaWYgKGVuZCA9PSBzdGFydCkNCgkJCQkJe2lmIChleHB2KQ0KCQkJ CQkJey8qIGUvRTsgaW5jcmVtZW50IGV4cG9uZW50ICovDQoJCQkJCQkqZW5k ID0gJzEnOw0KCQkJCQkJKysqZXhwdjsNCgkJCQkJCX0NCgkJCQkJZWxzZQ0K CQkJCQkJey8qIGY7IGFkZCBleHRyYSBkaWdpdCAqLw0KCQkJCQkJKi0tZW5k ID0gJzEnOw0KCQkJCQkJLS1zdGFydDsNCgkJCQkJCX0NCgkJCQkJYnJlYWs7 DQoJCQkJCX0NCgkJCQl9DQoJLyogYGAiJS4zZiIsIChkb3VibGUpLTAuMDAw NCcnIGdpdmVzIHlvdSBhIG5lZ2F0aXZlIDAuICovDQoJCWVsc2UgaWYgKCpz aWducCA9PSAnLScpDQoJCQlmb3IgKDs7IC0tZW5kKQ0KCQkJCXtpZiAoKmVu ZCA9PSBkZWNpbWFsKQ0KCQkJCQktLWVuZDsNCgkJCQlpZiAoKmVuZCAhPSAn MCcpDQoJCQkJCWJyZWFrOw0KCQkJCWlmIChlbmQgPT0gc3RhcnQpDQoJCQkJ CSpzaWducCA9IDA7DQoJCQkJfQ0KCXJldHVybiBzdGFydDsNCgl9DQoNCmNo YXIgKiBleHBvbmVudGwoY2hhciAqcCwgaW50IGV4cHYsIHVuc2lnbmVkIGNo YXIgZm10Y2gpDQoJew0KCWNoYXIgKnQ7DQoJY2hhciBleHBidWZbTUFYRVhQ TERdOw0KDQoJKnArKyA9IGZtdGNoOw0KCWlmIChleHB2IDwgMCkNCgkJe2V4 cHYgPSAtZXhwdjsNCgkJKnArKyA9ICctJzsNCgkJfQ0KCWVsc2UNCiAJCSpw KysgPSAnKyc7DQoJdCA9IGV4cGJ1ZiArIE1BWEVYUExEOw0KCWlmIChleHB2 ID4gOSkNCgkJew0KICAJCWRvIHsNCgkJCSotLXQgPSBUb0NoYXIoZXhwdiAl IDEwKTsNCgkJCX0gd2hpbGUgKChleHB2IC89IDEwKSA+IDkpOw0KCQkqLS10 ID0gVG9DaGFyKGV4cHYpOw0KCQlmb3IgKDsgdCA8IGV4cGJ1ZiArIE1BWEVY UExEOyAqcCsrID0gKnQrKyk7DQoJCX0NCgllbHNlDQoJCXsNCgkJKnArKyA9 ICcwJzsNCgkJKnArKyA9IFRvQ2hhcihleHB2KTsNCgkJfQ0KCXJldHVybiBw Ow0KCX0NCmludCBpc3NwZWNpYWxsKGxvbmcgZG91YmxlIGQsIGNoYXIgKmJ1 ZnApDQoJe3N0cnVjdCBJRUVFeHAgew0KCQl1bnNpZ25lZCBtYW5sOjMyOw0K CQl1bnNpZ25lZCBtYW5oOjMyOw0KCQl1bnNpZ25lZCBleHA6MTU7DQoJCXVu c2lnbmVkIHNpZ246MTsNCgl9KmlwID0gKHN0cnVjdCBJRUVFeHAgKikmZDsN Cg0KCW5hbiA9IDA7ICAvKiBkb24ndCBhc3N1bWUgdGhlIHN0YXRpYyBpcyAw IChlbWFjcykgKi8NCglpZiAoaXAtPmV4cCAhPSAweDdmZmYpDQoJCXJldHVy bigwKTsNCglpZiAoKGlwLT5tYW5oICYgMHg3ZmZmZmZmZikgfHwgaXAtPm1h bmwpDQoJCXtTdHJDcHkoYnVmcCwgIk5hTiIpOw0KCQluYW4gPSBpcC0+c2ln biA/IC0xIDogMTsgLyoga2x1ZGdlOiB3ZSBkb24ndCBuZWVkIHRoZSBzaWdu LCAgaXQncyBub3QgbmljZQ0KCQkJCWJ1dCBpdCBzaG91bGQgd29yayAqLw0K CQl9DQoJZWxzZQ0KCQkodm9pZClTdHJDcHkoYnVmcCwgIkluZiIpOw0KCXJl dHVybigzKTsNCgl9DQo= ------------=_1583533010-675-1--